Get rid of NdisWorkItemHalt.
[reactos.git] / reactos / drivers / net / ndis / ndis / miniport.c
index 0a792aa..a46668c 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"
 
@@ -35,7 +35,7 @@ NdisMSendComplete(
  */
 #define BREAK_ON_MINIPORT_INIT 0
 
-/* 
+/*
  * This has to be big enough to hold the results of querying the Route value
  * from the Linkage key.  Please re-code me to determine this dynamically.
  */
@@ -44,7 +44,7 @@ NdisMSendComplete(
 /* Number of media we know */
 #define MEDIA_ARRAY_SIZE    15
 
-static NDIS_MEDIUM MediaArray[MEDIA_ARRAY_SIZE] = 
+static NDIS_MEDIUM MediaArray[MEDIA_ARRAY_SIZE] =
 {
     NdisMedium802_3,
     NdisMedium802_5,
@@ -159,7 +159,7 @@ MiniIndicateData(
   /* KIRQL OldIrql; */
   PLIST_ENTRY CurrentEntry;
   PADAPTER_BINDING AdapterBinding;
-  
+
   NDIS_DbgPrint(DEBUG_MINIPORT, ("Called. Adapter (0x%X)  HeaderBuffer (0x%X)  "
       "HeaderBufferSize (0x%X)  LookaheadBuffer (0x%X)  LookaheadBufferSize (0x%X).\n",
       Adapter, HeaderBuffer, HeaderBufferSize, LookaheadBuffer, LookaheadBufferSize));
@@ -191,12 +191,12 @@ MiniIndicateData(
       CurrentEntry = Adapter->ProtocolListHead.Flink;
       NDIS_DbgPrint(DEBUG_MINIPORT, ("CurrentEntry = %x\n", CurrentEntry));
 
-      if (CurrentEntry == &Adapter->ProtocolListHead) 
+      if (CurrentEntry == &Adapter->ProtocolListHead)
         {
           NDIS_DbgPrint(DEBUG_MINIPORT, ("WARNING: No upper protocol layer.\n"));
         }
 
-      while (CurrentEntry != &Adapter->ProtocolListHead) 
+      while (CurrentEntry != &Adapter->ProtocolListHead)
         {
           AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry);
          NDIS_DbgPrint(DEBUG_MINIPORT, ("AdapterBinding = %x\n", AdapterBinding));
@@ -225,10 +225,10 @@ MiniIndicateData(
 #endif
 
          NDIS_DbgPrint
-             (MID_TRACE, 
+             (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,24 @@ MiniResetComplete(
 }
 
 
-VOID STDCALL
+\f
+VOID NTAPI
+MiniRequestComplete(
+    IN PADAPTER_BINDING AdapterBinding,
+    IN PNDIS_REQUEST Request,
+    IN  NDIS_STATUS Status)
+{
+    NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
+
+    if( AdapterBinding->ProtocolBinding->Chars.RequestCompleteHandler ) {
+        (*AdapterBinding->ProtocolBinding->Chars.RequestCompleteHandler)(
+            AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
+            Request,
+            Status);
+    }
+}
+
+VOID NTAPI
 MiniSendComplete(
     IN  NDIS_HANDLE     MiniportAdapterHandle,
     IN  PNDIS_PACKET    Packet,
@@ -348,13 +365,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 +379,7 @@ MiniSendResourcesAvailable(
 }
 
 
-VOID STDCALL
+VOID NTAPI
 MiniTransferDataComplete(
     IN  NDIS_HANDLE     MiniportAdapterHandle,
     IN  PNDIS_PACKET    Packet,
@@ -376,7 +393,7 @@ MiniTransferDataComplete(
     AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[0];
 
     (*AdapterBinding->ProtocolBinding->Chars.SendCompleteHandler)(
-        AdapterBinding->NdisOpenBlock.NdisCommonOpenBlock.ProtocolBindingContext,
+        AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
         Packet,
         Status);
 }
@@ -419,7 +436,7 @@ MiniAdapterHasAddress(
 
   NdisQueryPacket(Packet, NULL, NULL, &NdisBuffer, NULL);
 
-  if (!NdisBuffer) 
+  if (!NdisBuffer)
     {
       NDIS_DbgPrint(MID_TRACE, ("Packet contains no buffers.\n"));
       return FALSE;
@@ -429,7 +446,7 @@ MiniAdapterHasAddress(
 
   /* FIXME: Should handle fragmented packets */
 
-  switch (Adapter->NdisMiniportBlock.MediaType) 
+  switch (Adapter->NdisMiniportBlock.MediaType)
     {
       case NdisMedium802_3:
         Length = ETH_LENGTH_OF_ADDRESS;
@@ -441,7 +458,7 @@ MiniAdapterHasAddress(
         return FALSE;
     }
 
-  if (BufferLength < Length) 
+  if (BufferLength < Length)
     {
         NDIS_DbgPrint(MID_TRACE, ("Buffer is too small.\n"));
         return FALSE;
@@ -490,7 +507,7 @@ MiniLocateDevice(
         {
           CurrentEntry = AdapterListHead.Flink;
 
-          while (CurrentEntry != &AdapterListHead) 
+          while (CurrentEntry != &AdapterListHead)
             {
               Adapter = CONTAINING_RECORD(CurrentEntry, LOGICAL_ADAPTER, ListEntry);
 
@@ -499,7 +516,7 @@ MiniLocateDevice(
               NDIS_DbgPrint(DEBUG_MINIPORT, ("AdapterName = %wZ\n", AdapterName));
               NDIS_DbgPrint(DEBUG_MINIPORT, ("DeviceName = %wZ\n", &Adapter->NdisMiniportBlock.MiniportName));
 
-              if (RtlCompareUnicodeString(AdapterName, &Adapter->NdisMiniportBlock.MiniportName, TRUE) == 0) 
+              if (RtlCompareUnicodeString(AdapterName, &Adapter->NdisMiniportBlock.MiniportName, TRUE) == 0)
                 {
                   ReferenceObject(Adapter);
                   break;
@@ -514,7 +531,7 @@ MiniLocateDevice(
 
   if(Adapter)
     {
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("Leaving. Adapter found at 0x%x\n", Adapter)); 
+      NDIS_DbgPrint(DEBUG_MINIPORT, ("Leaving. Adapter found at 0x%x\n", Adapter));
     }
   else
     {
@@ -552,12 +569,12 @@ MiniQueryInformation(
 
   NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
 
-  if (Adapter->QueryBufferLength == 0) 
+  if (Adapter->QueryBufferLength == 0)
     {
       /* XXX is 32 the right number? */
       Adapter->QueryBuffer = ExAllocatePool(NonPagedPool, (Size == 0)? 32 : Size);
 
-      if (!Adapter->QueryBuffer) 
+      if (!Adapter->QueryBuffer)
         {
           NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
           return NDIS_STATUS_RESOURCES;
@@ -580,20 +597,20 @@ MiniQueryInformation(
       &BytesNeeded);
 
   /* XXX is status_pending part of success macro? */
-  if ((NT_SUCCESS(NdisStatus)) || (NdisStatus == NDIS_STATUS_PENDING)) 
+  if ((NT_SUCCESS(NdisStatus)) || (NdisStatus == NDIS_STATUS_PENDING))
     {
       NDIS_DbgPrint(DEBUG_MINIPORT, ("Miniport returned status (0x%X).\n", NdisStatus));
       return NdisStatus;
     }
 
-  if (NdisStatus == NDIS_STATUS_INVALID_LENGTH) 
+  if (NdisStatus == NDIS_STATUS_INVALID_LENGTH)
     {
       ExFreePool(Adapter->QueryBuffer);
 
       Adapter->QueryBufferLength += BytesNeeded;
       Adapter->QueryBuffer = ExAllocatePool(NonPagedPool, Adapter->QueryBufferLength);
 
-      if (!Adapter->QueryBuffer) 
+      if (!Adapter->QueryBuffer)
         {
           NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
           return NDIS_STATUS_RESOURCES;
@@ -603,7 +620,7 @@ MiniQueryInformation(
           Adapter->NdisMiniportBlock.MiniportAdapterContext,
           Oid,
           Adapter->QueryBuffer,
-          Size,
+          Adapter->QueryBufferLength,
           BytesWritten,
           &BytesNeeded);
     }
@@ -615,7 +632,7 @@ MiniQueryInformation(
 NDIS_STATUS
 FASTCALL
 MiniQueueWorkItem(
-    PLOGICAL_ADAPTER    Adapter,
+    PADAPTER_BINDING    AdapterBinding,
     NDIS_WORK_ITEM_TYPE WorkItemType,
     PVOID               WorkItemContext)
 /*
@@ -630,49 +647,51 @@ MiniQueueWorkItem(
  *     Status of operation
  */
 {
-  PNDIS_MINIPORT_WORK_ITEM Item;
-
-  NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
-
-  ASSERT(Adapter);
-  ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
+    PINTERNAL_NDIS_MINIPORT_WORK_ITEM Item;
+    PLOGICAL_ADAPTER Adapter = AdapterBinding->Adapter;
 
+    NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
+    
+    ASSERT(Adapter);
+    ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
+    
 #if 0
-  if (Adapter->WorkQueueLevel < NDIS_MINIPORT_WORK_QUEUE_SIZE - 1) 
+    if (Adapter->WorkQueueLevel < NDIS_MINIPORT_WORK_QUEUE_SIZE - 1)
     {
-      Item = &Adapter->WorkQueue[Adapter->WorkQueueLevel];
-      Adapter->WorkQueueLevel++;
-    } 
-  else 
+        Item = &Adapter->WorkQueue[Adapter->WorkQueueLevel];
+        Adapter->WorkQueueLevel++;
+    }
+    else
 #endif
     {
-      Item = ExAllocatePool(NonPagedPool, sizeof(NDIS_MINIPORT_WORK_ITEM));
-      if (Item == NULL) 
+        Item = ExAllocatePool(NonPagedPool, sizeof(INTERNAL_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->AdapterBinding = AdapterBinding;
+    Item->RealWorkItem.WorkItemType    = WorkItemType;
+    Item->RealWorkItem.WorkItemContext = WorkItemContext;
+    
+    /* safe due to adapter lock held */
+    Item->Link.Next = NULL;
+    if (!Adapter->WorkQueueHead)
     {
-      Adapter->WorkQueueHead = Item;
-      Adapter->WorkQueueTail = Item;
-    } 
-  else 
+        Adapter->WorkQueueHead = Item;
+        Adapter->WorkQueueTail = Item;
+    }
+    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->MiniportDpc, NULL, NULL);
+    
+    return NDIS_STATUS_SUCCESS;
 }
 
 \f
@@ -680,12 +699,14 @@ NDIS_STATUS
 FASTCALL
 MiniDequeueWorkItem(
     PLOGICAL_ADAPTER    Adapter,
+    PADAPTER_BINDING    *AdapterBinding,
     NDIS_WORK_ITEM_TYPE *WorkItemType,
     PVOID               *WorkItemContext)
 /*
  * 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,52 +715,55 @@ MiniDequeueWorkItem(
  *     Status of operation
  */
 {
-  PNDIS_MINIPORT_WORK_ITEM Item;
-
-  NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
-
-  Item = Adapter->WorkQueueHead;
-
-  if (Item) 
+    PINTERNAL_NDIS_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 = (PINTERNAL_NDIS_MINIPORT_WORK_ITEM)Item->Link.Next;
+        
+        if (Item == Adapter->WorkQueueTail)
+            Adapter->WorkQueueTail = NULL;
+        
+        *AdapterBinding  = Item->AdapterBinding;
+        *WorkItemType    = Item->RealWorkItem.WorkItemType;
+        *WorkItemContext = Item->RealWorkItem.WorkItemContext;
+        
+        ExFreePool(Item);
+        
+        return NDIS_STATUS_SUCCESS;
     }
-
-  return NDIS_STATUS_FAILURE;
+    
+    return NDIS_STATUS_FAILURE;
 }
 
 \f
 NDIS_STATUS
 MiniDoRequest(
-    PLOGICAL_ADAPTER Adapter,
+    PADAPTER_BINDING AdapterBinding,
     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;
+    PLOGICAL_ADAPTER Adapter = AdapterBinding->Adapter;
 
-  switch (NdisRequest->RequestType) 
+    NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
+    
+    Adapter->NdisMiniportBlock.MediaRequest = NdisRequest;
+    
+    switch (NdisRequest->RequestType)
     {
-      case NdisRequestQueryInformation:
+    case NdisRequestQueryInformation:
         return (*Adapter->Miniport->Chars.QueryInformationHandler)(
             Adapter->NdisMiniportBlock.MiniportAdapterContext,
             NdisRequest->DATA.QUERY_INFORMATION.Oid,
@@ -748,8 +772,8 @@ MiniDoRequest(
             (PULONG)&NdisRequest->DATA.QUERY_INFORMATION.BytesWritten,
             (PULONG)&NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded);
         break;
-
-      case NdisRequestSetInformation:
+        
+    case NdisRequestSetInformation:
         return (*Adapter->Miniport->Chars.SetInformationHandler)(
             Adapter->NdisMiniportBlock.MiniportAdapterContext,
             NdisRequest->DATA.SET_INFORMATION.Oid,
@@ -758,24 +782,24 @@ MiniDoRequest(
             (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(
     IN  NDIS_HANDLE MiniportAdapterHandle,
     IN  NDIS_STATUS Status)
 {
-    PNDIS_MINIPORT_BLOCK MiniportBlock = 
+    PNDIS_MINIPORT_BLOCK MiniportBlock =
        (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;
     ASSERT(MiniportBlock);
     if( MiniportBlock->QueryCompleteHandler )
@@ -783,7 +807,7 @@ NdisMQueryInformationComplete(
 }
 
 \f
-VOID STDCALL MiniportDpc(
+VOID NTAPI MiniportDpc(
     IN PKDPC Dpc,
     IN PVOID DeferredContext,
     IN PVOID SystemArgument1,
@@ -800,15 +824,18 @@ VOID STDCALL MiniportDpc(
   NDIS_STATUS NdisStatus;
   PVOID WorkItemContext;
   NDIS_WORK_ITEM_TYPE WorkItemType;
+  PADAPTER_BINDING AdapterBinding;
   PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext);
 
   NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
 
-  NdisStatus = MiniDequeueWorkItem(Adapter, &WorkItemType, &WorkItemContext);
+  NdisStatus = 
+      MiniDequeueWorkItem
+      (Adapter, &AdapterBinding, &WorkItemType, &WorkItemContext);
 
-  if (NdisStatus == NDIS_STATUS_SUCCESS) 
+  if (NdisStatus == NDIS_STATUS_SUCCESS)
     {
-      switch (WorkItemType) 
+      switch (WorkItemType)
         {
           case NdisWorkItemSend:
             /*
@@ -827,7 +854,7 @@ VOID STDCALL MiniportDpc(
                  */
                 (*Adapter->Miniport->Chars.SendPacketsHandler)(
                     Adapter->NdisMiniportBlock.MiniportAdapterContext, (PPNDIS_PACKET)&WorkItemContext, 1);
-               NdisStatus = 
+               NdisStatus =
                    NDIS_GET_PACKET_STATUS((PNDIS_PACKET)WorkItemContext);
 
                 NDIS_DbgPrint(MAX_TRACE, ("back from miniport's SendPackets handler\n"));
@@ -866,26 +893,25 @@ VOID STDCALL MiniportDpc(
           case NdisWorkItemResetInProgress:
             break;
 
-          case NdisWorkItemHalt:
-            break;
-
           case NdisWorkItemMiniportCallback:
             break;
 
           case NdisWorkItemRequest:
-            NdisStatus = MiniDoRequest(Adapter, (PNDIS_REQUEST)WorkItemContext);
+            NdisStatus = MiniDoRequest(AdapterBinding, (PNDIS_REQUEST)WorkItemContext);
 
             if (NdisStatus == NDIS_STATUS_PENDING)
               break;
 
-            switch (((PNDIS_REQUEST)WorkItemContext)->RequestType) 
+            switch (((PNDIS_REQUEST)WorkItemContext)->RequestType)
               {
                 case NdisRequestQueryInformation:
                  NdisMQueryInformationComplete((NDIS_HANDLE)Adapter, NdisStatus);
+                  MiniRequestComplete( AdapterBinding, (PNDIS_REQUEST)WorkItemContext, NdisStatus );
                   break;
 
                 case NdisRequestSetInformation:
                   NdisMSetInformationComplete((NDIS_HANDLE)Adapter, NdisStatus);
+                  MiniRequestComplete( AdapterBinding, (PNDIS_REQUEST)WorkItemContext, NdisStatus );
                   break;
 
                 default:
@@ -942,9 +968,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 +988,10 @@ NdisMFlushLog(
     UNIMPLEMENTED
 }
 
-#undef NdisMIndicateStatus
-
 /*
  * @unimplemented
  */
+#undef NdisMIndicateStatus
 VOID
 EXPORT
 NdisMIndicateStatus(
@@ -977,11 +1003,10 @@ NdisMIndicateStatus(
     UNIMPLEMENTED
 }
 
-#undef NdisMIndicateStatusComplete
-
 /*
  * @unimplemented
  */
+#undef NdisMIndicateStatusComplete
 VOID
 EXPORT
 NdisMIndicateStatusComplete(
@@ -1028,7 +1053,7 @@ NdisInitializeWrapper(
 
   Miniport = ExAllocatePool(NonPagedPool, sizeof(MINIPORT_DRIVER));
 
-  if (!Miniport) 
+  if (!Miniport)
     {
       NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
       return;
@@ -1075,7 +1100,7 @@ NdisInitializeWrapper(
 }
 
 \f
-VOID STDCALL NdisIBugcheckCallback(
+VOID NTAPI NdisIBugcheckCallback(
     IN PVOID   Buffer,
     IN ULONG   Length)
 /*
@@ -1092,7 +1117,7 @@ VOID STDCALL NdisIBugcheckCallback(
 
   if(sh)
     sh(Context->DriverContext);
-} 
+}
 
 \f
 /*
@@ -1120,7 +1145,7 @@ NdisMRegisterAdapterShutdownHandler(
 
   NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
 
-  if(BugcheckContext) 
+  if(BugcheckContext)
     return;
 
   BugcheckContext = ExAllocatePool(NonPagedPool, sizeof(MINIPORT_BUGCHECK_CONTEXT));
@@ -1136,7 +1161,7 @@ NdisMRegisterAdapterShutdownHandler(
   /* not sure if this needs to be initialized or not... oh well, it's a leak. */
   BugcheckContext->CallbackRecord = ExAllocatePool(NonPagedPool, sizeof(KBUGCHECK_CALLBACK_RECORD));
 
-  KeRegisterBugCheckCallback(BugcheckContext->CallbackRecord, NdisIBugcheckCallback, 
+  KeRegisterBugCheckCallback(BugcheckContext->CallbackRecord, NdisIBugcheckCallback,
       BugcheckContext, sizeof(BugcheckContext), (PUCHAR)"Ndis Miniport");
 }
 
@@ -1162,7 +1187,7 @@ DoQueries(
   /* Get MAC options for adapter */
   NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAC_OPTIONS, 0, &BytesWritten);
 
-  if (NdisStatus != NDIS_STATUS_SUCCESS) 
+  if (NdisStatus != NDIS_STATUS_SUCCESS)
     {
       NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAC_OPTIONS failed. NdisStatus (0x%X).\n", NdisStatus));
       return NdisStatus;
@@ -1175,7 +1200,7 @@ DoQueries(
   /* Get current hardware address of adapter */
   NdisStatus = MiniQueryInformation(Adapter, AddressOID, 0, &BytesWritten);
 
-  if (NdisStatus != NDIS_STATUS_SUCCESS) 
+  if (NdisStatus != NDIS_STATUS_SUCCESS)
     {
       NDIS_DbgPrint(MIN_TRACE, ("Address OID (0x%X) failed. NdisStatus (0x%X).\n", AddressOID, NdisStatus));
       return NdisStatus;
@@ -1195,7 +1220,7 @@ DoQueries(
   /* Get maximum lookahead buffer size of adapter */
   NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAXIMUM_LOOKAHEAD, 0, &BytesWritten);
 
-  if (NdisStatus != NDIS_STATUS_SUCCESS) 
+  if (NdisStatus != NDIS_STATUS_SUCCESS)
     {
       NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAXIMUM_LOOKAHEAD failed. NdisStatus (0x%X).\n", NdisStatus));
       return NdisStatus;
@@ -1208,7 +1233,7 @@ DoQueries(
   /* Get current lookahead buffer size of adapter */
   NdisStatus = MiniQueryInformation(Adapter, OID_GEN_CURRENT_LOOKAHEAD, 0, &BytesWritten);
 
-  if (NdisStatus != NDIS_STATUS_SUCCESS) 
+  if (NdisStatus != NDIS_STATUS_SUCCESS)
     {
       NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_CURRENT_LOOKAHEAD failed. NdisStatus (0x%X).\n", NdisStatus));
       return NdisStatus;
@@ -1218,7 +1243,7 @@ DoQueries(
 
   NDIS_DbgPrint(DEBUG_MINIPORT, ("CurLookaheadLength (0x%X).\n", Adapter->NdisMiniportBlock.CurrentLookahead));
 
-  if (Adapter->NdisMiniportBlock.MaximumLookahead != 0) 
+  if (Adapter->NdisMiniportBlock.MaximumLookahead != 0)
     {
       Adapter->LookaheadLength = Adapter->NdisMiniportBlock.MaximumLookahead + Adapter->MediumHeaderSize;
       Adapter->LookaheadBuffer = ExAllocatePool(NonPagedPool, Adapter->LookaheadLength);
@@ -1232,7 +1257,7 @@ DoQueries(
 
 \f
 NTSTATUS
-STDCALL
+NTAPI
 NdisIForwardIrpAndWaitCompletionRoutine(
     PDEVICE_OBJECT Fdo,
     PIRP Irp,
@@ -1248,7 +1273,7 @@ NdisIForwardIrpAndWaitCompletionRoutine(
 
 \f
 NTSTATUS
-STDCALL
+NTAPI
 NdisIForwardIrpAndWait(PLOGICAL_ADAPTER Adapter, PIRP Irp)
 {
   KEVENT Event;
@@ -1269,7 +1294,7 @@ NdisIForwardIrpAndWait(PLOGICAL_ADAPTER Adapter, PIRP Irp)
 
 \f
 NTSTATUS
-STDCALL
+NTAPI
 NdisIPnPStartDevice(
     IN PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
@@ -1290,19 +1315,19 @@ NdisIPnPStartDevice(
   NTSTATUS Status;
   UINT SelectedMediumIndex = 0;
   NDIS_OID AddressOID;
-  BOOLEAN Success;
+  BOOLEAN Success = FALSE;
   ULONG ResourceCount;
   ULONG ResourceListSize;
   UNICODE_STRING ParamName;
   PNDIS_CONFIGURATION_PARAMETER ConfigParam;
   NDIS_HANDLE ConfigHandle;
   ULONG Size;
-  KIRQL OldIrql;
+/* FIXME - KIRQL OldIrql; */
 
   /*
    * Prepare wrapper context used by HW and configuration routines.
    */
-  
+
   Status = IoOpenDeviceRegistryKey(
     Adapter->NdisMiniportBlock.PhysicalDeviceObject, PLUGPLAY_REGKEY_DRIVER,
     KEY_ALL_ACCESS, &WrapperContext.RegistryHandle);
@@ -1326,7 +1351,7 @@ NdisIPnPStartDevice(
     {
       ResourceCount = Stack->Parameters.StartDevice.AllocatedResources->List[0].
                       PartialResourceList.Count;
-      ResourceListSize = 
+      ResourceListSize =
         FIELD_OFFSET(CM_RESOURCE_LIST, List[0].PartialResourceList.
                      PartialDescriptors[ResourceCount]);
 
@@ -1349,7 +1374,7 @@ NdisIPnPStartDevice(
       RtlCopyMemory(Adapter->NdisMiniportBlock.AllocatedResources,
                     Stack->Parameters.StartDevice.AllocatedResources,
                     ResourceListSize);
-                
+
       RtlCopyMemory(Adapter->NdisMiniportBlock.AllocatedResourcesTranslated,
                     Stack->Parameters.StartDevice.AllocatedResourcesTranslated,
                     ResourceListSize);
@@ -1359,14 +1384,14 @@ NdisIPnPStartDevice(
    * Store the Bus Type, Bus Number and Slot information. It's used by
    * the hardware routines then.
    */
-    
+
   NdisOpenConfiguration(&NdisStatus, &ConfigHandle, (NDIS_HANDLE)&WrapperContext);
 
   Size = sizeof(ULONG);
   Status = IoGetDeviceProperty(Adapter->NdisMiniportBlock.PhysicalDeviceObject,
                                DevicePropertyLegacyBusType, Size,
                                &Adapter->NdisMiniportBlock.BusType, &Size);
-  if (!NT_SUCCESS(Status) || Adapter->NdisMiniportBlock.BusType == -1)
+  if (!NT_SUCCESS(Status) || Adapter->NdisMiniportBlock.BusType == (NDIS_INTERFACE_TYPE)-1)
     {
       NdisInitUnicodeString(&ParamName, L"BusType");
       NdisReadConfiguration(&NdisStatus, &ConfigParam, ConfigHandle,
@@ -1380,7 +1405,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 == (NDIS_INTERFACE_TYPE)-1)
     {
       NdisInitUnicodeString(&ParamName, L"BusNumber");
       NdisReadConfiguration(&NdisStatus, &ConfigParam, ConfigHandle,
@@ -1395,7 +1420,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,
@@ -1420,7 +1445,7 @@ NdisIPnPStartDevice(
   ZwClose(WrapperContext.RegistryHandle);
 
   if (NdisStatus != NDIS_STATUS_SUCCESS ||
-      SelectedMediumIndex >= MEDIA_ARRAY_SIZE) 
+      SelectedMediumIndex >= MEDIA_ARRAY_SIZE)
     {
       NDIS_DbgPrint(MIN_TRACE, ("MiniportInitialize() failed for an adapter.\n"));
       return (NTSTATUS)NdisStatus;
@@ -1438,7 +1463,7 @@ NdisIPnPStartDevice(
 
   Adapter->NdisMiniportBlock.MediaType = MediaArray[SelectedMediumIndex];
 
-  switch (Adapter->NdisMiniportBlock.MediaType) 
+  switch (Adapter->NdisMiniportBlock.MediaType)
     {
       case NdisMedium802_3:
         Adapter->MediumHeaderSize = 14;       /* XXX figure out what to do about LLC */
@@ -1449,9 +1474,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;
           }
@@ -1461,11 +1486,11 @@ NdisIPnPStartDevice(
         /* FIXME: Support other types of media */
         NDIS_DbgPrint(MIN_TRACE, ("error: unsupported media\n"));
         ASSERT(FALSE);
-        KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
+/* FIXME - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); */
         return STATUS_UNSUCCESSFUL;
     }
 
-  if (!Success || NdisStatus != NDIS_STATUS_SUCCESS) 
+  if (!Success || NdisStatus != NDIS_STATUS_SUCCESS)
     {
       NDIS_DbgPrint(MAX_TRACE, ("couldn't create filter (%x)\n", NdisStatus));
       if (Adapter->LookaheadBuffer)
@@ -1490,7 +1515,7 @@ NdisIPnPStartDevice(
 
 \f
 NTSTATUS
-STDCALL
+NTAPI
 NdisIPnPStopDevice(
     IN PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
@@ -1542,7 +1567,7 @@ NdisIPnPStopDevice(
 
 \f
 NTSTATUS
-STDCALL
+NTAPI
 NdisIDispatchPnp(
     IN PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
@@ -1564,6 +1589,8 @@ 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,7 +1603,8 @@ NdisIDispatchPnp(
 
       default:
         IoSkipCurrentIrpStackLocation(Irp);
-        return IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp);
+        Status = IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp);
+        break;
     }
 
   return Status;
@@ -1584,7 +1612,7 @@ NdisIDispatchPnp(
 
 \f
 NTSTATUS
-STDCALL
+NTAPI
 NdisIAddDevice(
     IN PDRIVER_OBJECT DriverObject,
     IN PDEVICE_OBJECT PhysicalDeviceObject)
@@ -1626,7 +1654,7 @@ NdisIAddDevice(
    * gathered by IoGetDeviceProperty. I choosed the second because
    * IoOpenDriverRegistryKey wasn't implemented at the time of writing.
    */
-  
+
   Status = IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyDriverKeyName,
                                0, NULL, &DriverKeyLength);
   if (Status != STATUS_BUFFER_TOO_SMALL)
@@ -1684,13 +1712,13 @@ NdisIAddDevice(
   /*
    * Create the device object.
    */
-  
+
   NDIS_DbgPrint(MAX_TRACE, ("creating device %wZ\n", &ExportName));
 
   Status = IoCreateDevice(Miniport->DriverObject, sizeof(LOGICAL_ADAPTER),
     &ExportName, FILE_DEVICE_PHYSICAL_NETCARD,
     0, FALSE, &DeviceObject);
-  if (!NT_SUCCESS(Status)) 
+  if (!NT_SUCCESS(Status))
     {
       NDIS_DbgPrint(MIN_TRACE, ("Could not create device object.\n"));
       RtlFreeUnicodeString(&ExportName);
@@ -1717,11 +1745,11 @@ NdisIAddDevice(
 
   Adapter->NdisMiniportBlock.OldPnPDeviceState = 0;
   Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceAdded;
-                                
+
   KeInitializeDpc(&Adapter->MiniportDpc, MiniportDpc, (PVOID)Adapter);
 
   DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
-  
+
   return STATUS_SUCCESS;
 }
 
@@ -1742,7 +1770,7 @@ NdisMRegisterMiniport(
  *     MiniportCharacteristics = Pointer to a buffer with miniport characteristics
  *     CharacteristicsLength   = Number of bytes in characteristics buffer
  * RETURNS:
- *     Status of operation      
+ *     Status of operation
  */
 {
   UINT MinSize;
@@ -1752,7 +1780,7 @@ NdisMRegisterMiniport(
 
   NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
 
-  switch (MiniportCharacteristics->MajorNdisVersion) 
+  switch (MiniportCharacteristics->MajorNdisVersion)
     {
       case 0x03:
         MinSize = sizeof(NDIS30_MINIPORT_CHARACTERISTICS);
@@ -1771,7 +1799,7 @@ NdisMRegisterMiniport(
         return NDIS_STATUS_BAD_VERSION;
     }
 
-  if (CharacteristicsLength < MinSize) 
+  if (CharacteristicsLength < MinSize)
     {
         NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n"));
         return NDIS_STATUS_BAD_CHARACTERISTICS;
@@ -1782,25 +1810,25 @@ NdisMRegisterMiniport(
       (!MiniportCharacteristics->InitializeHandler)||
       (!MiniportCharacteristics->QueryInformationHandler) ||
       (!MiniportCharacteristics->ResetHandler) ||
-      (!MiniportCharacteristics->SetInformationHandler)) 
+      (!MiniportCharacteristics->SetInformationHandler))
     {
       NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n"));
       return NDIS_STATUS_BAD_CHARACTERISTICS;
     }
 
-  if (MiniportCharacteristics->MajorNdisVersion == 0x03) 
+  if (MiniportCharacteristics->MajorNdisVersion == 0x03)
     {
-      if (!MiniportCharacteristics->SendHandler) 
+      if (!MiniportCharacteristics->SendHandler)
         {
           NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n"));
           return NDIS_STATUS_BAD_CHARACTERISTICS;
         }
-    } 
-  else if (MiniportCharacteristics->MajorNdisVersion >= 0x04) 
+    }
+  else if (MiniportCharacteristics->MajorNdisVersion >= 0x04)
     {
       /* NDIS 4.0+ */
       if ((!MiniportCharacteristics->SendHandler) &&
-          (!MiniportCharacteristics->SendPacketsHandler)) 
+          (!MiniportCharacteristics->SendPacketsHandler))
         {
           NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n"));
           return NDIS_STATUS_BAD_CHARACTERISTICS;
@@ -1836,6 +1864,7 @@ NdisMRegisterMiniport(
 /*
  * @implemented
  */
+#undef NdisMResetComplete
 VOID
 EXPORT
 NdisMResetComplete(
@@ -1850,6 +1879,7 @@ NdisMResetComplete(
 /*
  * @implemented
  */
+#undef NdisMSendComplete
 VOID
 EXPORT
 NdisMSendComplete(
@@ -1872,6 +1902,7 @@ NdisMSendComplete(
 /*
  * @implemented
  */
+#undef NdisMSendResourcesAvailable
 VOID
 EXPORT
 NdisMSendResourcesAvailable(
@@ -1884,6 +1915,7 @@ NdisMSendResourcesAvailable(
 /*
  * @implemented
  */
+#undef NdisMTransferDataComplete
 VOID
 EXPORT
 NdisMTransferDataComplete(
@@ -1895,12 +1927,11 @@ NdisMTransferDataComplete(
   MiniTransferDataComplete(MiniportAdapterHandle, Packet, Status, BytesTransferred);
 }
 
-#undef NdisMSetInformationComplete
-
 \f
 /*
  * @implemented
  */
+#undef NdisMSetInformationComplete
 VOID
 EXPORT
 NdisMSetInformationComplete(
@@ -1910,12 +1941,11 @@ NdisMSetInformationComplete(
   (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SetCompleteHandler)(MiniportAdapterHandle, Status);
 }
 
-#undef NdisMSetAttributes
-
 \f
 /*
  * @implemented
  */
+#undef NdisMSetAttributes
 VOID
 EXPORT
 NdisMSetAttributes(