[NDIS]
[reactos.git] / reactos / include / ddk / ndis.h
index e58e5db..afc55c1 100644 (file)
@@ -595,45 +595,54 @@ typedef MDL NDIS_BUFFER, *PNDIS_BUFFER;
 #define NDIS_ATTRIBUTE_NOT_CO_NDIS              0x00000100
 #define NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APIS    0x00000200
 
-
 /* Lock */
 
+#if NDIS_SUPPORT_60_COMPATIBLE_API
+
 typedef union _NDIS_RW_LOCK_REFCOUNT {
-  UINT  RefCount;
-  UCHAR  cacheLine[16];
+  UINT RefCount;
+  UCHAR cacheLine[16];
 } NDIS_RW_LOCK_REFCOUNT;
 
 typedef struct _NDIS_RW_LOCK {
-  __GNU_EXTENSION union {
-    __GNU_EXTENSION struct {
-      KSPIN_LOCK  SpinLock;
-      PVOID  Context;
+  __MINGW_EXTENSION union {
+    __MINGW_EXTENSION struct {
+      KSPIN_LOCK SpinLock;
+      PVOID Context;
+    };
+    UCHAR Reserved[16];
+  };
+  __MINGW_EXTENSION union {
+    NDIS_RW_LOCK_REFCOUNT RefCount[MAXIMUM_PROCESSORS]; 
+    ULONG RefCountEx[sizeof(NDIS_RW_LOCK_REFCOUNT)/sizeof(ULONG) * MAXIMUM_PROCESSORS];
+    __MINGW_EXTENSION struct {
+      KSPIN_LOCK RefCountLock;
+      volatile ULONG SharedRefCount;
+      volatile BOOLEAN WriterWaiting;
     };
-    UCHAR  Reserved[16];
   };
-
-  NDIS_RW_LOCK_REFCOUNT  RefCount[MAXIMUM_PROCESSORS];
 } NDIS_RW_LOCK, *PNDIS_RW_LOCK;
 
 typedef struct _LOCK_STATE {
-  USHORT  LockState;
-  KIRQL  OldIrql;
+  USHORT LockState;
+  KIRQL OldIrql;
 } LOCK_STATE, *PLOCK_STATE;
 
-
+#endif /* NDIS_SUPPORT_60_COMPATIBLE_API */
 
 /* Timer */
 
 typedef VOID
-(NTAPI *PNDIS_TIMER_FUNCTION)(
-       IN PVOID  SystemSpecific1,
-       IN PVOID  FunctionContext,
-       IN PVOID  SystemSpecific2,
-       IN PVOID  SystemSpecific3);
+(NTAPI NDIS_TIMER_FUNCTION)(
+  IN PVOID SystemSpecific1,
+  IN PVOID FunctionContext,
+  IN PVOID SystemSpecific2,
+  IN PVOID SystemSpecific3);
+typedef NDIS_TIMER_FUNCTION *PNDIS_TIMER_FUNCTION;
 
 typedef struct _NDIS_TIMER {
-  KTIMER  Timer;
-  KDPC  Dpc;
+  KTIMER Timer;
+  KDPC Dpc;
 } NDIS_TIMER, *PNDIS_TIMER;
 
 /* Hardware */
@@ -1941,2995 +1950,3212 @@ typedef struct _NDIS_PROTOCOL_CHARACTERISTICS {
 } NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS;
 #endif
 
+#define PROTOCOL_RESERVED_SIZE_IN_PACKET (4 * sizeof(PVOID))
 
+/* Prototypes for NDIS_MINIPORT_CHARACTERISTICS */
 
-/* Buffer management routines */
+typedef BOOLEAN
+(NTAPI *W_CHECK_FOR_HANG_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext);
 
-NDISAPI
-VOID
-NTAPI
-NdisAllocateBuffer(
-  OUT PNDIS_STATUS  Status,
-  OUT PNDIS_BUFFER  *Buffer,
-  IN NDIS_HANDLE  PoolHandle,
-  IN PVOID  VirtualAddress,
-  IN UINT  Length);
+typedef VOID
+(NTAPI *W_DISABLE_INTERRUPT_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext);
 
+typedef VOID
+(NTAPI *W_ENABLE_INTERRUPT_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext);
 
-NDISAPI
-VOID
-NTAPI
-NdisAllocateBufferPool(
-  OUT PNDIS_STATUS  Status,
-  OUT PNDIS_HANDLE  PoolHandle,
-  IN UINT  NumberOfDescriptors);
+typedef VOID
+(NTAPI *W_HALT_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext);
 
-NDISAPI
-VOID
-NTAPI
-NdisAllocatePacket(
-  OUT PNDIS_STATUS  Status,
-  OUT PNDIS_PACKET  *Packet,
-  IN NDIS_HANDLE  PoolHandle);
+typedef VOID
+(NTAPI *W_HANDLE_INTERRUPT_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext);
 
-NDISAPI
-VOID
-NTAPI
-NdisAllocatePacketPool(
-  OUT PNDIS_STATUS  Status,
-  OUT PNDIS_HANDLE  PoolHandle,
-  IN UINT  NumberOfDescriptors,
-  IN UINT  ProtocolReservedLength);
+typedef NDIS_STATUS
+(NTAPI *W_INITIALIZE_HANDLER)(
+  OUT PNDIS_STATUS  OpenErrorStatus,
+  OUT PUINT  SelectedMediumIndex,
+  IN PNDIS_MEDIUM  MediumArray,
+  IN UINT  MediumArraySize,
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN NDIS_HANDLE  WrapperConfigurationContext);
 
-#define PROTOCOL_RESERVED_SIZE_IN_PACKET (4 * sizeof(PVOID))
+typedef VOID
+(NTAPI *W_ISR_HANDLER)(
+  OUT PBOOLEAN  InterruptRecognized,
+  OUT PBOOLEAN  QueueMiniportHandleInterrupt,
+  IN   NDIS_HANDLE  MiniportAdapterContext);
 
-NDISAPI
-VOID
-NTAPI
-NdisCopyBuffer(
-  OUT PNDIS_STATUS  Status,
-  OUT PNDIS_BUFFER  *Buffer,
-  IN NDIS_HANDLE  PoolHandle,
-  IN PVOID  MemoryDescriptor,
-  IN UINT  Offset,
-  IN UINT  Length);
+typedef NDIS_STATUS
+(NTAPI *W_QUERY_INFORMATION_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN NDIS_OID  Oid,
+  IN PVOID  InformationBuffer,
+  IN ULONG  InformationBufferLength,
+  OUT PULONG  BytesWritten,
+  OUT PULONG  BytesNeeded);
 
-NDISAPI
-VOID
-NTAPI
-NdisCopyFromPacketToPacket(
-  IN PNDIS_PACKET  Destination,
-  IN UINT  DestinationOffset,
-  IN UINT  BytesToCopy,
-  IN PNDIS_PACKET  Source,
-  IN UINT  SourceOffset,
-  OUT PUINT  BytesCopied);
+typedef NDIS_STATUS
+(NTAPI *W_RECONFIGURE_HANDLER)(
+  OUT PNDIS_STATUS  OpenErrorStatus,
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN NDIS_HANDLE       WrapperConfigurationContext);
 
-/*
- * VOID
- * NdisCopyLookaheadData(
- *   IN PVOID Destination,
- *   IN PVOID Source,
- *   IN ULONG Length,
- *   IN ULONG ReceiveFlags);
- */
+typedef NDIS_STATUS
+(NTAPI *W_RESET_HANDLER)(
+  OUT PBOOLEAN  AddressingReset,
+  IN NDIS_HANDLE  MiniportAdapterContext);
 
-#if defined(_M_IX86) || defined(_M_AMD64)
-#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions) \
-  RtlCopyMemory(Destination, Source, Length)
-#else
-#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions) \
-  { \
-    if ((MacOptions) & NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA) \
-    { \
-      RtlCopyMemory(_Destination, _Source, _Length); \
-    } \
-    else \
-    { \
-      PUCHAR _Src = (PUCHAR)(Source); \
-      PUCHAR _Dest = (PUCHAR)(Destination); \
-      PUCHAR _End = _Dest + (Length); \
-      while (_Dest < _End) \
-        *_Dest++ = *_Src++; \
-    } \
-  }
-#endif
+typedef NDIS_STATUS
+(NTAPI *W_SEND_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN PNDIS_PACKET  Packet,
+  IN UINT  Flags);
 
-NDISAPI
-VOID
-NTAPI
-NdisDprAllocatePacket(
-  OUT PNDIS_STATUS  Status,
-  OUT PNDIS_PACKET  *Packet,
-  IN NDIS_HANDLE  PoolHandle);
+typedef NDIS_STATUS
+(NTAPI *WM_SEND_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN NDIS_HANDLE  NdisLinkHandle,
+  IN PNDIS_WAN_PACKET  Packet);
 
-NDISAPI
-VOID
-NTAPI
-NdisDprAllocatePacketNonInterlocked(
-  OUT PNDIS_STATUS  Status,
-  OUT PNDIS_PACKET  *Packet,
-  IN NDIS_HANDLE  PoolHandle);
+typedef NDIS_STATUS
+(NTAPI *W_SET_INFORMATION_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN NDIS_OID  Oid,
+  IN PVOID  InformationBuffer,
+  IN ULONG  InformationBufferLength,
+  OUT PULONG  BytesRead,
+  OUT PULONG  BytesNeeded);
 
-NDISAPI
-VOID
-NTAPI
-NdisDprFreePacket(
-  IN PNDIS_PACKET  Packet);
+typedef NDIS_STATUS
+(NTAPI *W_TRANSFER_DATA_HANDLER)(
+  OUT PNDIS_PACKET  Packet,
+  OUT PUINT  BytesTransferred,
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN NDIS_HANDLE  MiniportReceiveContext,
+  IN UINT  ByteOffset,
+  IN UINT  BytesToTransfer);
 
-NDISAPI
-VOID
-NTAPI
-NdisDprFreePacketNonInterlocked(
-  IN PNDIS_PACKET  Packet);
+typedef NDIS_STATUS
+(NTAPI *WM_TRANSFER_DATA_HANDLER)(
+  VOID);
 
-NDISAPI
-VOID
-NTAPI
-NdisFreeBufferPool(
-  IN NDIS_HANDLE  PoolHandle);
 
-NDISAPI
-VOID
-NTAPI
-NdisFreePacket(
-  IN PNDIS_PACKET  Packet);
+/* NDIS structures available only to miniport drivers */
 
-NDISAPI
-VOID
-NTAPI
-NdisFreePacketPool(
-  IN NDIS_HANDLE  PoolHandle);
+#define NDIS30_MINIPORT_CHARACTERISTICS_S \
+  UCHAR  MajorNdisVersion; \
+  UCHAR  MinorNdisVersion; \
+  UINT  Reserved; \
+  W_CHECK_FOR_HANG_HANDLER  CheckForHangHandler; \
+  W_DISABLE_INTERRUPT_HANDLER  DisableInterruptHandler; \
+  W_ENABLE_INTERRUPT_HANDLER  EnableInterruptHandler; \
+  W_HALT_HANDLER  HaltHandler; \
+  W_HANDLE_INTERRUPT_HANDLER  HandleInterruptHandler; \
+  W_INITIALIZE_HANDLER  InitializeHandler; \
+  W_ISR_HANDLER  ISRHandler; \
+  W_QUERY_INFORMATION_HANDLER  QueryInformationHandler; \
+  W_RECONFIGURE_HANDLER  ReconfigureHandler; \
+  W_RESET_HANDLER  ResetHandler; \
+  W_SEND_HANDLER  SendHandler; \
+  W_SET_INFORMATION_HANDLER  SetInformationHandler; \
+  W_TRANSFER_DATA_HANDLER  TransferDataHandler;
 
-NDISAPI
-VOID
-NTAPI
-NdisReturnPackets(
-  IN PNDIS_PACKET  *PacketsToReturn,
-  IN UINT  NumberOfPackets);
+typedef struct _NDIS30_MINIPORT_CHARACTERISTICS {
+  NDIS30_MINIPORT_CHARACTERISTICS_S
+} NDIS30_MINIPORT_CHARACTERISTICS, *PSNDIS30_MINIPORT_CHARACTERISTICS;
 
-NDISAPI
-VOID
-NTAPI
-NdisUnchainBufferAtBack(
-  IN OUT PNDIS_PACKET  Packet,
-  OUT PNDIS_BUFFER  *Buffer);
 
-NDISAPI
-VOID
-NTAPI
-NdisUnchainBufferAtFront(
-  IN OUT PNDIS_PACKET  Packet,
-  OUT PNDIS_BUFFER  *Buffer);
+/* Extensions for NDIS 4.0 miniports */
 
-NDISAPI
-VOID
-NTAPI
-NdisAdjustBufferLength(
-  IN PNDIS_BUFFER  Buffer,
-  IN UINT  Length);
+typedef VOID
+(NTAPI *W_SEND_PACKETS_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN PPNDIS_PACKET  PacketArray,
+  IN UINT  NumberOfPackets);
 
-NDISAPI
-ULONG
-NTAPI
-NdisBufferLength(
-  IN PNDIS_BUFFER  Buffer);
+typedef VOID
+(NTAPI *W_RETURN_PACKET_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN PNDIS_PACKET  Packet);
 
-NDISAPI
-PVOID
-NTAPI
-NdisBufferVirtualAddress(
-  IN PNDIS_BUFFER  Buffer);
+typedef VOID
+(NTAPI *W_ALLOCATE_COMPLETE_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN PVOID  VirtualAddress,
+  IN PNDIS_PHYSICAL_ADDRESS  PhysicalAddress,
+  IN ULONG  Length,
+  IN PVOID  Context);
 
-NDISAPI
-ULONG
-NTAPI
-NDIS_BUFFER_TO_SPAN_PAGES(
-  IN PNDIS_BUFFER  Buffer);
+#ifdef __cplusplus
 
-NDISAPI
-VOID
-NTAPI
-NdisFreeBuffer(
-  IN PNDIS_BUFFER  Buffer);
+#define NDIS40_MINIPORT_CHARACTERISTICS_S \
+  NDIS30_MINIPORT_CHARACTERISTICS  Ndis30Chars; \
+  W_RETURN_PACKET_HANDLER  ReturnPacketHandler; \
+  W_SEND_PACKETS_HANDLER  SendPacketsHandler; \
+  W_ALLOCATE_COMPLETE_HANDLER  AllocateCompleteHandler;
 
-NDISAPI
-VOID
-NTAPI
-NdisGetBufferPhysicalArraySize(
-  IN PNDIS_BUFFER  Buffer,
-  OUT PUINT  ArraySize);
+#else /* !__cplusplus */
 
-NDISAPI
-VOID
-NTAPI
-NdisGetFirstBufferFromPacket(
-  IN PNDIS_PACKET  _Packet,
-  OUT PNDIS_BUFFER  *_FirstBuffer,
-  OUT PVOID  *_FirstBufferVA,
-  OUT PUINT  _FirstBufferLength,
-  OUT PUINT  _TotalBufferLength);
+#define NDIS40_MINIPORT_CHARACTERISTICS_S \
+  NDIS30_MINIPORT_CHARACTERISTICS_S \
+  W_RETURN_PACKET_HANDLER  ReturnPacketHandler; \
+  W_SEND_PACKETS_HANDLER  SendPacketsHandler; \
+  W_ALLOCATE_COMPLETE_HANDLER  AllocateCompleteHandler;
 
-/*
- * VOID
- * NdisGetFirstBufferFromPacketSafe(
- * IN PNDIS_PACKET  _Packet,
- * OUT PNDIS_BUFFER  * _FirstBuffer,
- * OUT PVOID  * _FirstBufferVA,
- * OUT PUINT  _FirstBufferLength,
- * OUT PUINT  _TotalBufferLength),
- * IN MM_PAGE_PRIORITY _Priority)
- */
-#define NdisGetFirstBufferFromPacketSafe(_Packet,         \
-                                     _FirstBuffer,        \
-                                     _FirstBufferVA,      \
-                                     _FirstBufferLength,  \
-                                     _TotalBufferLength,  \
-                                     _Priority)           \
-{                                                         \
-  PNDIS_BUFFER _Buffer;                                   \
-                                                          \
-  _Buffer         = (_Packet)->Private.Head;              \
-  *(_FirstBuffer) = _Buffer;                              \
-  if (_Buffer != NULL)                                    \
-    {                                                     \
-            *(_FirstBufferVA)     = MmGetSystemAddressForMdlSafe(_Buffer, _Priority);  \
-            *(_FirstBufferLength) = MmGetMdlByteCount(_Buffer);         \
-            _Buffer = _Buffer->Next;                                    \
-                  *(_TotalBufferLength) = *(_FirstBufferLength);              \
-                  while (_Buffer != NULL) {                                   \
-                    *(_TotalBufferLength) += MmGetMdlByteCount(_Buffer);      \
-                    _Buffer = _Buffer->Next;                                  \
-                  }                                                           \
-    }                             \
-  else                            \
-    {                             \
-      *(_FirstBufferVA) = 0;      \
-      *(_FirstBufferLength) = 0;  \
-      *(_TotalBufferLength) = 0;  \
-    } \
-}
+#endif /* !__cplusplus */
 
-NDISAPI
-VOID
-NTAPI
-NdisQueryBuffer(
-  IN PNDIS_BUFFER  Buffer,
-  OUT PVOID  *VirtualAddress OPTIONAL,
-  OUT PUINT  Length);
+typedef struct _NDIS40_MINIPORT_CHARACTERISTICS {
+  NDIS40_MINIPORT_CHARACTERISTICS_S
+} NDIS40_MINIPORT_CHARACTERISTICS, *PNDIS40_MINIPORT_CHARACTERISTICS;
 
-NDISAPI
-VOID
-NTAPI
-NdisQueryBufferOffset(
-  IN PNDIS_BUFFER  Buffer,
-  OUT PUINT  Offset,
-  OUT PUINT  Length);
 
-/*
- * PVOID
- * NDIS_BUFFER_LINKAGE(
- *   IN PNDIS_BUFFER  Buffer);
- */
-#define NDIS_BUFFER_LINKAGE(Buffer)(Buffer)->Next;
+/* Extensions for NDIS 5.0 miniports */
 
+typedef NDIS_STATUS
+(NTAPI *W_CO_CREATE_VC_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN NDIS_HANDLE  NdisVcHandle,
+  OUT PNDIS_HANDLE  MiniportVcContext);
 
-/*
- * VOID
- * NdisChainBufferAtBack(
- *   IN OUT PNDIS_PACKET  Packet,
- *   IN OUT PNDIS_BUFFER  Buffer)
- */
-#define NdisChainBufferAtBack(Packet,           \
-                              Buffer)           \
-{                                               \
-       PNDIS_BUFFER NdisBuffer = (Buffer);           \
-                                                \
-       while (NdisBuffer->Next != NULL)              \
-   NdisBuffer = NdisBuffer->Next;               \
-                                                     \
-       NdisBuffer->Next = NULL;                      \
-                                                     \
-       if ((Packet)->Private.Head != NULL)           \
-    (Packet)->Private.Tail->Next = (Buffer);    \
-       else                                          \
-    (Packet)->Private.Head = (Buffer);          \
-                                                     \
-       (Packet)->Private.Tail = NdisBuffer;          \
-       (Packet)->Private.ValidCounts = FALSE;        \
-}
+typedef NDIS_STATUS
+(NTAPI *W_CO_DELETE_VC_HANDLER)(
+  IN NDIS_HANDLE  MiniportVcContext);
 
+typedef NDIS_STATUS
+(NTAPI *W_CO_ACTIVATE_VC_HANDLER)(
+  IN NDIS_HANDLE  MiniportVcContext,
+  IN OUT PCO_CALL_PARAMETERS  CallParameters);
 
-/*
- * VOID
- * NdisChainBufferAtFront(
- *   IN OUT PNDIS_PACKET  Packet,
- *   IN OUT PNDIS_BUFFER  Buffer)
- */
-#define NdisChainBufferAtFront(Packet,        \
-                               Buffer)        \
-{                                             \
-       PNDIS_BUFFER _NdisBuffer = (Buffer);        \
-                                              \
-  while (_NdisBuffer->Next != NULL)           \
-    _NdisBuffer = _NdisBuffer->Next;          \
-                                              \
-  if ((Packet)->Private.Head == NULL)         \
-    (Packet)->Private.Tail = _NdisBuffer;     \
-                                              \
-       _NdisBuffer->Next = (Packet)->Private.Head; \
-       (Packet)->Private.Head = (Buffer);          \
-       (Packet)->Private.ValidCounts = FALSE;      \
-}
+typedef NDIS_STATUS
+(NTAPI *W_CO_DEACTIVATE_VC_HANDLER)(
+  IN NDIS_HANDLE  MiniportVcContext);
 
+typedef VOID
+(NTAPI *W_CO_SEND_PACKETS_HANDLER)(
+  IN NDIS_HANDLE  MiniportVcContext,
+  IN PPNDIS_PACKET  PacketArray,
+  IN UINT  NumberOfPackets);
 
-/*
- * VOID
- * NdisGetNextBuffer(
- *   IN PNDIS_BUFFER  CurrentBuffer,
- *   OUT PNDIS_BUFFER  * NextBuffer)
- */
-#define NdisGetNextBuffer(CurrentBuffer,  \
-                          NextBuffer)     \
-{                                         \
-  *(NextBuffer) = (CurrentBuffer)->Next;  \
-}
+typedef NDIS_STATUS
+(NTAPI *W_CO_REQUEST_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN NDIS_HANDLE  MiniportVcContext  OPTIONAL,
+  IN OUT PNDIS_REQUEST  NdisRequest);
 
-#if NDIS_LEGACY_DRIVER
+#ifdef __cplusplus
 
-#define NDIS_PACKET_FIRST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Head)
-#define NDIS_PACKET_LAST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Tail)
-#define NDIS_PACKET_VALID_COUNTS(_Packet) ((_Packet)->Private.ValidCounts)
+#define NDIS50_MINIPORT_CHARACTERISTICS_S \
+  NDIS40_MINIPORT_CHARACTERISTICS  Ndis40Chars; \
+  W_CO_CREATE_VC_HANDLER  CoCreateVcHandler; \
+  W_CO_DELETE_VC_HANDLER  CoDeleteVcHandler; \
+  W_CO_ACTIVATE_VC_HANDLER  CoActivateVcHandler; \
+  W_CO_DEACTIVATE_VC_HANDLER  CoDeactivateVcHandler; \
+  W_CO_SEND_PACKETS_HANDLER  CoSendPacketsHandler; \
+  W_CO_REQUEST_HANDLER  CoRequestHandler;
 
-/*
- * UINT
- * NdisGetPacketFlags(
- *   IN PNDIS_PACKET  Packet);
- */
-#define NdisGetPacketFlags(Packet)(Packet)->Private.Flags;
+#else /* !__cplusplus */
 
-/*
- * ULONG
- * NDIS_GET_PACKET_PROTOCOL_TYPE(
- *   IN PNDIS_PACKET Packet);
- */
-#define NDIS_GET_PACKET_PROTOCOL_TYPE(_Packet) \
-  ((_Packet)->Private.Flags & NDIS_PROTOCOL_ID_MASK)
+#define NDIS50_MINIPORT_CHARACTERISTICS_S \
+  NDIS40_MINIPORT_CHARACTERISTICS_S \
+  W_CO_CREATE_VC_HANDLER  CoCreateVcHandler; \
+  W_CO_DELETE_VC_HANDLER  CoDeleteVcHandler; \
+  W_CO_ACTIVATE_VC_HANDLER  CoActivateVcHandler; \
+  W_CO_DEACTIVATE_VC_HANDLER  CoDeactivateVcHandler; \
+  W_CO_SEND_PACKETS_HANDLER  CoSendPacketsHandler; \
+  W_CO_REQUEST_HANDLER  CoRequestHandler;
 
-/*
- * PNDIS_PACKET_OOB_DATA
- * NDIS_OOB_DATA_FROM_PACKET(
- *   IN PNDIS_PACKET Packet);
- */
-#define NDIS_OOB_DATA_FROM_PACKET(_Packet)    \
-  (PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
-  (_Packet)->Private.NdisPacketOobOffset)
+#endif /* !__cplusplus */
 
-/*
- * ULONG
- * NDIS_GET_PACKET_HEADER_SIZE(
- *   IN PNDIS_PACKET Packet);
- */
-#define NDIS_GET_PACKET_HEADER_SIZE(_Packet)   \
-  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
-  (_Packet)->Private.NdisPacketOobOffset))->HeaderSize
+typedef struct _NDIS50_MINIPORT_CHARACTERISTICS {
+   NDIS50_MINIPORT_CHARACTERISTICS_S
+} NDIS50_MINIPORT_CHARACTERISTICS, *PSNDIS50_MINIPORT_CHARACTERISTICS;
 
-/*
- * NDIS_STATUS
- * NDIS_GET_PACKET_STATUS(
- *   IN PNDIS_PACKET Packet);
- */
-#define NDIS_GET_PACKET_STATUS(_Packet)        \
-  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
-  (_Packet)->Private.NdisPacketOobOffset))->Status
 
-/*
- * ULONGLONG
- * NDIS_GET_PACKET_TIME_TO_SEND(
- *   IN PNDIS_PACKET Packet);
- */
-#define NDIS_GET_PACKET_TIME_TO_SEND(_Packet)   \
-  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +  \
-  (_Packet)->Private.NdisPacketOobOffset))->TimeToSend
+/* Extensions for NDIS 5.1 miniports */
 
-/*
- * ULONGLONG
- * NDIS_GET_PACKET_TIME_SENT(
- *   IN PNDIS_PACKET Packet);
- */
-#define NDIS_GET_PACKET_TIME_SENT(_Packet)      \
-  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +  \
-  (_Packet)->Private.NdisPacketOobOffset))->TimeSent
+typedef VOID
+(NTAPI *W_CANCEL_SEND_PACKETS_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN PVOID  CancelId);
 
-/*
- * ULONGLONG
- * NDIS_GET_PACKET_TIME_RECEIVED(
- *   IN PNDIS_PACKET Packet);
- */
-#define NDIS_GET_PACKET_TIME_RECEIVED(_Packet)  \
-  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +  \
-  (_Packet)->Private.NdisPacketOobOffset))->TimeReceived
+typedef VOID
+(NTAPI *W_PNP_EVENT_NOTIFY_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterContext,
+  IN NDIS_DEVICE_PNP_EVENT  PnPEvent,
+  IN PVOID  InformationBuffer,
+  IN ULONG  InformationBufferLength);
 
