Author: jgardou
Date: Mon Nov 10 21:37:25 2014
New Revision: 65370

URL: http://svn.reactos.org/svn/reactos?rev=65370&view=rev
Log:
[TCPIP]
 - Add skeleton code to handle IOCTL_TCP_SET_INFORMATION_EX

Modified:
    branches/tcpip_revolution/drivers/network/tcpip/information.c
    branches/tcpip_revolution/drivers/network/tcpip/information.h
    branches/tcpip_revolution/drivers/network/tcpip/main.c

Modified: branches/tcpip_revolution/drivers/network/tcpip/information.c
URL: 
http://svn.reactos.org/svn/reactos/branches/tcpip_revolution/drivers/network/tcpip/information.c?rev=65370&r1=65369&r2=65370&view=diff
==============================================================================
--- branches/tcpip_revolution/drivers/network/tcpip/information.c       
[iso-8859-1] (original)
+++ branches/tcpip_revolution/drivers/network/tcpip/information.c       
[iso-8859-1] Mon Nov 10 21:37:25 2014
@@ -16,17 +16,23 @@
     _Out_opt_ PVOID OutBuffer,
     _Inout_ ULONG* BufferSize);
 
+typedef NTSTATUS (*SET_INFO_HANDLER)(
+    _In_ TDIEntityID ID,
+    _In_ PVOID InBuffer,
+    _In_ ULONG BufferSize);
+
 static
 struct
 {
     ULONG Entity, Class, Type, Id;
-    QUERY_INFO_HANDLER Handler;
+    QUERY_INFO_HANDLER QueryHandler;
+    SET_INFO_HANDLER SetHandler;
 
 } InfoHandlers[] =
 {
-    { GENERIC_ENTITY,   INFO_CLASS_GENERIC,     INFO_TYPE_PROVIDER,     
ENTITY_LIST_ID,             QueryEntityList },
-    { IF_ENTITY,        INFO_CLASS_PROTOCOL,    INFO_TYPE_PROVIDER,     
IP_MIB_STATS_ID,            QueryInterfaceEntry},
-    { CL_NL_ENTITY,     INFO_CLASS_PROTOCOL,    INFO_TYPE_PROVIDER,     
IP_MIB_ADDRTABLE_ENTRY_ID,  QueryInterfaceAddrTable},
+    { GENERIC_ENTITY,   INFO_CLASS_GENERIC,     INFO_TYPE_PROVIDER,     
ENTITY_LIST_ID,             QueryEntityList,            NULL },
+    { IF_ENTITY,        INFO_CLASS_PROTOCOL,    INFO_TYPE_PROVIDER,     
IP_MIB_STATS_ID,            QueryInterfaceEntry,        NULL },
+    { CL_NL_ENTITY,     INFO_CLASS_PROTOCOL,    INFO_TYPE_PROVIDER,     
IP_MIB_ADDRTABLE_ENTRY_ID,  QueryInterfaceAddrTable,    NULL },
     { (ULONG)-1, (ULONG)-1, (ULONG)-1, (ULONG)-1, NULL }
 };
 
@@ -95,14 +101,14 @@
     }
 
     /* Find the handler for this particular query */
-    for (i = 0; InfoHandlers[i].Handler != NULL; i++)
+    for (i = 0; InfoHandlers[i].Entity != (ULONG)-1; i++)
     {
         if ((InfoHandlers[i].Entity == Query->ID.toi_entity.tei_entity) &&
                 (InfoHandlers[i].Class == Query->ID.toi_class) &&
                 (InfoHandlers[i].Type == Query->ID.toi_type) &&
                 (InfoHandlers[i].Id == Query->ID.toi_id))
         {
-            Handler = InfoHandlers[i].Handler;
+            Handler = InfoHandlers[i].QueryHandler;
             break;
         }
     }
@@ -177,3 +183,44 @@
     IoCompleteRequest(Irp, IO_NETWORK_INCREMENT);
     return Status;
 }
+
+NTSTATUS
+TcpIpSetInformation(
+    _Inout_ PIRP Irp
+)
+{
+    TCP_REQUEST_SET_INFORMATION_EX* Query;
+    SET_INFO_HANDLER Handler = NULL;
+    NTSTATUS Status;
+    ULONG i;
+
+    /* Get the input buffer */
+    Query = Irp->AssociatedIrp.SystemBuffer;
+
+    /* Find the handler for this particular query */
+    for (i = 0; InfoHandlers[i].Entity != (ULONG)-1; i++)
+    {
+        if ((InfoHandlers[i].Entity == Query->ID.toi_entity.tei_entity) &&
+                (InfoHandlers[i].Class == Query->ID.toi_class) &&
+                (InfoHandlers[i].Type == Query->ID.toi_type) &&
+                (InfoHandlers[i].Id == Query->ID.toi_id))
+        {
+            Handler = InfoHandlers[i].SetHandler;
+            break;
+        }
+    }
+
+    if (!Handler)
+    {
+        DPRINT1("TCPIP - Unknown query: entity 0x%x, class 0x%x, type 0x%x, Id 
0x%x.\n",
+            Query->ID.toi_entity.tei_entity, Query->ID.toi_class, 
Query->ID.toi_type, Query->ID.toi_id);
+        return STATUS_NOT_IMPLEMENTED;
+    }
+
+    Status = Handler(Query->ID.toi_entity, &Query->Buffer, Query->BufferSize);
+
+    if (NT_SUCCESS(Status))
+        Irp->IoStatus.Information = Query->BufferSize;
+
+    return Status;
+}

Modified: branches/tcpip_revolution/drivers/network/tcpip/information.h
URL: 
http://svn.reactos.org/svn/reactos/branches/tcpip_revolution/drivers/network/tcpip/information.h?rev=65370&r1=65369&r2=65370&view=diff
==============================================================================
--- branches/tcpip_revolution/drivers/network/tcpip/information.h       
[iso-8859-1] (original)
+++ branches/tcpip_revolution/drivers/network/tcpip/information.h       
[iso-8859-1] Mon Nov 10 21:37:25 2014
@@ -10,3 +10,8 @@
 TcpIpQueryKernelInformation(
     _In_ PIRP Irp
 );
+
+NTSTATUS
+TcpIpSetInformation(
+    _Inout_ PIRP Irp
+);

Modified: branches/tcpip_revolution/drivers/network/tcpip/main.c
URL: 
http://svn.reactos.org/svn/reactos/branches/tcpip_revolution/drivers/network/tcpip/main.c?rev=65370&r1=65369&r2=65370&view=diff
==============================================================================
--- branches/tcpip_revolution/drivers/network/tcpip/main.c      [iso-8859-1] 
(original)
+++ branches/tcpip_revolution/drivers/network/tcpip/main.c      [iso-8859-1] 
Mon Nov 10 21:37:25 2014
@@ -455,8 +455,7 @@
         break;
 
       case IOCTL_TCP_SET_INFORMATION_EX:
-          DPRINT1("TCPIP: Should handle IOCTL_TCP_SET_INFORMATION_EX.\n");
-          Status = STATUS_NOT_IMPLEMENTED;
+          Status = TcpIpSetInformation(Irp);
       break;
 
       case IOCTL_SET_IP_ADDRESS:


Reply via email to