rename net to network
[reactos.git] / reactos / drivers / net / ndis / ndis / miniport.c
diff --git a/reactos/drivers/net/ndis/ndis/miniport.c b/reactos/drivers/net/ndis/ndis/miniport.c
deleted file mode 100644 (file)
index 3a3710b..0000000
+++ /dev/null
@@ -1,2064 +0,0 @@
-/*
- * COPYRIGHT:   See COPYING in the top level directory
- * PROJECT:     ReactOS NDIS library
- * FILE:        ndis/miniport.c
- * PURPOSE:     Routines used by NDIS miniport drivers
- * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
- *              Vizzini (vizzini@plasmic.com)
- * REVISIONS:
- *   CSH 01/08-2000 Created
- *   20 Aug 2003 vizzini - DMA support
- *   3  Oct 2003 vizzini - SendPackets support
- */
-
-#include "ndissys.h"
-#include "efilter.h"
-
-#ifdef DBG
-#include <buffer.h>
-#endif /* DBG */
-
-#undef NdisMSendComplete
-VOID
-EXPORT
-NdisMSendComplete(
-    IN  NDIS_HANDLE     MiniportAdapterHandle,
-    IN  PNDIS_PACKET    Packet,
-    IN  NDIS_STATUS     Status);
-
-/* Root of the scm database */
-#define SERVICES_ROOT L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"
-
-/*
- * Define to 1 to get a debugger breakpoint at the end of NdisInitializeWrapper
- * for each new miniport starting up
- */
-#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.
- */
-#define ROUTE_DATA_SIZE 256
-
-/* Number of media we know */
-#define MEDIA_ARRAY_SIZE    15
-
-static NDIS_MEDIUM MediaArray[MEDIA_ARRAY_SIZE] =
-{
-    NdisMedium802_3,
-    NdisMedium802_5,
-    NdisMediumFddi,
-    NdisMediumWan,
-    NdisMediumLocalTalk,
-    NdisMediumDix,
-    NdisMediumArcnetRaw,
-    NdisMediumArcnet878_2,
-    NdisMediumAtm,
-    NdisMediumWirelessWan,
-    NdisMediumIrda,
-    NdisMediumBpc,
-    NdisMediumCoWan,
-    NdisMedium1394,
-    NdisMediumMax
-};
-
-/* global list and lock of Miniports NDIS has registered */
-LIST_ENTRY MiniportListHead;
-KSPIN_LOCK MiniportListLock;
-
-/* global list and lock of adapters NDIS has registered */
-LIST_ENTRY AdapterListHead;
-KSPIN_LOCK AdapterListLock;
-
-VOID
-MiniDisplayPacket(
-    PNDIS_PACKET Packet)
-{
-#ifdef DBG
-    ULONG i, Length;
-    UCHAR Buffer[64];
-    if ((DebugTraceLevel & DEBUG_PACKET) > 0) {
-        Length = CopyPacketToBuffer(
-            Buffer,
-            Packet,
-            0,
-            64);
-
-        DbgPrint("*** PACKET START ***");
-
-        for (i = 0; i < Length; i++) {
-            if (i % 12 == 0)
-                DbgPrint("\n%04X ", i);
-            DbgPrint("%02X ", Buffer[i]);
-        }
-
-        DbgPrint("*** PACKET STOP ***\n");
-    }
-#endif /* DBG */
-}
-
-VOID
-MiniDisplayPacket2(
-    PVOID  HeaderBuffer,
-    UINT   HeaderBufferSize,
-    PVOID  LookaheadBuffer,
-    UINT   LookaheadBufferSize)
-{
-#ifdef DBG
-    if ((DebugTraceLevel & DEBUG_PACKET) > 0) {
-        ULONG i, Length;
-        PUCHAR p;
-
-        DbgPrint("*** RECEIVE PACKET START ***\n");
-        DbgPrint("HEADER:");
-        p = HeaderBuffer;
-        for (i = 0; i < HeaderBufferSize; i++) {
-            if (i % 16 == 0)
-                DbgPrint("\n%04X ", i);
-            DbgPrint("%02X ", *p++);
-        }
-
-        DbgPrint("\nFRAME:");
-
-        p = LookaheadBuffer;
-        Length = (LookaheadBufferSize < 64)? LookaheadBufferSize : 64;
-        for (i = 0; i < Length; i++) {
-            if (i % 16 == 0)
-                DbgPrint("\n%04X ", i);
-            DbgPrint("%02X ", *p++);
-        }
-
-        DbgPrint("\n*** RECEIVE PACKET STOP ***\n");
-    }
-#endif /* DBG */
-}
-
-\f
-VOID
-MiniIndicateData(
-    PLOGICAL_ADAPTER    Adapter,
-    NDIS_HANDLE         MacReceiveContext,
-    PVOID               HeaderBuffer,
-    UINT                HeaderBufferSize,
-    PVOID               LookaheadBuffer,
-    UINT                LookaheadBufferSize,
-    UINT                PacketSize)
-/*
- * FUNCTION: Indicate received data to bound protocols
- * ARGUMENTS:
- *     Adapter             = Pointer to logical adapter
- *     MacReceiveContext   = MAC receive context handle
- *     HeaderBuffer        = Pointer to header buffer
- *     HeaderBufferSize    = Size of header buffer
- *     LookaheadBuffer     = Pointer to lookahead buffer
- *     LookaheadBufferSize = Size of lookahead buffer
- *     PacketSize          = Total size of received packet
- */
-{
-  /* 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));
-
-  MiniDisplayPacket2(HeaderBuffer, HeaderBufferSize, LookaheadBuffer, LookaheadBufferSize);
-
-  /*
-   * XXX Think about this.  This is probably broken.  Spinlocks are
-   * taken out for now until i comprehend the Right Way to do this.
-   *
-   * This used to acquire the MiniportBlock spinlock and hold it until
-   * just before the call to ReceiveHandler.  It would then release and
-   * subsequently re-acquire the lock.
-   *
-   * I don't see how this does any good, as it would seem he's just
-   * trying to protect the packet list.  If somebody else dequeues
-   * a packet, we are in fact in bad shape, but we don't want to
-   * necessarily call the receive handler at elevated irql either.
-   *
-   * therefore: We *are* going to call the receive handler at high irql
-   * (due to holding the lock) for now, and eventually we have to
-   * figure out another way to protect this packet list.
-   *
-   * UPDATE: this is busted; this results in a recursive lock acquisition.
-   */
-  //NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
-  //KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
-    {
-      CurrentEntry = Adapter->ProtocolListHead.Flink;
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("CurrentEntry = %x\n", CurrentEntry));
-
-      if (CurrentEntry == &Adapter->ProtocolListHead)
-        {
-          NDIS_DbgPrint(DEBUG_MINIPORT, ("WARNING: No upper protocol layer.\n"));
-        }
-
-      while (CurrentEntry != &Adapter->ProtocolListHead)
-        {
-          AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry);
-         NDIS_DbgPrint(DEBUG_MINIPORT, ("AdapterBinding = %x\n", AdapterBinding));
-
-          /* see above */
-          /* KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); */
-
-#ifdef DBG
-          if(!AdapterBinding)
-            {
-              NDIS_DbgPrint(MIN_TRACE, ("AdapterBinding was null\n"));
-              break;
-            }
-
-          if(!AdapterBinding->ProtocolBinding)
-            {
-              NDIS_DbgPrint(MIN_TRACE, ("AdapterBinding->ProtocolBinding was null\n"));
-              break;
-            }
-
-          if(!AdapterBinding->ProtocolBinding->Chars.ReceiveHandler)
-            {
-              NDIS_DbgPrint(MIN_TRACE, ("AdapterBinding->ProtocolBinding->Chars.ReceiveHandler was null\n"));
-              break;
-            }
-#endif
-
-         NDIS_DbgPrint
-             (MID_TRACE,
-              ("XXX (%x) %x %x %x %x %x %x %x XXX\n",
-               *AdapterBinding->ProtocolBinding->Chars.ReceiveHandler,
-               AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
-               MacReceiveContext,
-               HeaderBuffer,
-               HeaderBufferSize,
-               LookaheadBuffer,
-               LookaheadBufferSize,
-               PacketSize));
-
-          /* call the receive handler */
-          (*AdapterBinding->ProtocolBinding->Chars.ReceiveHandler)(
-              AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
-              MacReceiveContext,
-              HeaderBuffer,
-              HeaderBufferSize,
-              LookaheadBuffer,
-              LookaheadBufferSize,
-              PacketSize);
-
-          /* see above */
-          /* KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); */
-
-          CurrentEntry = CurrentEntry->Flink;
-        }
-    }
-  //KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
-
-  NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n"));
-}
-
-\f
-VOID NTAPI
-MiniIndicateReceivePacket(
-    IN  NDIS_HANDLE    Miniport,
-    IN  PPNDIS_PACKET  PacketArray,
-    IN  UINT           NumberOfPackets)
-/*
- * FUNCTION: receives miniport packet array indications
- * ARGUMENTS:
- *     Miniport: Miniport handle for the adapter
- *     PacketArray: pointer to a list of packet pointers to indicate
- *     NumberOfPackets: number of packets to indicate
- * NOTES:
- *     - This currently is a big temporary hack.  In the future this should
- *       call ProtocolReceivePacket() on each bound protocol if it exists.
- *       For now it just mimics NdisMEthIndicateReceive.
- */
-{
-  UINT i;
-
-  for(i = 0; i < NumberOfPackets; i++)
-    {
-      PCHAR PacketBuffer = 0;
-      UINT PacketLength = 0;
-      PNDIS_BUFFER NdisBuffer = 0;
-
-#define PACKET_TAG (('k' << 24) + ('P' << 16) + ('D' << 8) + 'N')
-
-      NdisAllocateMemoryWithTag((PVOID)&PacketBuffer, 1518, PACKET_TAG);
-      if(!PacketBuffer)
-        {
-          NDIS_DbgPrint(MIN_TRACE, ("insufficient resources\n"));
-          return;
-        }
-
-      NdisQueryPacket(PacketArray[i], NULL, NULL, &NdisBuffer, NULL);
-
-      while(NdisBuffer)
-        {
-          PNDIS_BUFFER CurrentBuffer;
-          PVOID BufferVa;
-          UINT BufferLen;
-
-          NdisQueryBuffer(NdisBuffer, &BufferVa, &BufferLen);
-          memcpy(PacketBuffer + PacketLength, BufferVa, BufferLen);
-          PacketLength += BufferLen;
-
-          CurrentBuffer = NdisBuffer;
-          NdisGetNextBuffer(CurrentBuffer, &NdisBuffer);
-        }
-
-      NDIS_DbgPrint(MID_TRACE, ("indicating a %d-byte packet\n", PacketLength));
-
-      MiniIndicateData(Miniport, NULL, PacketBuffer, 14, PacketBuffer+14, PacketLength-14, PacketLength-14);
-
-      NdisFreeMemory(PacketBuffer, 0, 0);
-    }
-}
-
-\f
-VOID NTAPI
-MiniResetComplete(
-    IN  NDIS_HANDLE MiniportAdapterHandle,
-    IN  NDIS_STATUS Status,
-    IN  BOOLEAN     AddressingReset)
-{
-    UNIMPLEMENTED
-}
-
-
-\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,
-    IN  NDIS_STATUS     Status)
-/*
- * FUNCTION: Forwards a message to the initiating protocol saying
- *           that a packet was handled
- * ARGUMENTS:
- *     NdisAdapterHandle = Handle input to MiniportInitialize
- *     Packet            = Pointer to NDIS packet that was sent
- *     Status            = Status of send operation
- */
-{
-    PADAPTER_BINDING AdapterBinding;
-
-    NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
-
-    AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[0];
-
-    (*AdapterBinding->ProtocolBinding->Chars.SendCompleteHandler)(
-        AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
-        Packet,
-        Status);
-}
-
-
-VOID NTAPI
-MiniSendResourcesAvailable(
-    IN  NDIS_HANDLE MiniportAdapterHandle)
-{
-/*
-    UNIMPLEMENTED
-*/
-}
-
-
-VOID NTAPI
-MiniTransferDataComplete(
-    IN  NDIS_HANDLE     MiniportAdapterHandle,
-    IN  PNDIS_PACKET    Packet,
-    IN  NDIS_STATUS     Status,
-    IN  UINT            BytesTransferred)
-{
-    PADAPTER_BINDING AdapterBinding;
-
-    NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
-
-    AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[0];
-
-    (*AdapterBinding->ProtocolBinding->Chars.SendCompleteHandler)(
-        AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
-        Packet,
-        Status);
-}
-
-\f
-BOOLEAN
-MiniAdapterHasAddress(
-    PLOGICAL_ADAPTER Adapter,
-    PNDIS_PACKET Packet)
-/*
- * FUNCTION: Determines whether a packet has the same destination address as an adapter
- * ARGUMENTS:
- *     Adapter = Pointer to logical adapter object
- *     Packet  = Pointer to NDIS packet
- * RETURNS:
- *     TRUE if the destination address is that of the adapter, FALSE if not
- */
-{
-  UINT Length;
-  PUCHAR Start1;
-  PUCHAR Start2;
-  PNDIS_BUFFER NdisBuffer;
-  UINT BufferLength;
-
-  NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
-
-#ifdef DBG
-  if(!Adapter)
-    {
-      NDIS_DbgPrint(MID_TRACE, ("Adapter object was null\n"));
-      return FALSE;
-    }
-
-  if(!Packet)
-    {
-      NDIS_DbgPrint(MID_TRACE, ("Packet was null\n"));
-      return FALSE;
-    }
-#endif
-
-  NdisQueryPacket(Packet, NULL, NULL, &NdisBuffer, NULL);
-
-  if (!NdisBuffer)
-    {
-      NDIS_DbgPrint(MID_TRACE, ("Packet contains no buffers.\n"));
-      return FALSE;
-    }
-
-  NdisQueryBuffer(NdisBuffer, (PVOID)&Start2, &BufferLength);
-
-  /* FIXME: Should handle fragmented packets */
-
-  switch (Adapter->NdisMiniportBlock.MediaType)
-    {
-      case NdisMedium802_3:
-        Length = ETH_LENGTH_OF_ADDRESS;
-        /* Destination address is the first field */
-        break;
-
-      default:
-        NDIS_DbgPrint(MIN_TRACE, ("Adapter has unsupported media type (0x%X).\n", Adapter->NdisMiniportBlock.MediaType));
-        return FALSE;
-    }
-
-  if (BufferLength < Length)
-    {
-        NDIS_DbgPrint(MID_TRACE, ("Buffer is too small.\n"));
-        return FALSE;
-    }
-
-  Start1 = (PUCHAR)&Adapter->Address;
-  NDIS_DbgPrint(MAX_TRACE, ("packet address: %x:%x:%x:%x:%x:%x adapter address: %x:%x:%x:%x:%x:%x\n",
-      *((char *)Start1), *(((char *)Start1)+1), *(((char *)Start1)+2), *(((char *)Start1)+3), *(((char *)Start1)+4), *(((char *)Start1)+5),
-      *((char *)Start2), *(((char *)Start2)+1), *(((char *)Start2)+2), *(((char *)Start2)+3), *(((char *)Start2)+4), *(((char *)Start2)+5))
-  );
-
-  return (RtlCompareMemory((PVOID)Start1, (PVOID)Start2, Length) == Length);
-}
-
-\f
-PLOGICAL_ADAPTER
-MiniLocateDevice(
-    PNDIS_STRING AdapterName)
-/*
- * FUNCTION: Finds an adapter object by name
- * ARGUMENTS:
- *     AdapterName = Pointer to name of adapter
- * RETURNS:
- *     Pointer to logical adapter object, or NULL if none was found.
- *     If found, the adapter is referenced for the caller. The caller
- *     is responsible for dereferencing after use
- */
-{
-  KIRQL OldIrql;
-  PLIST_ENTRY CurrentEntry;
-  PLOGICAL_ADAPTER Adapter = 0;
-
-  ASSERT(AdapterName);
-
-  NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
-
-  if(IsListEmpty(&AdapterListHead))
-    {
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("No registered miniports for protocol to bind to\n"));
-      return NULL;
-    }
-
-  KeAcquireSpinLock(&AdapterListLock, &OldIrql);
-    {
-      do
-        {
-          CurrentEntry = AdapterListHead.Flink;
-
-          while (CurrentEntry != &AdapterListHead)
-            {
-              Adapter = CONTAINING_RECORD(CurrentEntry, LOGICAL_ADAPTER, ListEntry);
-
-              ASSERT(Adapter);
-
-              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)
-                {
-                  break;
-                }
-
-              Adapter = NULL;
-              CurrentEntry = CurrentEntry->Flink;
-            }
-        } while (0);
-    }
-  KeReleaseSpinLock(&AdapterListLock, OldIrql);
-
-  if(Adapter)
-    {
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("Leaving. Adapter found at 0x%x\n", Adapter));
-    }
-  else
-    {
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("Leaving (adapter not found).\n"));
-    }
-
-  return Adapter;
-}
-
-\f
-NDIS_STATUS
-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         = 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,
- *     and the query is attempted again
- * RETURNS:
- *     Status of operation
- * TODO:
- *     Is there any way to use the buffer provided by the protocol?
- */
-{
-  NDIS_STATUS NdisStatus;
-  ULONG BytesNeeded;
-
-  NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
-
-  /* call the miniport's queryinfo handler */
-  NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
-      Adapter->NdisMiniportBlock.MiniportAdapterContext,
-      Oid,
-      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))
-    {
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("Miniport returned status (0x%X).\n", NdisStatus));
-      return NdisStatus;
-    }
-
-  return NdisStatus;
-}
-
-\f
-NDIS_STATUS
-FASTCALL
-MiniQueueWorkItem(
-    PLOGICAL_ADAPTER     Adapter,
-    NDIS_WORK_ITEM_TYPE  WorkItemType,
-    PVOID                WorkItemContext)
-/*
- * FUNCTION: Queues a work item for execution at a later time
- * ARGUMENTS:
- *     Adapter         = Pointer to the logical adapter object to queue work item on
- *     WorkItemType    = Type of work item to queue
- *     WorkItemContext = Pointer to context information for work item
- * NOTES:
- *     Adapter lock must be held when called
- * RETURNS:
- *     Status of operation
- */
-{
-    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)
-    {
-        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)
-    {
-        Adapter->WorkQueueHead = Item;
-        Adapter->WorkQueueTail = Item;
-    }
-    else
-    {
-        Adapter->WorkQueueTail->Link.Next = (PSINGLE_LIST_ENTRY)Item;
-        Adapter->WorkQueueTail = Item;
-    }
-    
-    KeInsertQueueDpc(&Adapter->NdisMiniportBlock.DeferredDpc, NULL, NULL);
-    
-    return NDIS_STATUS_SUCCESS;
-}
-
-\f
-NDIS_STATUS
-FASTCALL
-MiniDequeueWorkItem(
-    PLOGICAL_ADAPTER    Adapter,
-    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:
- *     Adapter lock must be held when called
- * RETURNS:
- *     Status of operation
- */
-{
-    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;
-    }
-    
-    return NDIS_STATUS_FAILURE;
-}
-
-\f
-NDIS_STATUS
-MiniDoRequest(
-    PNDIS_MINIPORT_BLOCK Adapter,
-    PNDIS_REQUEST NdisRequest)
-/*
- * FUNCTION: Sends a request to a miniport
- * ARGUMENTS:
- *     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->MediaRequest = NdisRequest;
-    
-    switch (NdisRequest->RequestType)
-    {
-    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->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:
-        return NDIS_STATUS_FAILURE;
-    }
-}
-
-\f
-/*
- * @implemented
- */
-#undef NdisMQueryInformationComplete
-VOID
-EXPORT
-NdisMQueryInformationComplete(
-    IN  NDIS_HANDLE MiniportAdapterHandle,
-    IN  NDIS_STATUS Status)
-{
-    PNDIS_MINIPORT_BLOCK MiniportBlock =
-       (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;
-    ASSERT(MiniportBlock);
-    if( MiniportBlock->QueryCompleteHandler )
-       (MiniportBlock->QueryCompleteHandler)(MiniportAdapterHandle, Status);
-}
-
-\f
-VOID NTAPI MiniportDpc(
-    IN PKDPC Dpc,
-    IN PVOID DeferredContext,
-    IN PVOID SystemArgument1,
-    IN PVOID SystemArgument2)
-/*
- * FUNCTION: Deferred routine to handle serialization
- * ARGUMENTS:
- *     Dpc             = Pointer to DPC object
- *     DeferredContext = Pointer to context information (LOGICAL_ADAPTER)
- *     SystemArgument1 = Unused
- *     SystemArgument2 = Unused
- */
-{
-  NDIS_STATUS NdisStatus;
-  PVOID WorkItemContext;
-  NDIS_WORK_ITEM_TYPE WorkItemType;
-  PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext);
-
-  NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
-
-  NdisStatus = 
-      MiniDequeueWorkItem
-      (Adapter, &WorkItemType, &WorkItemContext);
-
-  if (NdisStatus == NDIS_STATUS_SUCCESS)
-    {
-      switch (WorkItemType)
-        {
-          case NdisWorkItemSend:
-            /*
-             * called by ProSend when protocols want to send packets to the miniport
-             */
-#ifdef DBG
-            MiniDisplayPacket((PNDIS_PACKET)WorkItemContext);
-#endif
-            if(Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)
-              {
-                NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n"));
-
-                /*
-                 * XXX assumes single-packet - prolly OK since we'll call something
-                 * different on multi-packet sends
-                 */
-                (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)(
-                    Adapter->NdisMiniportBlock.MiniportAdapterContext, (PPNDIS_PACKET)&WorkItemContext, 1);
-               NdisStatus =
-                   NDIS_GET_PACKET_STATUS((PNDIS_PACKET)WorkItemContext);
-
-                NDIS_DbgPrint(MAX_TRACE, ("back from miniport's SendPackets handler\n"));
-              }
-            else
-              {
-                NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n"));
-
-                NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendHandler)(
-                    Adapter->NdisMiniportBlock.MiniportAdapterContext, (PNDIS_PACKET)WorkItemContext, 0);
-
-                NDIS_DbgPrint(MAX_TRACE, ("back from miniport's Send handler\n"));
-              }
-           if( NdisStatus != NDIS_STATUS_PENDING ) {
-               NdisMSendComplete
-                   ( Adapter, (PNDIS_PACKET)WorkItemContext, NdisStatus );
-               Adapter->MiniportBusy = FALSE;
-           }
-            break;
-
-          case NdisWorkItemSendLoopback:
-            /*
-             * called by ProSend when protocols want to send loopback packets
-             */
-            /* XXX atm ProIndicatePacket sends a packet up via the loopback adapter only */
-            NdisStatus = ProIndicatePacket(Adapter, (PNDIS_PACKET)WorkItemContext);
-            MiniSendComplete((NDIS_HANDLE)Adapter, (PNDIS_PACKET)WorkItemContext, NdisStatus);
-            break;
-
-          case NdisWorkItemReturnPackets:
-            break;
-
-          case NdisWorkItemResetRequested:
-            break;
-
-          case NdisWorkItemResetInProgress:
-            break;
-
-          case NdisWorkItemMiniportCallback:
-            break;
-
-          case NdisWorkItemRequest:
-            NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, (PNDIS_REQUEST)WorkItemContext);
-
-            if (NdisStatus == NDIS_STATUS_PENDING)
-              break;
-
-            switch (((PNDIS_REQUEST)WorkItemContext)->RequestType)
-              {
-                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:
-                  NDIS_DbgPrint(MIN_TRACE, ("Unknown NDIS request type.\n"));
-                  break;
-              }
-            break;
-
-          default:
-            NDIS_DbgPrint(MIN_TRACE, ("Unknown NDIS work item type (%d).\n", WorkItemType));
-            break;
-        }
-    }
-}
-
-\f
-VOID
-NTAPI
-MiniStatus(
-    IN NDIS_HANDLE  MiniportHandle,
-    IN NDIS_STATUS  GeneralStatus,
-    IN PVOID  StatusBuffer,
-    IN UINT  StatusBufferSize)
-{
-    UNIMPLEMENTED
-}
-
-\f
-VOID
-NTAPI
-MiniStatusComplete(
-    IN NDIS_HANDLE  MiniportAdapterHandle)
-{
-    UNIMPLEMENTED
-}
-
-\f
-/*
- * @unimplemented
- */
-VOID
-EXPORT
-NdisMCloseLog(
-    IN  NDIS_HANDLE LogHandle)
-{
-    UNIMPLEMENTED
-}
-
-\f
-/*
- * @unimplemented
- */
-NDIS_STATUS
-EXPORT
-NdisMCreateLog(
-    IN  NDIS_HANDLE     MiniportAdapterHandle,
-    IN  UINT            Size,
-    OUT PNDIS_HANDLE    LogHandle)
-{
-    UNIMPLEMENTED
-
-  return NDIS_STATUS_FAILURE;
-}
-
-\f
-/*
- * @implemented
- */
-VOID
-EXPORT
-NdisMDeregisterAdapterShutdownHandler(
-    IN  NDIS_HANDLE MiniportHandle)
-/*
- * FUNCTION: de-registers a shutdown handler
- * ARGUMENTS:  MiniportHandle:  Handle passed into MiniportInitialize
- */
-{
-  PLOGICAL_ADAPTER  Adapter = (PLOGICAL_ADAPTER)MiniportHandle;
-
-  NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
-
-  if(Adapter->BugcheckContext->ShutdownHandler)
-    KeDeregisterBugCheckCallback(Adapter->BugcheckContext->CallbackRecord);
-}
-
-\f
-/*
- * @unimplemented
- */
-VOID
-EXPORT
-NdisMFlushLog(
-    IN  NDIS_HANDLE LogHandle)
-{
-    UNIMPLEMENTED
-}
-
-/*
- * @unimplemented
- */
-#undef NdisMIndicateStatus
-VOID
-EXPORT
-NdisMIndicateStatus(
-    IN  NDIS_HANDLE MiniportAdapterHandle,
-    IN  NDIS_STATUS GeneralStatus,
-    IN  PVOID       StatusBuffer,
-    IN  UINT        StatusBufferSize)
-{
-    UNIMPLEMENTED
-}
-
-/*
- * @unimplemented
- */
-#undef NdisMIndicateStatusComplete
-VOID
-EXPORT
-NdisMIndicateStatusComplete(
-    IN  NDIS_HANDLE MiniportAdapterHandle)
-{
-    UNIMPLEMENTED
-}
-
-\f
-/*
- * @implemented
- */
-VOID
-EXPORT
-NdisInitializeWrapper(
-    OUT PNDIS_HANDLE    NdisWrapperHandle,
-    IN  PVOID           SystemSpecific1,
-    IN  PVOID           SystemSpecific2,
-    IN  PVOID           SystemSpecific3)
-/*
- * FUNCTION: Notifies the NDIS library that a new miniport is initializing
- * ARGUMENTS:
- *     NdisWrapperHandle = Address of buffer to place NDIS wrapper handle
- *     SystemSpecific1   = Pointer to the driver's driver object
- *     SystemSpecific2   = Pointer to the driver's registry path
- *     SystemSpecific3   = Always NULL
- * NOTES:
- *     - SystemSpecific2 goes invalid so we copy it
- */
-{
-  PNDIS_M_DRIVER_BLOCK Miniport;
-  PUNICODE_STRING RegistryPath;
-  WCHAR *RegistryBuffer;
-
-  NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
-
-  ASSERT(NdisWrapperHandle);
-
-  *NdisWrapperHandle = NULL;
-
-#if BREAK_ON_MINIPORT_INIT
-  __asm__ ("int $3\n");
-#endif
-
-  Miniport = ExAllocatePool(NonPagedPool, sizeof(NDIS_M_DRIVER_BLOCK));
-
-  if (!Miniport)
-    {
-      NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
-      return;
-    }
-
-  RtlZeroMemory(Miniport, sizeof(NDIS_M_DRIVER_BLOCK));
-
-  KeInitializeSpinLock(&Miniport->Lock);
-
-  Miniport->DriverObject = (PDRIVER_OBJECT)SystemSpecific1;
-
-  /* set the miniport's driver registry path */
-  RegistryPath = ExAllocatePool(PagedPool, sizeof(UNICODE_STRING));
-  if(!RegistryPath)
-    {
-      NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
-      return;
-    }
-
-  RegistryPath->Length = ((PUNICODE_STRING)SystemSpecific2)->Length;
-  RegistryPath->MaximumLength = RegistryPath->Length + sizeof(WCHAR);  /* room for 0-term */
-
-  RegistryBuffer = ExAllocatePool(PagedPool, RegistryPath->MaximumLength);
-  if(!RegistryBuffer)
-    {
-      NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
-      return;
-    }
-
-  RtlCopyMemory(RegistryBuffer, ((PUNICODE_STRING)SystemSpecific2)->Buffer, RegistryPath->Length);
-  RegistryBuffer[RegistryPath->Length/sizeof(WCHAR)] = 0;
-
-  RegistryPath->Buffer = RegistryBuffer;
-  Miniport->RegistryPath = RegistryPath;
-
-  InitializeListHead(&Miniport->DeviceList);
-
-  /* Put miniport in global miniport list */
-  ExInterlockedInsertTailList(&MiniportListHead, &Miniport->ListEntry, &MiniportListLock);
-
-  *NdisWrapperHandle = Miniport;
-}
-
-\f
-VOID NTAPI NdisIBugcheckCallback(
-    IN PVOID   Buffer,
-    IN ULONG   Length)
-/*
- * FUNCTION:  Internal callback for handling bugchecks - calls adapter's shutdown handler
- * ARGUMENTS:
- *     Buffer:  Pointer to a bugcheck callback context
- *     Length:  Unused
- */
-{
-  PMINIPORT_BUGCHECK_CONTEXT Context = (PMINIPORT_BUGCHECK_CONTEXT)Buffer;
-  ADAPTER_SHUTDOWN_HANDLER sh = (ADAPTER_SHUTDOWN_HANDLER)Context->ShutdownHandler;
-
-   NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
-
-  if(sh)
-    sh(Context->DriverContext);
-}
-
-\f
-/*
- * @implemented
- */
-VOID
-EXPORT
-NdisMRegisterAdapterShutdownHandler(
-    IN  NDIS_HANDLE                 MiniportHandle,
-    IN  PVOID                       ShutdownContext,
-    IN  ADAPTER_SHUTDOWN_HANDLER    ShutdownHandler)
-/*
- * FUNCTION:  Register a shutdown handler for an adapter
- * ARGUMENTS:
- *     MiniportHandle:  Handle originally passed into MiniportInitialize
- *     ShutdownContext:  Pre-initialized bugcheck context
- *     ShutdownHandler:  Function to call to handle the bugcheck
- * NOTES:
- *     - I'm not sure about ShutdownContext
- *     - FIXME - memory leak below
- */
-{
-  PLOGICAL_ADAPTER            Adapter = (PLOGICAL_ADAPTER)MiniportHandle;
-  PMINIPORT_BUGCHECK_CONTEXT  BugcheckContext = Adapter->BugcheckContext;
-
-  NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
-
-  if(BugcheckContext)
-    return;
-
-  BugcheckContext = ExAllocatePool(NonPagedPool, sizeof(MINIPORT_BUGCHECK_CONTEXT));
-  if(!BugcheckContext)
-    {
-      NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
-      return;
-    }
-
-  BugcheckContext->ShutdownHandler = ShutdownHandler;
-  BugcheckContext->DriverContext = ShutdownContext;
-
-  /* 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,
-      BugcheckContext, sizeof(BugcheckContext), (PUCHAR)"Ndis Miniport");
-}
-
-\f
-NDIS_STATUS
-DoQueries(
-    PLOGICAL_ADAPTER Adapter,
-    NDIS_OID AddressOID)
-/*
- * FUNCTION: Queries miniport for information
- * ARGUMENTS:
- *     Adapter    = Pointer to logical adapter
- *     AddressOID = OID to use to query for current address
- * RETURNS:
- *     Status of operation
- */
-{
-  ULONG BytesWritten;
-  NDIS_STATUS NdisStatus;
-
-  NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
-
-  /* Get MAC options for adapter */
-  NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAC_OPTIONS, sizeof(UINT), 
-                                    &Adapter->NdisMiniportBlock.MacOptions,
-                                    &BytesWritten);
-
-  if (NdisStatus != NDIS_STATUS_SUCCESS)
-    {
-      NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAC_OPTIONS failed. NdisStatus (0x%X).\n", NdisStatus));
-      return NdisStatus;
-    }
-
-  NDIS_DbgPrint(DEBUG_MINIPORT, ("MacOptions (0x%X).\n", Adapter->NdisMiniportBlock.MacOptions));
-
-  /* Get current hardware address of adapter */
-  NdisStatus = MiniQueryInformation(Adapter, AddressOID, Adapter->AddressLength,
-                                    &Adapter->Address, &BytesWritten);
-
-  if (NdisStatus != NDIS_STATUS_SUCCESS)
-    {
-      NDIS_DbgPrint(MIN_TRACE, ("Address OID (0x%X) failed. NdisStatus (0x%X).\n", AddressOID, NdisStatus));
-      return NdisStatus;
-    }
-
-#ifdef DBG
-    {
-      /* 802.3 only */
-
-      PUCHAR A = (PUCHAR)&Adapter->Address.Type.Medium802_3;
-
-      NDIS_DbgPrint(MAX_TRACE, ("Adapter address is (%02X %02X %02X %02X %02X %02X).\n", A[0], A[1], A[2], A[3], A[4], A[5]));
-    }
-#endif /* DBG */
-
-  /* Get maximum lookahead buffer size of adapter */
-  NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAXIMUM_LOOKAHEAD, sizeof(ULONG),
-                                    &Adapter->NdisMiniportBlock.MaximumLookahead, &BytesWritten);
-
-  if (NdisStatus != NDIS_STATUS_SUCCESS)
-    {
-      NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAXIMUM_LOOKAHEAD failed. NdisStatus (0x%X).\n", NdisStatus));
-      return NdisStatus;
-    }
-
-  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, sizeof(ULONG),
-                                    &Adapter->NdisMiniportBlock.CurrentLookahead, &BytesWritten);
-
-  if (NdisStatus != NDIS_STATUS_SUCCESS)
-    {
-      NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_CURRENT_LOOKAHEAD failed. NdisStatus (0x%X).\n", NdisStatus));
-      return NdisStatus;
-    }
-
-  NDIS_DbgPrint(DEBUG_MINIPORT, ("CurLookaheadLength (0x%X).\n", Adapter->NdisMiniportBlock.CurrentLookahead));
-
-  if (Adapter->NdisMiniportBlock.MaximumLookahead != 0)
-    {
-      Adapter->LookaheadLength = Adapter->NdisMiniportBlock.MaximumLookahead + Adapter->MediumHeaderSize;
-      Adapter->LookaheadBuffer = ExAllocatePool(NonPagedPool, Adapter->LookaheadLength);
-
-      if (!Adapter->LookaheadBuffer)
-        return NDIS_STATUS_RESOURCES;
-    }
-
-  return STATUS_SUCCESS;
-}
-
-\f
-NTSTATUS
-NTAPI
-NdisIForwardIrpAndWaitCompletionRoutine(
-    PDEVICE_OBJECT Fdo,
-    PIRP Irp,
-    PVOID Context)
-{
-  PKEVENT Event = Context;
-
-  if (Irp->PendingReturned)
-    KeSetEvent(Event, IO_NO_INCREMENT, FALSE);
-
-  return STATUS_MORE_PROCESSING_REQUIRED;
-}
-
-\f
-NTSTATUS
-NTAPI
-NdisIForwardIrpAndWait(PLOGICAL_ADAPTER Adapter, PIRP Irp)
-{
-  KEVENT Event;
-  NTSTATUS Status;
-
-  KeInitializeEvent(&Event, NotificationEvent, FALSE);
-  IoCopyCurrentIrpStackLocationToNext(Irp);
-  IoSetCompletionRoutine(Irp, NdisIForwardIrpAndWaitCompletionRoutine, &Event,
-                         TRUE, TRUE, TRUE);
-  Status = IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp);
-  if (Status == STATUS_PENDING)
-    {
-      KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
-      Status = Irp->IoStatus.Status;
-    }
-  return Status;
-}
-
-\f
-NTSTATUS
-NTAPI
-NdisIPnPStartDevice(
-    IN PDEVICE_OBJECT DeviceObject,
-    PIRP Irp)
-/*
- * FUNCTION: Handle the PnP start device event
- * ARGUMENTS:
- *     DeviceObejct = Functional Device Object
- *     Irp          = IRP_MN_START_DEVICE I/O request packet
- * RETURNS:
- *     Status of operation
- */
-{
-  PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
-  PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
-  NDIS_WRAPPER_CONTEXT WrapperContext;
-  NDIS_STATUS NdisStatus;
-  NDIS_STATUS OpenErrorStatus;
-  NTSTATUS Status;
-  UINT SelectedMediumIndex = 0;
-  NDIS_OID AddressOID;
-  BOOLEAN Success = FALSE;
-  ULONG ResourceCount;
-  ULONG ResourceListSize;
-  UNICODE_STRING ParamName;
-  PNDIS_CONFIGURATION_PARAMETER ConfigParam;
-  NDIS_HANDLE ConfigHandle;
-  ULONG Size;
-/* 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);
-  if (!NT_SUCCESS(Status))
-    {
-      NDIS_DbgPrint(MIN_TRACE,("failed to open adapter-specific reg key\n"));
-      return Status;
-    }
-
-  NDIS_DbgPrint(MAX_TRACE, ("opened device reg key\n"));
-
-  WrapperContext.DeviceObject = Adapter->NdisMiniportBlock.DeviceObject;
-
-  /*
-   * Store the adapter resources used by HW routines such as
-   * NdisMQueryAdapterResources.
-   */
-
-  if (Stack->Parameters.StartDevice.AllocatedResources != NULL &&
-      Stack->Parameters.StartDevice.AllocatedResourcesTranslated != NULL)
-    {
-      ResourceCount = Stack->Parameters.StartDevice.AllocatedResources->List[0].
-                      PartialResourceList.Count;
-      ResourceListSize =
-        FIELD_OFFSET(CM_RESOURCE_LIST, List[0].PartialResourceList.
-                     PartialDescriptors[ResourceCount]);
-
-      Adapter->NdisMiniportBlock.AllocatedResources =
-        ExAllocatePool(PagedPool, ResourceListSize);
-      if (Adapter->NdisMiniportBlock.AllocatedResources == NULL)
-        {
-          return STATUS_INSUFFICIENT_RESOURCES;
-        }
-
-      Adapter->NdisMiniportBlock.AllocatedResourcesTranslated =
-        ExAllocatePool(PagedPool, ResourceListSize);
-      if (Adapter->NdisMiniportBlock.AllocatedResourcesTranslated == NULL)
-        {
-          ExFreePool(Adapter->NdisMiniportBlock.AllocatedResources);
-          Adapter->NdisMiniportBlock.AllocatedResources = NULL;
-          return STATUS_INSUFFICIENT_RESOURCES;
-        }
-
-      RtlCopyMemory(Adapter->NdisMiniportBlock.AllocatedResources,
-                    Stack->Parameters.StartDevice.AllocatedResources,
-                    ResourceListSize);
-
-      RtlCopyMemory(Adapter->NdisMiniportBlock.AllocatedResourcesTranslated,
-                    Stack->Parameters.StartDevice.AllocatedResourcesTranslated,
-                    ResourceListSize);
-    }
-
-  /*
-   * 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) || (INTERFACE_TYPE)Adapter->NdisMiniportBlock.BusType == InterfaceTypeUndefined)
-    {
-      NdisInitUnicodeString(&ParamName, L"BusType");
-      NdisReadConfiguration(&NdisStatus, &ConfigParam, ConfigHandle,
-                            &ParamName, NdisParameterInteger);
-      if (NdisStatus == NDIS_STATUS_SUCCESS)
-        Adapter->NdisMiniportBlock.BusType = ConfigParam->ParameterData.IntegerData;
-      else
-        Adapter->NdisMiniportBlock.BusType = Isa;
-    }
-
-  Status = IoGetDeviceProperty(Adapter->NdisMiniportBlock.PhysicalDeviceObject,
-                               DevicePropertyBusNumber, Size,
-                               &Adapter->NdisMiniportBlock.BusNumber, &Size);
-  if (!NT_SUCCESS(Status) || Adapter->NdisMiniportBlock.BusNumber == 0xFFFFFFF0)
-    {
-      NdisInitUnicodeString(&ParamName, L"BusNumber");
-      NdisReadConfiguration(&NdisStatus, &ConfigParam, ConfigHandle,
-                            &ParamName, NdisParameterInteger);
-      if (NdisStatus == NDIS_STATUS_SUCCESS)
-        Adapter->NdisMiniportBlock.BusNumber = ConfigParam->ParameterData.IntegerData;
-      else
-        Adapter->NdisMiniportBlock.BusNumber = 0;
-    }
-  WrapperContext.BusNumber = Adapter->NdisMiniportBlock.BusNumber;
-
-  Status = IoGetDeviceProperty(Adapter->NdisMiniportBlock.PhysicalDeviceObject,
-                               DevicePropertyAddress, Size,
-                               &Adapter->NdisMiniportBlock.SlotNumber, &Size);
-  if (!NT_SUCCESS(Status) || Adapter->NdisMiniportBlock.SlotNumber == (NDIS_INTERFACE_TYPE)-1)
-    {
-      NdisInitUnicodeString(&ParamName, L"SlotNumber");
-      NdisReadConfiguration(&NdisStatus, &ConfigParam, ConfigHandle,
-                            &ParamName, NdisParameterInteger);
-      if (NdisStatus == NDIS_STATUS_SUCCESS)
-        Adapter->NdisMiniportBlock.SlotNumber = ConfigParam->ParameterData.IntegerData;
-      else
-        Adapter->NdisMiniportBlock.SlotNumber = 0;
-    }
-
-  NdisCloseConfiguration(ConfigHandle);
-
-  /*
-   * Call MiniportInitialize.
-   */
-
-  NDIS_DbgPrint(MID_TRACE, ("calling MiniportInitialize\n"));
-  NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.InitializeHandler)(
-    &OpenErrorStatus, &SelectedMediumIndex, &MediaArray[0],
-    MEDIA_ARRAY_SIZE, Adapter, (NDIS_HANDLE)&WrapperContext);
-
-  ZwClose(WrapperContext.RegistryHandle);
-
-  if (NdisStatus != NDIS_STATUS_SUCCESS ||
-      SelectedMediumIndex >= MEDIA_ARRAY_SIZE)
-    {
-      NDIS_DbgPrint(MIN_TRACE, ("MiniportInitialize() failed for an adapter.\n"));
-      return (NTSTATUS)NdisStatus;
-    }
-
-  /* Set handlers (some NDIS macros require these) */
-
-  Adapter->NdisMiniportBlock.EthRxCompleteHandler = EthFilterDprIndicateReceiveComplete;
-  Adapter->NdisMiniportBlock.EthRxIndicateHandler = EthFilterDprIndicateReceive;
-  Adapter->NdisMiniportBlock.SendCompleteHandler  = MiniSendComplete;
-  Adapter->NdisMiniportBlock.SendResourcesHandler = MiniSendResourcesAvailable;
-  Adapter->NdisMiniportBlock.ResetCompleteHandler = MiniResetComplete;
-  Adapter->NdisMiniportBlock.TDCompleteHandler    = MiniTransferDataComplete;
-  Adapter->NdisMiniportBlock.PacketIndicateHandler= MiniIndicateReceivePacket;
-  Adapter->NdisMiniportBlock.StatusHandler        = MiniStatus;
-  Adapter->NdisMiniportBlock.StatusCompleteHandler= MiniStatusComplete;
-
-  Adapter->NdisMiniportBlock.MediaType = MediaArray[SelectedMediumIndex];
-
-  switch (Adapter->NdisMiniportBlock.MediaType)
-    {
-      case NdisMedium802_3:
-        Adapter->MediumHeaderSize = 14;       /* XXX figure out what to do about LLC */
-        AddressOID = OID_802_3_CURRENT_ADDRESS;
-        Adapter->AddressLength = ETH_LENGTH_OF_ADDRESS;
-        NdisStatus = DoQueries(Adapter, AddressOID);
-        if (NdisStatus == NDIS_STATUS_SUCCESS)
-          {
-            Success = EthCreateFilter(32, /* FIXME: Query this from miniport. */
-                                      Adapter->Address.Type.Medium802_3,
-                                      &Adapter->NdisMiniportBlock.EthDB);
-            if (Success)
-              ((PETHI_FILTER)Adapter->NdisMiniportBlock.EthDB)->Miniport = (PNDIS_MINIPORT_BLOCK)Adapter;
-            else
-              NdisStatus = NDIS_STATUS_RESOURCES;
-          }
-        break;
-
-      default:
-        /* FIXME: Support other types of media */
-        NDIS_DbgPrint(MIN_TRACE, ("error: unsupported media\n"));
-        ASSERT(FALSE);
-/* FIXME - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); */
-        return STATUS_UNSUCCESSFUL;
-    }
-
-  if (!Success || NdisStatus != NDIS_STATUS_SUCCESS)
-    {
-      NDIS_DbgPrint(MAX_TRACE, ("couldn't create filter (%x)\n", NdisStatus));
-      if (Adapter->LookaheadBuffer)
-        {
-          ExFreePool(Adapter->LookaheadBuffer);
-          Adapter->LookaheadBuffer = NULL;
-        }
-      return (NTSTATUS)NdisStatus;
-    }
-
-  Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState;
-  Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStarted;
-
-  /* Put adapter in adapter list for this miniport */
-  ExInterlockedInsertTailList(&Adapter->NdisMiniportBlock.DriverHandle->DeviceList, &Adapter->MiniportListEntry, &Adapter->NdisMiniportBlock.DriverHandle->Lock);
-
-  /* Put adapter in global adapter list */
-  ExInterlockedInsertTailList(&AdapterListHead, &Adapter->ListEntry, &AdapterListLock);
-
-  return STATUS_SUCCESS;
-}
-
-\f
-NTSTATUS
-NTAPI
-NdisIPnPStopDevice(
-    IN PDEVICE_OBJECT DeviceObject,
-    PIRP Irp)
-/*
- * FUNCTION: Handle the PnP stop device event
- * ARGUMENTS:
- *     DeviceObejct = Functional Device Object
- *     Irp          = IRP_MN_STOP_DEVICE I/O request packet
- * RETURNS:
- *     Status of operation
- */
-{
-  PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
-  KIRQL OldIrql;
-
-  /* Remove adapter from adapter list for this miniport */
-  KeAcquireSpinLock(&Adapter->NdisMiniportBlock.DriverHandle->Lock, &OldIrql);
-  RemoveEntryList(&Adapter->MiniportListEntry);
-  KeReleaseSpinLock(&Adapter->NdisMiniportBlock.DriverHandle->Lock, OldIrql);
-
-  /* Remove adapter from global adapter list */
-  KeAcquireSpinLock(&AdapterListLock, &OldIrql);
-  RemoveEntryList(&Adapter->ListEntry);
-  KeReleaseSpinLock(&AdapterListLock, OldIrql);
-
-  (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.HaltHandler)(Adapter);
-
-  if (Adapter->LookaheadBuffer)
-    {
-      ExFreePool(Adapter->LookaheadBuffer);
-      Adapter->LookaheadBuffer = NULL;
-    }
-  if (Adapter->NdisMiniportBlock.AllocatedResources)
-    {
-      ExFreePool(Adapter->NdisMiniportBlock.AllocatedResources);
-      Adapter->NdisMiniportBlock.AllocatedResources = NULL;
-    }
-  if (Adapter->NdisMiniportBlock.AllocatedResourcesTranslated)
-    {
-      ExFreePool(Adapter->NdisMiniportBlock.AllocatedResourcesTranslated);
-      Adapter->NdisMiniportBlock.AllocatedResourcesTranslated = NULL;
-    }
-
-  Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState;
-  Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStopped;
-
-  return STATUS_SUCCESS;
-}
-
-\f
-NTSTATUS
-NTAPI
-NdisIDispatchPnp(
-    IN PDEVICE_OBJECT DeviceObject,
-    PIRP Irp)
-{
-  PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
-  PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
-  NTSTATUS Status;
-
-  switch (Stack->MinorFunction)
-    {
-      case IRP_MN_START_DEVICE:
-        Status = NdisIForwardIrpAndWait(Adapter, Irp);
-        if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status))
-          {
-             Status = NdisIPnPStartDevice(DeviceObject, Irp);
-          }
-        Irp->IoStatus.Status = Status;
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-        break;
-
-      case IRP_MN_STOP_DEVICE:
-        Status = NdisIForwardIrpAndWait(Adapter, Irp);
-        if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status))
-          {
-            Status = NdisIPnPStopDevice(DeviceObject, Irp);
-          }
-        Irp->IoStatus.Status = Status;
-        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);
-        break;
-    }
-
-  return Status;
-}
-
-\f
-NTSTATUS
-NTAPI
-NdisIAddDevice(
-    IN PDRIVER_OBJECT DriverObject,
-    IN PDEVICE_OBJECT PhysicalDeviceObject)
-/*
- * FUNCTION: Create a device for an adapter found using PnP
- * ARGUMENTS:
- *     DriverObject         = Pointer to the miniport driver object
- *     PhysicalDeviceObject = Pointer to the PDO for our adapter
- */
-{
-  static const WCHAR ClassKeyName[] = {'C','l','a','s','s','\\'};
-  static const WCHAR LinkageKeyName[] = {'\\','L','i','n','k','a','g','e',0};
-  PNDIS_M_DRIVER_BLOCK Miniport;
-  PNDIS_M_DRIVER_BLOCK *MiniportPtr;
-  WCHAR *LinkageKeyBuffer;
-  ULONG DriverKeyLength;
-  RTL_QUERY_REGISTRY_TABLE QueryTable[2];
-  UNICODE_STRING ExportName;
-  PDEVICE_OBJECT DeviceObject;
-  PLOGICAL_ADAPTER Adapter;
-  NTSTATUS Status;
-
-  /*
-   * Gain the access to the miniport data structure first.
-   */
-
-  MiniportPtr = IoGetDriverObjectExtension(DriverObject, (PVOID)TAG('D','I','M','N'));
-  if (MiniportPtr == NULL)
-    {
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't get driver object extension.\n"));
-      return STATUS_UNSUCCESSFUL;
-    }
-  Miniport = *MiniportPtr;
-
-  /*
-   * Get name of the Linkage registry key for our adapter. It's located under
-   * the driver key for our driver and so we have basicly two ways to do it.
-   * Either we can use IoOpenDriverRegistryKey or compose it using information
-   * 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)
-    {
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't get miniport driver key length.\n"));
-      return Status;
-    }
-
-  LinkageKeyBuffer = ExAllocatePool(PagedPool, DriverKeyLength +
-                                    sizeof(ClassKeyName) + sizeof(LinkageKeyName));
-  if (LinkageKeyBuffer == NULL)
-    {
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't allocate memory for driver key name.\n"));
-      return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-  Status = IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyDriverKeyName,
-                               DriverKeyLength, LinkageKeyBuffer +
-                               (sizeof(ClassKeyName) / sizeof(WCHAR)),
-                               &DriverKeyLength);
-  if (!NT_SUCCESS(Status))
-    {
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't get miniport driver key.\n"));
-      ExFreePool(LinkageKeyBuffer);
-      return Status;
-    }
-
-  /* Compose the linkage key name. */
-  RtlCopyMemory(LinkageKeyBuffer, ClassKeyName, sizeof(ClassKeyName));
-  RtlCopyMemory(LinkageKeyBuffer + ((sizeof(ClassKeyName) + DriverKeyLength) /
-                sizeof(WCHAR)) - 1, LinkageKeyName, sizeof(LinkageKeyName));
-
-  NDIS_DbgPrint(DEBUG_MINIPORT, ("LinkageKey: %S.\n", LinkageKeyBuffer));
-
-  /*
-   * Now open the linkage key and read the "Export" and "RootDevice" values
-   * which contains device name and root service respectively.
-   */
-
-  RtlZeroMemory(QueryTable, sizeof(QueryTable));
-  RtlInitUnicodeString(&ExportName, NULL);
-  QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_DIRECT;
-  QueryTable[0].Name = L"Export";
-  QueryTable[0].EntryContext = &ExportName;
-
-  Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL, LinkageKeyBuffer,
-                                  QueryTable, NULL, NULL);
-  ExFreePool(LinkageKeyBuffer);
-  if (!NT_SUCCESS(Status))
-    {
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't get miniport device name. (%x)\n", Status));
-      return Status;
-    }
-
-  /*
-   * 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))
-    {
-      NDIS_DbgPrint(MIN_TRACE, ("Could not create device object.\n"));
-      RtlFreeUnicodeString(&ExportName);
-      return Status;
-    }
-
-  /*
-   * Initialize the adapter structure.
-   */
-
-  Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
-  KeInitializeSpinLock(&Adapter->NdisMiniportBlock.Lock);
-  InitializeListHead(&Adapter->ProtocolListHead);
-  Adapter->NdisMiniportBlock.DriverHandle = Miniport;
-
-  Adapter->NdisMiniportBlock.MiniportName = ExportName;
-
-  Adapter->NdisMiniportBlock.DeviceObject = DeviceObject;
-  Adapter->NdisMiniportBlock.PhysicalDeviceObject = PhysicalDeviceObject;
-  Adapter->NdisMiniportBlock.NextDeviceObject =
-    IoAttachDeviceToDeviceStack(Adapter->NdisMiniportBlock.DeviceObject,
-                                PhysicalDeviceObject);
-
-  Adapter->NdisMiniportBlock.OldPnPDeviceState = 0;
-  Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceAdded;
-
-  KeInitializeDpc(&Adapter->NdisMiniportBlock.DeferredDpc, MiniportDpc, (PVOID)Adapter);
-
-  DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
-
-  return STATUS_SUCCESS;
-}
-
-\f
-/*
- * @implemented
- */
-NDIS_STATUS
-EXPORT
-NdisMRegisterMiniport(
-    IN  NDIS_HANDLE                     NdisWrapperHandle,
-    IN  PNDIS_MINIPORT_CHARACTERISTICS  MiniportCharacteristics,
-    IN  UINT                            CharacteristicsLength)
-/*
- * FUNCTION: Registers a miniport's MiniportXxx entry points with the NDIS library
- * ARGUMENTS:
- *     NdisWrapperHandle       = Pointer to handle returned by NdisMInitializeWrapper
- *     MiniportCharacteristics = Pointer to a buffer with miniport characteristics
- *     CharacteristicsLength   = Number of bytes in characteristics buffer
- * RETURNS:
- *     Status of operation
- */
-{
-  UINT MinSize;
-  PNDIS_M_DRIVER_BLOCK Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle);
-  PNDIS_M_DRIVER_BLOCK *MiniportPtr;
-  NTSTATUS Status;
-
-  NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
-
-  switch (MiniportCharacteristics->MajorNdisVersion)
-    {
-      case 0x03:
-        MinSize = sizeof(NDIS30_MINIPORT_CHARACTERISTICS);
-        break;
-
-      case 0x04:
-        MinSize = sizeof(NDIS40_MINIPORT_CHARACTERISTICS);
-        break;
-
-      case 0x05:
-        MinSize = sizeof(NDIS50_MINIPORT_CHARACTERISTICS);
-        break;
-
-      default:
-        NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics version.\n"));
-        return NDIS_STATUS_BAD_VERSION;
-    }
-
-  if (CharacteristicsLength < MinSize)
-    {
-        NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n"));
-        return NDIS_STATUS_BAD_CHARACTERISTICS;
-    }
-
-  /* Check if mandatory MiniportXxx functions are specified */
-  if ((!MiniportCharacteristics->HaltHandler) ||
-      (!MiniportCharacteristics->InitializeHandler)||
-      (!MiniportCharacteristics->QueryInformationHandler) ||
-      (!MiniportCharacteristics->ResetHandler) ||
-      (!MiniportCharacteristics->SetInformationHandler))
-    {
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n"));
-      return NDIS_STATUS_BAD_CHARACTERISTICS;
-    }
-
-  if (MiniportCharacteristics->MajorNdisVersion == 0x03)
-    {
-      if (!MiniportCharacteristics->SendHandler)
-        {
-          NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n"));
-          return NDIS_STATUS_BAD_CHARACTERISTICS;
-        }
-    }
-  else if (MiniportCharacteristics->MajorNdisVersion >= 0x04)
-    {
-      /* NDIS 4.0+ */
-      if ((!MiniportCharacteristics->SendHandler) &&
-          (!MiniportCharacteristics->SendPacketsHandler))
-        {
-          NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n"));
-          return NDIS_STATUS_BAD_CHARACTERISTICS;
-        }
-    }
-
-  /* TODO: verify NDIS5 and NDIS5.1 */
-
-  RtlCopyMemory(&Miniport->MiniportCharacteristics, MiniportCharacteristics, MinSize);
-
-  /*
-   * 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(PNDIS_M_DRIVER_BLOCK), (PVOID*)&MiniportPtr);
-  if (!NT_SUCCESS(Status))
-    {
-      NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't allocate driver object extension.\n"));
-      return NDIS_STATUS_RESOURCES;
-    }
-
-  *MiniportPtr = Miniport;
-
-  Miniport->DriverObject->MajorFunction[IRP_MJ_PNP] = NdisIDispatchPnp;
-  Miniport->DriverObject->DriverExtension->AddDevice = NdisIAddDevice;
-
-  return NDIS_STATUS_SUCCESS;
-}
-
-\f
-/*
- * @implemented
- */
-#undef NdisMResetComplete
-VOID
-EXPORT
-NdisMResetComplete(
-    IN NDIS_HANDLE MiniportAdapterHandle,
-    IN NDIS_STATUS Status,
-    IN BOOLEAN     AddressingReset)
-{
-  MiniResetComplete(MiniportAdapterHandle, Status, AddressingReset);
-}
-
-\f
-/*
- * @implemented
- */
-#undef NdisMSendComplete
-VOID
-EXPORT
-NdisMSendComplete(
-    IN  NDIS_HANDLE     MiniportAdapterHandle,
-    IN  PNDIS_PACKET    Packet,
-    IN  NDIS_STATUS     Status)
-/*
- * FUNCTION: Forwards a message to the initiating protocol saying
- *           that a packet was handled
- * ARGUMENTS:
- *     NdisAdapterHandle = Handle input to MiniportInitialize
- *     Packet            = Pointer to NDIS packet that was sent
- *     Status            = Status of send operation
- */
-{
-  MiniSendComplete(MiniportAdapterHandle, Packet, Status);
-}
-
-\f
-/*
- * @implemented
- */
-#undef NdisMSendResourcesAvailable
-VOID
-EXPORT
-NdisMSendResourcesAvailable(
-    IN  NDIS_HANDLE MiniportAdapterHandle)
-{
-  MiniSendResourcesAvailable(MiniportAdapterHandle);
-}
-
-\f
-/*
- * @implemented
- */
-#undef NdisMTransferDataComplete
-VOID
-EXPORT
-NdisMTransferDataComplete(
-    IN  NDIS_HANDLE     MiniportAdapterHandle,
-    IN  PNDIS_PACKET    Packet,
-    IN  NDIS_STATUS     Status,
-    IN  UINT            BytesTransferred)
-{
-  MiniTransferDataComplete(MiniportAdapterHandle, Packet, Status, BytesTransferred);
-}
-
-\f
-/*
- * @implemented
- */
-#undef NdisMSetInformationComplete
-VOID
-EXPORT
-NdisMSetInformationComplete(
-    IN  NDIS_HANDLE MiniportAdapterHandle,
-    IN  NDIS_STATUS Status)
-{
-  (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SetCompleteHandler)(MiniportAdapterHandle, Status);
-}
-
-\f
-/*
- * @implemented
- */
-#undef NdisMSetAttributes
-VOID
-EXPORT
-NdisMSetAttributes(
-    IN  NDIS_HANDLE         MiniportAdapterHandle,
-    IN  NDIS_HANDLE         MiniportAdapterContext,
-    IN  BOOLEAN             BusMaster,
-    IN  NDIS_INTERFACE_TYPE AdapterType)
-/*
- * FUNCTION: Informs the NDIS library of significant features of the caller's NIC
- * ARGUMENTS:
- *     MiniportAdapterHandle  = Handle input to MiniportInitialize
- *     MiniportAdapterContext = Pointer to context information
- *     BusMaster              = Specifies TRUE if the caller's NIC is a busmaster DMA device
- *     AdapterType            = Specifies the I/O bus interface of the caller's NIC
- */
-{
-  NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
-  NdisMSetAttributesEx(MiniportAdapterHandle, MiniportAdapterContext, 0,
-                       BusMaster ? NDIS_ATTRIBUTE_BUS_MASTER : 0,
-                       AdapterType);
-}
-
-\f
-/*
- * @implemented
- */
-VOID
-EXPORT
-NdisMSetAttributesEx(
-    IN  NDIS_HANDLE         MiniportAdapterHandle,
-    IN  NDIS_HANDLE         MiniportAdapterContext,
-    IN  UINT                CheckForHangTimeInSeconds   OPTIONAL,
-    IN  ULONG               AttributeFlags,
-    IN  NDIS_INTERFACE_TYPE    AdapterType)
-/*
- * FUNCTION: Informs the NDIS library of significant features of the caller's NIC
- * ARGUMENTS:
- *     MiniportAdapterHandle     = Handle input to MiniportInitialize
- *     MiniportAdapterContext    = Pointer to context information
- *     CheckForHangTimeInSeconds = Specifies interval in seconds at which
- *                                 MiniportCheckForHang should be called
- *     AttributeFlags            = Bitmask that indicates specific attributes
- *     AdapterType               = Specifies the I/O bus interface of the caller's NIC
- */
-{
-  /* TODO: Take CheckForHandTimeInSeconds into account! */
-
-  PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle);
-
-  NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
-
-  Adapter->NdisMiniportBlock.MiniportAdapterContext = MiniportAdapterContext;
-  Adapter->NdisMiniportBlock.Flags = AttributeFlags;
-  Adapter->NdisMiniportBlock.AdapterType = AdapterType;
-  if (AttributeFlags & NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER)
-    NDIS_DbgPrint(MAX_TRACE, ("Intermediate drivers not supported yet.\n"));
-}
-
-\f
-/*
- * @implemented
- */
-VOID
-EXPORT
-NdisMSleep(
-    IN  ULONG   MicrosecondsToSleep)
-/*
- * FUNCTION: delay the thread's execution for MicrosecondsToSleep
- * ARGUMENTS:
- *     MicrosecondsToSleep: duh...
- * NOTES:
- *     - Because this is a blocking call, current IRQL must be < DISPATCH_LEVEL
- */
-{
-  KTIMER Timer;
-  LARGE_INTEGER DueTime;
-
-  PAGED_CODE();
-
-  DueTime.QuadPart = (-1) * 10 * MicrosecondsToSleep;
-
-  KeInitializeTimer(&Timer);
-  KeSetTimer(&Timer, DueTime, 0);
-  KeWaitForSingleObject(&Timer, Executive, KernelMode, FALSE, 0);
-}
-
-\f
-/*
- * @implemented
- */
-BOOLEAN
-EXPORT
-NdisMSynchronizeWithInterrupt(
-    IN  PNDIS_MINIPORT_INTERRUPT    Interrupt,
-    IN  PVOID                       SynchronizeFunction,
-    IN  PVOID                       SynchronizeContext)
-{
-  return(KeSynchronizeExecution(Interrupt->InterruptObject,
-                               (PKSYNCHRONIZE_ROUTINE)SynchronizeFunction,
-                               SynchronizeContext));
-}
-
-\f
-/*
- * @unimplemented
- */
-NDIS_STATUS
-EXPORT
-NdisMWriteLogData(
-    IN  NDIS_HANDLE LogHandle,
-    IN  PVOID       LogBuffer,
-    IN  UINT        LogBufferSize)
-{
-    UNIMPLEMENTED
-
-  return NDIS_STATUS_FAILURE;
-}
-
-\f
-/*
- * @implemented
- */
-VOID
-EXPORT
-NdisTerminateWrapper(
-    IN  NDIS_HANDLE NdisWrapperHandle,
-    IN  PVOID       SystemSpecific)
-/*
- * FUNCTION: Releases resources allocated by a call to NdisInitializeWrapper
- * ARGUMENTS:
- *     NdisWrapperHandle = Handle returned by NdisInitializeWrapper (NDIS_M_DRIVER_BLOCK)
- *     SystemSpecific    = Always NULL
- */
-{
-  PNDIS_M_DRIVER_BLOCK Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle);
-
-  NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
-
-  ExFreePool(Miniport->RegistryPath->Buffer);
-  ExFreePool(Miniport->RegistryPath);
-  ExFreePool(Miniport);
-}
-
-/* EOF */
-