-/*
- * VOID
- * NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(
- *   IN PNDIS_PACKET Packet,
- *   IN PPVOID pMediaSpecificInfo,
- *   IN PUINT pSizeMediaSpecificInfo);
- */
-#define NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(_Packet,                                  \
-                                            _pMediaSpecificInfo,                      \
-                                            _pSizeMediaSpecificInfo)                  \
-{                                                                                     \
-  if (!((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) ||            \
-      !((_Packet)->Private.NdisPacketFlags & fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO))   \
-    {                                                                                 \
-      *(_pMediaSpecificInfo) = NULL;                                                  \
-      *(_pSizeMediaSpecificInfo) = 0;                                                 \
-    }                                                                                 \
-  else                                                                                \
-    {                                                                                 \
-      *(_pMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +           \
-        (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation;           \
-      *(_pSizeMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +       \
-        (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo;              \
-    }                                                                                 \
-}
+typedef VOID
+(NTAPI *W_MINIPORT_SHUTDOWN_HANDLER)(
+  IN PVOID  ShutdownContext);
 
-/*
- * VOID
- * NDIS_SET_PACKET_HEADER_SIZE(
- *   IN PNDIS_PACKET Packet,
- *   IN UINT HdrSize);
- */
-#define NDIS_SET_PACKET_HEADER_SIZE(_Packet, _HdrSize)              \
-  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                      \
-  (_Packet)->Private.NdisPacketOobOffset))->HeaderSize = (_HdrSize)
+#ifdef __cplusplus
 
-/*
- * VOID
- * NDIS_SET_PACKET_STATUS(
- *   IN PNDIS_PACKET Packet,
- *   IN NDIS_STATUS Status);
- */
-#define NDIS_SET_PACKET_STATUS(_Packet, _Status)  \
-  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +    \
-  (_Packet)->Private.NdisPacketOobOffset))->Status = (_Status)
-
-/*
- * VOID
- * NDIS_SET_PACKET_TIME_TO_SEND(
- *   IN PNDIS_PACKET Packet,
- *   IN ULONGLONG TimeToSend);
- */
-#define NDIS_SET_PACKET_TIME_TO_SEND(_Packet, _TimeToSend)  \
-  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +              \
-  (_Packet)->Private.NdisPacketOobOffset))->TimeToSend = (_TimeToSend)
-
-/*
- * VOID
- * NDIS_SET_PACKET_TIME_SENT(
- *   IN PNDIS_PACKET Packet,
- *   IN ULONGLONG TimeSent);
- */
-#define NDIS_SET_PACKET_TIME_SENT(_Packet, _TimeSent) \
-  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +        \
-  (_Packet)->Private.NdisPacketOobOffset))->TimeSent = (_TimeSent)
+#define NDIS51_MINIPORT_CHARACTERISTICS_S \
+  NDIS50_MINIPORT_CHARACTERISTICS  Ndis50Chars; \
+  W_CANCEL_SEND_PACKETS_HANDLER  CancelSendPacketsHandler; \
+  W_PNP_EVENT_NOTIFY_HANDLER  PnPEventNotifyHandler; \
+  W_MINIPORT_SHUTDOWN_HANDLER  AdapterShutdownHandler;
 
-/*
- * VOID
- * NDIS_SET_PACKET_TIME_RECEIVED(
- *   IN PNDIS_PACKET Packet,
- *   IN ULONGLONG TimeReceived);
- */
-#define NDIS_SET_PACKET_TIME_RECEIVED(_Packet, _TimeReceived) \
-  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                \
-  (_Packet)->Private.NdisPacketOobOffset))->TimeReceived = (_TimeReceived)
+#else
 
-/*
- * VOID
- * NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(
- *   IN PNDIS_PACKET Packet,
- *   IN PVOID MediaSpecificInfo,
- *   IN UINT SizeMediaSpecificInfo);
- */
-#define NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(_Packet,                      \
-                                            _MediaSpecificInfo,           \
-                                            _SizeMediaSpecificInfo)       \
-{                                                                         \
-  if ((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS)     \
-    {                                                                     \
-      (_Packet)->Private.NdisPacketFlags |= fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO; \
-      ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                        \
-        (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation = \
-          (_MediaSpecificInfo);                                           \
-      ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                        \
-        (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo = \
-          (_SizeMediaSpecificInfo);                                       \
-    }                                                                     \
-}
+#define NDIS51_MINIPORT_CHARACTERISTICS_S \
+  NDIS50_MINIPORT_CHARACTERISTICS_S \
+  W_CANCEL_SEND_PACKETS_HANDLER  CancelSendPacketsHandler; \
+  W_PNP_EVENT_NOTIFY_HANDLER  PnPEventNotifyHandler; \
+  W_MINIPORT_SHUTDOWN_HANDLER  AdapterShutdownHandler;
 
-/*
- * VOID
- * NdisSetPacketFlags(
- *   IN PNDIS_PACKET  Packet,
- *   IN UINT  Flags);
- */
-#define NdisSetPacketFlags(Packet, Flags) (Packet)->Private.Flags |= (Flags)
+#endif
 
-/*
- * VOID
- * NdisClearPacketFlags(
- *   IN PNDIS_PACKET  Packet,
- *   IN UINT  Flags);
- */
-#define NdisClearPacketFlags(Packet, Flags) (Packet)->Private.Flags &= ~(Flags)
+typedef struct _NDIS51_MINIPORT_CHARACTERISTICS {
+   NDIS51_MINIPORT_CHARACTERISTICS_S
+} NDIS51_MINIPORT_CHARACTERISTICS, *PSNDIS51_MINIPORT_CHARACTERISTICS;
 
-#endif /* NDIS_LEGACY_DRIVER */
+#if defined(NDIS51_MINIPORT)
+typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
+  NDIS51_MINIPORT_CHARACTERISTICS_S
+} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
+#elif defined(NDIS50_MINIPORT)
+typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
+  NDIS50_MINIPORT_CHARACTERISTICS_S
+} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
+#elif defined(NDIS40_MINIPORT)
+typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
+  NDIS40_MINIPORT_CHARACTERISTICS_S
+} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
+#else /* NDIS30 */
+typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
+  NDIS30_MINIPORT_CHARACTERISTICS_S
+} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
+#endif
 
-/*
- * VOID
- * NdisQueryPacket(
- *   IN PNDIS_PACKET  Packet,
- *   OUT PUINT  PhysicalBufferCount  OPTIONAL,
- *   OUT PUINT  BufferCount  OPTIONAL,
- *   OUT PNDIS_BUFFER  *FirstBuffer  OPTIONAL,
- *   OUT PUINT  TotalPacketLength  OPTIONAL);
- */
-static __inline
-VOID
-NdisQueryPacket(
-    IN PNDIS_PACKET  Packet,
-    OUT PUINT  PhysicalBufferCount  OPTIONAL,
-    OUT PUINT  BufferCount  OPTIONAL,
-    OUT PNDIS_BUFFER  *FirstBuffer  OPTIONAL,
-    OUT PUINT  TotalPacketLength  OPTIONAL)
-{
-    if (FirstBuffer)
-        *FirstBuffer = Packet->Private.Head;
-    if (TotalPacketLength || BufferCount || PhysicalBufferCount)
-    {
-        if (!Packet->Private.ValidCounts)
-        {
-            UINT Offset;
-            UINT PacketLength;
-            PNDIS_BUFFER NdisBuffer;
-            UINT PhysicalBufferCount = 0;
-            UINT TotalPacketLength = 0;
-            UINT Count = 0;
-
-            for (NdisBuffer = Packet->Private.Head;
-                 NdisBuffer != (PNDIS_BUFFER)NULL;
-                 NdisBuffer = NdisBuffer->Next)
-            {
-                PhysicalBufferCount += NDIS_BUFFER_TO_SPAN_PAGES(NdisBuffer);
-                NdisQueryBufferOffset(NdisBuffer, &Offset, &PacketLength);
-                TotalPacketLength += PacketLength;
-                Count++;
-            }
-            Packet->Private.PhysicalCount = PhysicalBufferCount;
-            Packet->Private.TotalLength = TotalPacketLength;
-            Packet->Private.Count = Count;
-            Packet->Private.ValidCounts = TRUE;
-        }
-
-        if (PhysicalBufferCount)
-            *PhysicalBufferCount = Packet->Private.PhysicalCount;
-
-        if (BufferCount)
-            *BufferCount = Packet->Private.Count;
-
-        if (TotalPacketLength)
-            *TotalPacketLength = Packet->Private.TotalLength;
-    }
-}
+/* Structures available only to full MAC drivers */
 
-/*
- * VOID
- * NdisQueryPacketLength(
- *   IN PNDIS_PACKET  Packet,
- *   OUT PUINT  PhysicalBufferCount  OPTIONAL,
- *   OUT PUINT  BufferCount  OPTIONAL,
- *   OUT PNDIS_BUFFER  *FirstBuffer  OPTIONAL,
- *   OUT PUINT  TotalPacketLength  OPTIONAL);
- */
-static __inline
-VOID
-NdisQueryPacketLength(
-    IN PNDIS_PACKET  Packet,
-    OUT PUINT  TotalPacketLength  OPTIONAL)
-{
-  if (!(Packet)->Private.ValidCounts)                                     \
-    NdisQueryPacket(Packet, NULL, NULL, NULL, TotalPacketLength);         \
-  else                                                                    \
-    *(TotalPacketLength) = (Packet)->Private.TotalLength;                 \
-}
+typedef BOOLEAN
+(NTAPI *PNDIS_INTERRUPT_SERVICE)(
+  IN PVOID  InterruptContext);
 
+typedef VOID
+(NTAPI *PNDIS_DEFERRED_PROCESSING)(
+  IN PVOID  SystemSpecific1,
+  IN PVOID  InterruptContext,
+  IN PVOID  SystemSpecific2,
+  IN PVOID  SystemSpecific3);
 
-/*
- * VOID
- * NdisRecalculatePacketCounts(
- *   IN OUT  PNDIS_PACKET  Packet);
- */
-#define NdisRecalculatePacketCounts(Packet)       \
-{                                                 \
-  PNDIS_BUFFER _Buffer = (Packet)->Private.Head;  \
-  if (_Buffer != NULL)                            \
-  {                                               \
-      while (_Buffer->Next != NULL)               \
-      {                                           \
-          _Buffer = _Buffer->Next;                \
-      }                                           \
-      (Packet)->Private.Tail = _Buffer;           \
-  }                                               \
-  (Packet)->Private.ValidCounts = FALSE;          \
-}
+typedef struct _NDIS_WRAPPER_HANDLE NDIS_WRAPPER_HANDLE, *PNDIS_WRAPPER_HANDLE;
+typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLOCK;
+typedef struct _NDIS_OPEN_BLOCK NDIS_OPEN_BLOCK, *PNDIS_OPEN_BLOCK;
+typedef struct _NDIS_M_DRIVER_BLOCK NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK;
+typedef struct _NDIS_MINIPORT_BLOCK NDIS_MINIPORT_BLOCK,*PNDIS_MINIPORT_BLOCK;
+typedef struct _NDIS_OFFLOAD NDIS_OFFLOAD, *PNDIS_OFFLOAD;
+typedef struct _NDIS_AF_LIST NDIS_AF_LIST, *PNDIS_AF_LIST;
+typedef struct _X_FILTER ETH_FILTER, *PETH_FILTER;
+#if NDIS_SUPPORT_NDIS6
+typedef USHORT NET_FRAME_TYPE, *PNET_FRAME_TYPE;
+#endif
 
+typedef struct _NDIS_MINIPORT_INTERRUPT {
+  PKINTERRUPT  InterruptObject;
+  KSPIN_LOCK  DpcCountLock;
+  PVOID  MiniportIdField;
+  W_ISR_HANDLER  MiniportIsr;
+  W_HANDLE_INTERRUPT_HANDLER  MiniportDpc;
+  KDPC  InterruptDpc;
+  PNDIS_MINIPORT_BLOCK  Miniport;
+  UCHAR  DpcCount;
+  BOOLEAN  Filler1;
+  KEVENT  DpcsCompletedEvent;
+  BOOLEAN  SharedInterrupt;
+  BOOLEAN  IsrRequested;
+} NDIS_MINIPORT_INTERRUPT, *PNDIS_MINIPORT_INTERRUPT;
 
-/*
- * VOID
- * NdisReinitializePacket(
- *   IN OUT  PNDIS_PACKET  Packet);
- */
-#define NdisReinitializePacket(Packet)    \
-{                                               \
-       (Packet)->Private.Head = (PNDIS_BUFFER)NULL;  \
-       (Packet)->Private.ValidCounts = FALSE;        \
-}
+typedef struct _NDIS_MINIPORT_TIMER {
+  KTIMER  Timer;
+  KDPC  Dpc;
+  PNDIS_TIMER_FUNCTION  MiniportTimerFunction;
+  PVOID  MiniportTimerContext;
+  PNDIS_MINIPORT_BLOCK  Miniport;
+  struct _NDIS_MINIPORT_TIMER  *NextDeferredTimer;
+} NDIS_MINIPORT_TIMER, *PNDIS_MINIPORT_TIMER;
 
-/*
- * VOID
- * NdisSetSendFlags(
- *   IN PNDIS_PACKET  Packet,
- *   IN UINT  Flags);
- */
-#define NdisSetSendFlags(_Packet,_Flags)(_Packet)->Private.Flags = (_Flags)
+typedef struct _NDIS_INTERRUPT {
+  PKINTERRUPT  InterruptObject;
+  KSPIN_LOCK  DpcCountLock;
+  PNDIS_INTERRUPT_SERVICE  MacIsr;
+  PNDIS_DEFERRED_PROCESSING  MacDpc;
+  KDPC  InterruptDpc;
+  PVOID  InterruptContext;
+  UCHAR  DpcCount;
+  BOOLEAN       Removing;
+  KEVENT  DpcsCompletedEvent;
+} NDIS_INTERRUPT, *PNDIS_INTERRUPT;
 
 
+typedef enum _NDIS_WORK_ITEM_TYPE {
+  NdisWorkItemRequest,
+  NdisWorkItemSend,
+  NdisWorkItemReturnPackets,
+  NdisWorkItemResetRequested,
+  NdisWorkItemResetInProgress,
+  NdisWorkItemHalt,
+  NdisWorkItemSendLoopback,
+  NdisWorkItemMiniportCallback,
+  NdisMaxWorkItems
+} NDIS_WORK_ITEM_TYPE, *PNDIS_WORK_ITEM_TYPE;
 
-/* Memory management routines */
+#define        NUMBER_OF_WORK_ITEM_TYPES         NdisMaxWorkItems
+#define        NUMBER_OF_SINGLE_WORK_ITEMS       6
 
-NDISAPI
-VOID
-NTAPI
-NdisCreateLookaheadBufferFromSharedMemory(
-  IN PVOID  pSharedMemory,
-  IN UINT  LookaheadLength,
-  OUT PVOID  *pLookaheadBuffer);
+typedef struct _NDIS_MINIPORT_WORK_ITEM {
+       SINGLE_LIST_ENTRY  Link;
+       NDIS_WORK_ITEM_TYPE  WorkItemType;
+       PVOID  WorkItemContext;
+} NDIS_MINIPORT_WORK_ITEM, *PNDIS_MINIPORT_WORK_ITEM;
 
-NDISAPI
-VOID
-NTAPI
-NdisDestroyLookaheadBufferFromSharedMemory(
-  IN PVOID  pLookaheadBuffer);
+struct _NDIS_WORK_ITEM;
+typedef VOID (*NDIS_PROC)(struct _NDIS_WORK_ITEM *, PVOID);
 
-#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_ARM) || defined(_M_PPC)
+typedef struct _NDIS_WORK_ITEM {
+  PVOID Context;
+  NDIS_PROC Routine;
+  UCHAR WrapperReserved[8*sizeof(PVOID)];
+} NDIS_WORK_ITEM, *PNDIS_WORK_ITEM;
 
-/*
- * VOID
- * NdisMoveMappedMemory(
- *   OUT PVOID  Destination,
- *   IN PVOID  Source,
- *   IN ULONG  Length);
- */
-#define NdisMoveMappedMemory(Destination, Source, Length) \
-  RtlCopyMemory(Destination, Source, Length)
+typedef struct _NDIS_BIND_PATHS {
+       UINT  Number;
+       NDIS_STRING  Paths[1];
+} NDIS_BIND_PATHS, *PNDIS_BIND_PATHS;
 
-/*
- * VOID
- * NdisZeroMappedMemory(
- *   IN PVOID  Destination,
- *   IN ULONG  Length);
- */
-#define NdisZeroMappedMemory(Destination, Length) \
-  RtlZeroMemory(Destination, Length)
 
-#else
+typedef VOID
+(NTAPI *ETH_RCV_COMPLETE_HANDLER)(
+  IN PETH_FILTER  Filter);
 
-#define NdisMoveMappedMemory(Destination, Source, Length) \
-{ \
-  PUCHAR _Dest = Destination, _Src = Source, _End = _Dest + Length; \
-  while (_Dest < _End) \
-    *_Dest++ = _Src++; \
-}
+typedef VOID
+(NTAPI *ETH_RCV_INDICATE_HANDLER)(
+  IN PETH_FILTER  Filter,
+  IN NDIS_HANDLE  MacReceiveContext,
+  IN PCHAR  Address,
+  IN PVOID  HeaderBuffer,
+  IN UINT  HeaderBufferSize,
+  IN PVOID  LookaheadBuffer,
+  IN UINT  LookaheadBufferSize,
+  IN UINT  PacketSize);
 
-#define NdisZeroMappedMemory(Destination, Length) \
-{ \
-  PUCHAR _Dest = Destination, _End = _Dest + Length; \
-  while (_Dest < _End) \
-    *_Dest++ = 0; \
-}
+typedef VOID
+(NTAPI *FDDI_RCV_COMPLETE_HANDLER)(
+  IN PFDDI_FILTER  Filter);
 
-#endif /* _M_IX86 or _M_AMD64 */
+typedef VOID
+(NTAPI *FDDI_RCV_INDICATE_HANDLER)(
+  IN PFDDI_FILTER  Filter,
+  IN NDIS_HANDLE  MacReceiveContext,
+  IN PCHAR  Address,
+  IN UINT  AddressLength,
+  IN PVOID  HeaderBuffer,
+  IN UINT  HeaderBufferSize,
+  IN PVOID  LookaheadBuffer,
+  IN UINT  LookaheadBufferSize,
+  IN UINT  PacketSize);
 
-/*
- * VOID
- * NdisMoveFromMappedMemory(
- *   OUT PVOID  Destination,
- *   IN PVOID  Source,
- *   IN ULONG  Length);
- */
-#define NdisMoveFromMappedMemory(Destination, Source, Length) \
-  NdisMoveMappedMemory(Destination, Source, Length)
+typedef VOID
+(NTAPI *FILTER_PACKET_INDICATION_HANDLER)(
+  IN NDIS_HANDLE  Miniport,
+  IN PPNDIS_PACKET  PacketArray,
+  IN UINT  NumberOfPackets);
 
-/*
- * VOID
- * NdisMoveToMappedMemory(
- *   OUT PVOID  Destination,
- *   IN PVOID  Source,
- *   IN ULONG  Length);
- */
-#define NdisMoveToMappedMemory(Destination, Source, Length) \
-  NdisMoveMappedMemory(Destination, Source, Length)
+typedef VOID
+(NTAPI *TR_RCV_COMPLETE_HANDLER)(
+  IN PTR_FILTER  Filter);
 
-/*
- * VOID
- * NdisMUpdateSharedMemory(
- *   IN NDIS_HANDLE  MiniportAdapterHandle,
- *   IN ULONG  Length,
- *   IN PVOID  VirtualAddress,
- *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
- */
-#define NdisMUpdateSharedMemory(_H, _L, _V, _P) \
-  NdisUpdateSharedMemory(_H, _L, _V, _P)
+typedef VOID
+(NTAPI *TR_RCV_INDICATE_HANDLER)(
+  IN PTR_FILTER  Filter,
+  IN NDIS_HANDLE  MacReceiveContext,
+  IN PVOID  HeaderBuffer,
+  IN UINT  HeaderBufferSize,
+  IN PVOID  LookaheadBuffer,
+  IN UINT  LookaheadBufferSize,
+  IN UINT  PacketSize);
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisAllocateMemory(
-  OUT  PVOID  *VirtualAddress,
-  IN UINT  Length,
-  IN UINT  MemoryFlags,
-  IN NDIS_PHYSICAL_ADDRESS  HighestAcceptableAddress);
+typedef VOID
+(NTAPI *WAN_RCV_COMPLETE_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN NDIS_HANDLE  NdisLinkContext);
 
-NDISAPI
-VOID
-NTAPI
-NdisFreeMemory(
-  IN PVOID  VirtualAddress,
-  IN UINT  Length,
-  IN UINT  MemoryFlags);
+typedef VOID
+(NTAPI *WAN_RCV_HANDLER)(
+  OUT PNDIS_STATUS  Status,
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN NDIS_HANDLE  NdisLinkContext,
+  IN PUCHAR  Packet,
+  IN ULONG  PacketSize);
 
-NDISAPI
-VOID
-NTAPI
-NdisImmediateReadSharedMemory(
-  IN NDIS_HANDLE WrapperConfigurationContext,
-  IN ULONG       SharedMemoryAddress,
-  OUT PUCHAR      Buffer,
-  IN ULONG       Length);
+typedef VOID
+(FASTCALL *NDIS_M_DEQUEUE_WORK_ITEM)(
+  IN PNDIS_MINIPORT_BLOCK  Miniport,
+  IN NDIS_WORK_ITEM_TYPE  WorkItemType,
+  OUT PVOID  *WorkItemContext);
 
-NDISAPI
-VOID
-NTAPI
-NdisImmediateWriteSharedMemory(
-  IN NDIS_HANDLE WrapperConfigurationContext,
-  IN ULONG       SharedMemoryAddress,
-  IN PUCHAR      Buffer,
-  IN ULONG       Length);
+typedef NDIS_STATUS
+(FASTCALL *NDIS_M_QUEUE_NEW_WORK_ITEM)(
+  IN PNDIS_MINIPORT_BLOCK  Miniport,
+  IN NDIS_WORK_ITEM_TYPE  WorkItemType,
+  IN PVOID  WorkItemContext);
 
-NDISAPI
-VOID
-NTAPI
-NdisMAllocateSharedMemory(
-  IN   NDIS_HANDLE  MiniportAdapterHandle,
-  IN   ULONG  Length,
-  IN   BOOLEAN  Cached,
-  OUT   PVOID  *VirtualAddress,
-  OUT   PNDIS_PHYSICAL_ADDRESS  PhysicalAddress);
+typedef NDIS_STATUS
+(FASTCALL *NDIS_M_QUEUE_WORK_ITEM)(
+  IN PNDIS_MINIPORT_BLOCK  Miniport,
+  IN NDIS_WORK_ITEM_TYPE  WorkItemType,
+  IN PVOID  WorkItemContext);
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMAllocateSharedMemoryAsync(
+typedef VOID
+(NTAPI *NDIS_M_REQ_COMPLETE_HANDLER)(
   IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN ULONG  Length,
-  IN BOOLEAN  Cached,
-  IN PVOID  Context);
+  IN NDIS_STATUS  Status);
 
-#if defined(NDIS50)
+typedef VOID
+(NTAPI *NDIS_M_RESET_COMPLETE_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN NDIS_STATUS  Status,
+  IN BOOLEAN  AddressingReset);
 
-#define NdisUpdateSharedMemory(NdisAdapterHandle, \
-                               Length,            \
-                               VirtualAddress,    \
-                               PhysicalAddress)
+typedef VOID
+(NTAPI *NDIS_M_SEND_COMPLETE_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN PNDIS_PACKET  Packet,
+  IN NDIS_STATUS  Status);
 
-#else
+typedef VOID
+(NTAPI *NDIS_M_SEND_RESOURCES_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterHandle);
 
-NDISAPI
-VOID
-NTAPI
-NdisUpdateSharedMemory(
-  IN NDIS_HANDLE             NdisAdapterHandle,
-  IN ULONG                   Length,
-  IN PVOID                   VirtualAddress,
-  IN NDIS_PHYSICAL_ADDRESS   PhysicalAddress);
+typedef BOOLEAN
+(FASTCALL *NDIS_M_START_SENDS)(
+  IN PNDIS_MINIPORT_BLOCK  Miniport);
 
-#endif /* defined(NDIS50) */
+typedef VOID
+(NTAPI *NDIS_M_STATUS_HANDLER)(
+  IN NDIS_HANDLE  MiniportHandle,
+  IN NDIS_STATUS  GeneralStatus,
+  IN PVOID  StatusBuffer,
+  IN UINT  StatusBufferSize);
 
-/*
- * ULONG
- * NdisGetPhysicalAddressHigh(
- *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
- */
-#define NdisGetPhysicalAddressHigh(PhysicalAddress) \
-  ((PhysicalAddress).HighPart)
+typedef VOID
+(NTAPI *NDIS_M_STS_COMPLETE_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterHandle);
 
-/*
- * VOID
- * NdisSetPhysicalAddressHigh(
- *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,
- *   IN ULONG  Value);
- */
-#define NdisSetPhysicalAddressHigh(PhysicalAddress, Value) \
-  ((PhysicalAddress).HighPart) = (Value)
+typedef VOID
+(NTAPI *NDIS_M_TD_COMPLETE_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN PNDIS_PACKET  Packet,
+  IN NDIS_STATUS  Status,
+  IN UINT  BytesTransferred);
 
-/*
- * ULONG
- * NdisGetPhysicalAddressLow(
- *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
- */
-#define NdisGetPhysicalAddressLow(PhysicalAddress) \
-  ((PhysicalAddress).LowPart)
+typedef VOID (NTAPI *NDIS_WM_SEND_COMPLETE_HANDLER)(
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN PVOID  Packet,
+  IN NDIS_STATUS  Status);
 
 
-/*
- * VOID
- * NdisSetPhysicalAddressLow(
- *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,
- *   IN ULONG  Value);
- */
-#define NdisSetPhysicalAddressLow(PhysicalAddress, Value) \
-  ((PhysicalAddress).LowPart) = (Value)
+#if ARCNET
 
-/*
- * VOID
- * NDIS_PHYSICAL_ADDRESS_CONST(
- *   IN ULONG  Low,
- *   IN LONG  High);
- */
-#define NDIS_PHYSICAL_ADDRESS_CONST(Low, High)  \
-    { {(ULONG)(Low), (LONG)(High)} }
+#define ARC_SEND_BUFFERS                  8
+#define ARC_HEADER_SIZE                   4
 
-/*
- * ULONG
- * NdisEqualMemory(
- *  IN CONST VOID  *Source1,
- *  IN CONST VOID  *Source2,
- *  IN ULONG  Length);
- */
-#define NdisEqualMemory(Source1, Source2, Length) \
-  RtlEqualMemory(Source1, Source2, Length)
+typedef struct _NDIS_ARC_BUF {
+  NDIS_HANDLE  ArcnetBufferPool;
+  PUCHAR  ArcnetLookaheadBuffer;
+  UINT  NumFree;
+  ARC_BUFFER_LIST ArcnetBuffers[ARC_SEND_BUFFERS];
+} NDIS_ARC_BUF, *PNDIS_ARC_BUF;
 
-/*
- * VOID
- * NdisFillMemory(
- *   IN PVOID  Destination,
- *   IN ULONG  Length,
- *   IN UCHAR  Fill);
- */
-#define NdisFillMemory(Destination, Length, Fill) \
-  RtlFillMemory(Destination, Length, Fill)
+#endif /* ARCNET */
 
