[AFD] Introduce and use pool tags. Thanks go to Arty for assisting me with this....
[reactos.git] / drivers / network / afd / afd / tdi.c
index fcdb77b..75085bc 100644 (file)
@@ -7,11 +7,11 @@
  * REVISIONS:
  *   CSH 01/09-2000 Created
  */
+
 #include <afd.h>
-#include <pseh/pseh2.h>
-#include "debug.h"
-#include "tdiconn.h"
-#include "tdi_proto.h"
+
+#include <tdikrnl.h>
+#include <tdiinfo.h>
 
 #if DBG
 #if 0
@@ -144,7 +144,7 @@ static NTSTATUS TdiOpenDevice(
     if (NT_SUCCESS(Status)) {
         Status = ObReferenceObjectByHandle(*Handle,                       /* Handle to open file */
                                            GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,  /* Access mode */
-                                           IoFileObjectType,              /* Object type */
+                                           *IoFileObjectType,              /* Object type */
                                            KernelMode,                    /* Access mode */
                                            (PVOID*)Object,                /* Pointer to object */
                                            NULL);                         /* Handle information */
@@ -196,7 +196,9 @@ NTSTATUS TdiOpenAddressFile(
     EaLength = sizeof(FILE_FULL_EA_INFORMATION) +
         TDI_TRANSPORT_ADDRESS_LENGTH +
         TaLengthOfTransportAddress( Name ) + 1;
-    EaInfo = (PFILE_FULL_EA_INFORMATION)ExAllocatePool(NonPagedPool, EaLength);
+    EaInfo = (PFILE_FULL_EA_INFORMATION)ExAllocatePoolWithTag(NonPagedPool,
+                                                              EaLength,
+                                                              TAG_AFD_EA_INFO);
     if (!EaInfo)
         return STATUS_INSUFFICIENT_RESOURCES;
 
@@ -217,7 +219,7 @@ NTSTATUS TdiOpenAddressFile(
                            ShareType,
                            AddressHandle,
                            AddressObject);
-    ExFreePool(EaInfo);
+    ExFreePoolWithTag(EaInfo, TAG_AFD_EA_INFO);
     return Status;
 }
 
@@ -229,13 +231,16 @@ NTSTATUS TdiQueryMaxDatagramLength(
     PTDI_MAX_DATAGRAM_INFO Buffer;
     NTSTATUS Status = STATUS_SUCCESS;
 
-    Buffer = ExAllocatePool(NonPagedPool, sizeof(TDI_MAX_DATAGRAM_INFO));
+    Buffer = ExAllocatePoolWithTag(NonPagedPool,
+                                   sizeof(TDI_MAX_DATAGRAM_INFO),
+                                   TAG_AFD_DATA_BUFFER);
+
     if (!Buffer) return STATUS_NO_MEMORY;
 
     Mdl = IoAllocateMdl(Buffer, sizeof(TDI_MAX_DATAGRAM_INFO), FALSE, FALSE, NULL);
     if (!Mdl)
     {
-        ExFreePool(Buffer);
+        ExFreePoolWithTag(Buffer, TAG_AFD_DATA_BUFFER);
         return STATUS_NO_MEMORY;
     }
 
@@ -253,7 +258,7 @@ NTSTATUS TdiQueryMaxDatagramLength(
     {
         AFD_DbgPrint(MIN_TRACE,("Failed to lock pages\n"));
         IoFreeMdl(Mdl);
-        ExFreePool(Buffer);
+        ExFreePoolWithTag(Buffer, TAG_AFD_DATA_BUFFER);
         return Status;
     }
 
@@ -262,13 +267,13 @@ NTSTATUS TdiQueryMaxDatagramLength(
                                  Mdl);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePool(Buffer);
+        ExFreePoolWithTag(Buffer, TAG_AFD_DATA_BUFFER);
         return Status;
     }
 
     *MaxDatagramLength = Buffer->MaxDatagramSize;
 
-    ExFreePool(Buffer);
+    ExFreePoolWithTag(Buffer, TAG_AFD_DATA_BUFFER);
 
     return STATUS_SUCCESS;
 }
@@ -299,7 +304,9 @@ NTSTATUS TdiOpenConnectionEndpointFile(
         TDI_CONNECTION_CONTEXT_LENGTH +
         sizeof(PVOID) + 1;
 
-    EaInfo = (PFILE_FULL_EA_INFORMATION)ExAllocatePool(NonPagedPool, EaLength);
+    EaInfo = (PFILE_FULL_EA_INFORMATION)ExAllocatePoolWithTag(NonPagedPool,
+                                                              EaLength,
+                                                              TAG_AFD_EA_INFO);
     if (!EaInfo)
         return STATUS_INSUFFICIENT_RESOURCES;
 
@@ -319,7 +326,7 @@ NTSTATUS TdiOpenConnectionEndpointFile(
                            AFD_SHARE_UNIQUE,
                            ConnectionHandle,
                            ConnectionObject);
-    ExFreePool(EaInfo);
+    ExFreePoolWithTag(EaInfo, TAG_AFD_EA_INFO);
     return Status;
 }
 
@@ -329,7 +336,6 @@ NTSTATUS TdiConnect(
     PFILE_OBJECT ConnectionObject,
     PTDI_CONNECTION_INFORMATION ConnectionCallInfo,
     PTDI_CONNECTION_INFORMATION ConnectionReturnInfo,
-    PIO_STATUS_BLOCK Iosb,
     PIO_COMPLETION_ROUTINE CompletionRoutine,
     PVOID CompletionContext)
 /*
@@ -362,7 +368,7 @@ NTSTATUS TdiConnect(
                                             DeviceObject,            /* Device object */
                                             ConnectionObject,        /* File object */
                                             NULL,                    /* Event */
-                                            Iosb);                   /* Status */
+                                            NULL);                   /* Status */
     if (!*Irp) {
         return STATUS_INSUFFICIENT_RESOURCES;
     }
