Fix the NDIS_RW_LOCK structure.
[reactos.git] / reactos / w32api / include / ddk / ndis.h
index 11cbbf0..c6d6b32 100644 (file)
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  *
  * DEFINES: i386                 - Target platform is i386
- *          _NDIS_               - Define only for NDIS library
+ *          NDIS_WRAPPER         - Define only for NDIS library
  *          NDIS_MINIPORT_DRIVER - Define only for NDIS miniport drivers
  *          NDIS40               - Use NDIS 4.0 structures by default
  *          NDIS50               - Use NDIS 5.0 structures by default
+ *          NDIS51               - Use NDIS 5.1 structures by default
+ *          NDIS40_MINIPORT      - Building NDIS 4.0 miniport driver
  *          NDIS50_MINIPORT      - Building NDIS 5.0 miniport driver
  *          NDIS51_MINIPORT      - Building NDIS 5.1 miniport driver
  */
+
 #ifndef __NDIS_H
 #define __NDIS_H
 
 #pragma GCC system_header
 #endif
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #include "ntddk.h"
 #include "ntddndis.h"
 #include "netpnp.h"
 #include "netevent.h"
-#include <winsock2.h>
+#include <qos.h>
 
-#if defined(_NDIS_)
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(NDIS_WRAPPER)
   #define NDISAPI DECLSPEC_EXPORT
 #else
   #define NDISAPI DECLSPEC_IMPORT
 #endif
 
-#if defined(NDIS50_MINIPORT)
-#ifndef NDIS50
-#define NDIS50
+#if defined(NDIS50_MINIPORT) && !defined(NDIS_MINIPORT_MAJOR_VERSION) && !defined(NDIS_MINIPORT_MINOR_VERSION)
+#define NDIS_MINIPORT_MAJOR_VERSION 5
+#define NDIS_MINIPORT_MINOR_VERSION 0
 #endif
-#endif /* NDIS50_MINIPORT */
 
-#if defined(NDIS51_MINIPORT)
-#ifndef NDIS51
-#define NDIS51
+#if defined(NDIS51_MINIPORT) && !defined(NDIS_MINIPORT_MAJOR_VERSION) && !defined(NDIS_MINIPORT_MINOR_VERSION)
+#define NDIS_MINIPORT_MAJOR_VERSION 5
+#define NDIS_MINIPORT_MINOR_VERSION 1
+#endif
+
+#if defined(NDIS50) && !defined(NDIS_PROTOCOL_MAJOR_VERSION) && !defined(NDIS_PROTOCOL_MINOR_VERSION)
+#define NDIS_PROTOCOL_MAJOR_VERSION 5
+#define NDIS_PROTOCOL_MINOR_VERSION 0
 #endif
-#endif /* NDIS51_MINIPORT */
 
-/* NDIS 3.0 is default */
-#if !defined(NDIS30) || !defined(NDIS40) || !defined(NDIS50) || !defined(NDIS51)
-#define NDIS30
-#endif /* !NDIS30 || !NDIS40 || !NDIS50 || !NDIS51 */
+#if defined(NDIS51) && !defined(NDIS_PROTOCOL_MAJOR_VERSION) && !defined(NDIS_PROTOCOL_MINOR_VERSION)
+#define NDIS_PROTOCOL_MAJOR_VERSION 5
+#define NDIS_PROTOCOL_MINOR_VERSION 1
+#endif
+
+#if defined(NDIS_MINIPORT_DRIVER) && !defined(BINARY_COMPATIBLE)
+#define BINARY_COMPATIBLE 1
+#endif
+
+#if !defined(_M_IX86) && BINARY_COMPATIBLE
+#undef BINARY_COMPATIBLE
+#define BINARY_COMPATIBLE 0
+#endif
 
 #if 1
 /* FIXME: */
@@ -236,9 +251,9 @@ typedef struct _NDIS_RW_LOCK {
     struct {
       KSPIN_LOCK  SpinLock;
       PVOID  Context;
-    } s;
+    };
     UCHAR  Reserved[16];
-  } u;
+  };
 
   NDIS_RW_LOCK_REFCOUNT  RefCount[MAXIMUM_PROCESSORS];
 } NDIS_RW_LOCK, *PNDIS_RW_LOCK;