-/*
- * VOID
- * NdisMoveMemory(
- *   OUT  PVOID  Destination,
- *   IN PVOID  Source,
- *   IN ULONG  Length);
- */
-#define NdisMoveMemory(Destination, Source, Length) \
-  RtlCopyMemory(Destination, Source, Length)
+typedef struct _NDIS_LOG {
+  PNDIS_MINIPORT_BLOCK  Miniport;
+  KSPIN_LOCK  LogLock;
+  PIRP  Irp;
+  UINT  TotalSize;
+  UINT  CurrentSize;
+  UINT  InPtr;
+  UINT  OutPtr;
+  UCHAR  LogBuf[1];
+} NDIS_LOG, *PNDIS_LOG;
+
+#if ARCNET
+#define FILTERDBS_ARCNET_S \
+  PARC_FILTER  ArcDB;
+#else /* !ARCNET */
+#define FILTERDBS_ARCNET_S \
+  PVOID  XXXDB;
+#endif /* !ARCNET */
 
+#define FILTERDBS_S \
+  _ANONYMOUS_UNION union { \
+    PETH_FILTER  EthDB; \
+    PNULL_FILTER  NullDB; \
+  } DUMMYUNIONNAME; \
+  PTR_FILTER  TrDB; \
+  PFDDI_FILTER  FddiDB; \
+  FILTERDBS_ARCNET_S
 
-/*
- * VOID
- * NdisRetrieveUlong(
- *   IN PULONG  DestinationAddress,
- *   IN PULONG  SourceAddress);
- */
-#define NdisRetrieveUlong(DestinationAddress, SourceAddress) \
-  RtlRetrieveUlong(DestinationAddress, SourceAddress)
+typedef struct _FILTERDBS {
+  FILTERDBS_S
+} FILTERDBS, *PFILTERDBS;
 
 
-/*
- * VOID
- * NdisStoreUlong(
- *   IN PULONG  DestinationAddress,
- *   IN ULONG  Value);
- */
-#define NdisStoreUlong(DestinationAddress, Value) \
-  RtlStoreUlong(DestinationAddress, Value)
+struct _NDIS_MINIPORT_BLOCK {
+  PVOID  Signature;
+  PNDIS_MINIPORT_BLOCK  NextMiniport;
+  PNDIS_M_DRIVER_BLOCK  DriverHandle;
+  NDIS_HANDLE  MiniportAdapterContext;
+  UNICODE_STRING  MiniportName;
+  PNDIS_BIND_PATHS  BindPaths;
+  NDIS_HANDLE  OpenQueue;
+  REFERENCE  ShortRef;
+  NDIS_HANDLE  DeviceContext;
+  UCHAR  Padding1;
+  UCHAR  LockAcquired;
+  UCHAR  PmodeOpens;
+  UCHAR  AssignedProcessor;
+  KSPIN_LOCK  Lock;
+  PNDIS_REQUEST  MediaRequest;
+  PNDIS_MINIPORT_INTERRUPT  Interrupt;
+  ULONG  Flags;
+  ULONG  PnPFlags;
+  LIST_ENTRY  PacketList;
+  PNDIS_PACKET  FirstPendingPacket;
+  PNDIS_PACKET  ReturnPacketsQueue;
+  ULONG  RequestBuffer;
+  PVOID  SetMCastBuffer;
+  PNDIS_MINIPORT_BLOCK  PrimaryMiniport;
+  PVOID  WrapperContext;
+  PVOID  BusDataContext;
+  ULONG  PnPCapabilities;
+  PCM_RESOURCE_LIST  Resources;
+  NDIS_TIMER  WakeUpDpcTimer;
+  UNICODE_STRING  BaseName;
+  UNICODE_STRING  SymbolicLinkName;
+  ULONG  CheckForHangSeconds;
+  USHORT  CFHangTicks;
+  USHORT  CFHangCurrentTick;
+  NDIS_STATUS  ResetStatus;
+  NDIS_HANDLE  ResetOpen;
+  FILTERDBS_S
+  FILTER_PACKET_INDICATION_HANDLER  PacketIndicateHandler;
+  NDIS_M_SEND_COMPLETE_HANDLER  SendCompleteHandler;
+  NDIS_M_SEND_RESOURCES_HANDLER  SendResourcesHandler;
+  NDIS_M_RESET_COMPLETE_HANDLER  ResetCompleteHandler;
+  NDIS_MEDIUM  MediaType;
+  ULONG  BusNumber;
+  NDIS_INTERFACE_TYPE  BusType;
+  NDIS_INTERFACE_TYPE  AdapterType;
+  PDEVICE_OBJECT  DeviceObject;
+  PDEVICE_OBJECT  PhysicalDeviceObject;
+  PDEVICE_OBJECT  NextDeviceObject;
+  PMAP_REGISTER_ENTRY  MapRegisters;
+  PNDIS_AF_LIST  CallMgrAfList;
+  PVOID  MiniportThread;
+  PVOID  SetInfoBuf;
+  USHORT  SetInfoBufLen;
+  USHORT  MaxSendPackets;
+  NDIS_STATUS  FakeStatus;
+  PVOID  LockHandler;
+  PUNICODE_STRING  pAdapterInstanceName;
+  PNDIS_MINIPORT_TIMER  TimerQueue;
+  UINT  MacOptions;
+  PNDIS_REQUEST  PendingRequest;
+  UINT  MaximumLongAddresses;
+  UINT  MaximumShortAddresses;
+  UINT  CurrentLookahead;
+  UINT  MaximumLookahead;
+  W_HANDLE_INTERRUPT_HANDLER  HandleInterruptHandler;
+  W_DISABLE_INTERRUPT_HANDLER  DisableInterruptHandler;
+  W_ENABLE_INTERRUPT_HANDLER  EnableInterruptHandler;
+  W_SEND_PACKETS_HANDLER  SendPacketsHandler;
+  NDIS_M_START_SENDS  DeferredSendHandler;
+  ETH_RCV_INDICATE_HANDLER  EthRxIndicateHandler;
+  TR_RCV_INDICATE_HANDLER  TrRxIndicateHandler;
+  FDDI_RCV_INDICATE_HANDLER  FddiRxIndicateHandler;
+  ETH_RCV_COMPLETE_HANDLER  EthRxCompleteHandler;
+  TR_RCV_COMPLETE_HANDLER  TrRxCompleteHandler;
+  FDDI_RCV_COMPLETE_HANDLER  FddiRxCompleteHandler;
+  NDIS_M_STATUS_HANDLER  StatusHandler;
+  NDIS_M_STS_COMPLETE_HANDLER  StatusCompleteHandler;
+  NDIS_M_TD_COMPLETE_HANDLER  TDCompleteHandler;
+  NDIS_M_REQ_COMPLETE_HANDLER  QueryCompleteHandler;
+  NDIS_M_REQ_COMPLETE_HANDLER  SetCompleteHandler;
+  NDIS_WM_SEND_COMPLETE_HANDLER  WanSendCompleteHandler;
+  WAN_RCV_HANDLER  WanRcvHandler;
+  WAN_RCV_COMPLETE_HANDLER  WanRcvCompleteHandler;
+#if defined(NDIS_WRAPPER)
+  PNDIS_MINIPORT_BLOCK  NextGlobalMiniport;
+  SINGLE_LIST_ENTRY  WorkQueue[NUMBER_OF_WORK_ITEM_TYPES];
+  SINGLE_LIST_ENTRY  SingleWorkItems[NUMBER_OF_SINGLE_WORK_ITEMS];
+  UCHAR  SendFlags;
+  UCHAR  TrResetRing;
+  UCHAR  ArcnetAddress;
+  UCHAR  XState;
+  _ANONYMOUS_UNION union {
+#if ARCNET
+    PNDIS_ARC_BUF  ArcBuf;
+#endif
+    PVOID  BusInterface;
+  } DUMMYUNIONNAME;
+  PNDIS_LOG  Log;
+  ULONG  SlotNumber;
+  PCM_RESOURCE_LIST  AllocatedResources;
+  PCM_RESOURCE_LIST  AllocatedResourcesTranslated;
+  SINGLE_LIST_ENTRY  PatternList;
+  NDIS_PNP_CAPABILITIES  PMCapabilities;
+  DEVICE_CAPABILITIES  DeviceCaps;
+  ULONG  WakeUpEnable;
+  DEVICE_POWER_STATE  CurrentDevicePowerState;
+  PIRP  pIrpWaitWake;
+  SYSTEM_POWER_STATE  WaitWakeSystemState;
+  LARGE_INTEGER  VcIndex;
+  KSPIN_LOCK  VcCountLock;
+  LIST_ENTRY  WmiEnabledVcs;
+  PNDIS_GUID  pNdisGuidMap;
+  PNDIS_GUID  pCustomGuidMap;
+  USHORT  VcCount;
+  USHORT  cNdisGuidMap;
+  USHORT  cCustomGuidMap;
+  USHORT  CurrentMapRegister;
+  PKEVENT  AllocationEvent;
+  USHORT  BaseMapRegistersNeeded;
+  USHORT  SGMapRegistersNeeded;
+  ULONG  MaximumPhysicalMapping;
+  NDIS_TIMER  MediaDisconnectTimer;
+  USHORT  MediaDisconnectTimeOut;
+  USHORT  InstanceNumber;
+  NDIS_EVENT  OpenReadyEvent;
+  NDIS_PNP_DEVICE_STATE  PnPDeviceState;
+  NDIS_PNP_DEVICE_STATE  OldPnPDeviceState;
+  PGET_SET_DEVICE_DATA  SetBusData;
+  PGET_SET_DEVICE_DATA  GetBusData;
+  KDPC  DeferredDpc;
+#if 0
+  /* FIXME: */
+  NDIS_STATS  NdisStats;
+#else
+  ULONG  NdisStats;
+#endif
+  PNDIS_PACKET  IndicatedPacket[MAXIMUM_PROCESSORS];
+  PKEVENT  RemoveReadyEvent;
+  PKEVENT  AllOpensClosedEvent;
+  PKEVENT  AllRequestsCompletedEvent;
+  ULONG  InitTimeMs;
+  NDIS_MINIPORT_WORK_ITEM  WorkItemBuffer[NUMBER_OF_SINGLE_WORK_ITEMS];
+  PDMA_ADAPTER  SystemAdapterObject;
+  ULONG  DriverVerifyFlags;
+  POID_LIST  OidList;
+  USHORT  InternalResetCount;
+  USHORT  MiniportResetCount;
+  USHORT  MediaSenseConnectCount;
+  USHORT  MediaSenseDisconnectCount;
+  PNDIS_PACKET  *xPackets;
+  ULONG  UserModeOpenReferences;
+  _ANONYMOUS_UNION union {
+    PVOID  SavedSendHandler;
+    PVOID  SavedWanSendHandler;
+  } DUMMYUNIONNAME2;
+  PVOID  SavedSendPacketsHandler;
+  PVOID  SavedCancelSendPacketsHandler;
+  W_SEND_PACKETS_HANDLER  WSendPacketsHandler;
+  ULONG  MiniportAttributes;
+  PDMA_ADAPTER  SavedSystemAdapterObject;
+  USHORT  NumOpens;
+  USHORT  CFHangXTicks;
+  ULONG  RequestCount;
+  ULONG  IndicatedPacketsCount;
+  ULONG  PhysicalMediumType;
+  PNDIS_REQUEST  LastRequest;
+  LONG  DmaAdapterRefCount;
+  PVOID  FakeMac;
+  ULONG  LockDbg;
+  ULONG  LockDbgX;
+  PVOID  LockThread;
+  ULONG  InfoFlags;
+  KSPIN_LOCK  TimerQueueLock;
+  PKEVENT  ResetCompletedEvent;
+  PKEVENT  QueuedBindingCompletedEvent;
+  PKEVENT  DmaResourcesReleasedEvent;
+  FILTER_PACKET_INDICATION_HANDLER  SavedPacketIndicateHandler;
+  ULONG  RegisteredInterrupts;
+  PNPAGED_LOOKASIDE_LIST  SGListLookasideList;
+  ULONG  ScatterGatherListSize;
+#endif /* _NDIS_ */
+};
 
+#if NDIS_LEGACY_DRIVER
 
-/*
- * VOID
- * NdisZeroMemory(
- *   IN PVOID  Destination,
- *   IN ULONG  Length)
- */
-#define NdisZeroMemory(Destination, Length) \
-  RtlZeroMemory(Destination, Length)
+typedef NDIS_STATUS
+(NTAPI *WAN_SEND_HANDLER)(
+  IN NDIS_HANDLE MacBindingHandle,
+  IN NDIS_HANDLE LinkHandle,
+  IN PVOID Packet);
 
 typedef VOID
-(NTAPI *NDIS_BLOCK_INITIALIZER) (
-    IN  PUCHAR  Block,
-    IN  SIZE_T  NumberOfBytes
-    );
+(NTAPI *SEND_PACKETS_HANDLER)(
+  IN NDIS_HANDLE MiniportAdapterContext,
+  IN PPNDIS_PACKET PacketArray,
+  IN UINT NumberOfPackets);
 
-/* Configuration routines */
+typedef NDIS_STATUS
+(NTAPI *SEND_HANDLER)(
+  IN NDIS_HANDLE NdisBindingHandle,
+  IN PNDIS_PACKET Packet);
+
+typedef NDIS_STATUS
+(NTAPI *TRANSFER_DATA_HANDLER)(
+  IN NDIS_HANDLE NdisBindingHandle,
+  IN NDIS_HANDLE MacReceiveContext,
+  IN UINT ByteOffset,
+  IN UINT BytesToTransfer,
+  OUT PNDIS_PACKET Packet,
+  OUT PUINT BytesTransferred);
+
+typedef NDIS_STATUS
+(NTAPI *RESET_HANDLER)(
+  IN NDIS_HANDLE NdisBindingHandle);
+
+typedef NDIS_STATUS
+(NTAPI *REQUEST_HANDLER)(
+  IN NDIS_HANDLE NdisBindingHandle,
+  IN PNDIS_REQUEST NdisRequest);
+
+#endif /* NDIS_LEGACY_DRIVER */
+
+#if defined(NDIS_WRAPPER)
+#define NDIS_COMMON_OPEN_BLOCK_WRAPPER_S \
+  ULONG  Flags; \
+  ULONG  References; \
+  KSPIN_LOCK  SpinLock; \
+  NDIS_HANDLE  FilterHandle; \
+  ULONG  ProtocolOptions; \
+  USHORT  CurrentLookahead; \
+  USHORT  ConnectDampTicks; \
+  USHORT  DisconnectDampTicks; \
+  W_SEND_HANDLER  WSendHandler; \
+  W_TRANSFER_DATA_HANDLER  WTransferDataHandler; \
+  W_SEND_PACKETS_HANDLER  WSendPacketsHandler; \
+  W_CANCEL_SEND_PACKETS_HANDLER  CancelSendPacketsHandler; \
+  ULONG  WakeUpEnable; \
+  PKEVENT  CloseCompleteEvent; \
+  QUEUED_CLOSE  QC; \
+  ULONG  AfReferences; \
+  PNDIS_OPEN_BLOCK  NextGlobalOpen;
+#else
+#define NDIS_COMMON_OPEN_BLOCK_WRAPPER_S
+#endif
+
+#define NDIS_COMMON_OPEN_BLOCK_S \
+  PVOID  MacHandle; \
+  NDIS_HANDLE  BindingHandle; \
+  PNDIS_MINIPORT_BLOCK  MiniportHandle; \
+  PNDIS_PROTOCOL_BLOCK  ProtocolHandle; \
+  NDIS_HANDLE  ProtocolBindingContext; \
+  PNDIS_OPEN_BLOCK  MiniportNextOpen; \
+  PNDIS_OPEN_BLOCK  ProtocolNextOpen; \
+  NDIS_HANDLE  MiniportAdapterContext; \
+  BOOLEAN  Reserved1; \
+  BOOLEAN  Reserved2; \
+  BOOLEAN  Reserved3; \
+  BOOLEAN  Reserved4; \
+  PNDIS_STRING  BindDeviceName; \
+  KSPIN_LOCK  Reserved5; \
+  PNDIS_STRING  RootDeviceName; \
+  _ANONYMOUS_UNION union { \
+    SEND_HANDLER  SendHandler; \
+    WAN_SEND_HANDLER  WanSendHandler; \
+  } DUMMYUNIONNAME; \
+  TRANSFER_DATA_HANDLER  TransferDataHandler; \
+  SEND_COMPLETE_HANDLER  SendCompleteHandler; \
+  TRANSFER_DATA_COMPLETE_HANDLER  TransferDataCompleteHandler; \
+  RECEIVE_HANDLER  ReceiveHandler; \
+  RECEIVE_COMPLETE_HANDLER  ReceiveCompleteHandler; \
+  WAN_RECEIVE_HANDLER  WanReceiveHandler; \
+  REQUEST_COMPLETE_HANDLER  RequestCompleteHandler; \
+  RECEIVE_PACKET_HANDLER  ReceivePacketHandler; \
+  SEND_PACKETS_HANDLER  SendPacketsHandler; \
+  RESET_HANDLER  ResetHandler; \
+  REQUEST_HANDLER  RequestHandler; \
+  RESET_COMPLETE_HANDLER  ResetCompleteHandler; \
+  STATUS_HANDLER  StatusHandler; \
+  STATUS_COMPLETE_HANDLER  StatusCompleteHandler; \
+  NDIS_COMMON_OPEN_BLOCK_WRAPPER_S
+
+typedef struct _NDIS_COMMON_OPEN_BLOCK {
+  NDIS_COMMON_OPEN_BLOCK_S
+} NDIS_COMMON_OPEN_BLOCK;
+
+struct _NDIS_OPEN_BLOCK
+{
+#ifdef __cplusplus
+  NDIS_COMMON_OPEN_BLOCK NdisCommonOpenBlock;
+#else
+  NDIS_COMMON_OPEN_BLOCK_S
+#endif
+};
 
 NDISAPI
 VOID
 NTAPI
-NdisOpenConfiguration(
-  OUT  PNDIS_STATUS  Status,
-  OUT  PNDIS_HANDLE  ConfigurationHandle,
-  IN NDIS_HANDLE  WrapperConfigurationContext);
+NdisInitializeTimer(
+  PNDIS_TIMER Timer,
+  PNDIS_TIMER_FUNCTION TimerFunction,
+  PVOID FunctionContext);
 
 NDISAPI
 VOID
 NTAPI
-NdisReadNetworkAddress(
-  OUT PNDIS_STATUS  Status,
-  OUT PVOID  *NetworkAddress,
-  OUT PUINT  NetworkAddressLength,
-  IN NDIS_HANDLE  ConfigurationHandle);
+NdisCancelTimer(
+  PNDIS_TIMER Timer,
+  PBOOLEAN TimerCancelled);
 
 NDISAPI
 VOID
 NTAPI
-NdisReadEisaSlotInformation(
-  OUT PNDIS_STATUS  Status,
-  IN NDIS_HANDLE  WrapperConfigurationContext,
-  OUT PUINT  SlotNumber,
-  OUT PNDIS_EISA_FUNCTION_INFORMATION  EisaData);
+NdisSetTimer(
+  PNDIS_TIMER Timer,
+  UINT MillisecondsToDelay);
 
 NDISAPI
 VOID
 NTAPI
-NdisReadEisaSlotInformationEx(
-  OUT PNDIS_STATUS  Status,
-  IN NDIS_HANDLE  WrapperConfigurationContext,
-  OUT PUINT  SlotNumber,
-  OUT PNDIS_EISA_FUNCTION_INFORMATION  *EisaData,
-  OUT PUINT  NumberOfFunctions);
+NdisSetPeriodicTimer(
+  PNDIS_TIMER NdisTimer,
+  UINT MillisecondsPeriod);
 
 NDISAPI
-ULONG
+VOID
 NTAPI
-NdisReadPciSlotInformation(
-  IN NDIS_HANDLE  NdisAdapterHandle,
-  IN ULONG  SlotNumber,
-  IN ULONG  Offset,
-  IN PVOID  Buffer,
-  IN ULONG  Length);
+NdisSetTimerEx(
+  PNDIS_TIMER NdisTimer,
+  UINT MillisecondsToDelay,
+  PVOID FunctionContext);
 
 NDISAPI
-ULONG
+PVOID
 NTAPI
-NdisWritePciSlotInformation(
-  IN NDIS_HANDLE  NdisAdapterHandle,
-  IN ULONG  SlotNumber,
-  IN ULONG  Offset,
-  IN PVOID  Buffer,
-  IN ULONG  Length);
+NdisGetRoutineAddress(
+  PNDIS_STRING NdisRoutineName);
 
+NDISAPI
+UINT
+NTAPI
+NdisGetVersion(VOID);
 
+#if NDIS_LEGACY_DRIVER
 
-/* String management routines */
+NDISAPI
+VOID
+NTAPI
+NdisAllocateBuffer(
+  OUT PNDIS_STATUS Status,
+  OUT PNDIS_BUFFER *Buffer,
+  IN NDIS_HANDLE PoolHandle OPTIONAL,
+  IN PVOID VirtualAddress,
+  IN UINT Length);
 
 NDISAPI
-NDIS_STATUS
+VOID
 NTAPI
-NdisAnsiStringToUnicodeString(
-  IN OUT PNDIS_STRING  DestinationString,
-  IN PNDIS_ANSI_STRING  SourceString);
+NdisAllocateBufferPool(
+  OUT PNDIS_STATUS Status,
+  OUT PNDIS_HANDLE PoolHandle,
+  IN UINT NumberOfDescriptors);
+
+NDISAPI
+VOID
+NTAPI
+NdisFreeBufferPool(
+  IN NDIS_HANDLE PoolHandle);
 
 /*
- * BOOLEAN
- * NdisEqualString(
- *   IN PNDIS_STRING  String1,
- *   IN PNDIS_STRING  String2,
- *   IN BOOLEAN  CaseInsensitive);
- */
-#define NdisEqualString(_String1, _String2, _CaseInsensitive) \
-  RtlEqualUnicodeString(_String1, _String2, _CaseInsensitive)
+NDISAPI
+VOID
+NTAPI
+NdisFreeBuffer(
+  IN PNDIS_BUFFER Buffer);
+*/
+#define NdisFreeBuffer IoFreeMdl
 
 NDISAPI
 VOID
 NTAPI
-NdisInitAnsiString(
-  IN OUT PNDIS_ANSI_STRING  DestinationString,
-  IN PCSTR  SourceString);
+NdisAllocatePacketPool(
+  OUT PNDIS_STATUS Status,
+  OUT PNDIS_HANDLE PoolHandle,
+  IN UINT NumberOfDescriptors,
+  IN UINT ProtocolReservedLength);
 
 NDISAPI
 VOID
 NTAPI
-NdisInitUnicodeString(
-  IN OUT PNDIS_STRING  DestinationString,
-  IN PCWSTR  SourceString);
+NdisAllocatePacketPoolEx(
+  OUT PNDIS_STATUS Status,
+  OUT PNDIS_HANDLE PoolHandle,
+  IN UINT NumberOfDescriptors,
+  IN UINT NumberOfOverflowDescriptors,
+  IN UINT ProtocolReservedLength);
 
 NDISAPI
-NDIS_STATUS
+VOID
 NTAPI
-NdisUnicodeStringToAnsiString(
-  IN OUT PNDIS_ANSI_STRING  DestinationString,
-  IN PNDIS_STRING  SourceString);
+NdisSetPacketPoolProtocolId(
+  IN NDIS_HANDLE PacketPoolHandle,
+  IN UINT ProtocolId);
 
-#define NdisFreeString(_s)  NdisFreeMemory((_s).Buffer, (_s).MaximumLength, 0)
-#define NdisPrintString(_s) DbgPrint("%ls", (_s).Buffer)
+NDISAPI
+UINT
+NTAPI
+NdisPacketPoolUsage(
+  IN NDIS_HANDLE PoolHandle);
 
+NDISAPI
+UINT
+NTAPI
+NdisPacketSize(
+  IN UINT ProtocolReservedSize);
 
-/* Spin lock reoutines */
+NDISAPI
+NDIS_HANDLE
+NTAPI
+NdisGetPoolFromPacket(
+  IN PNDIS_PACKET Packet);
 
-/*
 NDISAPI
-VOID
 NTAPI
-NdisAllocateSpinLock(
-  IN PNDIS_SPIN_LOCK SpinLock);
-*/
-#define NdisAllocateSpinLock(_SpinLock) KeInitializeSpinLock(&(_SpinLock)->SpinLock)
+PNDIS_PACKET_STACK
+NdisIMGetCurrentPacketStack(
+  IN PNDIS_PACKET Packet,
+  OUT BOOLEAN * StacksRemaining);
 
-/*
 NDISAPI
 VOID
 NTAPI
-NdisFreeSpinLock(
-  IN PNDIS_SPIN_LOCK  SpinLock);
-*/
-#define NdisFreeSpinLock(_SpinLock)
+NdisFreePacketPool(
+  IN NDIS_HANDLE PoolHandle);
 
-/*
 NDISAPI
 VOID
 NTAPI
-NdisAcquireSpinLock(
-  IN PNDIS_SPIN_LOCK  SpinLock);
-*/
-#define NdisAcquireSpinLock(_SpinLock) KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql)
+NdisFreePacket(
+  IN PNDIS_PACKET Packet);
 
-/*
 NDISAPI
 VOID
 NTAPI
-NdisReleaseSpinLock(
-  IN PNDIS_SPIN_LOCK  SpinLock);
-*/
-#define NdisReleaseSpinLock(_SpinLock) KeReleaseSpinLock(&(_SpinLock)->SpinLock,(_SpinLock)->OldIrql)
+NdisDprFreePacket(
+  IN PNDIS_PACKET Packet);
 
-/*
 NDISAPI
 VOID
 NTAPI
-NdisDprAcquireSpinLock(
-  IN PNDIS_SPIN_LOCK  SpinLock);
-*/
-#define NdisDprAcquireSpinLock(_SpinLock) KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock)
+NdisDprFreePacketNonInterlocked(
+  IN PNDIS_PACKET Packet);
 
-/*
 NDISAPI
 VOID
 NTAPI
-NdisDprReleaseSpinLock(
-  IN PNDIS_SPIN_LOCK  SpinLock);
-*/
-#define NdisDprReleaseSpinLock(_SpinLock) KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock)
+NdisAllocatePacket(
+  OUT PNDIS_STATUS Status,
+  OUT PNDIS_PACKET *Packet,
+  IN NDIS_HANDLE PoolHandle);
 
-/* I/O routines */
+NDISAPI
+VOID
+NTAPI
+NdisDprAllocatePacket(
+  OUT PNDIS_STATUS Status,
+  OUT PNDIS_PACKET *Packet,
+  IN NDIS_HANDLE PoolHandle);
 
-/*
- * VOID
- * NdisRawReadPortBufferUchar(
- *   IN ULONG  Port,
- *   OUT PUCHAR  Buffer,
- *   IN ULONG  Length);
- */
-#define NdisRawReadPortBufferUchar(Port, Buffer, Length)    \
-  READ_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length))
+NDISAPI
+VOID
+NTAPI
+NdisDprAllocatePacketNonInterlocked(
+  OUT PNDIS_STATUS Status,
+  OUT PNDIS_PACKET *Packet,
+  IN NDIS_HANDLE PoolHandle);
 
 /*
  * VOID
- * NdisRawReadPortBufferUlong(
- *   IN ULONG  Port,
- *   OUT PULONG  Buffer,
- *   IN ULONG  Length);
+ * NdisReinitializePacket(
+ *   IN OUT  PNDIS_PACKET  Packet);
  */