@@ -376,7 +382,7 @@ NTSTATUS TdiConnect(
                     ConnectionCallInfo,     /* Request connection information */
                     ConnectionReturnInfo);  /* Return connection information */
 
-    TdiCall(*Irp, DeviceObject, NULL, Iosb);
+    TdiCall(*Irp, DeviceObject, NULL, NULL);
 
     return STATUS_PENDING;
 }
@@ -485,7 +491,6 @@ NTSTATUS TdiListen(
     PFILE_OBJECT ConnectionObject,
     PTDI_CONNECTION_INFORMATION *RequestConnectionInfo,
     PTDI_CONNECTION_INFORMATION *ReturnConnectionInfo,
-    PIO_STATUS_BLOCK Iosb,
     PIO_COMPLETION_ROUTINE  CompletionRoutine,
     PVOID CompletionContext)
 /*
@@ -519,7 +524,7 @@ NTSTATUS TdiListen(
                                             DeviceObject,            /* Device object */
                                             ConnectionObject,        /* File object */
                                             NULL,                    /* Event */
-                                            Iosb);                   /* Status */
+                                            NULL);                   /* Status */
     if (*Irp == NULL)
         return STATUS_INSUFFICIENT_RESOURCES;
 
@@ -532,7 +537,7 @@ NTSTATUS TdiListen(
                    *RequestConnectionInfo, /* Request connection information */
                    *ReturnConnectionInfo);  /* Return connection information */
 
-    TdiCall(*Irp, DeviceObject, NULL /* Don't wait for completion */, Iosb);
+    TdiCall(*Irp, DeviceObject, NULL /* Don't wait for completion */, NULL);
 
     return STATUS_PENDING;
 }
