Implement IRP_MN_QUERY_DEVICE_RELATIONS
[reactos.git] / reactos / drivers / net / ndis / ndis / miniport.c
index 4115adc..c8dd4c4 100644 (file)
@@ -10,7 +10,7 @@
  *   20 Aug 2003 vizzini - DMA support
  *   3  Oct 2003 vizzini - SendPackets support
  */
-#include <roscfg.h>
+
 #include "ndissys.h"
 #include "efilter.h"
 
@@ -80,7 +80,7 @@ MiniDisplayPacket(
     UCHAR Buffer[64];
     if ((DebugTraceLevel & DEBUG_PACKET) > 0) {
         Length = CopyPacketToBuffer(
-            (PUCHAR)&Buffer,
+            Buffer,
             Packet,
             0,
             64);
@@ -228,7 +228,7 @@ MiniIndicateData(
              (MID_TRACE,
               ("XXX (%x) %x %x %x %x %x %x %x XXX\n",
                *AdapterBinding->ProtocolBinding->Chars.ReceiveHandler,
-               AdapterBinding->NdisOpenBlock.NdisCommonOpenBlock.ProtocolBindingContext,
+               AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
                MacReceiveContext,
                HeaderBuffer,
                HeaderBufferSize,
@@ -238,7 +238,7 @@ MiniIndicateData(
 
           /* call the receive handler */
           (*AdapterBinding->ProtocolBinding->Chars.ReceiveHandler)(
-              AdapterBinding->NdisOpenBlock.NdisCommonOpenBlock.ProtocolBindingContext,
+              AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
               MacReceiveContext,
               HeaderBuffer,
               HeaderBufferSize,
@@ -258,7 +258,7 @@ MiniIndicateData(
 }
 
 \f
-VOID STDCALL
+VOID NTAPI
 MiniIndicateReceivePacket(
     IN  NDIS_HANDLE    Miniport,
     IN  PPNDIS_PACKET  PacketArray,
@@ -317,7 +317,7 @@ MiniIndicateReceivePacket(
 }
 
 \f
-VOID STDCALL
+VOID NTAPI
 MiniResetComplete(
     IN  NDIS_HANDLE MiniportAdapterHandle,
     IN  NDIS_STATUS Status,
@@ -327,7 +327,26 @@ MiniResetComplete(
 }
 
 
-VOID STDCALL
+\f
+VOID NTAPI
+MiniRequestComplete(
+    IN PNDIS_MINIPORT_BLOCK Adapter,
+    IN PNDIS_REQUEST Request,
+    IN NDIS_STATUS Status)
+{
+    PNDIS_REQUEST_MAC_BLOCK MacBlock = (PNDIS_REQUEST_MAC_BLOCK)Request->MacReserved;
+
+    NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
+
+    if( MacBlock->Binding->RequestCompleteHandler ) {
+        (*MacBlock->Binding->RequestCompleteHandler)(
+            MacBlock->Binding->ProtocolBindingContext,
+            Request,
+            Status);
+    }
+}
+
+VOID NTAPI
 MiniSendComplete(
     IN  NDIS_HANDLE     MiniportAdapterHandle,
     IN  PNDIS_PACKET    Packet,
@@ -348,13 +367,13 @@ MiniSendComplete(
     AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[0];
 
     (*AdapterBinding->ProtocolBinding->Chars.SendCompleteHandler)(
-        AdapterBinding->NdisOpenBlock.NdisCommonOpenBlock.ProtocolBindingContext,
+        AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
         Packet,
         Status);
 }
 
 
-VOID STDCALL
+VOID NTAPI
 MiniSendResourcesAvailable(
     IN  NDIS_HANDLE MiniportAdapterHandle)
 {
@@ -362,7 +381,7 @@ MiniSendResourcesAvailable(
 }
 
 
-VOID STDCALL
+VOID NTAPI
 MiniTransferDataComplete(
     IN  NDIS_HANDLE     MiniportAdapterHandle,
     IN  PNDIS_PACKET    Packet,
@@ -376,7 +395,7 @@ MiniTransferDataComplete(
     AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[0];
 
     (*AdapterBinding->ProtocolBinding->Chars.SendCompleteHandler)(
-        AdapterBinding->NdisOpenBlock.NdisCommonOpenBlock.ProtocolBindingContext,
+        AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
         Packet,
         Status);
 }
@@ -501,7 +520,6 @@ MiniLocateDevice(
 
               if (RtlCompareUnicodeString(AdapterName, &Adapter->NdisMiniportBlock.MiniportName, TRUE) == 0)
                 {
-                  ReferenceObject(Adapter);
                   break;
                 }
 
@@ -530,13 +548,15 @@ MiniQueryInformation(
     PLOGICAL_ADAPTER    Adapter,
     NDIS_OID            Oid,
     ULONG               Size,
+    PVOID               Buffer,
     PULONG              BytesWritten)
 /*
  * FUNCTION: Queries a logical adapter for properties
  * ARGUMENTS:
  *     Adapter      = Pointer to the logical adapter object to query
  *     Oid          = Specifies the Object ID to query for
- *     Size         = If non-zero overrides the length in the adapter object
+ *     Size         = Size of the passed buffer
+ *     Buffer       = Buffer for the output
  *     BytesWritten = Address of buffer to place number of bytes written
  * NOTES:
  *     If the specified buffer is too small, a new buffer is allocated,
@@ -552,33 +572,17 @@ MiniQueryInformation(
 
   NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
 
-  if (Adapter->QueryBufferLength == 0)
-    {
-      /* XXX is 32 the right number? */
-      Adapter->QueryBuffer = ExAllocatePool(NonPagedPool, (Size == 0)? 32 : Size);
-
-      if (!Adapter->QueryBuffer)
-        {
-          NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
-          return NDIS_STATUS_RESOURCES;
-        }
-
-      /* ditto */
-      Adapter->QueryBufferLength = (Size == 0)? 32 : Size;
-    }
-
-  /* this is the third time i've seen this conditional */
-  BytesNeeded = (Size == 0)? Adapter->QueryBufferLength : Size;
-
   /* call the miniport's queryinfo handler */
-  NdisStatus = (*Adapter->Miniport->Chars.QueryInformationHandler)(
+  NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
       Adapter->NdisMiniportBlock.MiniportAdapterContext,
       Oid,
-      Adapter->QueryBuffer,
-      BytesNeeded,
+      Buffer,
+      Size,
       BytesWritten,
       &BytesNeeded);
 
+  /* FIXME: Wait in pending case! */
+
   /* XXX is status_pending part of success macro? */
   if ((NT_SUCCESS(NdisStatus)) || (NdisStatus == NDIS_STATUS_PENDING))
     {
@@ -586,28 +590,6 @@ MiniQueryInformation(
       return NdisStatus;
     }
 
-  if (NdisStatus == NDIS_STATUS_INVALID_LENGTH)
-    {
-      ExFreePool(Adapter->QueryBuffer);
-
-      Adapter->QueryBufferLength += BytesNeeded;
-      Adapter->QueryBuffer = ExAllocatePool(NonPagedPool, Adapter->QueryBufferLength);
-
-      if (!Adapter->QueryBuffer)
-        {
-          NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
-          return NDIS_STATUS_RESOURCES;
-        }
-
-      NdisStatus = (*Adapter->Miniport->Chars.QueryInformationHandler)(
-          Adapter->NdisMiniportBlock.MiniportAdapterContext,
-          Oid,
-          Adapter->QueryBuffer,
-          Adapter->QueryBufferLength,
-          BytesWritten,
-          &BytesNeeded);
-    }
-
   return NdisStatus;
 }
 
@@ -615,9 +597,9 @@ MiniQueryInformation(
 NDIS_STATUS
 FASTCALL
 MiniQueueWorkItem(
-    PLOGICAL_ADAPTER    Adapter,
-    NDIS_WORK_ITEM_TYPE WorkItemType,
-    PVOID               WorkItemContext)
+    PLOGICAL_ADAPTER     Adapter,
+    NDIS_WORK_ITEM_TYPE  WorkItemType,
+    PVOID                WorkItemContext)
 /*
  * FUNCTION: Queues a work item for execution at a later time
  * ARGUMENTS:
@@ -630,49 +612,39 @@ MiniQueueWorkItem(
  *     Status of operation
  */
 {
-  PNDIS_MINIPORT_WORK_ITEM Item;
-
-  NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
-
-  ASSERT(Adapter);
-  ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
-
-#if 0
-  if (Adapter->WorkQueueLevel < NDIS_MINIPORT_WORK_QUEUE_SIZE - 1)
-    {
-      Item = &Adapter->WorkQueue[Adapter->WorkQueueLevel];
-      Adapter->WorkQueueLevel++;
-    }
-  else
-#endif
+    PNDIS_MINIPORT_WORK_ITEM Item;
+
+    NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
+    
+    ASSERT(Adapter);
+    ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
+    
+    Item = ExAllocatePool(NonPagedPool, sizeof(NDIS_MINIPORT_WORK_ITEM));
+    if (Item == NULL)
     {
-      Item = ExAllocatePool(NonPagedPool, sizeof(NDIS_MINIPORT_WORK_ITEM));
-      if (Item == NULL)
-        {
-          NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
-          return NDIS_STATUS_RESOURCES;
-        }
+        NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
+        return NDIS_STATUS_RESOURCES;
     }
-
-  Item->WorkItemType    = WorkItemType;
-  Item->WorkItemContext = WorkItemContext;
-
-  /* safe due to adapter lock held */
-  Item->Link.Next = NULL;
-  if (!Adapter->WorkQueueHead)
+    
+    Item->WorkItemType    = WorkItemType;
+    Item->WorkItemContext = WorkItemContext;
+    
+    /* safe due to adapter lock held */
+    Item->Link.Next = NULL;
+    if (!Adapter->WorkQueueHead)
     {
-      Adapter->WorkQueueHead = Item;
-      Adapter->WorkQueueTail = Item;
+        Adapter->WorkQueueHead = Item;
+        Adapter->WorkQueueTail = Item;
     }
-  else
+    else
     {
-      Adapter->WorkQueueTail->Link.Next = (PSINGLE_LIST_ENTRY)Item;
-      Adapter->WorkQueueTail = Item;
+        Adapter->WorkQueueTail->Link.Next = (PSINGLE_LIST_ENTRY)Item;
+        Adapter->WorkQueueTail = Item;
     }
-
-  KeInsertQueueDpc(&Adapter->MiniportDpc, NULL, NULL);
-
-  return NDIS_STATUS_SUCCESS;
+    
+    KeInsertQueueDpc(&Adapter->NdisMiniportBlock.DeferredDpc, NULL, NULL);
+    
+    return NDIS_STATUS_SUCCESS;
 }
 
 \f
@@ -686,6 +658,7 @@ MiniDequeueWorkItem(
  * FUNCTION: Dequeues a work item from the work queue of a logical adapter
  * ARGUMENTS:
  *     Adapter         = Pointer to the logical adapter object to dequeue work item from
+ *     AdapterBinding  = Address of buffer for adapter binding for this request
  *     WorkItemType    = Address of buffer for work item type
  *     WorkItemContext = Address of buffer for pointer to context information
  * NOTES:
@@ -694,81 +667,81 @@ MiniDequeueWorkItem(
  *     Status of operation
  */
 {
-  PNDIS_MINIPORT_WORK_ITEM Item;
-
-  NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
-
-  Item = Adapter->WorkQueueHead;
-
-  if (Item)
+    PNDIS_MINIPORT_WORK_ITEM Item;
+    
+    NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
+    
+    Item = Adapter->WorkQueueHead;
+    
+    if (Item)
     {
-      /* safe due to adapter lock held */
-      Adapter->WorkQueueHead = (PNDIS_MINIPORT_WORK_ITEM)Item->Link.Next;
-
-      if (Item == Adapter->WorkQueueTail)
-        Adapter->WorkQueueTail = NULL;
-
-      *WorkItemType    = Item->WorkItemType;
-      *WorkItemContext = Item->WorkItemContext;
-
-      ExFreePool(Item);
-
-      return NDIS_STATUS_SUCCESS;
+        /* safe due to adapter lock held */
+        Adapter->WorkQueueHead = (PNDIS_MINIPORT_WORK_ITEM)Item->Link.Next;
+        
+        if (Item == Adapter->WorkQueueTail)
+            Adapter->WorkQueueTail = NULL;
+        
+        *WorkItemType    = Item->WorkItemType;
+        *WorkItemContext = Item->WorkItemContext;
+        
+        ExFreePool(Item);
+        
+        return NDIS_STATUS_SUCCESS;
     }
-
-  return NDIS_STATUS_FAILURE;
+    
+    return NDIS_STATUS_FAILURE;
 }
 
 \f
 NDIS_STATUS
 MiniDoRequest(
-    PLOGICAL_ADAPTER Adapter,
+    PNDIS_MINIPORT_BLOCK Adapter,
     PNDIS_REQUEST NdisRequest)
 /*
  * FUNCTION: Sends a request to a miniport
  * ARGUMENTS:
- *     Adapter     = Pointer to logical adapter object
- *     NdisRequest = Pointer to NDIS request structure describing request
+ *     AdapterBinding = Pointer to binding used in the request
+ *     NdisRequest    = Pointer to NDIS request structure describing request
  * RETURNS:
  *     Status of operation
  */
 {
-  NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
-
-  Adapter->NdisMiniportBlock.MediaRequest = NdisRequest;
-
-  switch (NdisRequest->RequestType)
+    NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
+    
+    Adapter->MediaRequest = NdisRequest;
+    
+    switch (NdisRequest->RequestType)
     {
-      case NdisRequestQueryInformation:
-        return (*Adapter->Miniport->Chars.QueryInformationHandler)(
-            Adapter->NdisMiniportBlock.MiniportAdapterContext,
+    case NdisRequestQueryInformation:
+        return (*Adapter->DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
+            Adapter->MiniportAdapterContext,
             NdisRequest->DATA.QUERY_INFORMATION.Oid,
             NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
             NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
             (PULONG)&NdisRequest->DATA.QUERY_INFORMATION.BytesWritten,
             (PULONG)&NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded);
         break;
-
-      case NdisRequestSetInformation:
-        return (*Adapter->Miniport->Chars.SetInformationHandler)(
-            Adapter->NdisMiniportBlock.MiniportAdapterContext,
+        
+    case NdisRequestSetInformation:
+        return (*Adapter->DriverHandle->MiniportCharacteristics.SetInformationHandler)(
+            Adapter->MiniportAdapterContext,
             NdisRequest->DATA.SET_INFORMATION.Oid,
             NdisRequest->DATA.SET_INFORMATION.InformationBuffer,
             NdisRequest->DATA.SET_INFORMATION.InformationBufferLength,
             (PULONG)&NdisRequest->DATA.SET_INFORMATION.BytesRead,
             (PULONG)&NdisRequest->DATA.SET_INFORMATION.BytesNeeded);
         break;
-
-      default:
+        
+    default:
         return NDIS_STATUS_FAILURE;
     }
 }
 
 \f
-#undef NdisMQueryInformationComplete
 /*
  * @implemented
  */
+#undef NdisMQueryInformationComplete
 VOID
 EXPORT
 NdisMQueryInformationComplete(
@@ -783,7 +756,7 @@ NdisMQueryInformationComplete(
 }
 
 \f
-VOID STDCALL MiniportDpc(
+VOID NTAPI MiniportDpc(
     IN PKDPC Dpc,
     IN PVOID DeferredContext,
     IN PVOID SystemArgument1,
@@ -804,7 +777,9 @@ VOID STDCALL MiniportDpc(
 
   NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
 
-  NdisStatus = MiniDequeueWorkItem(Adapter, &WorkItemType, &WorkItemContext);
+  NdisStatus = 
+      MiniDequeueWorkItem
+      (Adapter, &WorkItemType, &WorkItemContext);
 
   if (NdisStatus == NDIS_STATUS_SUCCESS)
     {
@@ -817,7 +792,7 @@ VOID STDCALL MiniportDpc(
 #ifdef DBG
             MiniDisplayPacket((PNDIS_PACKET)WorkItemContext);
 #endif
-            if(Adapter->Miniport->Chars.SendPacketsHandler)
+            if(Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)
               {
                 NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n"));
 
@@ -825,7 +800,7 @@ VOID STDCALL MiniportDpc(
                  * XXX assumes single-packet - prolly OK since we'll call something
                  * different on multi-packet sends
                  */
-                (*Adapter->Miniport->Chars.SendPacketsHandler)(
+                (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)(
                     Adapter->NdisMiniportBlock.MiniportAdapterContext, (PPNDIS_PACKET)&WorkItemContext, 1);
                NdisStatus =
                    NDIS_GET_PACKET_STATUS((PNDIS_PACKET)WorkItemContext);
@@ -836,7 +811,7 @@ VOID STDCALL MiniportDpc(
               {
                 NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n"));
 
-                NdisStatus = (*Adapter->Miniport->Chars.SendHandler)(
+                NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendHandler)(
                     Adapter->NdisMiniportBlock.MiniportAdapterContext, (PNDIS_PACKET)WorkItemContext, 0);
 
                 NDIS_DbgPrint(MAX_TRACE, ("back from miniport's Send handler\n"));
@@ -866,14 +841,11 @@ VOID STDCALL MiniportDpc(
           case NdisWorkItemResetInProgress:
             break;
 
-          case NdisWorkItemHalt:
-            break;
-
           case NdisWorkItemMiniportCallback:
             break;
 
           case NdisWorkItemRequest:
-            NdisStatus = MiniDoRequest(Adapter, (PNDIS_REQUEST)WorkItemContext);
+            NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, (PNDIS_REQUEST)WorkItemContext);
 
             if (NdisStatus == NDIS_STATUS_PENDING)
               break;
@@ -882,10 +854,12 @@ VOID STDCALL MiniportDpc(
               {
                 case NdisRequestQueryInformation:
                  NdisMQueryInformationComplete((NDIS_HANDLE)Adapter, NdisStatus);
+                  MiniRequestComplete( &Adapter->NdisMiniportBlock, (PNDIS_REQUEST)WorkItemContext, NdisStatus );
                   break;
 
                 case NdisRequestSetInformation:
                   NdisMSetInformationComplete((NDIS_HANDLE)Adapter, NdisStatus);
+                  MiniRequestComplete( &Adapter->NdisMiniportBlock, (PNDIS_REQUEST)WorkItemContext, NdisStatus );
                   break;
 
                 default:
@@ -942,9 +916,10 @@ NdisMDeregisterAdapterShutdownHandler(
  * ARGUMENTS:  MiniportHandle:  Handle passed into MiniportInitialize
  */
 {
-  NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
   PLOGICAL_ADAPTER  Adapter = (PLOGICAL_ADAPTER)MiniportHandle;
 
+  NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
+
   if(Adapter->BugcheckContext->ShutdownHandler)
     KeDeregisterBugCheckCallback(Adapter->BugcheckContext->CallbackRecord);
 }
@@ -961,11 +936,10 @@ NdisMFlushLog(
     UNIMPLEMENTED
 }
 
-#undef NdisMIndicateStatus
-
 /*
  * @unimplemented
  */
+#undef NdisMIndicateStatus
 VOID
 EXPORT
 NdisMIndicateStatus(
@@ -977,11 +951,10 @@ NdisMIndicateStatus(
     UNIMPLEMENTED
 }
 
-#undef NdisMIndicateStatusComplete
-
 /*
  * @unimplemented
  */
+#undef NdisMIndicateStatusComplete
 VOID
 EXPORT
 NdisMIndicateStatusComplete(
@@ -1012,7 +985,7 @@ NdisInitializeWrapper(
  *     - SystemSpecific2 goes invalid so we copy it
  */
 {
-  PMINIPORT_DRIVER Miniport;
+  PNDIS_M_DRIVER_BLOCK Miniport;
   PUNICODE_STRING RegistryPath;
   WCHAR *RegistryBuffer;
 
@@ -1026,7 +999,7 @@ NdisInitializeWrapper(
   __asm__ ("int $3\n");
 #endif
 
-  Miniport = ExAllocatePool(NonPagedPool, sizeof(MINIPORT_DRIVER));
+  Miniport = ExAllocatePool(NonPagedPool, sizeof(NDIS_M_DRIVER_BLOCK));
 
   if (!Miniport)
     {
@@ -1034,12 +1007,10 @@ NdisInitializeWrapper(
       return;
     }
 
-  RtlZeroMemory(Miniport, sizeof(MINIPORT_DRIVER));
+  RtlZeroMemory(Miniport, sizeof(NDIS_M_DRIVER_BLOCK));
 
   KeInitializeSpinLock(&Miniport->Lock);
 
-  Miniport->RefCount = 1;
-
   Miniport->DriverObject = (PDRIVER_OBJECT)SystemSpecific1;
 
   /* set the miniport's driver registry path */
@@ -1066,7 +1037,7 @@ NdisInitializeWrapper(
   RegistryPath->Buffer = RegistryBuffer;
   Miniport->RegistryPath = RegistryPath;
 
-  InitializeListHead(&Miniport->AdapterListHead);
+  InitializeListHead(&Miniport->DeviceList);
 
   /* Put miniport in global miniport list */
   ExInterlockedInsertTailList(&MiniportListHead, &Miniport->ListEntry, &MiniportListLock);
@@ -1075,7 +1046,7 @@ NdisInitializeWrapper(
 }
 
 \f
-VOID STDCALL NdisIBugcheckCallback(
+VOID NTAPI NdisIBugcheckCallback(
     IN PVOID   Buffer,
     IN ULONG   Length)
 /*
@@ -1160,7 +1131,9 @@ DoQueries(
   NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
 
   /* Get MAC options for adapter */
-  NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAC_OPTIONS, 0, &BytesWritten);
+  NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAC_OPTIONS, sizeof(UINT), 
+                                    &Adapter->NdisMiniportBlock.MacOptions,
+                                    &BytesWritten);
 
   if (NdisStatus != NDIS_STATUS_SUCCESS)
     {
@@ -1168,12 +1141,11 @@ DoQueries(
       return NdisStatus;
     }
 
-  RtlCopyMemory(&Adapter->NdisMiniportBlock.MacOptions, Adapter->QueryBuffer, sizeof(UINT));
-
   NDIS_DbgPrint(DEBUG_MINIPORT, ("MacOptions (0x%X).\n", Adapter->NdisMiniportBlock.MacOptions));
 
   /* Get current hardware address of adapter */
-  NdisStatus = MiniQueryInformation(Adapter, AddressOID, 0, &BytesWritten);
+  NdisStatus = MiniQueryInformation(Adapter, AddressOID, Adapter->AddressLength,
+                                    &Adapter->Address, &BytesWritten);
 
   if (NdisStatus != NDIS_STATUS_SUCCESS)
     {
@@ -1181,7 +1153,6 @@ DoQueries(
       return NdisStatus;
     }
 
-  RtlCopyMemory(&Adapter->Address, Adapter->QueryBuffer, Adapter->AddressLength);
 #ifdef DBG
     {
       /* 802.3 only */
@@ -1193,7 +1164,8 @@ DoQueries(
 #endif /* DBG */
 
   /* Get maximum lookahead buffer size of adapter */
-  NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAXIMUM_LOOKAHEAD, 0, &BytesWritten);
+  NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAXIMUM_LOOKAHEAD, sizeof(ULONG),
+                                    &Adapter->NdisMiniportBlock.MaximumLookahead, &BytesWritten);
 
   if (NdisStatus != NDIS_STATUS_SUCCESS)
     {
@@ -1201,12 +1173,11 @@ DoQueries(
       return NdisStatus;
     }
 
-  Adapter->NdisMiniportBlock.MaximumLookahead = *((PULONG)Adapter->QueryBuffer);
-
   NDIS_DbgPrint(DEBUG_MINIPORT, ("MaxLookaheadLength (0x%X).\n", Adapter->NdisMiniportBlock.MaximumLookahead));
 
   /* Get current lookahead buffer size of adapter */
-  NdisStatus = MiniQueryInformation(Adapter, OID_GEN_CURRENT_LOOKAHEAD, 0, &BytesWritten);
+  NdisStatus = MiniQueryInformation(Adapter, OID_GEN_CURRENT_LOOKAHEAD, sizeof(ULONG),
+                                    &Adapter->NdisMiniportBlock.CurrentLookahead, &BytesWritten);
 
   if (NdisStatus != NDIS_STATUS_SUCCESS)
     {
@@ -1214,8 +1185,6 @@ DoQueries(
       return NdisStatus;
     }
 
-  Adapter->NdisMiniportBlock.CurrentLookahead = *((PULONG)Adapter->QueryBuffer);
-
   NDIS_DbgPrint(DEBUG_MINIPORT, ("CurLookaheadLength (0x%X).\n", Adapter->NdisMiniportBlock.CurrentLookahead));
 
   if (Adapter->NdisMiniportBlock.MaximumLookahead != 0)
@@ -1232,7 +1201,7 @@ DoQueries(
 
 \f
 NTSTATUS
-STDCALL
+NTAPI
 NdisIForwardIrpAndWaitCompletionRoutine(
     PDEVICE_OBJECT Fdo,
     PIRP Irp,
@@ -1248,7 +1217,7 @@ NdisIForwardIrpAndWaitCompletionRoutine(
 
 \f
 NTSTATUS
-STDCALL
+NTAPI
 NdisIForwardIrpAndWait(PLOGICAL_ADAPTER Adapter, PIRP Irp)
 {
   KEVENT Event;
@@ -1269,7 +1238,7 @@ NdisIForwardIrpAndWait(PLOGICAL_ADAPTER Adapter, PIRP Irp)
 
 \f
 NTSTATUS
-STDCALL
+NTAPI
 NdisIPnPStartDevice(
     IN PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
@@ -1366,7 +1335,7 @@ NdisIPnPStartDevice(
   Status = IoGetDeviceProperty(Adapter->NdisMiniportBlock.PhysicalDeviceObject,
                                DevicePropertyLegacyBusType, Size,
                                &Adapter->NdisMiniportBlock.BusType, &Size);
-  if (!NT_SUCCESS(Status) || Adapter->NdisMiniportBlock.BusType == -1)
+  if (!NT_SUCCESS(Status) || (INTERFACE_TYPE)Adapter->NdisMiniportBlock.BusType == InterfaceTypeUndefined)
     {
       NdisInitUnicodeString(&ParamName, L"BusType");
       NdisReadConfiguration(&NdisStatus, &ConfigParam, ConfigHandle,
@@ -1380,7 +1349,7 @@ NdisIPnPStartDevice(
   Status = IoGetDeviceProperty(Adapter->NdisMiniportBlock.PhysicalDeviceObject,
                                DevicePropertyBusNumber, Size,
                                &Adapter->NdisMiniportBlock.BusNumber, &Size);
-  if (!NT_SUCCESS(Status) || Adapter->NdisMiniportBlock.BusNumber == -1)
+  if (!NT_SUCCESS(Status) || Adapter->NdisMiniportBlock.BusNumber == 0xFFFFFFF0)
     {
       NdisInitUnicodeString(&ParamName, L"BusNumber");
       NdisReadConfiguration(&NdisStatus, &ConfigParam, ConfigHandle,
@@ -1395,7 +1364,7 @@ NdisIPnPStartDevice(
   Status = IoGetDeviceProperty(Adapter->NdisMiniportBlock.PhysicalDeviceObject,
                                DevicePropertyAddress, Size,
                                &Adapter->NdisMiniportBlock.SlotNumber, &Size);
-  if (!NT_SUCCESS(Status) || Adapter->NdisMiniportBlock.SlotNumber == -1)
+  if (!NT_SUCCESS(Status) || Adapter->NdisMiniportBlock.SlotNumber == (NDIS_INTERFACE_TYPE)-1)
     {
       NdisInitUnicodeString(&ParamName, L"SlotNumber");
       NdisReadConfiguration(&NdisStatus, &ConfigParam, ConfigHandle,
@@ -1413,7 +1382,7 @@ NdisIPnPStartDevice(
    */
 
   NDIS_DbgPrint(MID_TRACE, ("calling MiniportInitialize\n"));
-  NdisStatus = (*Adapter->Miniport->Chars.InitializeHandler)(
+  NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.InitializeHandler)(
     &OpenErrorStatus, &SelectedMediumIndex, &MediaArray[0],
     MEDIA_ARRAY_SIZE, Adapter, (NDIS_HANDLE)&WrapperContext);
 
@@ -1449,9 +1418,9 @@ NdisIPnPStartDevice(
           {
             Success = EthCreateFilter(32, /* FIXME: Query this from miniport. */
                                       Adapter->Address.Type.Medium802_3,
-                                      &Adapter->NdisMiniportBlock.FilterDbs.EthDB);
+                                      &Adapter->NdisMiniportBlock.EthDB);
             if (Success)
-              Adapter->NdisMiniportBlock.FilterDbs.EthDB->Miniport = (PNDIS_MINIPORT_BLOCK)Adapter;
+              ((PETHI_FILTER)Adapter->NdisMiniportBlock.EthDB)->Miniport = (PNDIS_MINIPORT_BLOCK)Adapter;
             else
               NdisStatus = NDIS_STATUS_RESOURCES;
           }
@@ -1480,7 +1449,7 @@ NdisIPnPStartDevice(
   Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStarted;
 
   /* Put adapter in adapter list for this miniport */
-  ExInterlockedInsertTailList(&Adapter->Miniport->AdapterListHead, &Adapter->MiniportListEntry, &Adapter->Miniport->Lock);
+  ExInterlockedInsertTailList(&Adapter->NdisMiniportBlock.DriverHandle->DeviceList, &Adapter->MiniportListEntry, &Adapter->NdisMiniportBlock.DriverHandle->Lock);
 
   /* Put adapter in global adapter list */
   ExInterlockedInsertTailList(&AdapterListHead, &Adapter->ListEntry, &AdapterListLock);
@@ -1490,7 +1459,7 @@ NdisIPnPStartDevice(
 
 \f
 NTSTATUS
-STDCALL
+NTAPI
 NdisIPnPStopDevice(
     IN PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
@@ -1507,16 +1476,16 @@ NdisIPnPStopDevice(
   KIRQL OldIrql;
 
   /* Remove adapter from adapter list for this miniport */
-  KeAcquireSpinLock(&Adapter->Miniport->Lock, &OldIrql);
+  KeAcquireSpinLock(&Adapter->NdisMiniportBlock.DriverHandle->Lock, &OldIrql);
   RemoveEntryList(&Adapter->MiniportListEntry);
-  KeReleaseSpinLock(&Adapter->Miniport->Lock, OldIrql);
+  KeReleaseSpinLock(&Adapter->NdisMiniportBlock.DriverHandle->Lock, OldIrql);
 
   /* Remove adapter from global adapter list */
   KeAcquireSpinLock(&AdapterListLock, &OldIrql);
   RemoveEntryList(&Adapter->ListEntry);
   KeReleaseSpinLock(&AdapterListLock, OldIrql);
 
-  (*Adapter->Miniport->Chars.HaltHandler)(Adapter);
+  (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.HaltHandler)(Adapter);
 
   if (Adapter->LookaheadBuffer)
     {
@@ -1542,7 +1511,7 @@ NdisIPnPStopDevice(
 
 \f
 NTSTATUS
-STDCALL
+NTAPI
 NdisIDispatchPnp(
     IN PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
@@ -1564,9 +1533,6 @@ NdisIDispatchPnp(
         break;
 
       case IRP_MN_STOP_DEVICE:
-        /* FIXME */
-        Status = STATUS_UNSUCCESSFUL;
-        break;
         Status = NdisIForwardIrpAndWait(Adapter, Irp);
         if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status))
           {
@@ -1576,6 +1542,12 @@ NdisIDispatchPnp(
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
         break;
 
+      case IRP_MN_QUERY_DEVICE_RELATIONS:
+        Status = STATUS_NOT_SUPPORTED;
+        Irp->IoStatus.Status = Status;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        break;
+
       default:
         IoSkipCurrentIrpStackLocation(Irp);
         Status = IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp);
@@ -1587,7 +1559,7 @@ NdisIDispatchPnp(
 
 \f
 NTSTATUS
-STDCALL
+NTAPI
 NdisIAddDevice(
     IN PDRIVER_OBJECT DriverObject,
     IN PDEVICE_OBJECT PhysicalDeviceObject)
@@ -1600,8 +1572,8 @@ NdisIAddDevice(
 {
   static const WCHAR ClassKeyName[] = {'C','l','a','s','s','\\'};
   static const WCHAR LinkageKeyName[] = {'\\','L','i','n','k','a','g','e',0};
-  PMINIPORT_DRIVER Miniport;
-  PMINIPORT_DRIVER *MiniportPtr;
+  PNDIS_M_DRIVER_BLOCK Miniport;
+  PNDIS_M_DRIVER_BLOCK *MiniportPtr;
   WCHAR *LinkageKeyBuffer;
   ULONG DriverKeyLength;
   RTL_QUERY_REGISTRY_TABLE QueryTable[2];
@@ -1707,8 +1679,7 @@ NdisIAddDevice(
   Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
   KeInitializeSpinLock(&Adapter->NdisMiniportBlock.Lock);
   InitializeListHead(&Adapter->ProtocolListHead);
-  Adapter->RefCount = 1;
-  Adapter->Miniport = Miniport;
+  Adapter->NdisMiniportBlock.DriverHandle = Miniport;
 
   Adapter->NdisMiniportBlock.MiniportName = ExportName;
 
@@ -1721,7 +1692,7 @@ NdisIAddDevice(
   Adapter->NdisMiniportBlock.OldPnPDeviceState = 0;
   Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceAdded;
 
-  KeInitializeDpc(&Adapter->MiniportDpc, MiniportDpc, (PVOID)Adapter);
+  KeInitializeDpc(&Adapter->NdisMiniportBlock.DeferredDpc, MiniportDpc, (PVOID)Adapter);
 
   DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
 
@@ -1749,8 +1720,8 @@ NdisMRegisterMiniport(
  */
 {
   UINT MinSize;
-  PMINIPORT_DRIVER Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle);
-  PMINIPORT_DRIVER *MiniportPtr;
+  PNDIS_M_DRIVER_BLOCK Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle);
+  PNDIS_M_DRIVER_BLOCK *MiniportPtr;
   NTSTATUS Status;
 
   NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
@@ -1812,15 +1783,15 @@ NdisMRegisterMiniport(
 
   /* TODO: verify NDIS5 and NDIS5.1 */
 
-  RtlCopyMemory(&Miniport->Chars, MiniportCharacteristics, MinSize);
+  RtlCopyMemory(&Miniport->MiniportCharacteristics, MiniportCharacteristics, MinSize);
 
   /*
-   * NOTE: This is VERY unoptimal! Should we store the MINIPORT_DRIVER
-   * struture in the driver extension or what?
+   * NOTE: This is VERY unoptimal! Should we store the NDIS_M_DRIVER_BLOCK
+   * structure in the driver extension or what?
    */
 
   Status = IoAllocateDriverObjectExtension(Miniport->DriverObject, (PVOID)TAG('D','I','M','N'),
-                                           sizeof(PMINIPORT_DRIVER), (PVOID*)&MiniportPtr);
+                                           sizeof(PNDIS_M_DRIVER_BLOCK), (PVOID*)&MiniportPtr);
   if (!NT_SUCCESS(Status))
     {
       NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't allocate driver object extension.\n"));
@@ -1839,6 +1810,7 @@ NdisMRegisterMiniport(
 /*
  * @implemented
  */
+#undef NdisMResetComplete
 VOID
 EXPORT
 NdisMResetComplete(
@@ -1853,6 +1825,7 @@ NdisMResetComplete(
 /*
  * @implemented
  */
+#undef NdisMSendComplete
 VOID
 EXPORT
 NdisMSendComplete(
@@ -1875,6 +1848,7 @@ NdisMSendComplete(
 /*
  * @implemented
  */
+#undef NdisMSendResourcesAvailable
 VOID
 EXPORT
 NdisMSendResourcesAvailable(
@@ -1887,6 +1861,7 @@ NdisMSendResourcesAvailable(
 /*
  * @implemented
  */
+#undef NdisMTransferDataComplete
 VOID
 EXPORT
 NdisMTransferDataComplete(
@@ -1898,12 +1873,11 @@ NdisMTransferDataComplete(
   MiniTransferDataComplete(MiniportAdapterHandle, Packet, Status, BytesTransferred);
 }
 
-#undef NdisMSetInformationComplete
-
 \f
 /*
  * @implemented
  */
+#undef NdisMSetInformationComplete
 VOID
 EXPORT
 NdisMSetInformationComplete(
@@ -1913,12 +1887,11 @@ NdisMSetInformationComplete(
   (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SetCompleteHandler)(MiniportAdapterHandle, Status);
 }
 
-#undef NdisMSetAttributes
-
 \f
 /*
  * @implemented
  */
+#undef NdisMSetAttributes
 VOID
 EXPORT
 NdisMSetAttributes(
@@ -1973,7 +1946,6 @@ NdisMSetAttributesEx(
   Adapter->NdisMiniportBlock.MiniportAdapterContext = MiniportAdapterContext;
   Adapter->NdisMiniportBlock.Flags = AttributeFlags;
   Adapter->NdisMiniportBlock.AdapterType = AdapterType;
-  Adapter->AttributesSet = TRUE;
   if (AttributeFlags & NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER)
     NDIS_DbgPrint(MAX_TRACE, ("Intermediate drivers not supported yet.\n"));
 }
@@ -2050,11 +2022,11 @@ NdisTerminateWrapper(
 /*
  * FUNCTION: Releases resources allocated by a call to NdisInitializeWrapper
  * ARGUMENTS:
- *     NdisWrapperHandle = Handle returned by NdisInitializeWrapper (MINIPORT_DRIVER)
+ *     NdisWrapperHandle = Handle returned by NdisInitializeWrapper (NDIS_M_DRIVER_BLOCK)
  *     SystemSpecific    = Always NULL
  */
 {
-  PMINIPORT_DRIVER Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle);
+  PNDIS_M_DRIVER_BLOCK Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle);
 
   NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));