-#define NdisRawReadPortBufferUlong(Port, Buffer, Length)  \
-  READ_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length))
+#define NdisReinitializePacket(Packet) {        \
+  (Packet)->Private.Head = (PNDIS_BUFFER)NULL;  \
+  (Packet)->Private.ValidCounts = FALSE;        \
+}
 
 /*
- * VOID
- * NdisRawReadPortBufferUshort(
- *   IN ULONG  Port,
- *   OUT PUSHORT  Buffer,
- *   IN ULONG  Length);
- */
-#define NdisRawReadPortBufferUshort(Port, Buffer, Length) \
-  READ_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length))
+NDISAPI
+VOID
+NTAPI
+NdisQueryBuffer(
+  IN PNDIS_BUFFER Buffer,
+  OUT PVOID *VirtualAddress OPTIONAL,
+  OUT PUINT Length);
+*/
+#define NdisQueryBuffer(_Buffer, _VirtualAddress, _Length) {         \
+  if (ARGUMENT_PRESENT(_VirtualAddress)) {                           \
+    *(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdl(_Buffer); \
+  }                                                                  \
+  *(_Length) = MmGetMdlByteCount(_Buffer);                           \
+}
 
+NDISAPI
+VOID
+NTAPI
+NdisGetFirstBufferFromPacket(
+  IN PNDIS_PACKET _Packet,
+  OUT PNDIS_BUFFER *_FirstBuffer,
+  OUT PVOID *_FirstBufferVA,
+  OUT PUINT _FirstBufferLength,
+  OUT PUINT _TotalBufferLength);
 
 /*
  * VOID
- * NdisRawReadPortUchar(
- *   IN ULONG  Port,
- *   OUT PUCHAR  Data);
+ * NdisGetFirstBufferFromPacketSafe(
+ * IN PNDIS_PACKET _Packet,
+ * OUT PNDIS_BUFFER * _FirstBuffer,
+ * OUT PVOID * _FirstBufferVA,
+ * OUT PUINT _FirstBufferLength,
+ * OUT PUINT _TotalBufferLength),
+ * IN MM_PAGE_PRIORITY _Priority)
  */
-#define NdisRawReadPortUchar(Port, Data) \
-  *(Data) = READ_PORT_UCHAR((PUCHAR)(Port))
+#define NdisGetFirstBufferFromPacketSafe(_Packet,                             \
+                                     _FirstBuffer,                            \
+                                     _FirstBufferVA,                          \
+                                     _FirstBufferLength,                      \
+                                     _TotalBufferLength,                      \
+                                     _Priority)                               \
+{                                                                             \
+  PNDIS_BUFFER _Buffer;                                                       \
+                                                                              \
+  _Buffer         = (_Packet)->Private.Head;                                  \
+  *(_FirstBuffer) = _Buffer;                                                  \
+  if (_Buffer != NULL) {                                                      \
+    *(_FirstBufferVA)     = MmGetSystemAddressForMdlSafe(_Buffer, _Priority); \
+    *(_FirstBufferLength) = MmGetMdlByteCount(_Buffer);                       \
+    _Buffer = _Buffer->Next;                                                  \
+    *(_TotalBufferLength) = *(_FirstBufferLength);                            \
+    while (_Buffer != NULL) {                                                 \
+      *(_TotalBufferLength) += MmGetMdlByteCount(_Buffer);                    \
+      _Buffer = _Buffer->Next;                                                \
+    }                                                                         \
+  }                                                                           \
+  else {                                                                      \
+    *(_FirstBufferVA) = 0;                                                    \
+    *(_FirstBufferLength) = 0;                                                \
+    *(_TotalBufferLength) = 0;                                                \
+  }                                                                           \
+}
 
 /*
  * VOID
- * NdisRawReadPortUlong(
- *   IN ULONG  Port,
- *   OUT PULONG  Data);
+ * NdisRecalculatePacketCounts(
+ *   IN OUT PNDIS_PACKET Packet);
  */
-#define NdisRawReadPortUlong(Port, Data) \
-  *(Data) = READ_PORT_ULONG((PULONG)(Port))
+#define NdisRecalculatePacketCounts(Packet) {     \
+  PNDIS_BUFFER _Buffer = (Packet)->Private.Head;  \
+  if (_Buffer != NULL) {                          \
+    while (_Buffer->Next != NULL) {               \
+      _Buffer = _Buffer->Next;                    \
+    }                                             \
+    (Packet)->Private.Tail = _Buffer;             \
+  }                                               \
+  (Packet)->Private.ValidCounts = FALSE;          \
+}
 
 /*
  * VOID
- * NdisRawReadPortUshort(
- *   IN ULONG   Port,
- *   OUT PUSHORT Data);
+ * NdisChainBufferAtFront(
+ *   IN OUT PNDIS_PACKET Packet,
+ *   IN OUT PNDIS_BUFFER Buffer)
  */
-#define NdisRawReadPortUshort(Port, Data) \
-  *(Data) = READ_PORT_USHORT((PUSHORT)(Port))
-
-
-/*
- * VOID
- * NdisRawWritePortBufferUchar(
- *   IN ULONG  Port,
- *   IN PUCHAR  Buffer,
- *   IN ULONG  Length);
- */
-#define NdisRawWritePortBufferUchar(Port, Buffer, Length) \
-  WRITE_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length))
-
-/*
- * VOID
- * NdisRawWritePortBufferUlong(
- *   IN ULONG  Port,
- *   IN PULONG  Buffer,
- *   IN ULONG  Length);
- */
-#define NdisRawWritePortBufferUlong(Port, Buffer, Length) \
-  WRITE_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length))
-
-/*
- * VOID
- * NdisRawWritePortBufferUshort(
- *   IN ULONG   Port,
- *   IN PUSHORT Buffer,
- *   IN ULONG   Length);
- */
-#define NdisRawWritePortBufferUshort(Port, Buffer, Length) \
-  WRITE_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length))
-
-
-/*
- * VOID
- * NdisRawWritePortUchar(
- *   IN ULONG  Port,
- *   IN UCHAR  Data);
- */
-#define NdisRawWritePortUchar(Port, Data) \
-  WRITE_PORT_UCHAR((PUCHAR)(Port), (UCHAR)(Data))
-
-/*
- * VOID
- * NdisRawWritePortUlong(
- *   IN ULONG  Port,
- *   IN ULONG  Data);
- */
-#define NdisRawWritePortUlong(Port, Data)   \
-  WRITE_PORT_ULONG((PULONG)(Port), (ULONG)(Data))
-
-/*
- * VOID
- * NdisRawWritePortUshort(
- *   IN ULONG  Port,
- *   IN USHORT  Data);
- */
-#define NdisRawWritePortUshort(Port, Data) \
-  WRITE_PORT_USHORT((PUSHORT)(Port), (USHORT)(Data))
-
-
-/*
- * VOID
- * NdisReadRegisterUchar(
- *   IN PUCHAR  Register,
- *   OUT PUCHAR  Data);
- */
-#define NdisReadRegisterUchar(Register, Data) \
-  *(Data) = *(Register)
-
-/*
- * VOID
- * NdisReadRegisterUlong(
- *   IN PULONG  Register,
- *   OUT PULONG  Data);
- */
-#define NdisReadRegisterUlong(Register, Data)   \
-  *(Data) = *(Register)
-
-/*
- * VOID
- * NdisReadRegisterUshort(
- *   IN PUSHORT  Register,
- *   OUT PUSHORT  Data);
- */
-#define NdisReadRegisterUshort(Register, Data)  \
-    *(Data) = *(Register)
-
-/*
- * VOID
- * NdisReadRegisterUchar(
- *   IN PUCHAR  Register,
- *   IN UCHAR  Data);
- */
-#define NdisWriteRegisterUchar(Register, Data) \
-  WRITE_REGISTER_UCHAR((Register), (Data))
-
-/*
- * VOID
- * NdisReadRegisterUlong(
- *   IN PULONG  Register,
- *   IN ULONG  Data);
- */
-#define NdisWriteRegisterUlong(Register, Data) \
-  WRITE_REGISTER_ULONG((Register), (Data))
-
-/*
- * VOID
- * NdisReadRegisterUshort(
- *   IN PUSHORT  Register,
- *   IN USHORT  Data);
- */
-#define NdisWriteRegisterUshort(Register, Data) \
-  WRITE_REGISTER_USHORT((Register), (Data))
-
-
-/* Linked lists */
-
-/*
- * VOID
- * NdisInitializeListHead(
- *   IN PLIST_ENTRY  ListHead);
- */
-#define NdisInitializeListHead(_ListHead) \
-  InitializeListHead(_ListHead)
-
-/*
- * PLIST_ENTRY
- * NdisInterlockedInsertHeadList(
- *   IN PLIST_ENTRY  ListHead,
- *   IN PLIST_ENTRY  ListEntry,
- *   IN PNDIS_SPIN_LOCK  SpinLock);
- */
-#define NdisInterlockedInsertHeadList(_ListHead, _ListEntry, _SpinLock) \
-  ExInterlockedInsertHeadList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
-
-/*
- * PLIST_ENTRY
- * NdisInterlockedInsertTailList(
- *   IN PLIST_ENTRY  ListHead,
- *   IN PLIST_ENTRY  ListEntry,
- *   IN PNDIS_SPIN_LOCK  SpinLock);
- */
-#define NdisInterlockedInsertTailList(_ListHead, _ListEntry, _SpinLock) \
-  ExInterlockedInsertTailList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
-
-/*
- * PLIST_ENTRY
- * NdisInterlockedRemoveHeadList(
- *   IN PLIST_ENTRY  ListHead,
- *   IN PNDIS_SPIN_LOCK  SpinLock);
-*/
-#define NdisInterlockedRemoveHeadList(_ListHead, _SpinLock) \
-  ExInterlockedRemoveHeadList(_ListHead, &(_SpinLock)->SpinLock)
+#define NdisChainBufferAtFront(Packet,        \
+                               Buffer)        \
+{                                             \
+  PNDIS_BUFFER _NdisBuffer = (Buffer);        \
+                                              \
+  while (_NdisBuffer->Next != NULL)           \
+    _NdisBuffer = _NdisBuffer->Next;          \
+                                              \
+  if ((Packet)->Private.Head == NULL)         \
+    (Packet)->Private.Tail = _NdisBuffer;     \
+                                              \
+  _NdisBuffer->Next = (Packet)->Private.Head; \
+  (Packet)->Private.Head = (Buffer);          \
+  (Packet)->Private.ValidCounts = FALSE;      \
+}
 
 /*
  * VOID
- * NdisInitializeSListHead(
- *   IN PSLIST_HEADER  SListHead);
- */
-#define NdisInitializeSListHead(SListHead) ExInitializeSListHead(SListHead)
-
-/*
- * USHORT NdisQueryDepthSList(
- *   IN PSLIST_HEADER  SListHead);
+ * NdisChainBufferAtBack(
+ *   IN OUT PNDIS_PACKET Packet,
+ *   IN OUT PNDIS_BUFFER Buffer)
  */
-#define NdisQueryDepthSList(SListHead) ExQueryDepthSList(SListHead)
-
-#define NdisInterlockedPushEntryList(ListHead, ListEntry, Lock) \
-  ExInterlockedPushEntryList(ListHead, ListEntry, &(Lock)->SpinLock)
-
-#define NdisInterlockedPopEntryList(ListHead, Lock) \
-  ExInterlockedPopEntryList(ListHead, &(Lock)->SpinLock)
-
-/* Interlocked routines */
+#define NdisChainBufferAtBack(Packet,           \
+                              Buffer)           \
+{                                               \
+  PNDIS_BUFFER NdisBuffer = (Buffer);           \
+                                                \
+  while (NdisBuffer->Next != NULL)              \
+    NdisBuffer = NdisBuffer->Next;              \
+                                                \
+  NdisBuffer->Next = NULL;                      \
+                                                \
+  if ((Packet)->Private.Head != NULL)           \
+    (Packet)->Private.Tail->Next = (Buffer);    \
+  else                                          \
+    (Packet)->Private.Head = (Buffer);          \
+                                                \
+  (Packet)->Private.Tail = NdisBuffer;          \
+  (Packet)->Private.ValidCounts = FALSE;        \
+}
 
-/*
- * LONG
- * NdisInterlockedDecrement(
- *   IN PLONG  Addend);
- */
-#define NdisInterlockedDecrement(Addend) InterlockedDecrement(Addend)
+NDISAPI
+VOID
+NTAPI
+NdisUnchainBufferAtFront(
+  IN OUT PNDIS_PACKET Packet,
+  OUT PNDIS_BUFFER *Buffer);
 
-/*
- * LONG
- * NdisInterlockedIncrement(
- *   IN PLONG  Addend);
- */
-#define NdisInterlockedIncrement(Addend) InterlockedIncrement(Addend)
+NDISAPI
+VOID
+NTAPI
+NdisUnchainBufferAtBack(
+  IN OUT PNDIS_PACKET Packet,
+  OUT PNDIS_BUFFER *Buffer);
 
-/*
- * VOID
- * NdisInterlockedAddUlong(
- *   IN PULONG  Addend,
- *   IN ULONG  Increment,
- *   IN PNDIS_SPIN_LOCK  SpinLock);
- */
-#define NdisInterlockedAddUlong(_Addend, _Increment, _SpinLock) \
-  ExInterlockedAddUlong(_Addend, _Increment, &(_SpinLock)->SpinLock)
+NDISAPI
+VOID
+NTAPI
+NdisCopyFromPacketToPacket(
+  IN PNDIS_PACKET Destination,
+  IN UINT DestinationOffset,
+  IN UINT BytesToCopy,
+  IN PNDIS_PACKET Source,
+  IN UINT SourceOffset,
+  OUT PUINT BytesCopied);
 
+NDISAPI
+VOID
+NTAPI
+NdisCopyFromPacketToPacketSafe(
+  IN PNDIS_PACKET Destination,
+  IN UINT DestinationOffset,
+  IN UINT BytesToCopy,
+  IN PNDIS_PACKET Source,
+  IN UINT SourceOffset,
+  OUT PUINT BytesCopied,
+  IN MM_PAGE_PRIORITY Priority);
 
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisAllocateMemory(
+  OUT PVOID *VirtualAddress,
+  IN UINT Length,
+  IN UINT MemoryFlags,
+  IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress);
+
+#define NdisInitializeWorkItem(_WI_, _R_, _C_) { \
+  (_WI_)->Context = _C_;                         \
+  (_WI_)->Routine = _R_;                         \
+}
 
-/* Miscellaneous routines */
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisScheduleWorkItem(
+  IN PNDIS_WORK_ITEM WorkItem);
 
 NDISAPI
 VOID
 NTAPI
-NdisCloseConfiguration(
-  IN NDIS_HANDLE  ConfigurationHandle);
+NdisSetPacketStatus(
+  IN PNDIS_PACKET Packet,
+  IN NDIS_STATUS Status,
+  IN NDIS_HANDLE Handle,
+  IN ULONG Code);
+
+#endif /* NDIS_LEGACY_DRIVER */
 
 NDISAPI
 VOID
 NTAPI
-NdisReadConfiguration(
-  OUT  PNDIS_STATUS  Status,
-  OUT  PNDIS_CONFIGURATION_PARAMETER  *ParameterValue,
-  IN NDIS_HANDLE  ConfigurationHandle,
-  IN PNDIS_STRING  Keyword,
-  IN NDIS_PARAMETER_TYPE  ParameterType);
+NdisOpenFile(
+  OUT PNDIS_STATUS Status,
+  OUT PNDIS_HANDLE FileHandle,
+  OUT PUINT FileLength,
+  IN PNDIS_STRING FileName,
+  IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress);
 
 NDISAPI
 VOID
 NTAPI
-NdisWriteConfiguration(
-  OUT  PNDIS_STATUS  Status,
-  IN NDIS_HANDLE  WrapperConfigurationContext,
-  IN PNDIS_STRING  Keyword,
-  IN PNDIS_CONFIGURATION_PARAMETER  ParameterValue);
+NdisCloseFile(
+  IN NDIS_HANDLE FileHandle);
 
 NDISAPI
 VOID
-__cdecl
-NdisWriteErrorLogEntry(
-       IN NDIS_HANDLE  NdisAdapterHandle,
-       IN NDIS_ERROR_CODE  ErrorCode,
-       IN ULONG  NumberOfErrorValues,
-       IN ...);
-
-/*
- * VOID
- * NdisStallExecution(
- *   IN UINT  MicrosecondsToStall)
- */
-#define NdisStallExecution KeStallExecutionProcessor
+NTAPI
+NdisMapFile(
+  OUT PNDIS_STATUS Status,
+  OUT PVOID *MappedBuffer,
+  IN NDIS_HANDLE FileHandle);
 
-/*
 NDISAPI
 VOID
 NTAPI
-NdisGetCurrentSystemTime(
-  IN PLARGE_INTEGER  pSystemTime);
-*/
-#define NdisGetCurrentSystemTime KeQuerySystemTime
+NdisUnmapFile(
+  IN NDIS_HANDLE FileHandle);
 
 NDISAPI
-CCHAR
+ULONG
 NTAPI
-NdisSystemProcessorCount(VOID);
+NdisGetSharedDataAlignment(VOID);
+
+#define NdisFlushBuffer(Buffer,WriteToDevice) \
+  KeFlushIoBuffers((Buffer),!(WriteToDevice), TRUE)
 
 NDISAPI
 VOID
 NTAPI
-NdisGetCurrentProcessorCpuUsage(
-  OUT PULONG  pCpuUsage);
-
-
-
-/* NDIS helper macros */
+NdisCopyBuffer(
+  OUT PNDIS_STATUS Status,
+  OUT PNDIS_BUFFER *Buffer,
+  IN NDIS_HANDLE PoolHandle,
+  IN PVOID MemoryDescriptor,
+  IN UINT Offset,
+  IN UINT Length);
 
 /*
  * VOID
- * NDIS_INIT_FUNCTION(FunctionName)
+ * NdisCopyLookaheadData(
+ *   IN PVOID Destination,
+ *   IN PVOID Source,
+ *   IN ULONG Length,
+ *   IN ULONG ReceiveFlags);
  */
-#define NDIS_INIT_FUNCTION(FunctionName)    \
-  alloc_text(init, FunctionName)
 
-/*
- * VOID
- * NDIS_PAGABLE_FUNCTION(FunctionName)
- */
-#define NDIS_PAGEABLE_FUNCTION(FunctionName) \
-  alloc_text(page, FunctionName)
-
-#define NDIS_PAGABLE_FUNCTION NDIS_PAGEABLE_FUNCTION
-
-
-/* NDIS 4.0 extensions */
-
-NDISAPI
-VOID
-NTAPI
-NdisMFreeSharedMemory(
-       IN NDIS_HANDLE  MiniportAdapterHandle,
-       IN ULONG  Length,
-       IN BOOLEAN  Cached,
-       IN PVOID  VirtualAddress,
-       IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
-
-NDISAPI
-VOID
-NTAPI
-NdisMWanIndicateReceive(
-       OUT PNDIS_STATUS  Status,
-       IN NDIS_HANDLE  MiniportAdapterHandle,
-       IN NDIS_HANDLE  NdisLinkContext,
-       IN PUCHAR  PacketBuffer,
-       IN UINT  PacketSize);
+#if defined(_M_IX86) || defined(_M_AMD64)
+#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions) \
+  RtlCopyMemory(Destination, Source, Length)
+#else
+#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions) \
+  { \
+    if ((MacOptions) & NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA) \
+    { \
+      RtlCopyMemory(_Destination, _Source, _Length); \
+    } \
+    else \
+    { \
+      PUCHAR _Src = (PUCHAR)(Source); \
+      PUCHAR _Dest = (PUCHAR)(Destination); \
+      PUCHAR _End = _Dest + (Length); \
+      while (_Dest < _End) \
+        *_Dest++ = *_Src++; \
+    } \
+  }
+#endif
 
 NDISAPI
 VOID
 NTAPI
-NdisMWanIndicateReceiveComplete(
-  IN NDIS_HANDLE  MiniportAdapterHandle);
+NdisReturnPackets(
+  IN PNDIS_PACKET  *PacketsToReturn,
+  IN UINT  NumberOfPackets);
 
+/*
 NDISAPI
 VOID
 NTAPI
-NdisMWanSendComplete(
-       IN NDIS_HANDLE  MiniportAdapterHandle,
-       IN PNDIS_WAN_PACKET  Packet,
-       IN NDIS_STATUS  Status);
-
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisPciAssignResources(
-       IN NDIS_HANDLE  NdisMacHandle,
-       IN NDIS_HANDLE  NdisWrapperHandle,
-       IN NDIS_HANDLE  WrapperConfigurationContext,
-       IN ULONG  SlotNumber,
-       OUT PNDIS_RESOURCE_LIST  *AssignedResources);
-
+NdisAdjustBufferLength(
+  IN PNDIS_BUFFER Buffer,
+  IN UINT Length);
+*/
+#define NdisAdjustBufferLength(Buffer, Length) \
+  (((Buffer)->ByteCount) = (Length))
 
-/* NDIS 5.0 extensions */
+#if NDIS_SUPPORT_NDIS6
+#define NdisAdjustMdlLength(_Mdl, _Length) \
+  (((_Mdl)->ByteCount) = (_Length))
+#endif
 
 NDISAPI
-VOID
+ULONG
 NTAPI
-NdisAcquireReadWriteLock(
-  IN PNDIS_RW_LOCK  Lock,
-  IN BOOLEAN  fWrite,
-  IN PLOCK_STATE  LockState);
+NdisBufferLength(
+  IN PNDIS_BUFFER  Buffer);
 
 NDISAPI
-NDIS_STATUS
+PVOID
 NTAPI
-NdisAllocateMemoryWithTag(
-  OUT PVOID  *VirtualAddress,
-  IN UINT  Length,
-  IN ULONG  Tag);
+NdisBufferVirtualAddress(
+  IN PNDIS_BUFFER  Buffer);
 
 NDISAPI
-VOID
+ULONG
 NTAPI
-NdisAllocatePacketPoolEx(
-  OUT PNDIS_STATUS  Status,
-  OUT PNDIS_HANDLE  PoolHandle,
-  IN UINT  NumberOfDescriptors,
-  IN UINT  NumberOfOverflowDescriptors,
-  IN UINT  ProtocolReservedLength);
+NDIS_BUFFER_TO_SPAN_PAGES(
+  IN PNDIS_BUFFER Buffer);
 
+/*
 NDISAPI
 VOID
 NTAPI
-NdisSetPacketPoolProtocolId(
-  IN NDIS_HANDLE PacketPoolHandle,
-  IN UINT ProtocolId);
+NdisGetBufferPhysicalArraySize(
+  IN PNDIS_BUFFER Buffer,
+  OUT PUINT ArraySize);
+*/
+#define NdisGetBufferPhysicalArraySize(Buffer, ArraySize) \
+  (*(ArraySize) = NDIS_BUFFER_TO_SPAN_PAGES(Buffer))
 
+/*
 NDISAPI
 VOID
 NTAPI
-NdisCompletePnPEvent(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisBindingHandle,
-  IN PNET_PNP_EVENT  NetPnPEvent);
+NdisQueryBufferOffset(
+  IN PNDIS_BUFFER Buffer,
+  OUT PUINT Offset,
+  OUT PUINT Length);
+*/
+#define NdisQueryBufferOffset(_Buffer, _Offset, _Length) { \
+  *(_Offset) = MmGetMdlByteOffset(_Buffer);                \
+  *(_Length) = MmGetMdlByteCount(_Buffer);                 \
+}
 
-NDISAPI
-VOID
-NTAPI
-NdisGetCurrentProcessorCounts(
-  OUT PULONG  pIdleCount,
-  OUT PULONG  pKernelAndUser,
-  OUT PULONG  pIndex);
+/*
+ * PVOID
+ * NDIS_BUFFER_LINKAGE(
+ *   IN PNDIS_BUFFER Buffer);
+ */
+#define NDIS_BUFFER_LINKAGE(Buffer)(Buffer)->Next;
 
-NDISAPI
-VOID
-NTAPI
-NdisGetDriverHandle(
-  IN PNDIS_HANDLE  NdisBindingHandle,
-  OUT PNDIS_HANDLE  NdisDriverHandle);
+/*
+ * VOID
+ * NdisGetNextBuffer(
+ *   IN PNDIS_BUFFER CurrentBuffer,
+ *   OUT PNDIS_BUFFER * NextBuffer)
+ */
+#define NdisGetNextBuffer(CurrentBuffer,  \
+                          NextBuffer)     \
+{                                         \
+  *(NextBuffer) = (CurrentBuffer)->Next;  \
+}
 
-NDISAPI
-PNDIS_PACKET
-NTAPI
-NdisGetReceivedPacket(
-  IN PNDIS_HANDLE  NdisBindingHandle,
-  IN PNDIS_HANDLE  MacContext);
+#if NDIS_LEGACY_DRIVER
 
-NDISAPI
-VOID
-NTAPI
-NdisGetSystemUpTime(
-  OUT PULONG  pSystemUpTime);
+#define NDIS_PACKET_FIRST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Head)
+#define NDIS_PACKET_LAST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Tail)
+#define NDIS_PACKET_VALID_COUNTS(_Packet) ((_Packet)->Private.ValidCounts)
 
-NDISAPI
-VOID
-NTAPI
-NdisInitializeReadWriteLock(
-  IN PNDIS_RW_LOCK  Lock);
+/*
+ * UINT
+ * NdisGetPacketFlags(
+ *   IN PNDIS_PACKET  Packet);
+ */
+#define NdisGetPacketFlags(Packet)(Packet)->Private.Flags;
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMDeregisterDevice(
-  IN NDIS_HANDLE  NdisDeviceHandle);
+/*
+ * ULONG
+ * NDIS_GET_PACKET_PROTOCOL_TYPE(
+ *   IN PNDIS_PACKET Packet);
+ */
+#define NDIS_GET_PACKET_PROTOCOL_TYPE(_Packet) \
+  ((_Packet)->Private.Flags & NDIS_PROTOCOL_ID_MASK)
 