@@ -372,13 +387,7 @@ typedef struct _NDIS_GUID {
 #define        NDIS_GUID_UNICODE_STRING          0x00000008
 #define        NDIS_GUID_ARRAY                   0x00000010
 
-
-typedef struct _NDIS_PACKET_POOL {
-  NDIS_SPIN_LOCK  SpinLock;
-  struct _NDIS_PACKET *FreeList;
-  UINT  PacketLength;
-  UCHAR  Buffer[1];
-} NDIS_PACKET_POOL, * PNDIS_PACKET_POOL;
+typedef HANDLE PNDIS_PACKET_POOL;
 
 /* NDIS_PACKET_PRIVATE.Flags constants */
 #define fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO    0x40
@@ -545,6 +554,19 @@ typedef UCHAR NDIS_DMA_SIZE;
 #define NDIS_DMA_32BITS                         ((NDIS_DMA_SIZE)1)
 #define NDIS_DMA_64BITS                         ((NDIS_DMA_SIZE)2)
 
+typedef enum _NDIS_PROCESSOR_TYPE {
+       NdisProcessorX86,
+       NdisProcessorMips,
+       NdisProcessorAlpha,
+       NdisProcessorPpc,
+       NdisProcessorAmd64
+} NDIS_PROCESSOR_TYPE, *PNDIS_PROCESSOR_TYPE;
+
+typedef enum _NDIS_ENVIRONMENT_TYPE {
+       NdisEnvironmentWindows,
+       NdisEnvironmentWindowsNt
+} NDIS_ENVIRONMENT_TYPE, *PNDIS_ENVIRONMENT_TYPE;
+
 /* Possible hardware architecture */
 typedef enum _NDIS_INTERFACE_TYPE {
        NdisInterfaceInternal = Internal,
@@ -650,15 +672,15 @@ typedef enum _NDIS_PNP_DEVICE_STATE {
 
 /* OID_GEN_NETWORK_LAYER_ADDRESSES */
 typedef struct _NETWORK_ADDRESS {
-  USHORT  AddressLength; 
-  USHORT  AddressType; 
-  UCHAR  Address[1]; 
+  USHORT  AddressLength;
+  USHORT  AddressType;
+  UCHAR  Address[1];
 } NETWORK_ADDRESS, *PNETWORK_ADDRESS;
 
 typedef struct _NETWORK_ADDRESS_LIST {
-       LONG  AddressCount; 
-       USHORT  AddressType; 
-       NETWORK_ADDRESS  Address[1]; 
+       LONG  AddressCount;
+       USHORT  AddressType;
+       NETWORK_ADDRESS  Address[1];
 } NETWORK_ADDRESS_LIST, *PNETWORK_ADDRESS_LIST;
 
 /* Protocol types supported by NDIS */
@@ -672,8 +694,8 @@ typedef struct _NETWORK_ADDRESS_LIST {
 
 /* OID_GEN_TRANSPORT_HEADER_OFFSET */
 typedef struct _TRANSPORT_HEADER_OFFSET {
-       USHORT  ProtocolType; 
-       USHORT  HeaderOffset; 
+       USHORT  ProtocolType;
+       USHORT  HeaderOffset;
 } TRANSPORT_HEADER_OFFSET, *PTRANSPORT_HEADER_OFFSET;
 
 
@@ -701,17 +723,6 @@ typedef struct {
   ULONG  MinorVersion;
 } CO_ADDRESS_FAMILY, *PCO_ADDRESS_FAMILY;
 
-typedef struct _CO_FLOW_PARAMETERS {
-  ULONG  TokenRate;
-  ULONG  TokenBucketSize;
-  ULONG  PeakBandwidth;
-  ULONG  Latency;
-  ULONG  DelayVariation;
-  SERVICETYPE  ServiceType;
-  ULONG  MaxSduSize;
-  ULONG  MinimumPolicedSize;
-} CO_FLOW_PARAMETERS, *PCO_FLOW_PARAMETERS;
-
 typedef struct _CO_SPECIFIC_PARAMETERS {
   ULONG  ParamType;
   ULONG  Length;
@@ -719,8 +730,8 @@ typedef struct _CO_SPECIFIC_PARAMETERS {
 } CO_SPECIFIC_PARAMETERS, *PCO_SPECIFIC_PARAMETERS;
 
 typedef struct _CO_CALL_MANAGER_PARAMETERS {
-  CO_FLOW_PARAMETERS  Transmit;
-  CO_FLOW_PARAMETERS  Receive;
+  FLOWSPEC  Transmit;
+  FLOWSPEC  Receive;
   CO_SPECIFIC_PARAMETERS  CallMgrSpecific;
 } CO_CALL_MANAGER_PARAMETERS, *PCO_CALL_MANAGER_PARAMETERS;
 
@@ -898,7 +909,7 @@ typedef struct _NDIS_TASK_IPSEC {
     ULONG  V4_OPTIONS;
     ULONG  RESERVED;
   } Supported;
+
   struct {
     ULONG  MD5 : 1;
     ULONG  SHA_1 : 1;
@@ -907,7 +918,7 @@ typedef struct _NDIS_TASK_IPSEC {
     ULONG  Send : 1;
     ULONG  Receive : 1;
   } V4AH;
+
   struct {
     ULONG  DES : 1;
     ULONG  RESERVED : 1;
@@ -958,7 +969,7 @@ typedef struct _NDIS_TASK_TCP_IP_CHECKSUM {
     ULONG  UdpChecksum:1;
     ULONG  IpChecksum:1;
   } V4Transmit;
+
   struct {
     ULONG  IpOptionsSupported : 1;
     ULONG  TcpOptionsSupported : 1;
@@ -966,14 +977,14 @@ typedef struct _NDIS_TASK_TCP_IP_CHECKSUM {
     ULONG  UdpChecksum : 1;
     ULONG  IpChecksum : 1;
   } V4Receive;
+
   struct {
     ULONG  IpOptionsSupported : 1;
     ULONG  TcpOptionsSupported : 1;
     ULONG  TcpChecksum : 1;
     ULONG  UdpChecksum : 1;
   } V6Transmit;
+
   struct {
     ULONG  IpOptionsSupported : 1;
     ULONG  TcpOptionsSupported : 1;
@@ -999,7 +1010,7 @@ typedef struct _NDIS_TCP_IP_CHECKSUM_PACKET_INFO {
       ULONG  NdisPacketUdpChecksum : 1;
       ULONG  NdisPacketIpChecksum : 1;
       } Transmit;
+
     struct {
       ULONG  NdisPacketTcpChecksumFailed : 1;
       ULONG  NdisPacketUdpChecksumFailed : 1;
@@ -1023,9 +1034,9 @@ typedef struct _NDIS_WAN_FRAGMENT {
 } NDIS_WAN_FRAGMENT, *PNDIS_WAN_FRAGMENT;
 
 typedef struct _WAN_CO_LINKPARAMS {
-  ULONG  TransmitSpeed; 
-  ULONG  ReceiveSpeed; 
-  ULONG  SendWindow; 
+  ULONG  TransmitSpeed;
+  ULONG  ReceiveSpeed;
+  ULONG  SendWindow;
 } WAN_CO_LINKPARAMS, *PWAN_CO_LINKPARAMS;
 
 
@@ -1422,7 +1433,7 @@ typedef VOID DDKAPI
   BIND_HANDLER  BindAdapterHandler; \
   UNBIND_HANDLER  UnbindAdapterHandler; \
   PNP_EVENT_HANDLER  PnPEventHandler; \
-  UNLOAD_PROTOCOL_HANDLER  UnloadHandler; 
+  UNLOAD_PROTOCOL_HANDLER  UnloadHandler;
 
 #else /* !__cplusplus */
 
@@ -1432,7 +1443,7 @@ typedef VOID DDKAPI
   BIND_HANDLER  BindAdapterHandler; \
   UNBIND_HANDLER  UnbindAdapterHandler; \
   PNP_EVENT_HANDLER  PnPEventHandler; \
-  UNLOAD_PROTOCOL_HANDLER  UnloadHandler; 
+  UNLOAD_PROTOCOL_HANDLER  UnloadHandler;
 
 #endif /* __cplusplus */
 
@@ -1501,13 +1512,11 @@ typedef struct _NDIS_PROTOCOL_CHARACTERISTICS {
 typedef struct _NDIS_PROTOCOL_CHARACTERISTICS {
   NDIS40_PROTOCOL_CHARACTERISTICS_S;
 } NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS;
-#elif defined(NDIS30)
+#else /* NDIS30 */
 typedef struct _NDIS_PROTOCOL_CHARACTERISTICS {
   NDIS30_PROTOCOL_CHARACTERISTICS_S
 } NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS;
-#else
-#error Define an NDIS version
-#endif /* NDIS30 */
+#endif
 
 
 
@@ -1571,6 +1580,36 @@ NdisCopyFromPacketToPacket(
   IN UINT  SourceOffset,
   OUT PUINT  BytesCopied);
 
+/*
+ * VOID
+ * NdisCopyLookaheadData(
+ *   IN PVOID Destination,
+ *   IN PVOID Source,
+ *   IN ULONG Length,
+ *   IN ULONG ReceiveFlags);
+ */
+
+#ifdef _M_IX86
+#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
 DDKAPI
@@ -1669,6 +1708,8 @@ DDKAPI
 NdisFreeBuffer(
   IN PNDIS_BUFFER  Buffer);
 
+#if BINARY_COMPATIBLE
+
 NDISAPI
 VOID
 DDKAPI
@@ -1702,11 +1743,7 @@ NdisQueryBufferOffset(
   OUT PUINT  Offset,
   OUT PUINT  Length);
 
-NDISAPI
-VOID
-DDKAPI
-NdisFreeBuffer(
-  IN PNDIS_BUFFER  Buffer);
+#else
 
 /*
  * VOID
@@ -1720,7 +1757,6 @@ NdisFreeBuffer(
   (*(ArraySize) = NDIS_BUFFER_TO_SPAN_PAGES(Buffer))  \
 }
 
-
 /*
  * VOID
  * NdisGetFirstBufferFromPacket(
@@ -1792,6 +1828,7 @@ NdisFreeBuffer(
   *((PUINT)Length) = MmGetMdlByteCount(Buffer);   \
 }
 
+#endif /* BINARY_COMPATIBLE */
 
 /*
  * PVOID
@@ -1866,7 +1903,7 @@ NdisFreeBuffer(
 /*
  * UINT
  * NdisGetPacketFlags(
- *   IN PNDIS_PACKET  Packet); 
+ *   IN PNDIS_PACKET  Packet);
  */
 #define NdisGetPacketFlags(Packet)(Packet)->Private.Flags;
 
@@ -1975,7 +2012,7 @@ NdisFreeBuffer(
   (PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
   (_Packet)->Private.NdisPacketOobOffset)
 
+
 /*
  * VOID
  * NdisQueryPacket(
@@ -2108,7 +2145,7 @@ NdisFreeBuffer(
  * VOID
  * NdisSetPacketFlags(
  *   IN PNDIS_PACKET  Packet,
- *   IN UINT  Flags); 
+ *   IN UINT  Flags);
  */
 #define NdisSetPacketFlags(Packet, Flags) \
   (Packet)->Private.Flags |= (Flags);
@@ -2205,6 +2242,24 @@ NdisFreeBuffer(
 
 /* Memory management routines */
 
+#if BINARY_COMPATIBLE
+
+NDISAPI
+VOID
+DDKAPI
+NdisCreateLookaheadBufferFromSharedMemory(
+  IN PVOID  pSharedMemory,
+  IN UINT  LookaheadLength,
+  OUT PVOID  *pLookaheadBuffer);
+
+NDISAPI
+VOID
+DDKAPI
+NdisDestroyLookaheadBufferFromSharedMemory(
+  IN PVOID  pLookaheadBuffer);
+
+#else
+
 /*
  * VOID
  * NdisCreateLookaheadBufferFromSharedMemory(
@@ -2224,27 +2279,56 @@ NdisFreeBuffer(
  */
 #define NdisDestroyLookaheadBufferFromSharedMemory(_pLookaheadBuffer)
 
-#if defined(i386)
+#endif
+
+#if defined(_M_IX86) || defined(_M_AMD64)
 
 /*
  * VOID
- * NdisMoveFromMappedMemory(
+ * NdisMoveMappedMemory(
  *   OUT PVOID  Destination,
  *   IN PVOID  Source,
  *   IN ULONG  Length);
  */
-#define NdisMoveFromMappedMemory(Destination, Source, Length) \
-  NdisMoveMappedMemory(Destination, Source, Length)
+#define NdisMoveMappedMemory(Destination, Source, Length) \
+  RtlCopyMemory(Destination, Source, Length)
 
 /*
  * VOID
- * NdisMoveMappedMemory(
+ * NdisZeroMappedMemory(
+ *   IN PVOID  Destination,
+ *   IN ULONG  Length);
+ */
+#define NdisZeroMappedMemory(Destination, Length) \
+  RtlZeroMemory(Destination, Length)
+
+#else
+
+#define NdisMoveMappedMemory(Destination, Source, Length) \
+{
+  PUCHAR _Dest = Destination, _Src = Source, _End = _Dest + Length;
+  while (_Dest < _End)
+    *_Dest++ = _Src++;
+}
+
+#define NdisZeroMappedMemory(Destination, Length) \
+{
+  PUCHAR _Dest = Destination, _End = _Dest + Length;
+  while (_Dest < _End)
+    *_Dest++ = 0;
+}
+
+#endif /* _M_IX86 or _M_AMD64 */
+
+/*
+ * VOID
+ * NdisMoveFromMappedMemory(
  *   OUT PVOID  Destination,
  *   IN PVOID  Source,
  *   IN ULONG  Length);
  */
-#define NdisMoveMappedMemory(Destination, Source, Length) \
-  RtlCopyMemory(Destination, Source, Length)
+#define NdisMoveFromMappedMemory(Destination, Source, Length) \
+  NdisMoveMappedMemory(Destination, Source, Length)
 
 /*
  * VOID
@@ -2256,8 +2340,6 @@ NdisFreeBuffer(
 #define NdisMoveToMappedMemory(Destination, Source, Length) \
   NdisMoveMappedMemory(Destination, Source, Length)
 
-#endif /* i386 */
-
 /*
  * VOID
  * NdisMUpdateSharedMemory(
@@ -2382,7 +2464,7 @@ NdisUpdateSharedMemory(
  * VOID
  * NDIS_PHYSICAL_ADDRESS_CONST(
  *   IN ULONG  Low,
- *   IN LONG  High); 
+ *   IN LONG  High);
  */
 #define NDIS_PHYSICAL_ADDRESS_CONST(Low, High)  \
     { {(ULONG)(Low), (LONG)(High)} }
@@ -2407,15 +2489,6 @@ NdisUpdateSharedMemory(
 #define NdisFillMemory(Destination, Length, Fill) \
   RtlFillMemory(Destination, Length, Fill)
 
-/*
- * VOID
- * NdisZeroMappedMemory(
- *   IN PVOID  Destination,
- *   IN ULONG  Length);
- */
-#define NdisZeroMappedMemory(Destination, Length) \
-  RtlZeroMemory(Destination, Length)
-
 /*
  * VOID
  * NdisMoveMemory(
@@ -2441,7 +2514,7 @@ NdisUpdateSharedMemory(
  * VOID
  * NdisStoreUlong(
  *   IN PULONG  DestinationAddress,
- *   IN ULONG  Value); 
+ *   IN ULONG  Value);
  */
 #define NdisStoreUlong(DestinationAddress, Value) \
   RtlStoreUlong(DestinationAddress, Value)
@@ -2507,7 +2580,7 @@ NdisReadPciSlotInformation(
   IN ULONG  Length);
 
 NDISAPI
-ULONG 
+ULONG
 DDKAPI
 NdisWritePciSlotInformation(
   IN NDIS_HANDLE  NdisAdapterHandle,
@@ -2564,6 +2637,46 @@ NdisUnicodeStringToAnsiString(
 
 /* Spin lock reoutines */
 
+#if BINARY_COMPATIBLE
+
+NDISAPI
+VOID
+DDKAPI
+NdisAllocateSpinLock(
+  IN PNDIS_SPIN_LOCK  SpinLock);
+
+NDISAPI
+VOID
+DDKAPI
+NdisFreeSpinLock(
+  IN PNDIS_SPIN_LOCK  SpinLock);
+
+NDISAPI
+VOID
+DDKAPI
+NdisAcquireSpinLock(
+  IN PNDIS_SPIN_LOCK  SpinLock);
+
+NDISAPI
+VOID
+DDKAPI
+NdisReleaseSpinLock(
+  IN PNDIS_SPIN_LOCK  SpinLock);
+
+NDISAPI
+VOID
+DDKAPI
+NdisDprAcquireSpinLock(
+  IN PNDIS_SPIN_LOCK  SpinLock);
+
+NDISAPI
+VOID
+DDKAPI
+NdisDprReleaseSpinLock(
+  IN PNDIS_SPIN_LOCK  SpinLock);
+
+#else
+
 /*
  * VOID
  * NdisAllocateSpinLock(
@@ -2614,7 +2727,7 @@ NdisUnicodeStringToAnsiString(
 #define NdisDprReleaseSpinLock(_SpinLock) \
   KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock)
 
-
+#endif /* BINARY_COMPATIBLE */
 
 /* I/O routines */
 
@@ -2898,7 +3011,7 @@ NdisWriteConfiguration(
   OUT  PNDIS_STATUS  Status,
   IN NDIS_HANDLE  WrapperConfigurationContext,
   IN PNDIS_STRING  Keyword,
-  IN PNDIS_CONFIGURATION_PARAMETER  *ParameterValue);
+  IN PNDIS_CONFIGURATION_PARAMETER  ParameterValue);
 
 NDISAPI
 VOID
@@ -2916,6 +3029,16 @@ NdisWriteErrorLogEntry(
  */
 #define NdisStallExecution KeStallExecutionProcessor
 
+#if BINARY_COMPATIBLE
+
+NDISAPI
+VOID
+DDKAPI
+NdisGetCurrentSystemTime(
+  IN PLARGE_INTEGER  pSystemTime);
+
+#else
+
 /*
  * VOID
  * NdisGetCurrentSystemTime(
@@ -2923,6 +3046,13 @@ NdisWriteErrorLogEntry(
  */
 #define NdisGetCurrentSystemTime KeQuerySystemTime
 
+#endif
+
+NDISAPI
+CCHAR
+DDKAPI
+NdisSystemProcessorCount(VOID);
+
 NDISAPI
 VOID
 DDKAPI
@@ -2942,7 +3072,7 @@ NdisGetCurrentProcessorCpuUsage(
 
 /*
  * VOID
- * NDIS_PAGABLE_FUNCTION(FunctionName) 
+ * NDIS_PAGABLE_FUNCTION(FunctionName)
  */
 #define NDIS_PAGEABLE_FUNCTION(FunctionName) \
   alloc_text(page, FunctionName)
@@ -3264,7 +3394,7 @@ NdisClMakeCall(
   OUT PNDIS_HANDLE  NdisPartyHandle  OPTIONAL);
 
 NDISAPI
-NDIS_STATUS 
+NDIS_STATUS
 DDKAPI
 NdisClModifyCallQoS(
   IN NDIS_HANDLE  NdisVcHandle,
@@ -3568,7 +3698,7 @@ NdisMCoRequestComplete(
   IN PNDIS_REQUEST  Request);
 
 NDISAPI
-VOID 
+VOID
 DDKAPI
 NdisMCoSendComplete(
   IN NDIS_STATUS  Status,
@@ -3586,7 +3716,7 @@ NdisIMAssociateMiniport(
   IN NDIS_HANDLE  ProtocolHandle);
 
 NDISAPI
-NDIS_STATUS 
+NDIS_STATUS
 DDKAPI
 NdisIMCancelInitializeDeviceInstance(
   IN NDIS_HANDLE  DriverHandle,
@@ -3656,7 +3786,6 @@ NdisQueryBufferSafe(
   OUT PUINT  Length,
   IN UINT  Priority);
 
-
 /* Prototypes for NDIS_MINIPORT_CHARACTERISTICS */
 
 typedef BOOLEAN DDKAPI
@@ -3895,23 +4024,23 @@ typedef VOID DDKAPI
   IN PVOID  CancelId);
 
 
-#if defined(NDIS51)
+#if defined(NDIS51_MINIPORT)
 typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
   NDIS50_MINIPORT_CHARACTERISTICS_S
 } NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
-#elif defined(NDIS50)
+#elif defined(NDIS50_MINIPORT)
 typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
   NDIS50_MINIPORT_CHARACTERISTICS_S
 } NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
-#elif defined(NDIS40)
+#elif defined(NDIS40_MINIPORT)
 typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
   NDIS40_MINIPORT_CHARACTERISTICS_S
 } NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
-#elif defined(NDIS30)
+#else /* NDIS30 */
 typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
   NDIS30_MINIPORT_CHARACTERISTICS_S
 } NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
-#endif /* NDIS30 */
+#endif
 
 
 typedef NDIS_STATUS DDKAPI
@@ -3973,7 +4102,7 @@ typedef struct _NDIS_MINIPORT_INTERRUPT {
   BOOLEAN  Filler1;
   KEVENT  DpcsCompletedEvent;
   BOOLEAN  SharedInterrupt;
-  BOOLEAN       IsrRequested;
+  BOOLEAN  IsrRequested;
 } NDIS_MINIPORT_INTERRUPT, *PNDIS_MINIPORT_INTERRUPT;
 
 typedef struct _NDIS_MINIPORT_TIMER {
@@ -4063,7 +4192,7 @@ typedef struct _ETH_FILTER {
   PETH_BINDING_INFO  DirectedList;
   PETH_BINDING_INFO  BMList;
   PETH_BINDING_INFO  MCastSet;
-#if defined(_NDIS_)
+#if defined(NDIS_WRAPPER)
   UINT  NumOpens;
   PVOID  BindListLock;
 #endif
@@ -4214,8 +4343,6 @@ typedef struct _NDIS_ARC_BUF {
 
 #endif /* ARCNET */
 
-#define NDIS_MINIPORT_WORK_QUEUE_SIZE 10
-
 typedef struct _NDIS_LOG {
   PNDIS_MINIPORT_BLOCK  Miniport;
   KSPIN_LOCK  LogLock;
@@ -4227,18 +4354,25 @@ typedef struct _NDIS_LOG {
   UCHAR  LogBuf[1];
 } NDIS_LOG, *PNDIS_LOG;
 
-typedef struct _FILTERDBS {
-  _ANONYMOUS_UNION union {
-    PETH_FILTER  EthDB;
-    PNULL_FILTER  NullDB;
-  } DUMMYUNIONNAME;
-  PTR_FILTER  TrDB;
-  PFDDI_FILTER  FddiDB;
 #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
+
+typedef struct _FILTERDBS {
+  FILTERDBS_S
 } FILTERDBS, *PFILTERDBS;
 
 
@@ -4250,7 +4384,7 @@ struct _NDIS_MINIPORT_BLOCK {
   UNICODE_STRING  MiniportName;
   PNDIS_BIND_PATHS  BindPaths;
   NDIS_HANDLE  OpenQueue;
-  REFERENCE  Ref;
+  REFERENCE  ShortRef;
   NDIS_HANDLE  DeviceContext;
   UCHAR  Padding1;
   UCHAR  LockAcquired;
@@ -4279,7 +4413,7 @@ struct _NDIS_MINIPORT_BLOCK {
   USHORT  CFHangCurrentTick;
   NDIS_STATUS  ResetStatus;
   NDIS_HANDLE  ResetOpen;
-  FILTERDBS  FilterDbs;
+  FILTERDBS_S
   FILTER_PACKET_INDICATION_HANDLER  PacketIndicateHandler;
   NDIS_M_SEND_COMPLETE_HANDLER  SendCompleteHandler;
   NDIS_M_SEND_RESOURCES_HANDLER  SendResourcesHandler;
@@ -4326,7 +4460,7 @@ struct _NDIS_MINIPORT_BLOCK {
   NDIS_WM_SEND_COMPLETE_HANDLER  WanSendCompleteHandler;
   WAN_RCV_HANDLER  WanRcvHandler;
   WAN_RCV_COMPLETE_HANDLER  WanRcvCompleteHandler;
-#if defined(_NDIS_)
+#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];
@@ -4400,11 +4534,11 @@ struct _NDIS_MINIPORT_BLOCK {
   } DUMMYUNIONNAME2;
   PVOID  SavedSendPacketsHandler;
   PVOID  SavedCancelSendPacketsHandler;
-  W_SEND_PACKETS_HANDLER  WSendPacketsHandler;                
+  W_SEND_PACKETS_HANDLER  WSendPacketsHandler;
   ULONG  MiniportAttributes;
   PDMA_ADAPTER  SavedSystemAdapterObject;
   USHORT  NumOpens;
-  USHORT  CFHangXTicks; 
+  USHORT  CFHangXTicks;
   ULONG  RequestCount;
   ULONG  IndicatedPacketsCount;
   ULONG  PhysicalMediumType;
@@ -4441,81 +4575,92 @@ typedef VOID (DDKAPI *SEND_PACKETS_HANDLER)(
   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
+
+#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 {
-  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;
-#if defined(_NDIS_)
-  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;
-#endif /* _NDIS_ */
+  NDIS_COMMON_OPEN_BLOCK_S
 } NDIS_COMMON_OPEN_BLOCK;
 
 struct _NDIS_OPEN_BLOCK
 {
-    NDIS_COMMON_OPEN_BLOCK NdisCommonOpenBlock;
-#if defined(_NDIS_)
-    struct _NDIS_OPEN_CO
-    {
-        struct _NDIS_CO_AF_BLOCK *  NextAf;
-        W_CO_CREATE_VC_HANDLER      MiniportCoCreateVcHandler;
-        W_CO_REQUEST_HANDLER        MiniportCoRequestHandler;
-        CO_CREATE_VC_HANDLER        CoCreateVcHandler;
-        CO_DELETE_VC_HANDLER        CoDeleteVcHandler;
-        PVOID                       CmActivateVcCompleteHandler;
-        PVOID                       CmDeactivateVcCompleteHandler;
-        PVOID                       CoRequestCompleteHandler;
-        LIST_ENTRY                  ActiveVcHead;
-        LIST_ENTRY                  InactiveVcHead;
-        LONG                        PendingAfNotifications;
-        PKEVENT                     AfNotifyCompleteEvent;
-    };
+#ifdef __cplusplus
+  NDIS_COMMON_OPEN_BLOCK NdisCommonOpenBlock;
+#else
+  NDIS_COMMON_OPEN_BLOCK_S
+#endif
+#if defined(NDIS_WRAPPER)
+  struct _NDIS_OPEN_CO
+  {
+    struct _NDIS_CO_AF_BLOCK *  NextAf;
+    W_CO_CREATE_VC_HANDLER      MiniportCoCreateVcHandler;
+    W_CO_REQUEST_HANDLER        MiniportCoRequestHandler;
+    CO_CREATE_VC_HANDLER        CoCreateVcHandler;
+    CO_DELETE_VC_HANDLER        CoDeleteVcHandler;
+    PVOID                       CmActivateVcCompleteHandler;
+    PVOID                       CmDeactivateVcCompleteHandler;
+    PVOID                       CoRequestCompleteHandler;
+    LIST_ENTRY                  ActiveVcHead;
+    LIST_ENTRY                  InactiveVcHead;
+    LONG                        PendingAfNotifications;
+    PKEVENT                     AfNotifyCompleteEvent;
+  };
 #endif /* _NDIS_ */
 };
 
@@ -4556,7 +4701,7 @@ NdisMAllocateMapRegisters(
                                 Length)                \
 {                                                      \
     ArcFilterDprIndicateReceive(                       \
-        (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FilterDbs.ArcDB), \
+        (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->ArcDB), \
         (HeaderBuffer), \
         (DataBuffer),   \
         (Length));      \
@@ -4633,7 +4778,7 @@ NdisMDeregisterIoPortRange(
                                 PacketSize)             \
 {                                                       \
     (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->EthRxIndicateHandler)( \
-               ((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FilterDbs.EthDB,  \
+               ((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->EthDB,  \
                (MiniportReceiveContext), \
                (HeaderBuffer),           \
                (HeaderBuffer),           \
@@ -4651,7 +4796,7 @@ NdisMDeregisterIoPortRange(
 #define NdisMEthIndicateReceiveComplete(MiniportAdapterHandle) \
 {                                                              \
     (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->EthRxCompleteHandler)( \
-        ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->FilterDbs.EthDB);    \
+        ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->EthDB);    \
 }
 
 /*
@@ -4674,7 +4819,7 @@ NdisMDeregisterIoPortRange(
                                  PacketSize)             \
 {                                                        \
     (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FddiRxIndicateHandler)( \
-        (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FilterDbs.FddiDB),   \
+        (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FddiDB),   \
         (MiniportReceiveContext),              \
         (PUCHAR)(HeaderBuffer) + 1,            \
         (((*(PUCHAR*)(HeaderBuffer)) & 0x40) ? \
@@ -4697,7 +4842,7 @@ NdisMDeregisterIoPortRange(
 #define NdisMFddiIndicateReceiveComplete(MiniportAdapterHandle) \
 {                                                               \
     (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FddiRxCompleteHandler)( \
-        ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->FilterDbs.FddiDB);      \
+        ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->FddiDB);      \
 }
 
 NDISAPI
@@ -4723,7 +4868,7 @@ NdisMFreeMapRegisters(
 
 #define NdisMIndicateStatus(MiniportAdapterHandle,  \
    GeneralStatus, StatusBuffer, StatusBufferSize)   \
-  (*((PNDIS_MINIPORT_BLOCK)(_M))->StatusHandler)(   \
+  (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->StatusHandler)(   \
   MiniportAdapterHandle, GeneralStatus, StatusBuffer, StatusBufferSize)
 
 /*
@@ -4807,8 +4952,37 @@ NdisMRegisterMiniport(
   IN PNDIS_MINIPORT_CHARACTERISTICS  MiniportCharacteristics,
   IN UINT  CharacteristicsLength);
 
+NDISAPI
+VOID
+DDKAPI
+NdisMSetTimer(
+  IN PNDIS_MINIPORT_TIMER  Timer,
+  IN UINT  MillisecondsToDelay);
 
-#if !defined(_NDIS_)
+NDISAPI
+VOID
+DDKAPI
+NdisMInitializeTimer(
+  IN OUT PNDIS_MINIPORT_TIMER Timer,
+  IN NDIS_HANDLE MiniportAdapterHandle,
+  IN PNDIS_TIMER_FUNCTION TimerFunction,
+  IN PVOID FunctionContext);
+
+NDISAPI
+VOID
+DDKAPI
+NdisMSetPeriodicTimer(
+  IN PNDIS_MINIPORT_TIMER  Timer,
+  IN UINT  MillisecondPeriod);
+
+NDISAPI
+VOID
+DDKAPI
+NdisMCancelTimer(
+  IN PNDIS_MINIPORT_TIMER  Timer,
+  OUT PBOOLEAN  TimerCancelled);
+
+#if !defined(NDIS_WRAPPER)
 
 /*
  * VOID
@@ -4890,14 +5064,14 @@ NdisMRegisterMiniport(
     AdapterType)
 
 NDISAPI
-VOID 
+VOID
 DDKAPI
 NdisMSetAttributesEx(
   IN NDIS_HANDLE  MiniportAdapterHandle,
   IN NDIS_HANDLE  MiniportAdapterContext,
   IN UINT  CheckForHangTimeInSeconds   OPTIONAL,
   IN ULONG  AttributeFlags,
-  IN NDIS_INTERFACE_TYPE AdapterType); 
+  IN NDIS_INTERFACE_TYPE AdapterType);
 
 /*
  * VOID
@@ -4944,7 +5118,7 @@ NdisMSynchronizeWithInterrupt(
                                PacketSize)             \
 {                                                      \
     (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TrRxIndicateHandler)( \
-      (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FilterDbs.TrDB),     \
+      (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TrDB),     \
                (MiniportReceiveContext), \
                (HeaderBuffer),           \
                (HeaderBuffer),           \
@@ -4962,7 +5136,7 @@ NdisMSynchronizeWithInterrupt(
 #define NdisMTrIndicateReceiveComplete(MiniportAdapterHandle) \
 {                                                             \
        (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TrRxCompleteHandler)( \
-    ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->FilterDbs.TrDB);    \
+    ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->TrDB);    \
 }
 
 NDISAPI
@@ -4999,6 +5173,35 @@ NdisMUnmapIoSpace(
 
 
 
+/* Event functions */
+
+NDISAPI
+VOID
+DDKAPI
+NdisInitializeEvent(
+  IN PNDIS_EVENT  Event);
+
+NDISAPI
+VOID
+DDKAPI
+NdisSetEvent(
+  IN PNDIS_EVENT  Event);
+
+NDISAPI
+VOID
+DDKAPI
+NdisResetEvent(
+  IN PNDIS_EVENT  Event);
+
+NDISAPI
+BOOLEAN
+DDKAPI
+NdisWaitEvent(
+  IN PNDIS_EVENT  Event,
+  IN UINT  Timeout);
+
+
+
 /* NDIS intermediate miniport structures */
 
 typedef VOID (DDKAPI *W_MINIPORT_CALLBACK)(
@@ -5057,7 +5260,7 @@ NDISAPI
 NTSTATUS
 DDKAPI
 NdisUpcaseUnicodeString(
-  OUT PUNICODE_STRING  DestinationString,  
+  OUT PUNICODE_STRING  DestinationString,
   IN PUNICODE_STRING  SourceString);