@@ -770,7 +775,7 @@ NTSTATUS TdiQueryAddress(
     TDIEntityID *Entities;
     ULONG EntityCount;
     ULONG EntityType;
-    IPSNMP_INFO SnmpInfo;
+    IPSNMPInfo SnmpInfo;
     PIPADDR_ENTRY IpAddress;
     ULONG BufferSize;
     NTSTATUS Status = STATUS_SUCCESS;
@@ -778,7 +783,9 @@ NTSTATUS TdiQueryAddress(
     AFD_DbgPrint(MAX_TRACE, ("Called\n"));
 
     BufferSize = sizeof(TDIEntityID) * 20;
-    Entities   = (TDIEntityID*)ExAllocatePool(NonPagedPool, BufferSize);
+    Entities = (TDIEntityID*)ExAllocatePoolWithTag(NonPagedPool,
+                                                   BufferSize,
+                                                   TAG_AFD_TRANSPORT_ADDRESS);
     if (!Entities) {
         AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -796,7 +803,7 @@ NTSTATUS TdiQueryAddress(
                                    &BufferSize);        /* Output buffer size */
     if (!NT_SUCCESS(Status)) {
         AFD_DbgPrint(MIN_TRACE, ("Unable to get list of supported entities (Status = 0x%X).\n", Status));
-        ExFreePool(Entities);
+        ExFreePoolWithTag(Entities, TAG_AFD_TRANSPORT_ADDRESS);
         return Status;
     }
 
@@ -834,16 +841,18 @@ NTSTATUS TdiQueryAddress(
                                            IP_MIB_STATS_ID,             /* Entity id */
                                            &SnmpInfo,                   /* Output buffer */
                                            &BufferSize);                /* Output buffer size */
-            if (!NT_SUCCESS(Status) || (SnmpInfo.NumAddr == 0)) {
+            if (!NT_SUCCESS(Status) || (SnmpInfo.ipsi_numaddr == 0)) {
                 AFD_DbgPrint(MIN_TRACE, ("Unable to get SNMP information or no IP addresses available (Status = 0x%X).\n", Status));
                 break;
             }
 
             /* Query device for all IP addresses */
 
-            if (SnmpInfo.NumAddr != 0) {
-                BufferSize = SnmpInfo.NumAddr * sizeof(IPADDR_ENTRY);
-                IpAddress = (PIPADDR_ENTRY)ExAllocatePool(NonPagedPool, BufferSize);
+            if (SnmpInfo.ipsi_numaddr != 0) {
+                BufferSize = SnmpInfo.ipsi_numaddr * sizeof(IPADDR_ENTRY);
+                IpAddress = (PIPADDR_ENTRY)ExAllocatePoolWithTag(NonPagedPool,
+                                                                 BufferSize,
+                                                                 TAG_AFD_SNMP_ADDRESS_INFO);
                 if (!IpAddress) {
                     AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
                     break;
@@ -859,11 +868,11 @@ NTSTATUS TdiQueryAddress(
                                                &BufferSize);                /* Output buffer size */
                 if (!NT_SUCCESS(Status)) {
                     AFD_DbgPrint(MIN_TRACE, ("Unable to get IP address (Status = 0x%X).\n", Status));
-                    ExFreePool(IpAddress);
+                    ExFreePoolWithTag(IpAddress, TAG_AFD_SNMP_ADDRESS_INFO);
                     break;
                 }
 
-                if (SnmpInfo.NumAddr != 1) {
+                if (SnmpInfo.ipsi_numaddr != 1) {
                     /* Skip loopback address */
                     *Address = DN2H(IpAddress[1].Addr);
                 } else {
@@ -871,7 +880,7 @@ NTSTATUS TdiQueryAddress(
                     *Address = DN2H(IpAddress->Addr);
                 }
 
-                ExFreePool(IpAddress);
+                ExFreePoolWithTag(IpAddress, TAG_AFD_SNMP_ADDRESS_INFO);
             } else {
                 Status = STATUS_UNSUCCESSFUL;
                 break;
@@ -879,7 +888,7 @@ NTSTATUS TdiQueryAddress(
         }
     }
 
-    ExFreePool(Entities);
+    ExFreePoolWithTag(Entities, TAG_AFD_TRANSPORT_ADDRESS);
 
     AFD_DbgPrint(MAX_TRACE, ("Leaving\n"));
 
@@ -892,7 +901,6 @@ NTSTATUS TdiSend(
     USHORT Flags,
     PCHAR Buffer,
     UINT BufferLength,
-    PIO_STATUS_BLOCK Iosb,
     PIO_COMPLETION_ROUTINE CompletionRoutine,
     PVOID CompletionContext)
 {
@@ -916,7 +924,7 @@ NTSTATUS TdiSend(
                                             DeviceObject,            /* Device object */
                                             TransportObject,         /* File object */
                                             NULL,                    /* Event */
-                                            Iosb);                   /* Status */
+                                            NULL);                   /* Status */
 
     if (!*Irp) {
         AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
@@ -938,7 +946,7 @@ NTSTATUS TdiSend(
     }
 
     _SEH2_TRY {
-        MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess);
+        MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoReadAccess);
     } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
         AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
         IoFreeMdl(Mdl);
@@ -958,7 +966,7 @@ NTSTATUS TdiSend(
                  Flags,                  /* Flags */
                  BufferLength);          /* Length of data */
 
-    TdiCall(*Irp, DeviceObject, NULL, Iosb);
+    TdiCall(*Irp, DeviceObject, NULL, NULL);
     /* Does not block...  The MDL is deleted in the receive completion
        routine. */
 
@@ -971,7 +979,6 @@ NTSTATUS TdiReceive(
     USHORT Flags,
     PCHAR Buffer,
     UINT BufferLength,
-    PIO_STATUS_BLOCK Iosb,
     PIO_COMPLETION_ROUTINE CompletionRoutine,
     PVOID CompletionContext)
 {
@@ -995,7 +1002,7 @@ NTSTATUS TdiReceive(
                                             DeviceObject,            /* Device object */
                                             TransportObject,         /* File object */
                                             NULL,                    /* Event */
-                                            Iosb);                   /* Status */
+                                            NULL);                   /* Status */
 
     if (!*Irp) {
         AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
@@ -1040,7 +1047,7 @@ NTSTATUS TdiReceive(
                     BufferLength);          /* Length of data */
 
 
-    TdiCall(*Irp, DeviceObject, NULL, Iosb);
+    TdiCall(*Irp, DeviceObject, NULL, NULL);
     /* Does not block...  The MDL is deleted in the receive completion
        routine. */
 
@@ -1055,7 +1062,6 @@ NTSTATUS TdiReceiveDatagram(
     PCHAR Buffer,
     UINT BufferLength,
     PTDI_CONNECTION_INFORMATION Addr,
-    PIO_STATUS_BLOCK Iosb,
     PIO_COMPLETION_ROUTINE CompletionRoutine,
     PVOID CompletionContext)
 /*
@@ -1090,7 +1096,7 @@ NTSTATUS TdiReceiveDatagram(
                                             DeviceObject,            /* Device object */
                                             TransportObject,         /* File object */
                                             NULL,                    /* Event */
-                                            Iosb);                   /* Status */
+                                            NULL);                   /* Status */
 
     if (!*Irp) {
         AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
@@ -1134,7 +1140,7 @@ NTSTATUS TdiReceiveDatagram(
                             Addr,
                             Flags);                 /* Length of data */
 
-    TdiCall(*Irp, DeviceObject, NULL, Iosb);
+    TdiCall(*Irp, DeviceObject, NULL, NULL);
     /* Does not block...  The MDL is deleted in the receive completion
        routine. */
 
@@ -1148,7 +1154,6 @@ NTSTATUS TdiSendDatagram(
     PCHAR Buffer,
     UINT BufferLength,
     PTDI_CONNECTION_INFORMATION Addr,
-    PIO_STATUS_BLOCK Iosb,
     PIO_COMPLETION_ROUTINE CompletionRoutine,
     PVOID CompletionContext)
 /*
@@ -1181,11 +1186,17 @@ NTSTATUS TdiSendDatagram(
         return STATUS_INVALID_PARAMETER;
     }
 
+    if (BufferLength == 0)
+    {
+        AFD_DbgPrint(MID_TRACE, ("Succeeding send with length 0.\n"));
+        return STATUS_SUCCESS;
+    }
+
     *Irp = TdiBuildInternalDeviceControlIrp(TDI_SEND_DATAGRAM,       /* Sub function */
                                             DeviceObject,            /* Device object */
                                             TransportObject,         /* File object */
                                             NULL,                    /* Event */
-                                            Iosb);                   /* Status */
+                                            NULL);                   /* Status */
 
     if (!*Irp) {
         AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
@@ -1208,7 +1219,7 @@ NTSTATUS TdiSendDatagram(
     }
 
     _SEH2_TRY {
-        MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess);
+        MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoReadAccess);
     } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
         AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
         IoFreeMdl(Mdl);
@@ -1228,7 +1239,7 @@ NTSTATUS TdiSendDatagram(
                          BufferLength,           /* Bytes to send */
                          Addr);                  /* Address */
 
-    TdiCall(*Irp, DeviceObject, NULL, Iosb);
+    TdiCall(*Irp, DeviceObject, NULL, NULL);
     /* Does not block...  The MDL is deleted in the send completion
        routine. */
 
@@ -1240,7 +1251,6 @@ NTSTATUS TdiDisconnect(
     PFILE_OBJECT TransportObject,
     PLARGE_INTEGER Time,
     USHORT Flags,
-    PIO_STATUS_BLOCK Iosb,
     PIO_COMPLETION_ROUTINE CompletionRoutine,
     PVOID CompletionContext,
     PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
@@ -1264,7 +1274,7 @@ NTSTATUS TdiDisconnect(
                                             DeviceObject,            /* Device object */
                                             TransportObject,         /* File object */
                                             NULL,                    /* Event */
-                                            Iosb);                   /* Status */
+                                            NULL);                   /* Status */
 
     if (!*Irp) {
         AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
@@ -1281,7 +1291,7 @@ NTSTATUS TdiDisconnect(
                        RequestConnectionInfo,  /* Indication of who to disconnect */
                        ReturnConnectionInfo);  /* Indication of who disconnected */
 
-    TdiCall(*Irp, DeviceObject, NULL, Iosb);
+    TdiCall(*Irp, DeviceObject, NULL, NULL);
 
     return STATUS_PENDING;
 }