-NDISAPI
-VOID
-NTAPI
-NdisMGetDeviceProperty(
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN OUT PDEVICE_OBJECT  *PhysicalDeviceObject  OPTIONAL,
-  IN OUT PDEVICE_OBJECT  *FunctionalDeviceObject  OPTIONAL,
-  IN OUT PDEVICE_OBJECT  *NextDeviceObject  OPTIONAL,
-  IN OUT PCM_RESOURCE_LIST  *AllocatedResources  OPTIONAL,
-  IN OUT PCM_RESOURCE_LIST  *AllocatedResourcesTranslated  OPTIONAL);
+/*
+ * PNDIS_PACKET_OOB_DATA
+ * NDIS_OOB_DATA_FROM_PACKET(
+ *   IN PNDIS_PACKET Packet);
+ */
+#define NDIS_OOB_DATA_FROM_PACKET(_Packet)    \
+  (PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
+  (_Packet)->Private.NdisPacketOobOffset)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMInitializeScatterGatherDma(
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN BOOLEAN  Dma64BitAddresses,
-  IN ULONG  MaximumPhysicalMapping);
+/*
+ * ULONG
+ * NDIS_GET_PACKET_HEADER_SIZE(
+ *   IN PNDIS_PACKET Packet);
+ */
+#define NDIS_GET_PACKET_HEADER_SIZE(_Packet)   \
+  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
+  (_Packet)->Private.NdisPacketOobOffset))->HeaderSize
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMPromoteMiniport(
-  IN NDIS_HANDLE  MiniportAdapterHandle);
+/*
+ * NDIS_STATUS
+ * NDIS_GET_PACKET_STATUS(
+ *   IN PNDIS_PACKET Packet);
+ */
+#define NDIS_GET_PACKET_STATUS(_Packet)        \
+  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
+  (_Packet)->Private.NdisPacketOobOffset))->Status
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMQueryAdapterInstanceName(
-  OUT PNDIS_STRING  AdapterInstanceName,
-  IN NDIS_HANDLE  MiniportAdapterHandle);
+/*
+ * ULONGLONG
+ * NDIS_GET_PACKET_TIME_TO_SEND(
+ *   IN PNDIS_PACKET Packet);
+ */
+#define NDIS_GET_PACKET_TIME_TO_SEND(_Packet)   \
+  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +  \
+  (_Packet)->Private.NdisPacketOobOffset))->TimeToSend
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMRegisterDevice(
-  IN NDIS_HANDLE  NdisWrapperHandle,
-  IN PNDIS_STRING  DeviceName,
-  IN PNDIS_STRING  SymbolicName,
-  IN PDRIVER_DISPATCH  MajorFunctions[],
-  OUT PDEVICE_OBJECT  *pDeviceObject,
-  OUT NDIS_HANDLE  *NdisDeviceHandle);
+/*
+ * ULONGLONG
+ * NDIS_GET_PACKET_TIME_SENT(
+ *   IN PNDIS_PACKET Packet);
+ */
+#define NDIS_GET_PACKET_TIME_SENT(_Packet)      \
+  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +  \
+  (_Packet)->Private.NdisPacketOobOffset))->TimeSent
 
-NDISAPI
-VOID
-NTAPI
-NdisMRegisterUnloadHandler(
-  IN NDIS_HANDLE  NdisWrapperHandle,
-  IN PDRIVER_UNLOAD  UnloadHandler);
+/*
+ * ULONGLONG
+ * NDIS_GET_PACKET_TIME_RECEIVED(
+ *   IN PNDIS_PACKET Packet);
+ */
+#define NDIS_GET_PACKET_TIME_RECEIVED(_Packet)  \
+  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +  \
+  (_Packet)->Private.NdisPacketOobOffset))->TimeReceived
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMRemoveMiniport(
-  IN NDIS_HANDLE  MiniportAdapterHandle);
+/*
+ * VOID
+ * NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(
+ *   IN PNDIS_PACKET Packet,
+ *   IN PPVOID pMediaSpecificInfo,
+ *   IN PUINT pSizeMediaSpecificInfo);
+ */
+#define NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(_Packet,                                  \
+                                            _pMediaSpecificInfo,                      \
+                                            _pSizeMediaSpecificInfo)                  \
+{                                                                                     \
+  if (!((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) ||            \
+      !((_Packet)->Private.NdisPacketFlags & fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO))   \
+    {                                                                                 \
+      *(_pMediaSpecificInfo) = NULL;                                                  \
+      *(_pSizeMediaSpecificInfo) = 0;                                                 \
+    }                                                                                 \
+  else                                                                                \
+    {                                                                                 \
+      *(_pMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +           \
+        (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation;           \
+      *(_pSizeMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +       \
+        (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo;              \
+    }                                                                                 \
+}
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMSetMiniportSecondary(
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN NDIS_HANDLE  PrimaryMiniportAdapterHandle);
+/*
+ * VOID
+ * NDIS_SET_PACKET_HEADER_SIZE(
+ *   IN PNDIS_PACKET Packet,
+ *   IN UINT HdrSize);
+ */
+#define NDIS_SET_PACKET_HEADER_SIZE(_Packet, _HdrSize)              \
+  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                      \
+  (_Packet)->Private.NdisPacketOobOffset))->HeaderSize = (_HdrSize)
 
-NDISAPI
-VOID
-NTAPI
-NdisOpenConfigurationKeyByIndex(
-  OUT PNDIS_STATUS  Status,
-  IN NDIS_HANDLE  ConfigurationHandle,
-  IN ULONG  Index,
-  OUT PNDIS_STRING  KeyName,
-  OUT PNDIS_HANDLE  KeyHandle);
+/*
+ * VOID
+ * NDIS_SET_PACKET_STATUS(
+ *   IN PNDIS_PACKET Packet,
+ *   IN NDIS_STATUS Status);
+ */
+#define NDIS_SET_PACKET_STATUS(_Packet, _Status)  \
+  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +    \
+  (_Packet)->Private.NdisPacketOobOffset))->Status = (_Status)
 
-NDISAPI
-VOID
-NTAPI
-NdisOpenConfigurationKeyByName(
-  OUT PNDIS_STATUS  Status,
-  IN NDIS_HANDLE  ConfigurationHandle,
-  IN PNDIS_STRING  SubKeyName,
-  OUT PNDIS_HANDLE  SubKeyHandle);
+/*
+ * VOID
+ * NDIS_SET_PACKET_TIME_TO_SEND(
+ *   IN PNDIS_PACKET Packet,
+ *   IN ULONGLONG TimeToSend);
+ */
+#define NDIS_SET_PACKET_TIME_TO_SEND(_Packet, _TimeToSend)  \
+  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +              \
+  (_Packet)->Private.NdisPacketOobOffset))->TimeToSend = (_TimeToSend)
 
-NDISAPI
-UINT
-NTAPI
-NdisPacketPoolUsage(
-  IN NDIS_HANDLE  PoolHandle);
+/*
+ * VOID
+ * NDIS_SET_PACKET_TIME_SENT(
+ *   IN PNDIS_PACKET Packet,
+ *   IN ULONGLONG TimeSent);
+ */
+#define NDIS_SET_PACKET_TIME_SENT(_Packet, _TimeSent) \
+  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +        \
+  (_Packet)->Private.NdisPacketOobOffset))->TimeSent = (_TimeSent)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisQueryAdapterInstanceName(
-  OUT PNDIS_STRING  AdapterInstanceName,
-  IN NDIS_HANDLE  NdisBindingHandle);
+/*
+ * VOID
+ * NDIS_SET_PACKET_TIME_RECEIVED(
+ *   IN PNDIS_PACKET Packet,
+ *   IN ULONGLONG TimeReceived);
+ */
+#define NDIS_SET_PACKET_TIME_RECEIVED(_Packet, _TimeReceived) \
+  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                \
+  (_Packet)->Private.NdisPacketOobOffset))->TimeReceived = (_TimeReceived)
 
-NDISAPI
-ULONG
-NTAPI
-NdisReadPcmciaAttributeMemory(
-  IN NDIS_HANDLE  NdisAdapterHandle,
-  IN ULONG  Offset,
-  IN PVOID  Buffer,
-  IN ULONG  Length);
+/*
+ * VOID
+ * NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(
+ *   IN PNDIS_PACKET Packet,
+ *   IN PVOID MediaSpecificInfo,
+ *   IN UINT SizeMediaSpecificInfo);
+ */
+#define NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(_Packet,                      \
+                                            _MediaSpecificInfo,           \
+                                            _SizeMediaSpecificInfo)       \
+{                                                                         \
+  if ((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS)     \
+    {                                                                     \
+      (_Packet)->Private.NdisPacketFlags |= fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO; \
+      ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                        \
+        (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation = \
+          (_MediaSpecificInfo);                                           \
+      ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                        \
+        (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo = \
+          (_SizeMediaSpecificInfo);                                       \
+    }                                                                     \
+}
 
-NDISAPI
-VOID
-NTAPI
-NdisReleaseReadWriteLock(
-  IN PNDIS_RW_LOCK  Lock,
-  IN PLOCK_STATE  LockState);
+/*
+ * VOID
+ * NdisSetPacketFlags(
+ *   IN PNDIS_PACKET  Packet,
+ *   IN UINT  Flags);
+ */
+#define NdisSetPacketFlags(Packet, Flags) (Packet)->Private.Flags |= (Flags)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisWriteEventLogEntry(
-  IN PVOID  LogHandle,
-  IN NDIS_STATUS  EventCode,
-  IN ULONG  UniqueEventValue,
-  IN USHORT  NumStrings,
-  IN PVOID  StringsList  OPTIONAL,
-  IN ULONG  DataSize,
-  IN PVOID  Data  OPTIONAL);
+/*
+ * VOID
+ * NdisClearPacketFlags(
+ *   IN PNDIS_PACKET  Packet,
+ *   IN UINT  Flags);
+ */
+#define NdisClearPacketFlags(Packet, Flags) (Packet)->Private.Flags &= ~(Flags)
 
-NDISAPI
-ULONG
-NTAPI
-NdisWritePcmciaAttributeMemory(
-  IN NDIS_HANDLE  NdisAdapterHandle,
-  IN ULONG  Offset,
-  IN PVOID  Buffer,
-  IN ULONG  Length);
+/*
+ * VOID
+ * NdisQueryPacket(
+ *   IN PNDIS_PACKET Packet,
+ *   OUT PUINT PhysicalBufferCount OPTIONAL,
+ *   OUT PUINT BufferCount OPTIONAL,
+ *   OUT PNDIS_BUFFER *FirstBuffer OPTIONAL,
+ *   OUT PUINT TotalPacketLength OPTIONAL);
+ */
+static __inline
+VOID
+NdisQueryPacket(
+  IN PNDIS_PACKET Packet,
+  OUT PUINT PhysicalBufferCount OPTIONAL,
+  OUT PUINT BufferCount OPTIONAL,
+  OUT PNDIS_BUFFER *FirstBuffer OPTIONAL,
+  OUT PUINT TotalPacketLength OPTIONAL)
+{
+  if (FirstBuffer)
+    *FirstBuffer = Packet->Private.Head;
+  if (TotalPacketLength || BufferCount || PhysicalBufferCount) {
+    if (!Packet->Private.ValidCounts) {
+      UINT Offset;
+      UINT PacketLength;
+      PNDIS_BUFFER NdisBuffer;
+      UINT PhysicalBufferCount = 0;
+      UINT TotalPacketLength = 0;
+      UINT Count = 0;
+
+      for (NdisBuffer = Packet->Private.Head;
+           NdisBuffer != (PNDIS_BUFFER)NULL;
+           NdisBuffer = NdisBuffer->Next) {
+        PhysicalBufferCount += NDIS_BUFFER_TO_SPAN_PAGES(NdisBuffer);
+        NdisQueryBufferOffset(NdisBuffer, &Offset, &PacketLength);
+        TotalPacketLength += PacketLength;
+        Count++;
+      }
+      Packet->Private.PhysicalCount = PhysicalBufferCount;
+      Packet->Private.TotalLength = TotalPacketLength;
+      Packet->Private.Count = Count;
+      Packet->Private.ValidCounts = TRUE;
+    }
 
+    if (PhysicalBufferCount)
+      *PhysicalBufferCount = Packet->Private.PhysicalCount;
 
-/* Connectionless services */
+    if (BufferCount)
+      *BufferCount = Packet->Private.Count;
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisClAddParty(
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN NDIS_HANDLE  ProtocolPartyContext,
-  IN OUT PCO_CALL_PARAMETERS  CallParameters,
-  OUT PNDIS_HANDLE  NdisPartyHandle);
+    if (TotalPacketLength)
+      *TotalPacketLength = Packet->Private.TotalLength;
+  }
+}
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisClCloseAddressFamily(
-  IN NDIS_HANDLE  NdisAfHandle);
+/*
+ * VOID
+ * NdisQueryPacketLength(
+ *   IN PNDIS_PACKET Packet,
+ *   OUT PUINT PhysicalBufferCount OPTIONAL,
+ *   OUT PUINT BufferCount OPTIONAL,
+ *   OUT PNDIS_BUFFER *FirstBuffer OPTIONAL,
+ *   OUT PUINT TotalPacketLength OPTIONAL);
+ */
+#define NdisQueryPacketLength(_Packet,                              \
+                              _TotalPacketLength)                   \
+{                                                                   \
+  if (!(_Packet)->Private.ValidCounts) {                            \
+    NdisQueryPacket(_Packet, NULL, NULL, NULL, _TotalPacketLength); \
+  }                                                                 \
+  else *(_TotalPacketLength) = (_Packet)->Private.TotalLength;      \
+}
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisClCloseCall(
-  IN NDIS_HANDLE NdisVcHandle,
-  IN NDIS_HANDLE NdisPartyHandle  OPTIONAL,
-  IN PVOID  Buffer  OPTIONAL,
-  IN UINT  Size);
+#endif /* NDIS_LEGACY_DRIVER */
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisClDeregisterSap(
-  IN NDIS_HANDLE  NdisSapHandle);
+/*
+ * VOID
+ * NdisSetSendFlags(
+ *   IN PNDIS_PACKET  Packet,
+ *   IN UINT  Flags);
+ */
+#define NdisSetSendFlags(_Packet,_Flags)(_Packet)->Private.Flags = (_Flags)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisClDropParty(
-  IN NDIS_HANDLE  NdisPartyHandle,
-  IN PVOID  Buffer  OPTIONAL,
-  IN UINT  Size);
+/* Memory management routines */
 
+/*
 NDISAPI
 VOID
 NTAPI
-NdisClIncomingCallComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN PCO_CALL_PARAMETERS  CallParameters);
+NdisCreateLookaheadBufferFromSharedMemory(
+  IN PVOID pSharedMemory,
+  IN UINT LookaheadLength,
+  OUT PVOID *pLookaheadBuffer);
+*/
+#define NdisCreateLookaheadBufferFromSharedMemory(_S, _L, _B) ((*(_B)) = (_S))
 
 NDISAPI
-NDIS_STATUS
+VOID
 NTAPI
-NdisClMakeCall(
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN OUT PCO_CALL_PARAMETERS  CallParameters,
-  IN NDIS_HANDLE  ProtocolPartyContext  OPTIONAL,
-  OUT PNDIS_HANDLE  NdisPartyHandle  OPTIONAL);
+NdisDestroyLookaheadBufferFromSharedMemory(
+  IN PVOID pLookaheadBuffer);
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisClModifyCallQoS(
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN PCO_CALL_PARAMETERS  CallParameters);
+#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_ARM) || defined(_M_PPC)
 
+/*
+ * VOID
+ * NdisMoveMappedMemory(
+ *   OUT PVOID  Destination,
+ *   IN PVOID  Source,
+ *   IN ULONG  Length);
+ */
+#define NdisMoveMappedMemory(Destination, Source, Length) \
+  RtlCopyMemory(Destination, Source, Length)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisClOpenAddressFamily(
-  IN NDIS_HANDLE  NdisBindingHandle,
-  IN PCO_ADDRESS_FAMILY  AddressFamily,
-  IN NDIS_HANDLE  ProtocolAfContext,
-  IN PNDIS_CLIENT_CHARACTERISTICS  ClCharacteristics,
-  IN UINT  SizeOfClCharacteristics,
-  OUT PNDIS_HANDLE  NdisAfHandle);
-
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisClRegisterSap(
-  IN NDIS_HANDLE  NdisAfHandle,
-  IN NDIS_HANDLE  ProtocolSapContext,
-  IN PCO_SAP  Sap,
-  OUT PNDIS_HANDLE  NdisSapHandle);
-
+/*
+ * VOID
+ * NdisZeroMappedMemory(
+ *   IN PVOID  Destination,
+ *   IN ULONG  Length);
+ */
+#define NdisZeroMappedMemory(Destination, Length) \
+  RtlZeroMemory(Destination, Length)
 
-/* Call Manager services */
+#else
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisCmActivateVc(
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN OUT PCO_CALL_PARAMETERS  CallParameters);
+#define NdisMoveMappedMemory(Destination, Source, Length) \
+{ \
+  PUCHAR _Dest = Destination, _Src = Source, _End = _Dest + Length; \
+  while (_Dest < _End) \
+    *_Dest++ = _Src++; \
+}
 
-NDISAPI
-VOID
-NTAPI
-NdisCmAddPartyComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisPartyHandle,
-  IN NDIS_HANDLE  CallMgrPartyContext  OPTIONAL,
-  IN PCO_CALL_PARAMETERS  CallParameters);
+#define NdisZeroMappedMemory(Destination, Length) \
+{ \
+  PUCHAR _Dest = Destination, _End = _Dest + Length; \
+  while (_Dest < _End) \
+    *_Dest++ = 0; \
+}
 
-NDISAPI
-VOID
-NTAPI
-NdisCmCloseAddressFamilyComplete(
-  IN NDIS_STATUS Status,
-  IN NDIS_HANDLE NdisAfHandle);
+#endif /* _M_IX86 or _M_AMD64 */
 
-NDISAPI
-VOID
-NTAPI
-NdisCmCloseCallComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL);
+/*
+ * VOID
+ * NdisMoveFromMappedMemory(
+ *   OUT PVOID  Destination,
+ *   IN PVOID  Source,
+ *   IN ULONG  Length);
+ */
+#define NdisMoveFromMappedMemory(Destination, Source, Length) \
+  NdisMoveMappedMemory(Destination, Source, Length)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisCmDeactivateVc(
-  IN NDIS_HANDLE  NdisVcHandle);
+/*
+ * VOID
+ * NdisMoveToMappedMemory(
+ *   OUT PVOID  Destination,
+ *   IN PVOID  Source,
+ *   IN ULONG  Length);
+ */
+#define NdisMoveToMappedMemory(Destination, Source, Length) \
+  NdisMoveMappedMemory(Destination, Source, Length)
 
-NDISAPI
-VOID
-NTAPI
-NdisCmDeregisterSapComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisSapHandle);
+/*
+ * VOID
+ * NdisMUpdateSharedMemory(
+ *   IN NDIS_HANDLE  MiniportAdapterHandle,
+ *   IN ULONG  Length,
+ *   IN PVOID  VirtualAddress,
+ *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
+ */
+#define NdisMUpdateSharedMemory(_H, _L, _V, _P) \
+  NdisUpdateSharedMemory(_H, _L, _V, _P)
 
 NDISAPI
 VOID
 NTAPI
-NdisCmDispatchCallConnected(
-  IN NDIS_HANDLE  NdisVcHandle);
-
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisCmDispatchIncomingCall(
-  IN NDIS_HANDLE  NdisSapHandle,
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN PCO_CALL_PARAMETERS  CallParameters);
+NdisFreeMemory(
+  IN PVOID VirtualAddress,
+  IN UINT Length,
+  IN UINT MemoryFlags);
 
 NDISAPI
 VOID
 NTAPI
-NdisCmDispatchIncomingCallQoSChange(
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN PCO_CALL_PARAMETERS  CallParameters);
+NdisFreeMemoryWithTag(
+  IN PVOID VirtualAddress,
+  IN ULONG Tag);
 
 NDISAPI
 VOID
 NTAPI
-NdisCmDispatchIncomingCloseCall(
-  IN NDIS_STATUS  CloseStatus,
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN PVOID  Buffer  OPTIONAL,
-  IN UINT  Size);
+NdisImmediateReadSharedMemory(
+  IN NDIS_HANDLE WrapperConfigurationContext,
+  IN ULONG       SharedMemoryAddress,
+  OUT PUCHAR      Buffer,
+  IN ULONG       Length);
 
 NDISAPI
 VOID
 NTAPI
-NdisCmDispatchIncomingDropParty(
-  IN NDIS_STATUS  DropStatus,
-  IN NDIS_HANDLE  NdisPartyHandle,
-  IN PVOID  Buffer  OPTIONAL,
-  IN UINT  Size);
+NdisImmediateWriteSharedMemory(
+  IN NDIS_HANDLE WrapperConfigurationContext,
+  IN ULONG       SharedMemoryAddress,
+  IN PUCHAR      Buffer,
+  IN ULONG       Length);
 
 NDISAPI
 VOID
 NTAPI
-NdisCmDropPartyComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisPartyHandle);
+NdisMAllocateSharedMemory(
+  IN   NDIS_HANDLE  MiniportAdapterHandle,
+  IN   ULONG  Length,
+  IN   BOOLEAN  Cached,
+  OUT   PVOID  *VirtualAddress,
+  OUT   PNDIS_PHYSICAL_ADDRESS  PhysicalAddress);
 
 NDISAPI
-VOID
+NDIS_STATUS
 NTAPI
-NdisCmMakeCallComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
-  IN NDIS_HANDLE  CallMgrPartyContext  OPTIONAL,
-  IN PCO_CALL_PARAMETERS  CallParameters);
+NdisMAllocateSharedMemoryAsync(
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN ULONG  Length,
+  IN BOOLEAN  Cached,
+  IN PVOID  Context);
 
-NDISAPI
-VOID
-NTAPI
-NdisCmModifyCallQoSComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN PCO_CALL_PARAMETERS  CallParameters);
+#if defined(NDIS50)
 
-NDISAPI
-VOID
-NTAPI
-NdisCmOpenAddressFamilyComplete(
-  IN NDIS_STATUS Status,
-  IN NDIS_HANDLE NdisAfHandle,
-  IN NDIS_HANDLE CallMgrAfContext);
+#define NdisUpdateSharedMemory(NdisAdapterHandle, \
+                               Length,            \
+                               VirtualAddress,    \
+                               PhysicalAddress)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisCmRegisterAddressFamily(
-  IN NDIS_HANDLE  NdisBindingHandle,
-  IN PCO_ADDRESS_FAMILY  AddressFamily,
-  IN PNDIS_CALL_MANAGER_CHARACTERISTICS  CmCharacteristics,
-  IN UINT  SizeOfCmCharacteristics);
+#else
 
 NDISAPI
 VOID
 NTAPI
-NdisCmRegisterSapComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisSapHandle,
-  IN NDIS_HANDLE  CallMgrSapContext);
-
+NdisUpdateSharedMemory(
+  IN NDIS_HANDLE             NdisAdapterHandle,
+  IN ULONG                   Length,
+  IN PVOID                   VirtualAddress,
+  IN NDIS_PHYSICAL_ADDRESS   PhysicalAddress);
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMCmActivateVc(
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN PCO_CALL_PARAMETERS  CallParameters);
+#endif /* defined(NDIS50) */
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMCmCreateVc(
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN NDIS_HANDLE  NdisAfHandle,
-  IN NDIS_HANDLE  MiniportVcContext,
-  OUT  PNDIS_HANDLE  NdisVcHandle);
+/*
+ * ULONG
+ * NdisGetPhysicalAddressHigh(
+ *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
+ */
+#define NdisGetPhysicalAddressHigh(PhysicalAddress) \
+  ((PhysicalAddress).HighPart)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMCmDeactivateVc(
-  IN NDIS_HANDLE  NdisVcHandle);
+/*
+ * VOID
+ * NdisSetPhysicalAddressHigh(
+ *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,
+ *   IN ULONG  Value);
+ */
+#define NdisSetPhysicalAddressHigh(PhysicalAddress, Value) \
+  ((PhysicalAddress).HighPart) = (Value)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMCmDeleteVc(
-  IN NDIS_HANDLE  NdisVcHandle);
+/*
+ * ULONG
+ * NdisGetPhysicalAddressLow(
+ *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
+ */
+#define NdisGetPhysicalAddressLow(PhysicalAddress) \
+  ((PhysicalAddress).LowPart)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMCmRegisterAddressFamily(
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN PCO_ADDRESS_FAMILY  AddressFamily,
-  IN PNDIS_CALL_MANAGER_CHARACTERISTICS  CmCharacteristics,
-  IN UINT  SizeOfCmCharacteristics);
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisMCmRequest(
-  IN NDIS_HANDLE  NdisAfHandle,
-  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
-  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
-  IN OUT  PNDIS_REQUEST  NdisRequest);
+/*
+ * VOID
+ * NdisSetPhysicalAddressLow(
+ *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,
+ *   IN ULONG  Value);
+ */
+#define NdisSetPhysicalAddressLow(PhysicalAddress, Value) \
+  ((PhysicalAddress).LowPart) = (Value)
 
+/*
+ * VOID
+ * NDIS_PHYSICAL_ADDRESS_CONST(
+ *   IN ULONG  Low,
+ *   IN LONG  High);
+ */
+#define NDIS_PHYSICAL_ADDRESS_CONST(Low, High)  \
+    { {(ULONG)(Low), (LONG)(High)} }
 
-/* Connection-oriented services */
+/*
+ * ULONG
+ * NdisEqualMemory(
+ *  IN CONST VOID  *Source1,
+ *  IN CONST VOID  *Source2,
+ *  IN ULONG  Length);
+ */
+#define NdisEqualMemory(Source1, Source2, Length) \
+  RtlEqualMemory(Source1, Source2, Length)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisCoCreateVc(
-  IN NDIS_HANDLE  NdisBindingHandle,
-  IN NDIS_HANDLE  NdisAfHandle  OPTIONAL,
-  IN NDIS_HANDLE  ProtocolVcContext,
-  IN OUT PNDIS_HANDLE  NdisVcHandle);
+/*
+ * VOID
+ * NdisFillMemory(
+ *   IN PVOID  Destination,
+ *   IN ULONG  Length,
+ *   IN UCHAR  Fill);
+ */
+#define NdisFillMemory(Destination, Length, Fill) \
+  RtlFillMemory(Destination, Length, Fill)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisCoDeleteVc(
-  IN NDIS_HANDLE  NdisVcHandle);
+/*
+ * VOID
+ * NdisMoveMemory(
+ *   OUT  PVOID  Destination,
+ *   IN PVOID  Source,
+ *   IN ULONG  Length);
+ */
+#define NdisMoveMemory(Destination, Source, Length) \
+  RtlCopyMemory(Destination, Source, Length)
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisCoRequest(
-  IN NDIS_HANDLE  NdisBindingHandle,
-  IN NDIS_HANDLE  NdisAfHandle  OPTIONAL,
-  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
-  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
-  IN OUT  PNDIS_REQUEST  NdisRequest);
 
+/*
+ * VOID
+ * NdisRetrieveUlong(
+ *   IN PULONG  DestinationAddress,
+ *   IN PULONG  SourceAddress);
+ */
+#define NdisRetrieveUlong(DestinationAddress, SourceAddress) \
+  RtlRetrieveUlong(DestinationAddress, SourceAddress)
+
+
+/*
+ * VOID
+ * NdisStoreUlong(
+ *   IN PULONG  DestinationAddress,
+ *   IN ULONG  Value);
+ */
+#define NdisStoreUlong(DestinationAddress, Value) \
+  RtlStoreUlong(DestinationAddress, Value)
+
+
+/*
+ * VOID
+ * NdisZeroMemory(
+ *   IN PVOID  Destination,
+ *   IN ULONG  Length)
+ */
+#define NdisZeroMemory(Destination, Length) \
+  RtlZeroMemory(Destination, Length)
+
+typedef VOID
+(NTAPI *NDIS_BLOCK_INITIALIZER) (
+    IN  PUCHAR  Block,
+    IN  SIZE_T  NumberOfBytes
+    );
+
+/* Configuration routines */
+
+#if NDIS_LEGACY_DRIVER
 NDISAPI
 VOID
 NTAPI
-NdisCoRequestComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisAfHandle,
-  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
-  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
-  IN PNDIS_REQUEST  NdisRequest);
+NdisOpenConfiguration(
+  OUT PNDIS_STATUS Status,
+  OUT PNDIS_HANDLE ConfigurationHandle,
+  IN NDIS_HANDLE WrapperConfigurationContext);
+#endif
 
 NDISAPI
 VOID
 NTAPI
-NdisCoSendPackets(
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN PPNDIS_PACKET  PacketArray,
-  IN UINT  NumberOfPackets);
+NdisReadNetworkAddress(
+  OUT PNDIS_STATUS Status,
+  OUT PVOID *NetworkAddress,
+  OUT PUINT NetworkAddressLength,
+  IN NDIS_HANDLE ConfigurationHandle);
 
 NDISAPI
 VOID
 NTAPI
-NdisMCoActivateVcComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN PCO_CALL_PARAMETERS  CallParameters);
+NdisReadEisaSlotInformation(
+  OUT PNDIS_STATUS  Status,
+  IN NDIS_HANDLE  WrapperConfigurationContext,
+  OUT PUINT  SlotNumber,
+  OUT PNDIS_EISA_FUNCTION_INFORMATION  EisaData);
 
 NDISAPI
 VOID
 NTAPI
-NdisMCoDeactivateVcComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisVcHandle);
+NdisReadEisaSlotInformationEx(
+  OUT PNDIS_STATUS  Status,
+  IN NDIS_HANDLE  WrapperConfigurationContext,
+  OUT PUINT  SlotNumber,
+  OUT PNDIS_EISA_FUNCTION_INFORMATION  *EisaData,
+  OUT PUINT  NumberOfFunctions);
+
+#if NDIS_LEGACY_MINIPORT
 
 NDISAPI
-VOID
+ULONG
 NTAPI
-NdisMCoIndicateReceivePacket(
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN PPNDIS_PACKET  PacketArray,
-  IN UINT  NumberOfPackets);
+NdisReadPciSlotInformation(
+  IN NDIS_HANDLE NdisAdapterHandle,
+  IN ULONG SlotNumber,
+  IN ULONG Offset,
+  OUT PVOID Buffer,
+  IN ULONG Length);
 
 NDISAPI
-VOID
+ULONG
 NTAPI
-NdisMCoIndicateStatus(
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
-  IN NDIS_STATUS  GeneralStatus,
-  IN PVOID  StatusBuffer  OPTIONAL,
-  IN ULONG  StatusBufferSize);
+NdisWritePciSlotInformation(
+  IN NDIS_HANDLE NdisAdapterHandle,
+  IN ULONG SlotNumber,
+  IN ULONG Offset,
+  IN PVOID Buffer,
+  IN ULONG Length);
 
 NDISAPI
-VOID
+ULONG
 NTAPI
-NdisMCoReceiveComplete(
-  IN NDIS_HANDLE  MiniportAdapterHandle);
+NdisReadPcmciaAttributeMemory(
+  IN NDIS_HANDLE NdisAdapterHandle,
+  IN ULONG Offset,
+  OUT PVOID Buffer,
+  IN ULONG Length);
 
 NDISAPI
-VOID
+ULONG
 NTAPI
-NdisMCoRequestComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN PNDIS_REQUEST  Request);
+NdisWritePcmciaAttributeMemory(
+  IN NDIS_HANDLE NdisAdapterHandle,
+  IN ULONG Offset,
+  IN PVOID Buffer,
+  IN ULONG Length);
+
+#endif /* NDIS_LEGACY_MINIPORT */
+
+/* String management routines */
 
+/*
 NDISAPI
-VOID
+NDIS_STATUS
 NTAPI
-NdisMCoSendComplete(
-  IN NDIS_STATUS  Status,
-  IN NDIS_HANDLE  NdisVcHandle,
-  IN PNDIS_PACKET  Packet);
+NdisAnsiStringToUnicodeString(
+  IN OUT PNDIS_STRING DestinationString,
+  IN PNDIS_ANSI_STRING SourceString);
+*/
+#define NdisAnsiStringToUnicodeString(_us, _as) RtlAnsiStringToUnicodeString(_us, _as, FALSE)
 
+/*
+ * BOOLEAN
+ * NdisEqualString(
+ *   IN PNDIS_STRING String1,
+ *   IN PNDIS_STRING String2,
+ *   IN BOOLEAN CaseInsensitive);
+ */
+#define NdisEqualString RtlEqualString
 
-/* NDIS 5.0 extensions for intermediate drivers */
+#define NdisEqualUnicodeString RtlEqualUnicodeString
 
+/*
 NDISAPI
 VOID
 NTAPI
-NdisIMAssociateMiniport(
-  IN NDIS_HANDLE  DriverHandle,
-  IN NDIS_HANDLE  ProtocolHandle);
+NdisInitAnsiString(
+  IN OUT PNDIS_ANSI_STRING DestinationString,
+  IN PCSTR SourceString);
+*/
+#define NdisInitAnsiString RtlInitString
+
+NDISAPI
+VOID
+NTAPI
+NdisInitUnicodeString(
+  IN OUT PNDIS_STRING  DestinationString,
+  IN PCWSTR  SourceString);
 
+/*
 NDISAPI
 NDIS_STATUS
 NTAPI
-NdisIMCancelInitializeDeviceInstance(
-  IN NDIS_HANDLE  DriverHandle,
-  IN PNDIS_STRING  DeviceInstance);
+NdisUnicodeStringToAnsiString(
+  IN OUT PNDIS_ANSI_STRING DestinationString,
+  IN PNDIS_STRING SourceString);
+*/
+#define NdisUnicodeStringToAnsiString(_as, _us) RtlUnicodeStringToAnsiString(_as, _us, FALSE)
+
+#define NdisFreeString(_s) NdisFreeMemory((_s).Buffer, (_s).MaximumLength, 0)
+#define NdisPrintString(_s) DbgPrint("%ls", (_s).Buffer)
 
+/* Spin lock reoutines */
+
+/*
 NDISAPI
 VOID
 NTAPI
-NdisIMCopySendCompletePerPacketInfo(
-  IN PNDIS_PACKET  DstPacket,
-  IN PNDIS_PACKET  SrcPacket);
+NdisAllocateSpinLock(
+  IN PNDIS_SPIN_LOCK SpinLock);
+*/
+#define NdisAllocateSpinLock(_SpinLock) KeInitializeSpinLock(&(_SpinLock)->SpinLock)
 
+/*
 NDISAPI
 VOID
 NTAPI
-NdisIMCopySendPerPacketInfo(
-  IN PNDIS_PACKET  DstPacket,
-  IN PNDIS_PACKET  SrcPacket);
+NdisFreeSpinLock(
+  IN PNDIS_SPIN_LOCK  SpinLock);
+*/
+#define NdisFreeSpinLock(_SpinLock)
 
+/*
 NDISAPI
 VOID
 NTAPI
-NdisIMDeregisterLayeredMiniport(
-  IN NDIS_HANDLE  DriverHandle);
+NdisAcquireSpinLock(
+  IN PNDIS_SPIN_LOCK  SpinLock);
+*/
+#define NdisAcquireSpinLock(_SpinLock) KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql)
 
+/*
 NDISAPI
-NDIS_HANDLE
+VOID
 NTAPI
-NdisIMGetBindingContext(
-  IN NDIS_HANDLE  NdisBindingHandle);
+NdisReleaseSpinLock(
+  IN PNDIS_SPIN_LOCK  SpinLock);
+*/
+#define NdisReleaseSpinLock(_SpinLock) KeReleaseSpinLock(&(_SpinLock)->SpinLock,(_SpinLock)->OldIrql)
 
+/*
 NDISAPI
-NDIS_HANDLE
+VOID
 NTAPI
-NdisIMGetDeviceContext(
-  IN NDIS_HANDLE  MiniportAdapterHandle);
+NdisDprAcquireSpinLock(
+  IN PNDIS_SPIN_LOCK  SpinLock);
+*/
+#define NdisDprAcquireSpinLock(_SpinLock) KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock)
 
+/*
 NDISAPI
-NDIS_STATUS
+VOID
 NTAPI
-NdisIMInitializeDeviceInstanceEx(
-  IN NDIS_HANDLE  DriverHandle,
-  IN PNDIS_STRING  DriverInstance,
-  IN NDIS_HANDLE  DeviceContext  OPTIONAL);
-
-NDISAPI
-PSINGLE_LIST_ENTRY
-NTAPI
-NdisInterlockedPopEntrySList(
-  IN PSLIST_HEADER  ListHead,
-  IN PKSPIN_LOCK  Lock);
+NdisDprReleaseSpinLock(
+  IN PNDIS_SPIN_LOCK  SpinLock);
+*/
+#define NdisDprReleaseSpinLock(_SpinLock) KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock)
 
-NDISAPI
-PSINGLE_LIST_ENTRY
-NTAPI
-NdisInterlockedPushEntrySList(
-  IN PSLIST_HEADER  ListHead,
-  IN PSINGLE_LIST_ENTRY  ListEntry,
-  IN PKSPIN_LOCK  Lock);
+/* I/O routines */
 
-NDISAPI
-VOID
-NTAPI
-NdisQueryBufferSafe(
-  IN PNDIS_BUFFER  Buffer,
-  OUT PVOID  *VirtualAddress  OPTIONAL,
-  OUT PUINT  Length,
-  IN UINT  Priority);
+/*
+ * VOID
+ * NdisRawReadPortBufferUchar(
+ *   IN ULONG Port,
+ *   OUT PUCHAR Buffer,
+ *   IN ULONG Length);
+ */
+#define NdisRawReadPortBufferUchar(Port, Buffer, Length) \
+  READ_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length))
 
-/* Prototypes for NDIS_MINIPORT_CHARACTERISTICS */
+/*
+ * VOID
+ * NdisRawReadPortBufferUlong(
+ *   IN ULONG Port,
+ *   OUT PULONG Buffer,
+ *   IN ULONG Length);
+ */
+#define NdisRawReadPortBufferUlong(Port, Buffer, Length) \
+  READ_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length))
 
-typedef BOOLEAN
-(NTAPI *W_CHECK_FOR_HANG_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext);
+/*
+ * VOID
+ * NdisRawReadPortBufferUshort(
+ *   IN ULONG Port,
+ *   OUT PUSHORT Buffer,
+ *   IN ULONG Length);
+ */
+#define NdisRawReadPortBufferUshort(Port, Buffer, Length) \
+  READ_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length))
 
-typedef VOID
-(NTAPI *W_DISABLE_INTERRUPT_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext);
+/*
+ * VOID
+ * NdisRawReadPortUchar(
+ *   IN ULONG Port,
+ *   OUT PUCHAR Data);
+ */
+#define NdisRawReadPortUchar(Port, Data) \
+  *(Data) = READ_PORT_UCHAR((PUCHAR)(Port))
 
-typedef VOID
-(NTAPI *W_ENABLE_INTERRUPT_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext);
+/*
+ * VOID
+ * NdisRawReadPortUlong(
+ *   IN ULONG Port,
+ *   OUT PULONG Data);
+ */
+#define NdisRawReadPortUlong(Port, Data) \
+  *(Data) = READ_PORT_ULONG((PULONG)(Port))
 
-typedef VOID
-(NTAPI *W_HALT_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext);
+/*
+ * VOID
+ * NdisRawReadPortUshort(
+ *   IN ULONG Port,
+ *   OUT PUSHORT Data);
+ */
+#define NdisRawReadPortUshort(Port, Data) \
+  *(Data) = READ_PORT_USHORT((PUSHORT)(Port))
 
-typedef VOID
-(NTAPI *W_HANDLE_INTERRUPT_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext);
+/*
+ * VOID
+ * NdisRawWritePortBufferUchar(
+ *   IN ULONG Port,
+ *   IN PUCHAR Buffer,
+ *   IN ULONG Length);
+ */
+#define NdisRawWritePortBufferUchar(Port, Buffer, Length) \
+  WRITE_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length))
 
-typedef NDIS_STATUS
-(NTAPI *W_INITIALIZE_HANDLER)(
-  OUT PNDIS_STATUS  OpenErrorStatus,
-  OUT PUINT  SelectedMediumIndex,
-  IN PNDIS_MEDIUM  MediumArray,
-  IN UINT  MediumArraySize,
-  IN NDIS_HANDLE  MiniportAdapterContext,
-  IN NDIS_HANDLE  WrapperConfigurationContext);
+/*
+ * VOID
+ * NdisRawWritePortBufferUlong(
+ *   IN ULONG Port,
+ *   IN PULONG Buffer,
+ *   IN ULONG Length);
+ */
+#define NdisRawWritePortBufferUlong(Port, Buffer, Length) \
+  WRITE_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length))
 
-typedef VOID
-(NTAPI *W_ISR_HANDLER)(
-  OUT PBOOLEAN  InterruptRecognized,
-  OUT PBOOLEAN  QueueMiniportHandleInterrupt,
-  IN   NDIS_HANDLE  MiniportAdapterContext);
+/*
+ * VOID
+ * NdisRawWritePortBufferUshort(
+ *   IN ULONG Port,
+ *   IN PUSHORT Buffer,
+ *   IN ULONG Length);
+ */
+#define NdisRawWritePortBufferUshort(Port, Buffer, Length) \
+  WRITE_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length))
 
-typedef NDIS_STATUS
-(NTAPI *W_QUERY_INFORMATION_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext,
 IN NDIS_OID  Oid,
-  IN PVOID  InformationBuffer,
-  IN ULONG  InformationBufferLength,
-  OUT PULONG  BytesWritten,
-  OUT PULONG  BytesNeeded);
+/*
+ * VOID
+ * NdisRawWritePortUchar(
*   IN ULONG Port,
+ *   IN UCHAR Data);
+ */
+#define NdisRawWritePortUchar(Port, Data) \
+  WRITE_PORT_UCHAR((PUCHAR)(Port), (UCHAR)(Data))
 
-typedef NDIS_STATUS
-(NTAPI *W_RECONFIGURE_HANDLER)(
-  OUT PNDIS_STATUS  OpenErrorStatus,
-  IN NDIS_HANDLE  MiniportAdapterContext,
-  IN NDIS_HANDLE       WrapperConfigurationContext);
+/*
+ * VOID
+ * NdisRawWritePortUlong(
+ *   IN ULONG Port,
+ *   IN ULONG Data);
+ */
+#define NdisRawWritePortUlong(Port, Data) \
+  WRITE_PORT_ULONG((PULONG)(Port), (ULONG)(Data))
 
-typedef NDIS_STATUS
-(NTAPI *W_RESET_HANDLER)(
-  OUT PBOOLEAN  AddressingReset,
-  IN NDIS_HANDLE  MiniportAdapterContext);
+/*
+ * VOID
+ * NdisRawWritePortUshort(
+ *   IN ULONG Port,
+ *   IN USHORT Data);
+ */
+#define NdisRawWritePortUshort(Port, Data) \
+  WRITE_PORT_USHORT((PUSHORT)(Port), (USHORT)(Data))
 
-typedef NDIS_STATUS
-(NTAPI *W_SEND_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext,
-  IN PNDIS_PACKET  Packet,
-  IN UINT  Flags);
 
-typedef NDIS_STATUS
-(NTAPI *WM_SEND_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext,
-  IN NDIS_HANDLE  NdisLinkHandle,
-  IN PNDIS_WAN_PACKET  Packet);
+/*
+ * VOID
+ * NdisReadRegisterUchar(
+ *   IN PUCHAR Register,
+ *   OUT PUCHAR Data);
+ */
+#define NdisReadRegisterUchar(Register, Data) \
+  *(Data) = *(Register)
 
-typedef NDIS_STATUS
-(NTAPI *W_SET_INFORMATION_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext,
 IN NDIS_OID  Oid,
-  IN PVOID  InformationBuffer,
-  IN ULONG  InformationBufferLength,
-  OUT PULONG  BytesRead,
-  OUT PULONG  BytesNeeded);
+/*
+ * VOID
+ * NdisReadRegisterUlong(
*   IN PULONG  Register,
+ *   OUT PULONG  Data);
+ */
+#define NdisReadRegisterUlong(Register, Data)   \
+  *(Data) = *(Register)
 
-typedef NDIS_STATUS
-(NTAPI *W_TRANSFER_DATA_HANDLER)(
-  OUT PNDIS_PACKET  Packet,
 OUT PUINT  BytesTransferred,
-  IN NDIS_HANDLE  MiniportAdapterContext,
-  IN NDIS_HANDLE  MiniportReceiveContext,
-  IN UINT  ByteOffset,
-  IN UINT  BytesToTransfer);
+/*
+ * VOID
+ * NdisReadRegisterUshort(
*   IN PUSHORT Register,
+ *   OUT PUSHORT Data);
+ */
+#define NdisReadRegisterUshort(Register, Data) \
+    *(Data) = *(Register)
 
-typedef NDIS_STATUS
-(NTAPI *WM_TRANSFER_DATA_HANDLER)(
-  VOID);
+/*
+ * VOID
+ * NdisReadRegisterUchar(
+ *   IN PUCHAR Register,
+ *   IN UCHAR Data);
+ */
+#define NdisWriteRegisterUchar(Register, Data) \
+  WRITE_REGISTER_UCHAR((Register), (Data))
 
+/*
+ * VOID
+ * NdisReadRegisterUlong(
+ *   IN PULONG Register,
+ *   IN ULONG Data);
+ */
+#define NdisWriteRegisterUlong(Register, Data) \
+  WRITE_REGISTER_ULONG((Register), (Data))
 
-/* NDIS structures available only to miniport drivers */
+/*
+ * VOID
+ * NdisReadRegisterUshort(
+ *   IN PUSHORT Register,
+ *   IN USHORT Data);
+ */
+#define NdisWriteRegisterUshort(Register, Data) \
+  WRITE_REGISTER_USHORT((Register), (Data))
 
-#define NDIS30_MINIPORT_CHARACTERISTICS_S \
-  UCHAR  MajorNdisVersion; \
-  UCHAR  MinorNdisVersion; \
-  UINT  Reserved; \
-  W_CHECK_FOR_HANG_HANDLER  CheckForHangHandler; \
-  W_DISABLE_INTERRUPT_HANDLER  DisableInterruptHandler; \
-  W_ENABLE_INTERRUPT_HANDLER  EnableInterruptHandler; \
-  W_HALT_HANDLER  HaltHandler; \
-  W_HANDLE_INTERRUPT_HANDLER  HandleInterruptHandler; \
-  W_INITIALIZE_HANDLER  InitializeHandler; \
-  W_ISR_HANDLER  ISRHandler; \
-  W_QUERY_INFORMATION_HANDLER  QueryInformationHandler; \
-  W_RECONFIGURE_HANDLER  ReconfigureHandler; \
-  W_RESET_HANDLER  ResetHandler; \
-  W_SEND_HANDLER  SendHandler; \
-  W_SET_INFORMATION_HANDLER  SetInformationHandler; \
-  W_TRANSFER_DATA_HANDLER  TransferDataHandler;
 
-typedef struct _NDIS30_MINIPORT_CHARACTERISTICS {
-  NDIS30_MINIPORT_CHARACTERISTICS_S
-} NDIS30_MINIPORT_CHARACTERISTICS, *PSNDIS30_MINIPORT_CHARACTERISTICS;
+/* Linked lists */
 
+/*
+ * VOID
+ * NdisInitializeListHead(
+ *   IN PLIST_ENTRY ListHead);
+ */
+#define NdisInitializeListHead InitializeListHead
 
-/* Extensions for NDIS 4.0 miniports */
+/*
+ * PLIST_ENTRY
+ * NdisInterlockedInsertHeadList(
+ *   IN PLIST_ENTRY  ListHead,
+ *   IN PLIST_ENTRY  ListEntry,
+ *   IN PNDIS_SPIN_LOCK  SpinLock);
+ */
+#define NdisInterlockedInsertHeadList(_ListHead, _ListEntry, _SpinLock) \
+  ExInterlockedInsertHeadList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
 
-typedef VOID
-(NTAPI *W_SEND_PACKETS_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext,
-  IN PPNDIS_PACKET  PacketArray,
-  IN UINT  NumberOfPackets);
+/*
+ * PLIST_ENTRY
+ * NdisInterlockedInsertTailList(
+ *   IN PLIST_ENTRY  ListHead,
+ *   IN PLIST_ENTRY  ListEntry,
+ *   IN PNDIS_SPIN_LOCK  SpinLock);
+ */
+#define NdisInterlockedInsertTailList(_ListHead, _ListEntry, _SpinLock) \
+  ExInterlockedInsertTailList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
 
-typedef VOID
-(NTAPI *W_RETURN_PACKET_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext,
-  IN PNDIS_PACKET  Packet);
+/*
+ * PLIST_ENTRY
+ * NdisInterlockedRemoveHeadList(
+ *   IN PLIST_ENTRY  ListHead,
+ *   IN PNDIS_SPIN_LOCK  SpinLock);
+*/
+#define NdisInterlockedRemoveHeadList(_ListHead, _SpinLock) \
+  ExInterlockedRemoveHeadList(_ListHead, &(_SpinLock)->SpinLock)
 
-typedef VOID
-(NTAPI *W_ALLOCATE_COMPLETE_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext,
-  IN PVOID  VirtualAddress,
-  IN PNDIS_PHYSICAL_ADDRESS  PhysicalAddress,
-  IN ULONG  Length,
-  IN PVOID  Context);
+/*
+ * VOID
+ * NdisInitializeSListHead(
+ *   IN PSLIST_HEADER SListHead);
+ */
+#define NdisInitializeSListHead(SListHead) ExInitializeSListHead(SListHead)
 
-#ifdef __cplusplus
+/*
+ * USHORT NdisQueryDepthSList(
+ *   IN PSLIST_HEADER SListHead);
+ */
+#define NdisQueryDepthSList(SListHead) ExQueryDepthSList(SListHead)
 
-#define NDIS40_MINIPORT_CHARACTERISTICS_S \
-  NDIS30_MINIPORT_CHARACTERISTICS  Ndis30Chars; \
-  W_RETURN_PACKET_HANDLER  ReturnPacketHandler; \
-  W_SEND_PACKETS_HANDLER  SendPacketsHandler; \
-  W_ALLOCATE_COMPLETE_HANDLER  AllocateCompleteHandler;
+#define NdisInterlockedPushEntryList(ListHead, ListEntry, Lock) \
+  ExInterlockedPushEntryList(ListHead, ListEntry, &(Lock)->SpinLock)
 
-#else /* !__cplusplus */
+#define NdisInterlockedPopEntryList(ListHead, Lock) \
+  ExInterlockedPopEntryList(ListHead, &(Lock)->SpinLock)
 
-#define NDIS40_MINIPORT_CHARACTERISTICS_S \
-  NDIS30_MINIPORT_CHARACTERISTICS_S \
-  W_RETURN_PACKET_HANDLER  ReturnPacketHandler; \
-  W_SEND_PACKETS_HANDLER  SendPacketsHandler; \
-  W_ALLOCATE_COMPLETE_HANDLER  AllocateCompleteHandler;
+/* Non-paged lookaside lists */
 
-#endif /* !__cplusplus */
+#define NdisInitializeNPagedLookasideList(_L, _AR, _FR, _Fl, _S, _T, _D) \
+  ExInitializeNPagedLookasideList(_L, _AR, _FR, _Fl, _S, _T, _D)
+#define NdisDeleteNPagedLookasideList(_L) ExDeleteNPagedLookasideList(_L)
+#define NdisAllocateFromNPagedLookasideList(_L) ExAllocateFromNPagedLookasideList(_L)
+#define NdisFreeToNPagedLookasideList(_L, _E) ExFreeToNPagedLookasideList(_L, _E)
 
-typedef struct _NDIS40_MINIPORT_CHARACTERISTICS {
-  NDIS40_MINIPORT_CHARACTERISTICS_S
-} NDIS40_MINIPORT_CHARACTERISTICS, *PNDIS40_MINIPORT_CHARACTERISTICS;
+/* Interlocked routines */
 
+/*
+ * LONG
+ * NdisInterlockedDecrement(
+ *   IN PLONG  Addend);
+ */
+#define NdisInterlockedDecrement(Addend) InterlockedDecrement(Addend)
 
-/* Extensions for NDIS 5.0 miniports */
+/*
+ * LONG
+ * NdisInterlockedIncrement(
+ *   IN PLONG  Addend);
+ */
+#define NdisInterlockedIncrement(Addend) InterlockedIncrement(Addend)
 
-typedef NDIS_STATUS
-(NTAPI *W_CO_CREATE_VC_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext,
-  IN NDIS_HANDLE  NdisVcHandle,
-  OUT PNDIS_HANDLE  MiniportVcContext);
+/*
+ * VOID
+ * NdisInterlockedAddUlong(
+ *   IN PULONG  Addend,
+ *   IN ULONG  Increment,
+ *   IN PNDIS_SPIN_LOCK  SpinLock);
+ */
+#define NdisInterlockedAddUlong(_Addend, _Increment, _SpinLock) \
+  ExInterlockedAddUlong(_Addend, _Increment, &(_SpinLock)->SpinLock)
 
-typedef NDIS_STATUS
-(NTAPI *W_CO_DELETE_VC_HANDLER)(
-  IN NDIS_HANDLE  MiniportVcContext);
+/* Miscellaneous routines */
 
-typedef NDIS_STATUS
-(NTAPI *W_CO_ACTIVATE_VC_HANDLER)(
-  IN NDIS_HANDLE  MiniportVcContext,
-  IN OUT PCO_CALL_PARAMETERS  CallParameters);
+NDISAPI
+VOID
+NTAPI
+NdisCloseConfiguration(
+  IN NDIS_HANDLE ConfigurationHandle);
 
-typedef NDIS_STATUS
-(NTAPI *W_CO_DEACTIVATE_VC_HANDLER)(
-  IN NDIS_HANDLE  MiniportVcContext);
+NDISAPI
+VOID
+NTAPI
+NdisReadConfiguration(
+  OUT PNDIS_STATUS Status,
+  OUT PNDIS_CONFIGURATION_PARAMETER *ParameterValue,
+  IN NDIS_HANDLE ConfigurationHandle,
+  IN PNDIS_STRING Keyword,
+  IN NDIS_PARAMETER_TYPE ParameterType);
 
-typedef VOID
-(NTAPI *W_CO_SEND_PACKETS_HANDLER)(
-  IN NDIS_HANDLE  MiniportVcContext,
-  IN PPNDIS_PACKET  PacketArray,
-  IN UINT  NumberOfPackets);
+NDISAPI
+VOID
+NTAPI
+NdisWriteConfiguration(
+  OUT PNDIS_STATUS Status,
+  IN NDIS_HANDLE WrapperConfigurationContext,
+  IN PNDIS_STRING Keyword,
+  IN PNDIS_CONFIGURATION_PARAMETER ParameterValue);
 
-typedef NDIS_STATUS
-(NTAPI *W_CO_REQUEST_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext,
-  IN NDIS_HANDLE  MiniportVcContext  OPTIONAL,
-  IN OUT PNDIS_REQUEST  NdisRequest);
+NDISAPI
+VOID
+__cdecl
+NdisWriteErrorLogEntry(
+  IN NDIS_HANDLE NdisAdapterHandle,
+  IN NDIS_ERROR_CODE ErrorCode,
+  IN ULONG NumberOfErrorValues,
+  IN ...);
 
-#ifdef __cplusplus
+NDISAPI
+VOID
+NTAPI
+NdisInitializeString(
+  OUT PNDIS_STRING Destination,
+  IN PUCHAR Source);
 
-#define NDIS50_MINIPORT_CHARACTERISTICS_S \
-  NDIS40_MINIPORT_CHARACTERISTICS  Ndis40Chars; \
-  W_CO_CREATE_VC_HANDLER  CoCreateVcHandler; \
-  W_CO_DELETE_VC_HANDLER  CoDeleteVcHandler; \
-  W_CO_ACTIVATE_VC_HANDLER  CoActivateVcHandler; \
-  W_CO_DEACTIVATE_VC_HANDLER  CoDeactivateVcHandler; \
-  W_CO_SEND_PACKETS_HANDLER  CoSendPacketsHandler; \
-  W_CO_REQUEST_HANDLER  CoRequestHandler;
+/*
+ * VOID
+ * NdisStallExecution(
+ *   IN UINT MicrosecondsToStall)
+ */
+#define NdisStallExecution KeStallExecutionProcessor
 
-#else /* !__cplusplus */
+/*
+NDISAPI
+VOID
+NTAPI
+NdisGetCurrentSystemTime(
+  IN PLARGE_INTEGER  pSystemTime);
+*/
+#define NdisGetCurrentSystemTime KeQuerySystemTime
 
-#define NDIS50_MINIPORT_CHARACTERISTICS_S \
-  NDIS40_MINIPORT_CHARACTERISTICS_S \
-  W_CO_CREATE_VC_HANDLER  CoCreateVcHandler; \
-  W_CO_DELETE_VC_HANDLER  CoDeleteVcHandler; \
-  W_CO_ACTIVATE_VC_HANDLER  CoActivateVcHandler; \
-  W_CO_DEACTIVATE_VC_HANDLER  CoDeactivateVcHandler; \
-  W_CO_SEND_PACKETS_HANDLER  CoSendPacketsHandler; \
-  W_CO_REQUEST_HANDLER  CoRequestHandler;
+#if NDIS_SUPPORT_60_COMPATIBLE_API
+NDISAPI
+CCHAR
+NTAPI
+NdisSystemProcessorCount(VOID);
+#endif
 
-#endif /* !__cplusplus */
+NDISAPI
+VOID
+NTAPI
+NdisGetCurrentProcessorCpuUsage(
+  OUT PULONG pCpuUsage);
 
-typedef struct _NDIS50_MINIPORT_CHARACTERISTICS {
-   NDIS50_MINIPORT_CHARACTERISTICS_S
-} NDIS50_MINIPORT_CHARACTERISTICS, *PSNDIS50_MINIPORT_CHARACTERISTICS;
+/* NDIS helper macros */
 
+/*
+ * VOID
+ * NDIS_INIT_FUNCTION(FunctionName)
+ */
+#define NDIS_INIT_FUNCTION(FunctionName)    \
+  alloc_text(init, FunctionName)
 
-/* Extensions for NDIS 5.1 miniports */
+/*
+ * VOID
+ * NDIS_PAGABLE_FUNCTION(FunctionName)
+ */
+#define NDIS_PAGEABLE_FUNCTION(FunctionName) \
+  alloc_text(page, FunctionName)
 
-typedef VOID
-(NTAPI *W_CANCEL_SEND_PACKETS_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext,
-  IN PVOID  CancelId);
+#define NDIS_PAGABLE_FUNCTION NDIS_PAGEABLE_FUNCTION
 
-typedef VOID
-(NTAPI *W_PNP_EVENT_NOTIFY_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext,
-  IN NDIS_DEVICE_PNP_EVENT  PnPEvent,
-  IN PVOID  InformationBuffer,
-  IN ULONG  InformationBufferLength);
 
-typedef VOID
-(NTAPI *W_MINIPORT_SHUTDOWN_HANDLER)(
-  IN PVOID  ShutdownContext);
+/* NDIS 4.0 extensions */
 
-#ifdef __cplusplus
+NDISAPI
+VOID
+NTAPI
+NdisMFreeSharedMemory(
+       IN NDIS_HANDLE  MiniportAdapterHandle,
+       IN ULONG  Length,
+       IN BOOLEAN  Cached,
+       IN PVOID  VirtualAddress,
+       IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
 
-#define NDIS51_MINIPORT_CHARACTERISTICS_S \
-  NDIS50_MINIPORT_CHARACTERISTICS  Ndis50Chars; \
-  W_CANCEL_SEND_PACKETS_HANDLER  CancelSendPacketsHandler; \
-  W_PNP_EVENT_NOTIFY_HANDLER  PnPEventNotifyHandler; \
-  W_MINIPORT_SHUTDOWN_HANDLER  AdapterShutdownHandler;
+NDISAPI
+VOID
+NTAPI
+NdisMWanIndicateReceive(
+       OUT PNDIS_STATUS  Status,
+       IN NDIS_HANDLE  MiniportAdapterHandle,
+       IN NDIS_HANDLE  NdisLinkContext,
+       IN PUCHAR  PacketBuffer,
+       IN UINT  PacketSize);
 
-#else
+NDISAPI
+VOID
+NTAPI
+NdisMWanIndicateReceiveComplete(
+  IN NDIS_HANDLE  MiniportAdapterHandle);
 
-#define NDIS51_MINIPORT_CHARACTERISTICS_S \
-  NDIS50_MINIPORT_CHARACTERISTICS_S \
-  W_CANCEL_SEND_PACKETS_HANDLER  CancelSendPacketsHandler; \
-  W_PNP_EVENT_NOTIFY_HANDLER  PnPEventNotifyHandler; \
-  W_MINIPORT_SHUTDOWN_HANDLER  AdapterShutdownHandler;
+NDISAPI
+VOID
+NTAPI
+NdisMWanSendComplete(
+       IN NDIS_HANDLE  MiniportAdapterHandle,
+       IN PNDIS_WAN_PACKET  Packet,
+       IN NDIS_STATUS  Status);
 
-#endif
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisPciAssignResources(
+       IN NDIS_HANDLE  NdisMacHandle,
+       IN NDIS_HANDLE  NdisWrapperHandle,
+       IN NDIS_HANDLE  WrapperConfigurationContext,
+       IN ULONG  SlotNumber,
+       OUT PNDIS_RESOURCE_LIST  *AssignedResources);
 
-typedef struct _NDIS51_MINIPORT_CHARACTERISTICS {
-   NDIS51_MINIPORT_CHARACTERISTICS_S
-} NDIS51_MINIPORT_CHARACTERISTICS, *PSNDIS51_MINIPORT_CHARACTERISTICS;
 
-#if defined(NDIS51_MINIPORT)
-typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
-  NDIS51_MINIPORT_CHARACTERISTICS_S
-} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
-#elif defined(NDIS50_MINIPORT)
-typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
-  NDIS50_MINIPORT_CHARACTERISTICS_S
-} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
-#elif defined(NDIS40_MINIPORT)
-typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
-  NDIS40_MINIPORT_CHARACTERISTICS_S
-} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
-#else /* NDIS30 */
-typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
-  NDIS30_MINIPORT_CHARACTERISTICS_S
-} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
-#endif
+/* NDIS 5.0 extensions */
 
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisAllocateMemoryWithTag(
+  OUT PVOID *VirtualAddress,
+  IN UINT Length,
+  IN ULONG Tag);
 
-typedef NDIS_STATUS
-(NTAPI *SEND_HANDLER)(
-  IN NDIS_HANDLE  MacBindingHandle,
-  IN PNDIS_PACKET  Packet);
+NDISAPI
+VOID
+NTAPI
+NdisCompletePnPEvent(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  NdisBindingHandle,
+  IN PNET_PNP_EVENT  NetPnPEvent);
 
-typedef NDIS_STATUS
-(NTAPI *TRANSFER_DATA_HANDLER)(
-  IN NDIS_HANDLE  MacBindingHandle,
-  IN NDIS_HANDLE  MacReceiveContext,
-  IN UINT  ByteOffset,
-  IN UINT  BytesToTransfer,
-  OUT PNDIS_PACKET  Packet,
-  OUT PUINT  BytesTransferred);
+NDISAPI
+VOID
+NTAPI
+NdisGetCurrentProcessorCounts(
+  OUT PULONG pIdleCount,
+  OUT PULONG pKernelAndUser,
+  OUT PULONG pIndex);
 
-typedef NDIS_STATUS
-(NTAPI *RESET_HANDLER)(
-  IN NDIS_HANDLE  MacBindingHandle);
+NDISAPI
+VOID
+NTAPI
+NdisGetDriverHandle(
+  IN PNDIS_HANDLE  NdisBindingHandle,
+  OUT PNDIS_HANDLE  NdisDriverHandle);
 
-typedef NDIS_STATUS
-(NTAPI *REQUEST_HANDLER)(
-  IN NDIS_HANDLE   MacBindingHandle,
-  IN PNDIS_REQUEST   NdisRequest);
+NDISAPI
+PNDIS_PACKET
+NTAPI
+NdisGetReceivedPacket(
+  IN PNDIS_HANDLE  NdisBindingHandle,
+  IN PNDIS_HANDLE  MacContext);
 
+#if NDIS_LEGACY_DRIVER
+NDISAPI
+VOID
+NTAPI
+NdisGetSystemUpTime(
+  OUT PULONG pSystemUpTime);
+#endif
 
+#if NDIS_SUPPORT_60_COMPATIBLE_API
 
-/* Structures available only to full MAC drivers */
+NDISAPI
+VOID
+NTAPI
+NdisAcquireReadWriteLock(
+  IN OUT PNDIS_RW_LOCK Lock,
+  IN BOOLEAN fWrite,
+  OUT PLOCK_STATE LockState);
 
-typedef BOOLEAN
-(NTAPI *PNDIS_INTERRUPT_SERVICE)(
-  IN PVOID  InterruptContext);
+NDISAPI
+VOID
+NTAPI
+NdisInitializeReadWriteLock(
+  OUT PNDIS_RW_LOCK Lock);
 
-typedef VOID
-(NTAPI *PNDIS_DEFERRED_PROCESSING)(
-  IN PVOID  SystemSpecific1,
-  IN PVOID  InterruptContext,
-  IN PVOID  SystemSpecific2,
-  IN PVOID  SystemSpecific3);
+NDISAPI
+VOID
+NTAPI
+NdisReleaseReadWriteLock(
+  IN OUT PNDIS_RW_LOCK Lock,
+  IN PLOCK_STATE LockState);
 
+#if NDIS_SUPPORT_NDIS6
 
+NDISAPI
+VOID
+NTAPI
+NdisDprAcquireReadWriteLock(
+  IN PNDIS_RW_LOCK Lock,
+  IN BOOLEAN fWrite,
+  IN PLOCK_STATE LockState);
 
-typedef struct _NDIS_MINIPORT_BLOCK NDIS_MINIPORT_BLOCK, *PNDIS_MINIPORT_BLOCK;
-typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLOCK;
-typedef struct _NDIS_OPEN_BLOCK                NDIS_OPEN_BLOCK,     *PNDIS_OPEN_BLOCK;
-typedef struct _NDIS_M_DRIVER_BLOCK NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK;
-typedef        struct _NDIS_AF_LIST        NDIS_AF_LIST,        *PNDIS_AF_LIST;
+NDISAPI
+VOID
+NTAPI
+NdisDprReleaseReadWriteLock(
+  IN PNDIS_RW_LOCK Lock,
+  IN PLOCK_STATE LockState);
 
-//
-// FIXME: Should be   typedef struct _X_FILTER ETH_FILTER, *PETH_FILTER;
-//
-typedef PVOID ETH_FILTER, *PETH_FILTER;
+#endif /* NDIS_SUPPORT_NDIS6 */
 
+#endif /* NDIS_SUPPORT_60_COMPATIBLE_API */
 
-typedef struct _NDIS_MINIPORT_INTERRUPT {
-  PKINTERRUPT  InterruptObject;
-  KSPIN_LOCK  DpcCountLock;
-  PVOID  MiniportIdField;
-  W_ISR_HANDLER  MiniportIsr;
-  W_HANDLE_INTERRUPT_HANDLER  MiniportDpc;
-  KDPC  InterruptDpc;
-  PNDIS_MINIPORT_BLOCK  Miniport;
-  UCHAR  DpcCount;
-  BOOLEAN  Filler1;
-  KEVENT  DpcsCompletedEvent;
-  BOOLEAN  SharedInterrupt;
-  BOOLEAN  IsrRequested;
-} NDIS_MINIPORT_INTERRUPT, *PNDIS_MINIPORT_INTERRUPT;
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMDeregisterDevice(
+  IN NDIS_HANDLE  NdisDeviceHandle);
 
-typedef struct _NDIS_MINIPORT_TIMER {
-  KTIMER  Timer;
-  KDPC  Dpc;
-  PNDIS_TIMER_FUNCTION  MiniportTimerFunction;
-  PVOID  MiniportTimerContext;
-  PNDIS_MINIPORT_BLOCK  Miniport;
-  struct _NDIS_MINIPORT_TIMER  *NextDeferredTimer;
-} NDIS_MINIPORT_TIMER, *PNDIS_MINIPORT_TIMER;
+NDISAPI
+VOID
+NTAPI
+NdisMGetDeviceProperty(
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN OUT PDEVICE_OBJECT  *PhysicalDeviceObject  OPTIONAL,
+  IN OUT PDEVICE_OBJECT  *FunctionalDeviceObject  OPTIONAL,
+  IN OUT PDEVICE_OBJECT  *NextDeviceObject  OPTIONAL,
+  IN OUT PCM_RESOURCE_LIST  *AllocatedResources  OPTIONAL,
+  IN OUT PCM_RESOURCE_LIST  *AllocatedResourcesTranslated  OPTIONAL);
 
-typedef struct _NDIS_INTERRUPT {
-  PKINTERRUPT  InterruptObject;
-  KSPIN_LOCK  DpcCountLock;
-  PNDIS_INTERRUPT_SERVICE  MacIsr;
-  PNDIS_DEFERRED_PROCESSING  MacDpc;
-  KDPC  InterruptDpc;
-  PVOID  InterruptContext;
-  UCHAR  DpcCount;
-  BOOLEAN       Removing;
-  KEVENT  DpcsCompletedEvent;
-} NDIS_INTERRUPT, *PNDIS_INTERRUPT;
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMInitializeScatterGatherDma(
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN BOOLEAN  Dma64BitAddresses,
+  IN ULONG  MaximumPhysicalMapping);
 
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMPromoteMiniport(
+  IN NDIS_HANDLE  MiniportAdapterHandle);
 
-typedef enum _NDIS_WORK_ITEM_TYPE {
-  NdisWorkItemRequest,
-  NdisWorkItemSend,
-  NdisWorkItemReturnPackets,
-  NdisWorkItemResetRequested,
-  NdisWorkItemResetInProgress,
-  NdisWorkItemHalt,
-  NdisWorkItemSendLoopback,
-  NdisWorkItemMiniportCallback,
-  NdisMaxWorkItems
-} NDIS_WORK_ITEM_TYPE, *PNDIS_WORK_ITEM_TYPE;
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMQueryAdapterInstanceName(
+  OUT PNDIS_STRING  AdapterInstanceName,
+  IN NDIS_HANDLE  MiniportAdapterHandle);
 
-#define        NUMBER_OF_WORK_ITEM_TYPES         NdisMaxWorkItems
-#define        NUMBER_OF_SINGLE_WORK_ITEMS       6
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMRegisterDevice(
+  IN NDIS_HANDLE  NdisWrapperHandle,
+  IN PNDIS_STRING  DeviceName,
+  IN PNDIS_STRING  SymbolicName,
+  IN PDRIVER_DISPATCH  MajorFunctions[],
+  OUT PDEVICE_OBJECT  *pDeviceObject,
+  OUT NDIS_HANDLE  *NdisDeviceHandle);
 
-typedef struct _NDIS_MINIPORT_WORK_ITEM {
-       SINGLE_LIST_ENTRY  Link;
-       NDIS_WORK_ITEM_TYPE  WorkItemType;
-       PVOID  WorkItemContext;
-} NDIS_MINIPORT_WORK_ITEM, *PNDIS_MINIPORT_WORK_ITEM;
+NDISAPI
+VOID
+NTAPI
+NdisMRegisterUnloadHandler(
+  IN NDIS_HANDLE  NdisWrapperHandle,
+  IN PDRIVER_UNLOAD  UnloadHandler);
 
-struct _NDIS_WORK_ITEM;
-typedef VOID (*NDIS_PROC)(struct _NDIS_WORK_ITEM *, PVOID);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMRemoveMiniport(
+  IN NDIS_HANDLE  MiniportAdapterHandle);
 
-typedef struct _NDIS_WORK_ITEM {
-  PVOID Context;
-  NDIS_PROC Routine;
-  UCHAR WrapperReserved[8*sizeof(PVOID)];
-} NDIS_WORK_ITEM, *PNDIS_WORK_ITEM;
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMSetMiniportSecondary(
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN NDIS_HANDLE  PrimaryMiniportAdapterHandle);
 
-typedef struct _NDIS_BIND_PATHS {
-       UINT  Number;
-       NDIS_STRING  Paths[1];
-} NDIS_BIND_PATHS, *PNDIS_BIND_PATHS;
+NDISAPI
+VOID
+NTAPI
+NdisOpenConfigurationKeyByIndex(
+  OUT PNDIS_STATUS Status,
+  IN NDIS_HANDLE ConfigurationHandle,
+  IN ULONG Index,
+  OUT PNDIS_STRING KeyName,
+  OUT PNDIS_HANDLE KeyHandle);
 
+NDISAPI
+VOID
+NTAPI
+NdisOpenConfigurationKeyByName(
+  OUT PNDIS_STATUS Status,
+  IN NDIS_HANDLE ConfigurationHandle,
+  IN PNDIS_STRING SubKeyName,
+  OUT PNDIS_HANDLE SubKeyHandle);
 
-typedef VOID
-(NTAPI *ETH_RCV_COMPLETE_HANDLER)(
-  IN PETH_FILTER  Filter);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisQueryAdapterInstanceName(
+  OUT PNDIS_STRING  AdapterInstanceName,
+  IN NDIS_HANDLE  NdisBindingHandle);
 
-typedef VOID
-(NTAPI *ETH_RCV_INDICATE_HANDLER)(
-  IN PETH_FILTER  Filter,
-  IN NDIS_HANDLE  MacReceiveContext,
-  IN PCHAR  Address,
-  IN PVOID  HeaderBuffer,
-  IN UINT  HeaderBufferSize,
-  IN PVOID  LookaheadBuffer,
-  IN UINT  LookaheadBufferSize,
-  IN UINT  PacketSize);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisWriteEventLogEntry(
+  IN PVOID  LogHandle,
+  IN NDIS_STATUS  EventCode,
+  IN ULONG  UniqueEventValue,
+  IN USHORT  NumStrings,
+  IN PVOID  StringsList  OPTIONAL,
+  IN ULONG  DataSize,
+  IN PVOID  Data  OPTIONAL);
 
-typedef VOID
-(NTAPI *FDDI_RCV_COMPLETE_HANDLER)(
-  IN PFDDI_FILTER  Filter);
+/* Connectionless services */
 
-typedef VOID
-(NTAPI *FDDI_RCV_INDICATE_HANDLER)(
-  IN PFDDI_FILTER  Filter,
-  IN NDIS_HANDLE  MacReceiveContext,
-  IN PCHAR  Address,
-  IN UINT  AddressLength,
-  IN PVOID  HeaderBuffer,
-  IN UINT  HeaderBufferSize,
-  IN PVOID  LookaheadBuffer,
-  IN UINT  LookaheadBufferSize,
-  IN UINT  PacketSize);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisClAddParty(
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN NDIS_HANDLE  ProtocolPartyContext,
+  IN OUT PCO_CALL_PARAMETERS  CallParameters,
+  OUT PNDIS_HANDLE  NdisPartyHandle);
 
-typedef VOID
-(NTAPI *FILTER_PACKET_INDICATION_HANDLER)(
-  IN NDIS_HANDLE  Miniport,
-  IN PPNDIS_PACKET  PacketArray,
-  IN UINT  NumberOfPackets);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisClCloseAddressFamily(
+  IN NDIS_HANDLE  NdisAfHandle);
 
-typedef VOID
-(NTAPI *TR_RCV_COMPLETE_HANDLER)(
-  IN PTR_FILTER  Filter);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisClCloseCall(
+  IN NDIS_HANDLE NdisVcHandle,
+  IN NDIS_HANDLE NdisPartyHandle  OPTIONAL,
+  IN PVOID  Buffer  OPTIONAL,
+  IN UINT  Size);
 
-typedef VOID
-(NTAPI *TR_RCV_INDICATE_HANDLER)(
-  IN PTR_FILTER  Filter,
-  IN NDIS_HANDLE  MacReceiveContext,
-  IN PVOID  HeaderBuffer,
-  IN UINT  HeaderBufferSize,
-  IN PVOID  LookaheadBuffer,
-  IN UINT  LookaheadBufferSize,
-  IN UINT  PacketSize);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisClDeregisterSap(
+  IN NDIS_HANDLE  NdisSapHandle);
 
-typedef VOID
-(NTAPI *WAN_RCV_COMPLETE_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN NDIS_HANDLE  NdisLinkContext);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisClDropParty(
+  IN NDIS_HANDLE  NdisPartyHandle,
+  IN PVOID  Buffer  OPTIONAL,
+  IN UINT  Size);
 
-typedef VOID
-(NTAPI *WAN_RCV_HANDLER)(
-  OUT PNDIS_STATUS  Status,
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN NDIS_HANDLE  NdisLinkContext,
-  IN PUCHAR  Packet,
-  IN ULONG  PacketSize);
+NDISAPI
+VOID
+NTAPI
+NdisClIncomingCallComplete(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN PCO_CALL_PARAMETERS  CallParameters);
 
-typedef VOID
-(FASTCALL *NDIS_M_DEQUEUE_WORK_ITEM)(
-  IN PNDIS_MINIPORT_BLOCK  Miniport,
-  IN NDIS_WORK_ITEM_TYPE  WorkItemType,
-  OUT PVOID  *WorkItemContext);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisClMakeCall(
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN OUT PCO_CALL_PARAMETERS  CallParameters,
+  IN NDIS_HANDLE  ProtocolPartyContext  OPTIONAL,
+  OUT PNDIS_HANDLE  NdisPartyHandle  OPTIONAL);
 
-typedef NDIS_STATUS
-(FASTCALL *NDIS_M_QUEUE_NEW_WORK_ITEM)(
-  IN PNDIS_MINIPORT_BLOCK  Miniport,
-  IN NDIS_WORK_ITEM_TYPE  WorkItemType,
-  IN PVOID  WorkItemContext);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisClModifyCallQoS(
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN PCO_CALL_PARAMETERS  CallParameters);
 
-typedef NDIS_STATUS
-(FASTCALL *NDIS_M_QUEUE_WORK_ITEM)(
-  IN PNDIS_MINIPORT_BLOCK  Miniport,
-  IN NDIS_WORK_ITEM_TYPE  WorkItemType,
-  IN PVOID  WorkItemContext);
 
-typedef VOID
-(NTAPI *NDIS_M_REQ_COMPLETE_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN NDIS_STATUS  Status);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisClOpenAddressFamily(
+  IN NDIS_HANDLE  NdisBindingHandle,
+  IN PCO_ADDRESS_FAMILY  AddressFamily,
+  IN NDIS_HANDLE  ProtocolAfContext,
+  IN PNDIS_CLIENT_CHARACTERISTICS  ClCharacteristics,
+  IN UINT  SizeOfClCharacteristics,
+  OUT PNDIS_HANDLE  NdisAfHandle);
 
-typedef VOID
-(NTAPI *NDIS_M_RESET_COMPLETE_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN NDIS_STATUS  Status,
-  IN BOOLEAN  AddressingReset);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisClRegisterSap(
+  IN NDIS_HANDLE  NdisAfHandle,
+  IN NDIS_HANDLE  ProtocolSapContext,
+  IN PCO_SAP  Sap,
+  OUT PNDIS_HANDLE  NdisSapHandle);
 
-typedef VOID
-(NTAPI *NDIS_M_SEND_COMPLETE_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN PNDIS_PACKET  Packet,
-  IN NDIS_STATUS  Status);
 
-typedef VOID
-(NTAPI *NDIS_M_SEND_RESOURCES_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterHandle);
+/* Call Manager services */
 
-typedef BOOLEAN
-(FASTCALL *NDIS_M_START_SENDS)(
-  IN PNDIS_MINIPORT_BLOCK  Miniport);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisCmActivateVc(
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN OUT PCO_CALL_PARAMETERS  CallParameters);
 
-typedef VOID
-(NTAPI *NDIS_M_STATUS_HANDLER)(
-  IN NDIS_HANDLE  MiniportHandle,
-  IN NDIS_STATUS  GeneralStatus,
-  IN PVOID  StatusBuffer,
-  IN UINT  StatusBufferSize);
+NDISAPI
+VOID
+NTAPI
+NdisCmAddPartyComplete(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  NdisPartyHandle,
+  IN NDIS_HANDLE  CallMgrPartyContext  OPTIONAL,
+  IN PCO_CALL_PARAMETERS  CallParameters);
 
-typedef VOID
-(NTAPI *NDIS_M_STS_COMPLETE_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterHandle);
+NDISAPI
+VOID
+NTAPI
+NdisCmCloseAddressFamilyComplete(
+  IN NDIS_STATUS Status,
+  IN NDIS_HANDLE NdisAfHandle);
 
-typedef VOID
-(NTAPI *NDIS_M_TD_COMPLETE_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN PNDIS_PACKET  Packet,
+NDISAPI
+VOID
+NTAPI
+NdisCmCloseCallComplete(
   IN NDIS_STATUS  Status,
-  IN UINT  BytesTransferred);
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL);
 
-typedef VOID (NTAPI *NDIS_WM_SEND_COMPLETE_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterHandle,
-  IN PVOID  Packet,
-  IN NDIS_STATUS  Status);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisCmDeactivateVc(
+  IN NDIS_HANDLE  NdisVcHandle);
 
+NDISAPI
+VOID
+NTAPI
+NdisCmDeregisterSapComplete(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  NdisSapHandle);
 
-#if ARCNET
+NDISAPI
+VOID
+NTAPI
+NdisCmDispatchCallConnected(
+  IN NDIS_HANDLE  NdisVcHandle);
 
-#define ARC_SEND_BUFFERS                  8
-#define ARC_HEADER_SIZE                   4
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisCmDispatchIncomingCall(
+  IN NDIS_HANDLE  NdisSapHandle,
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN PCO_CALL_PARAMETERS  CallParameters);
 
-typedef struct _NDIS_ARC_BUF {
-  NDIS_HANDLE  ArcnetBufferPool;
-  PUCHAR  ArcnetLookaheadBuffer;
-  UINT  NumFree;
-  ARC_BUFFER_LIST ArcnetBuffers[ARC_SEND_BUFFERS];
-} NDIS_ARC_BUF, *PNDIS_ARC_BUF;
+NDISAPI
+VOID
+NTAPI
+NdisCmDispatchIncomingCallQoSChange(
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN PCO_CALL_PARAMETERS  CallParameters);
 
-#endif /* ARCNET */
+NDISAPI
+VOID
+NTAPI
+NdisCmDispatchIncomingCloseCall(
+  IN NDIS_STATUS  CloseStatus,
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN PVOID  Buffer  OPTIONAL,
+  IN UINT  Size);
 
-typedef struct _NDIS_LOG {
-  PNDIS_MINIPORT_BLOCK  Miniport;
-  KSPIN_LOCK  LogLock;
-  PIRP  Irp;
-  UINT  TotalSize;
-  UINT  CurrentSize;
-  UINT  InPtr;
-  UINT  OutPtr;
-  UCHAR  LogBuf[1];
-} NDIS_LOG, *PNDIS_LOG;
+NDISAPI
+VOID
+NTAPI
+NdisCmDispatchIncomingDropParty(
+  IN NDIS_STATUS  DropStatus,
+  IN NDIS_HANDLE  NdisPartyHandle,
+  IN PVOID  Buffer  OPTIONAL,
+  IN UINT  Size);
 
-#if ARCNET
-#define FILTERDBS_ARCNET_S \
-  PARC_FILTER  ArcDB;
-#else /* !ARCNET */
-#define FILTERDBS_ARCNET_S \
-  PVOID  XXXDB;
-#endif /* !ARCNET */
+NDISAPI
+VOID
+NTAPI
+NdisCmDropPartyComplete(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  NdisPartyHandle);
 
-#define FILTERDBS_S \
-  _ANONYMOUS_UNION union { \
-    PETH_FILTER  EthDB; \
-    PNULL_FILTER  NullDB; \
-  } DUMMYUNIONNAME; \
-  PTR_FILTER  TrDB; \
-  PFDDI_FILTER  FddiDB; \
-  FILTERDBS_ARCNET_S
+NDISAPI
+VOID
+NTAPI
+NdisCmMakeCallComplete(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
+  IN NDIS_HANDLE  CallMgrPartyContext  OPTIONAL,
+  IN PCO_CALL_PARAMETERS  CallParameters);
 
-typedef struct _FILTERDBS {
-  FILTERDBS_S
-} FILTERDBS, *PFILTERDBS;
+NDISAPI
+VOID
+NTAPI
+NdisCmModifyCallQoSComplete(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN PCO_CALL_PARAMETERS  CallParameters);
 
+NDISAPI
+VOID
+NTAPI
+NdisCmOpenAddressFamilyComplete(
+  IN NDIS_STATUS Status,
+  IN NDIS_HANDLE NdisAfHandle,
+  IN NDIS_HANDLE CallMgrAfContext);
 
-struct _NDIS_MINIPORT_BLOCK {
-  PVOID  Signature;
-  PNDIS_MINIPORT_BLOCK  NextMiniport;
-  PNDIS_M_DRIVER_BLOCK  DriverHandle;
-  NDIS_HANDLE  MiniportAdapterContext;
-  UNICODE_STRING  MiniportName;
-  PNDIS_BIND_PATHS  BindPaths;
-  NDIS_HANDLE  OpenQueue;
-  REFERENCE  ShortRef;
-  NDIS_HANDLE  DeviceContext;
-  UCHAR  Padding1;
-  UCHAR  LockAcquired;
-  UCHAR  PmodeOpens;
-  UCHAR  AssignedProcessor;
-  KSPIN_LOCK  Lock;
-  PNDIS_REQUEST  MediaRequest;
-  PNDIS_MINIPORT_INTERRUPT  Interrupt;
-  ULONG  Flags;
-  ULONG  PnPFlags;
-  LIST_ENTRY  PacketList;
-  PNDIS_PACKET  FirstPendingPacket;
-  PNDIS_PACKET  ReturnPacketsQueue;
-  ULONG  RequestBuffer;
-  PVOID  SetMCastBuffer;
-  PNDIS_MINIPORT_BLOCK  PrimaryMiniport;
-  PVOID  WrapperContext;
-  PVOID  BusDataContext;
-  ULONG  PnPCapabilities;
-  PCM_RESOURCE_LIST  Resources;
-  NDIS_TIMER  WakeUpDpcTimer;
-  UNICODE_STRING  BaseName;
-  UNICODE_STRING  SymbolicLinkName;
-  ULONG  CheckForHangSeconds;
-  USHORT  CFHangTicks;
-  USHORT  CFHangCurrentTick;
-  NDIS_STATUS  ResetStatus;
-  NDIS_HANDLE  ResetOpen;
-  FILTERDBS_S
-  FILTER_PACKET_INDICATION_HANDLER  PacketIndicateHandler;
-  NDIS_M_SEND_COMPLETE_HANDLER  SendCompleteHandler;
-  NDIS_M_SEND_RESOURCES_HANDLER  SendResourcesHandler;
-  NDIS_M_RESET_COMPLETE_HANDLER  ResetCompleteHandler;
-  NDIS_MEDIUM  MediaType;
-  ULONG  BusNumber;
-  NDIS_INTERFACE_TYPE  BusType;
-  NDIS_INTERFACE_TYPE  AdapterType;
-  PDEVICE_OBJECT  DeviceObject;
-  PDEVICE_OBJECT  PhysicalDeviceObject;
-  PDEVICE_OBJECT  NextDeviceObject;
-  PMAP_REGISTER_ENTRY  MapRegisters;
-  PNDIS_AF_LIST  CallMgrAfList;
-  PVOID  MiniportThread;
-  PVOID  SetInfoBuf;
-  USHORT  SetInfoBufLen;
-  USHORT  MaxSendPackets;
-  NDIS_STATUS  FakeStatus;
-  PVOID  LockHandler;
-  PUNICODE_STRING  pAdapterInstanceName;
-  PNDIS_MINIPORT_TIMER  TimerQueue;
-  UINT  MacOptions;
-  PNDIS_REQUEST  PendingRequest;
-  UINT  MaximumLongAddresses;
-  UINT  MaximumShortAddresses;
-  UINT  CurrentLookahead;
-  UINT  MaximumLookahead;
-  W_HANDLE_INTERRUPT_HANDLER  HandleInterruptHandler;
-  W_DISABLE_INTERRUPT_HANDLER  DisableInterruptHandler;
-  W_ENABLE_INTERRUPT_HANDLER  EnableInterruptHandler;
-  W_SEND_PACKETS_HANDLER  SendPacketsHandler;
-  NDIS_M_START_SENDS  DeferredSendHandler;
-  ETH_RCV_INDICATE_HANDLER  EthRxIndicateHandler;
-  TR_RCV_INDICATE_HANDLER  TrRxIndicateHandler;
-  FDDI_RCV_INDICATE_HANDLER  FddiRxIndicateHandler;
-  ETH_RCV_COMPLETE_HANDLER  EthRxCompleteHandler;
-  TR_RCV_COMPLETE_HANDLER  TrRxCompleteHandler;
-  FDDI_RCV_COMPLETE_HANDLER  FddiRxCompleteHandler;
-  NDIS_M_STATUS_HANDLER  StatusHandler;
-  NDIS_M_STS_COMPLETE_HANDLER  StatusCompleteHandler;
-  NDIS_M_TD_COMPLETE_HANDLER  TDCompleteHandler;
-  NDIS_M_REQ_COMPLETE_HANDLER  QueryCompleteHandler;
-  NDIS_M_REQ_COMPLETE_HANDLER  SetCompleteHandler;
-  NDIS_WM_SEND_COMPLETE_HANDLER  WanSendCompleteHandler;
-  WAN_RCV_HANDLER  WanRcvHandler;
-  WAN_RCV_COMPLETE_HANDLER  WanRcvCompleteHandler;
-#if defined(NDIS_WRAPPER)
-  PNDIS_MINIPORT_BLOCK  NextGlobalMiniport;
-  SINGLE_LIST_ENTRY  WorkQueue[NUMBER_OF_WORK_ITEM_TYPES];
-  SINGLE_LIST_ENTRY  SingleWorkItems[NUMBER_OF_SINGLE_WORK_ITEMS];
-  UCHAR  SendFlags;
-  UCHAR  TrResetRing;
-  UCHAR  ArcnetAddress;
-  UCHAR  XState;
-  _ANONYMOUS_UNION union {
-#if ARCNET
-    PNDIS_ARC_BUF  ArcBuf;
-#endif
-    PVOID  BusInterface;
-  } DUMMYUNIONNAME;
-  PNDIS_LOG  Log;
-  ULONG  SlotNumber;
-  PCM_RESOURCE_LIST  AllocatedResources;
-  PCM_RESOURCE_LIST  AllocatedResourcesTranslated;
-  SINGLE_LIST_ENTRY  PatternList;
-  NDIS_PNP_CAPABILITIES  PMCapabilities;
-  DEVICE_CAPABILITIES  DeviceCaps;
-  ULONG  WakeUpEnable;
-  DEVICE_POWER_STATE  CurrentDevicePowerState;
-  PIRP  pIrpWaitWake;
-  SYSTEM_POWER_STATE  WaitWakeSystemState;
-  LARGE_INTEGER  VcIndex;
-  KSPIN_LOCK  VcCountLock;
-  LIST_ENTRY  WmiEnabledVcs;
-  PNDIS_GUID  pNdisGuidMap;
-  PNDIS_GUID  pCustomGuidMap;
-  USHORT  VcCount;
-  USHORT  cNdisGuidMap;
-  USHORT  cCustomGuidMap;
-  USHORT  CurrentMapRegister;
-  PKEVENT  AllocationEvent;
-  USHORT  BaseMapRegistersNeeded;
-  USHORT  SGMapRegistersNeeded;
-  ULONG  MaximumPhysicalMapping;
-  NDIS_TIMER  MediaDisconnectTimer;
-  USHORT  MediaDisconnectTimeOut;
-  USHORT  InstanceNumber;
-  NDIS_EVENT  OpenReadyEvent;
-  NDIS_PNP_DEVICE_STATE  PnPDeviceState;
-  NDIS_PNP_DEVICE_STATE  OldPnPDeviceState;
-  PGET_SET_DEVICE_DATA  SetBusData;
-  PGET_SET_DEVICE_DATA  GetBusData;
-  KDPC  DeferredDpc;
-#if 0
-  /* FIXME: */
-  NDIS_STATS  NdisStats;
-#else
-  ULONG  NdisStats;
-#endif
-  PNDIS_PACKET  IndicatedPacket[MAXIMUM_PROCESSORS];
-  PKEVENT  RemoveReadyEvent;
-  PKEVENT  AllOpensClosedEvent;
-  PKEVENT  AllRequestsCompletedEvent;
-  ULONG  InitTimeMs;
-  NDIS_MINIPORT_WORK_ITEM  WorkItemBuffer[NUMBER_OF_SINGLE_WORK_ITEMS];
-  PDMA_ADAPTER  SystemAdapterObject;
-  ULONG  DriverVerifyFlags;
-  POID_LIST  OidList;
-  USHORT  InternalResetCount;
-  USHORT  MiniportResetCount;
-  USHORT  MediaSenseConnectCount;
-  USHORT  MediaSenseDisconnectCount;
-  PNDIS_PACKET  *xPackets;
-  ULONG  UserModeOpenReferences;
-  _ANONYMOUS_UNION union {
-    PVOID  SavedSendHandler;
-    PVOID  SavedWanSendHandler;
-  } DUMMYUNIONNAME2;
-  PVOID  SavedSendPacketsHandler;
-  PVOID  SavedCancelSendPacketsHandler;
-  W_SEND_PACKETS_HANDLER  WSendPacketsHandler;
-  ULONG  MiniportAttributes;
-  PDMA_ADAPTER  SavedSystemAdapterObject;
-  USHORT  NumOpens;
-  USHORT  CFHangXTicks;
-  ULONG  RequestCount;
-  ULONG  IndicatedPacketsCount;
-  ULONG  PhysicalMediumType;
-  PNDIS_REQUEST  LastRequest;
-  LONG  DmaAdapterRefCount;
-  PVOID  FakeMac;
-  ULONG  LockDbg;
-  ULONG  LockDbgX;
-  PVOID  LockThread;
-  ULONG  InfoFlags;
-  KSPIN_LOCK  TimerQueueLock;
-  PKEVENT  ResetCompletedEvent;
-  PKEVENT  QueuedBindingCompletedEvent;
-  PKEVENT  DmaResourcesReleasedEvent;
-  FILTER_PACKET_INDICATION_HANDLER  SavedPacketIndicateHandler;
-  ULONG  RegisteredInterrupts;
-  PNPAGED_LOOKASIDE_LIST  SGListLookasideList;
-  ULONG  ScatterGatherListSize;
-#endif /* _NDIS_ */
-};
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisCmRegisterAddressFamily(
+  IN NDIS_HANDLE  NdisBindingHandle,
+  IN PCO_ADDRESS_FAMILY  AddressFamily,
+  IN PNDIS_CALL_MANAGER_CHARACTERISTICS  CmCharacteristics,
+  IN UINT  SizeOfCmCharacteristics);
+
+NDISAPI
+VOID
+NTAPI
+NdisCmRegisterSapComplete(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  NdisSapHandle,
+  IN NDIS_HANDLE  CallMgrSapContext);
+
+
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMCmActivateVc(
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN PCO_CALL_PARAMETERS  CallParameters);
+
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMCmCreateVc(
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN NDIS_HANDLE  NdisAfHandle,
+  IN NDIS_HANDLE  MiniportVcContext,
+  OUT  PNDIS_HANDLE  NdisVcHandle);
+
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMCmDeactivateVc(
+  IN NDIS_HANDLE  NdisVcHandle);
+
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMCmDeleteVc(
+  IN NDIS_HANDLE  NdisVcHandle);
+
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMCmRegisterAddressFamily(
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN PCO_ADDRESS_FAMILY  AddressFamily,
+  IN PNDIS_CALL_MANAGER_CHARACTERISTICS  CmCharacteristics,
+  IN UINT  SizeOfCmCharacteristics);
+
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisMCmRequest(
+  IN NDIS_HANDLE  NdisAfHandle,
+  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
+  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
+  IN OUT  PNDIS_REQUEST  NdisRequest);
 
 
-/* Handler prototypes for NDIS_OPEN_BLOCK */
+/* Connection-oriented services */
+
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisCoCreateVc(
+  IN NDIS_HANDLE  NdisBindingHandle,
+  IN NDIS_HANDLE  NdisAfHandle  OPTIONAL,
+  IN NDIS_HANDLE  ProtocolVcContext,
+  IN OUT PNDIS_HANDLE  NdisVcHandle);
 
-typedef NDIS_STATUS (NTAPI *WAN_SEND_HANDLER)(
-  IN NDIS_HANDLE  MacBindingHandle,
-  IN NDIS_HANDLE  LinkHandle,
-  IN PVOID  Packet);
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisCoDeleteVc(
+  IN NDIS_HANDLE  NdisVcHandle);
 
-/* NDIS 4.0 extension */
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisCoRequest(
+  IN NDIS_HANDLE  NdisBindingHandle,
+  IN NDIS_HANDLE  NdisAfHandle  OPTIONAL,
+  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
+  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
+  IN OUT  PNDIS_REQUEST  NdisRequest);
 
-typedef VOID (NTAPI *SEND_PACKETS_HANDLER)(
-  IN NDIS_HANDLE  MiniportAdapterContext,
+NDISAPI
+VOID
+NTAPI
+NdisCoRequestComplete(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  NdisAfHandle,
+  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
+  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
+  IN PNDIS_REQUEST  NdisRequest);
+
+NDISAPI
+VOID
+NTAPI
+NdisCoSendPackets(
+  IN NDIS_HANDLE  NdisVcHandle,
   IN PPNDIS_PACKET  PacketArray,
   IN UINT  NumberOfPackets);
 
-#if defined(NDIS_WRAPPER)
-#define NDIS_COMMON_OPEN_BLOCK_WRAPPER_S \
-  ULONG  Flags; \
-  ULONG  References; \
-  KSPIN_LOCK  SpinLock; \
-  NDIS_HANDLE  FilterHandle; \
-  ULONG  ProtocolOptions; \
-  USHORT  CurrentLookahead; \
-  USHORT  ConnectDampTicks; \
-  USHORT  DisconnectDampTicks; \
-  W_SEND_HANDLER  WSendHandler; \
-  W_TRANSFER_DATA_HANDLER  WTransferDataHandler; \
-  W_SEND_PACKETS_HANDLER  WSendPacketsHandler; \
-  W_CANCEL_SEND_PACKETS_HANDLER  CancelSendPacketsHandler; \
-  ULONG  WakeUpEnable; \
-  PKEVENT  CloseCompleteEvent; \
-  QUEUED_CLOSE  QC; \
-  ULONG  AfReferences; \
-  PNDIS_OPEN_BLOCK  NextGlobalOpen;
-#else
-#define NDIS_COMMON_OPEN_BLOCK_WRAPPER_S
-#endif
+NDISAPI
+VOID
+NTAPI
+NdisMCoActivateVcComplete(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN PCO_CALL_PARAMETERS  CallParameters);
 
-#define NDIS_COMMON_OPEN_BLOCK_S \
-  PVOID  MacHandle; \
-  NDIS_HANDLE  BindingHandle; \
-  PNDIS_MINIPORT_BLOCK  MiniportHandle; \
-  PNDIS_PROTOCOL_BLOCK  ProtocolHandle; \
-  NDIS_HANDLE  ProtocolBindingContext; \
-  PNDIS_OPEN_BLOCK  MiniportNextOpen; \
-  PNDIS_OPEN_BLOCK  ProtocolNextOpen; \
-  NDIS_HANDLE  MiniportAdapterContext; \
-  BOOLEAN  Reserved1; \
-  BOOLEAN  Reserved2; \
-  BOOLEAN  Reserved3; \
-  BOOLEAN  Reserved4; \
-  PNDIS_STRING  BindDeviceName; \
-  KSPIN_LOCK  Reserved5; \
-  PNDIS_STRING  RootDeviceName; \
-  _ANONYMOUS_UNION union { \
-    SEND_HANDLER  SendHandler; \
-    WAN_SEND_HANDLER  WanSendHandler; \
-  } DUMMYUNIONNAME; \
-  TRANSFER_DATA_HANDLER  TransferDataHandler; \
-  SEND_COMPLETE_HANDLER  SendCompleteHandler; \
-  TRANSFER_DATA_COMPLETE_HANDLER  TransferDataCompleteHandler; \
-  RECEIVE_HANDLER  ReceiveHandler; \
-  RECEIVE_COMPLETE_HANDLER  ReceiveCompleteHandler; \
-  WAN_RECEIVE_HANDLER  WanReceiveHandler; \
-  REQUEST_COMPLETE_HANDLER  RequestCompleteHandler; \
-  RECEIVE_PACKET_HANDLER  ReceivePacketHandler; \
-  SEND_PACKETS_HANDLER  SendPacketsHandler; \
-  RESET_HANDLER  ResetHandler; \
-  REQUEST_HANDLER  RequestHandler; \
-  RESET_COMPLETE_HANDLER  ResetCompleteHandler; \
-  STATUS_HANDLER  StatusHandler; \
-  STATUS_COMPLETE_HANDLER  StatusCompleteHandler; \
-  NDIS_COMMON_OPEN_BLOCK_WRAPPER_S
+NDISAPI
+VOID
+NTAPI
+NdisMCoDeactivateVcComplete(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  NdisVcHandle);
 
-typedef struct _NDIS_COMMON_OPEN_BLOCK {
-  NDIS_COMMON_OPEN_BLOCK_S
-} NDIS_COMMON_OPEN_BLOCK;
+NDISAPI
+VOID
+NTAPI
+NdisMCoIndicateReceivePacket(
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN PPNDIS_PACKET  PacketArray,
+  IN UINT  NumberOfPackets);
 
-struct _NDIS_OPEN_BLOCK
-{
-#ifdef __cplusplus
-  NDIS_COMMON_OPEN_BLOCK NdisCommonOpenBlock;
-#else
-  NDIS_COMMON_OPEN_BLOCK_S
-#endif
-};
+NDISAPI
+VOID
+NTAPI
+NdisMCoIndicateStatus(
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
+  IN NDIS_STATUS  GeneralStatus,
+  IN PVOID  StatusBuffer  OPTIONAL,
+  IN ULONG  StatusBufferSize);
+
+NDISAPI
+VOID
+NTAPI
+NdisMCoReceiveComplete(
+  IN NDIS_HANDLE  MiniportAdapterHandle);
+
+NDISAPI
+VOID
+NTAPI
+NdisMCoRequestComplete(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  MiniportAdapterHandle,
+  IN PNDIS_REQUEST  Request);
+
+NDISAPI
+VOID
+NTAPI
+NdisMCoSendComplete(
+  IN NDIS_STATUS  Status,
+  IN NDIS_HANDLE  NdisVcHandle,
+  IN PNDIS_PACKET  Packet);
+
+
+/* NDIS 5.0 extensions for intermediate drivers */
+
+NDISAPI
+VOID
+NTAPI
+NdisIMAssociateMiniport(
+  IN NDIS_HANDLE  DriverHandle,
+  IN NDIS_HANDLE  ProtocolHandle);
+
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisIMCancelInitializeDeviceInstance(
+  IN NDIS_HANDLE  DriverHandle,
+  IN PNDIS_STRING  DeviceInstance);
+
+NDISAPI
+VOID
+NTAPI
+NdisIMCopySendCompletePerPacketInfo(
+  IN PNDIS_PACKET  DstPacket,
+  IN PNDIS_PACKET  SrcPacket);
+
+NDISAPI
+VOID
+NTAPI
+NdisIMCopySendPerPacketInfo(
+  IN PNDIS_PACKET  DstPacket,
+  IN PNDIS_PACKET  SrcPacket);
+
+NDISAPI
+VOID
+NTAPI
+NdisIMDeregisterLayeredMiniport(
+  IN NDIS_HANDLE  DriverHandle);
+
+NDISAPI
+NDIS_HANDLE
+NTAPI
+NdisIMGetBindingContext(
+  IN NDIS_HANDLE  NdisBindingHandle);
+
+NDISAPI
+NDIS_HANDLE
+NTAPI
+NdisIMGetDeviceContext(
+  IN NDIS_HANDLE  MiniportAdapterHandle);
+
+NDISAPI
+NDIS_STATUS
+NTAPI
+NdisIMInitializeDeviceInstanceEx(
+  IN NDIS_HANDLE  DriverHandle,
+  IN PNDIS_STRING  DriverInstance,
+  IN NDIS_HANDLE  DeviceContext  OPTIONAL);
+
+/*
+NDISAPI
+PSINGLE_LIST_ENTRY
+NTAPI
+NdisInterlockedPopEntrySList(
+  IN PSLIST_HEADER ListHead,
+  IN PKSPIN_LOCK Lock);
+*/
+#define NdisInterlockedPopEntrySList(SListHead, Lock) \
+  ExInterlockedPopEntrySList(SListHead, &(Lock)->SpinLock)
+
+/*
+NDISAPI
+PSINGLE_LIST_ENTRY
+NTAPI
+NdisInterlockedPushEntrySList(
+  IN PSLIST_HEADER ListHead,
+  IN PSINGLE_LIST_ENTRY ListEntry,
+  IN PKSPIN_LOCK Lock);
+*/
+#define NdisInterlockedPushEntrySList(SListHead, SListEntry, Lock) \
+  ExInterlockedPushEntrySList(SListHead, SListEntry, &(Lock)->SpinLock)
+
+#define NdisInterlockedFlushSList(SListHead) ExInterlockedFlushSList(SListHead)
+
+/*
+NDISAPI
+VOID
+NTAPI
+NdisQueryBufferSafe(
+  IN PNDIS_BUFFER Buffer,
+  OUT PVOID *VirtualAddress OPTIONAL,
+  OUT PUINT Length,
+  IN UINT Priority);
+*/
+#define NdisQueryBufferSafe(_Buffer, _VirtualAddress, _Length, _Priority) {         \
+  if (ARGUMENT_PRESENT(_VirtualAddress)) {                                          \
+    *(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdlSafe(_Buffer, _Priority); \
+  }                                                                                 \
+  *(_Length) = MmGetMdlByteCount(_Buffer);                                          \
+}
 
 /* Routines for NDIS miniport drivers */
 
@@ -5467,36 +5693,32 @@ NdisMUnmapIoSpace(
   IN PVOID  VirtualAddress,
   IN UINT  Length);
 
-
-
 /* Event functions */
 
 NDISAPI
 VOID
 NTAPI
 NdisInitializeEvent(
-  IN PNDIS_EVENT  Event);
+  OUT PNDIS_EVENT Event);
 
 NDISAPI
 VOID
 NTAPI
 NdisSetEvent(
-  IN PNDIS_EVENT  Event);
+  IN PNDIS_EVENT Event);
 
 NDISAPI
 VOID
 NTAPI
 NdisResetEvent(
-  IN PNDIS_EVENT  Event);
+  IN PNDIS_EVENT Event);
 
 NDISAPI
 BOOLEAN
 NTAPI
 NdisWaitEvent(
-  IN PNDIS_EVENT  Event,
-  IN UINT  Timeout);
-
-
+  IN PNDIS_EVENT Event,
+  IN UINT Timeout);
 
 /* NDIS intermediate miniport structures */
 
@@ -5504,8 +5726,6 @@ typedef VOID (NTAPI *W_MINIPORT_CALLBACK)(
   IN NDIS_HANDLE  MiniportAdapterContext,
   IN PVOID  CallbackContext);
 
-
-
 /* Routines for intermediate miniport drivers */
 
 NDISAPI
@@ -5552,12 +5772,15 @@ NdisSetupDmaTransfer(
   IN ULONG  Length,
   IN BOOLEAN  WriteToDevice);
 
+/*
 NDISAPI
 NTSTATUS
 NTAPI
 NdisUpcaseUnicodeString(
-  OUT PUNICODE_STRING  DestinationString,
-  IN PUNICODE_STRING  SourceString);
+  OUT PUNICODE_STRING DestinationString,
+  IN PUNICODE_STRING SourceString);
+*/
+#define NdisUpcaseUnicodeString(_d, _s) RtlUpcaseUnicodeString(_d, _s, FALSE)
 
 
 /* Routines for NDIS protocol drivers */
@@ -5667,12 +5890,6 @@ NdisRegisterProtocol(
   IN PNDIS_PROTOCOL_CHARACTERISTICS  ProtocolCharacteristics,
   IN UINT  CharacteristicsLength);
 
-NDISAPI
-NDIS_STATUS
-NTAPI
-NdisScheduleWorkItem(
-  IN  PNDIS_WORK_ITEM WorkItem);
-
 /* Obsoleted in Windows XP */
 
 /* Prototypes for NDIS_MAC_CHARACTERISTICS */