* DEFINES: i386 - Target platform is i386
* NDIS_WRAPPER - Define only for NDIS wrapper library
* NDIS_MINIPORT_DRIVER - Define only for NDIS miniport drivers
- * BINARY_COMPATIBLE - 0 = Use macros for some features
- * - 1 = Use imports for features not available
* NDIS40 - Use NDIS 4.0 structures by default
* NDIS50 - Use NDIS 5.0 structures by default
+ * NDIS_WDM - Include wdm.h (currently just pulls in ntddk.h)
+ *
+ * NOTES: If NDIS_WDM is not defined, ntddk.h is included instead
+ *
+ * I have removed the following standard flag, used for building binary-compatible
+ * drivers for windows 98 and windows me:
+ *
+ * BINARY_COMPATIBLE - 0 = Use macros for some features
+ * - 1 = Use imports for features not available
+ *
+ * rationale: you're never going to use *this* ndis.h to build a driver for win9x. You'll
+ * use the MS ddk. This assumption drammatically simplifies ndis.h.
*/
+
+// TODO: finish sanitizing NDIS40 and NDIS50; think about NDIS51
+
#ifndef __NDIS_H
#define __NDIS_H
#define NDIS40
#endif
-
-/* Windows 9x compatibillity for miniports on x86 platform */
-#ifndef BINARY_COMPATIBLE
-#if defined(NDIS_MINIPORT_DRIVER) && defined(i386)
-#define BINARY_COMPATIBLE 1
-#else
-#define BINARY_COMPATIBLE 0
-#endif
-#endif
-
#ifndef UNALIGNED
#define UNALIGNED
#endif
#define FASTCALL __attribute__((fastcall))
#endif
-/* The NDIS library export functions. NDIS miniport drivers import functions */
+/* The NDIS library exports functions. NDIS miniport drivers import functions */
#ifdef NDIS_WRAPPER
#ifdef _MSC_VER
#define EXPIMP __declspec(dllexport)
#else
-#define EXPIMP STDCALL
+#define EXPIMP STDCALL /* MS ndis.h is 100% stdcall due to compiler flag /Gz */
#endif
#else /* NDIS_WRAPPER */
#endif /* NDIS_WRAPPER */
+/* support NDIS_WDM and MAC drivers */
+#if defined (NDIS_WDM)
+#include <wdm.h>
+#else
+#include <ntddk.h>
+#endif
+/* Assert stuff */
+#ifdef DBG
+VOID
+STDCALL
+RtlAssert (
+ PVOID FailedAssertion,
+ PVOID FileName,
+ ULONG LineNumber,
+ PCHAR Message
+ );
-#ifdef NDIS_MINIPORT_DRIVER
-
-#include "miniport.h"
-
-#else /* NDIS_MINIPORT_DRIVER */
+#define ASSERT( exp ) if (!(exp)) RtlAssert( #exp, __FILE__, __LINE__, NULL )
+#define ASSERTMSG( msg, exp ) if (!(exp)) RtlAssert( #exp, __FILE__, __LINE__, msg )
-#ifdef _MSC_VER
-#include <ntddk.h>
+#else
+#define ASSERT( exp )
+#define ASSERTMSG( msg, exp )
+#endif /* DBG */
-typedef ULONG ULONG_PTR, *PULONG_PTR;
+/* Base types */
-#else /* _MSC_VER */
-#include <ddk/ntddk.h>
+#define IN
+#define OUT
+#define OPTIONAL
-/* FIXME: Missed some definitions in there */
+typedef CONST CHAR *PCSTR;
typedef struct _DMA_CONFIGURATION_BYTE0
{
UCHAR InitializationData[60];
} CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
-#endif /* _MSC_VER */
+ULONG CDECL DbgPrint(
+ PCH Format,
+ ...);
-/* FIXME: Missed some definitions in there */
-typedef CONST CHAR *PCSTR;
+/* Core kernel functions */
+
+VOID
+STDCALL
+KeStallExecutionProcessor(
+ ULONG MicroSeconds);
-#endif /* NDIS_MINIPORT_DRIVER */
#include "netevent.h"
#include "ndisoid.h"
#include "ntddndis.h"
-#if defined(NDIS_MINIPORT_DRIVER) || !defined(_MSC_VER)
-
+#if !defined(_MSC_VER)
#ifndef _GUID_DEFINED
#define _GUID_DEFINED
-
typedef struct _GUID {
ULONG Data1;
USHORT Data2;
USHORT Data3;
UCHAR Data4[8];
} GUID;
-
#endif /* _GUID_DEFINED */
-
-#endif /* NDIS_MINIPORT_DRIVER || _MSC_VER */
+#endif /* _MSC_VER */
/* NDIS base types */
typedef UNICODE_STRING NDIS_STRING, *PNDIS_STRING;
-typedef PCSTR NDIS_ANSI_STRING, *PNDIS_ANSI_STRING;
-
typedef MDL NDIS_BUFFER, *PNDIS_BUFFER;
/* NDIS_STATUS constants */
#define NDIS_MEMORY_NONCACHED 0x00000002
/* NIC attribute flags. Used by NdisMSetAttributes(Ex) */
-#define NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT 0x00000001
+#define NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT 0x00000001
#define NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT 0x00000002
#define NDIS_ATTRIBUTE_IGNORE_TOKEN_RING_ERRORS 0x00000004
#define NDIS_ATTRIBUTE_BUS_MASTER 0x00000008
#define NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER 0x00000010
+#define NDIS_ATTRIBUTE_DESERIALIZE 0x00000020
KDPC Dpc;
} NDIS_TIMER, *PNDIS_TIMER;
+VOID
+EXPIMP
+NdisInitializeTimer(
+ IN OUT PNDIS_TIMER Timer,
+ IN PNDIS_TIMER_FUNCTION TimerFunction,
+ IN PVOID FunctionContext);
+
+VOID
+EXPIMP
+NdisSetTimer(
+ IN PNDIS_TIMER Timer,
+ IN UINT MillisecondsToDelay);
/* Hardware */
UINT BytesNeeded;
} SET_INFORMATION;
} DATA;
+#ifdef NDIS50
+ UCHAR NdisReserved[36];
+ union {
+ UCHAR CallMgrReserved[8];
+ UCHAR ProtocolReserved[8];
+ };
+ UCHAR MiniportReserved[8];
+#endif
} NDIS_REQUEST, *PNDIS_REQUEST;
#endif /* NDIS_WRAPPER */
-#ifdef NDIS50
-
typedef struct _ATM_ADDRESS ATM_ADDRESS, *PATM_ADDRESS;
CL_CALL_CONNECTED_HANDLER ClCallConnectedHandler;
} NDIS_CLIENT_CHARACTERISTICS, *PNDIS_CLIENT_CHARACTERISTICS;
-#endif /* NDIS50 */
-
/* NDIS protocol structures */
IN OUT PNDIS_PACKET Packet,
OUT PNDIS_BUFFER *Buffer);
-#if BINARY_COMPATIBLE
-
-VOID
-EXPIMP
-NdisAdjustBufferLength(
- IN PNDIS_BUFFER Buffer,
- IN UINT Length);
-
-ULONG
-EXPIMP
-NDIS_BUFFER_TO_SPAN_PAGES(
- IN PNDIS_BUFFER Buffer);
-
-VOID
-EXPIMP
-NdisFreeBuffer(
- IN PNDIS_BUFFER Buffer);
-
-VOID
-EXPIMP
-NdisGetBufferPhysicalArraySize(
- IN PNDIS_BUFFER Buffer,
- OUT PUINT ArraySize);
-
-VOID
-EXPIMP
-NdisGetFirstBufferFromPacket(
- IN PNDIS_PACKET _Packet,
- OUT PNDIS_BUFFER *_FirstBuffer,
- OUT PVOID *_FirstBufferVA,
- OUT PUINT _FirstBufferLength,
- OUT PUINT _TotalBufferLength);
-
-VOID
-EXPIMP
-NdisQueryBuffer(
- IN PNDIS_BUFFER Buffer,
- OUT PVOID *VirtualAddress OPTIONAL,
- OUT PUINT Length);
-
-VOID
-EXPIMP
-NdisQueryBufferOffset(
- IN PNDIS_BUFFER Buffer,
- OUT PUINT Offset,
- OUT PUINT Length);
-
-#else /* BINARY_COMPATIBLE */
-
/*
* PVOID NdisAdjustBufferLength(
* IN PNDIS_BUFFER Buffer,
* IN UINT Length);
*/
-#define NdisAdjustBufferLength(Buffer, \
- Length) \
-{ \
- (Buffer)->ByteCount = (Length); \
-}
-
+VOID
+EXPIMP
+NdisAdjustBufferLength(
+ IN PNDIS_BUFFER Buffer,
+ IN UINT Length);
/*
* ULONG NDIS_BUFFER_TO_SPAN_PAGES(
* IN PNDIS_BUFFER Buffer);
*/
-#define NDIS_BUFFER_TO_SPAN_PAGES(Buffer) \
-( \
- MmGetMdlByteCount(Buffer) == 0 ? \
- 1 : \
- ADDRESS_AND_SIZE_TO_SPAN_PAGES( \
- MmGetMdlVirtualAddress(Buffer), \
- MmGetMdlByteCount(Buffer)) \
-)
-
-
-#if 0
-
-/*
- * VOID NdisFreeBuffer(
- * IN PNDIS_BUFFER Buffer);
- */
-#define NdisFreeBuffer(Buffer) \
-{ \
- IoFreeMdl(Buffer) /* ??? */ \
-}
-
-#else
+ULONG
+EXPIMP
+NDIS_BUFFER_TO_SPAN_PAGES(
+ IN PNDIS_BUFFER Buffer);
VOID
EXPIMP
NdisFreeBuffer(
IN PNDIS_BUFFER Buffer);
-#endif
/*
* IN PNDIS_BUFFER Buffer,
* OUT PUINT ArraySize);
*/
-#define NdisGetBufferPhysicalArraySize(Buffer, \
- ArraySize) \
-{ \
-}
-
+VOID
+EXPIMP
+NdisGetBufferPhysicalArraySize(
+ IN PNDIS_BUFFER Buffer,
+ OUT PUINT ArraySize);
/*
* VOID NdisGetFirstBufferFromPacket(
* OUT PUINT _FirstBufferLength,
* OUT PUINT _TotalBufferLength)
*/
-#define NdisGetFirstBufferFromPacket(Packet, \
- FirstBuffer, \
- FirstBufferVA, \
- FirstBufferLength, \
- TotalBufferLength) \
-{ \
- PNDIS_BUFFER _Buffer; \
- \
- _Buffer = (Packet)->Private.Head; \
- *(FirstBuffer) = _Buffer; \
- *(FirstBufferVA) = MmGetMdlVirtualAddress(_Buffer); \
- if (_Buffer != NULL) { \
- *(FirstBufferLength) = MmGetMdlByteCount(_Buffer); \
- _Buffer = _Buffer->Next; \
- } else \
- *(FirstBufferLength) = 0; \
- *(TotalBufferLength) = *(FirstBufferLength); \
- while (_Buffer != NULL) { \
- *(TotalBufferLength) += MmGetMdlByteCount(_Buffer); \
- _Buffer = _Buffer->Next; \
- } \
-}
-
-/*
- * VOID NdisQueryBuffer(
- * IN PNDIS_BUFFER Buffer,
- * OUT PVOID *VirtualAddress OPTIONAL,
- * OUT PUINT Length)
- */
-#define NdisQueryBuffer(Buffer, \
- VirtualAddress, \
- Length) \
-{ \
- if (VirtualAddress) \
- *((PVOID*)VirtualAddress) = MmGetSystemAddressForMdl(Buffer); \
- \
- *((PUINT)Length) = MmGetMdlByteCount(Buffer); \
-}
-
-
-/*
- * VOID NdisQueryBufferOffset(
- * IN PNDIS_BUFFER Buffer,
- * OUT PUINT Offset,
- * OUT PUINT Length);
- */
-#define NdisQueryBufferOffset(Buffer, \
- Offset, \
- Length) \
-{ \
- *((PUINT)Offset) = MmGetMdlByteOffset(Buffer); \
- *((PUINT)Length) = MmGetMdlByteCount(Buffer); \
-}
+VOID
+EXPIMP
+NdisGetFirstBufferFromPacket(
+ IN PNDIS_PACKET _Packet,
+ OUT PNDIS_BUFFER * _FirstBuffer,
+ OUT PVOID * _FirstBufferVA,
+ OUT PUINT _FirstBufferLength,
+ OUT PUINT _TotalBufferLength);
-#endif /* BINARY_COMPATIBLE */
+VOID
+EXPIMP
+NdisQueryBuffer(
+ IN PNDIS_BUFFER Buffer,
+ OUT PVOID *VirtualAddress OPTIONAL,
+ OUT PUINT Length);
+VOID
+EXPIMP
+NdisQueryBufferOffset(
+ IN PNDIS_BUFFER Buffer,
+ OUT PUINT Offset,
+ OUT PUINT Length);
/*
* PVOID NDIS_BUFFER_LINKAGE(
*(NextBuffer) = (CurrentBuffer)->Next; \
}
-
/*
* UINT NdisGetPacketFlags(
* IN PNDIS_PACKET Packet);
/* String management routines */
-#if BINARY_COMPATIBLE
-
-NDIS_STATUS
-EXPIMP
-NdisAnsiStringToUnicodeString(
- IN OUT PNDIS_STRING DestinationString,
- IN PNDIS_ANSI_STRING SourceString);
-
-BOOLEAN
-EXPIMP
-NdisEqualString(
- IN PNDIS_STRING String1,
- IN PNDIS_STRING String2,
- IN BOOLEAN CaseInsensitive);
-
-VOID
-EXPIMP
-NdisInitAnsiString(
- IN OUT PNDIS_ANSI_STRING DestinationString,
- IN PCSTR SourceString);
-
-VOID
-EXPIMP
-NdisInitUnicodeString(
- IN OUT PNDIS_STRING DestinationString,
- IN PCWSTR SourceString);
-
-NDIS_STATUS
-EXPIMP
-NdisUnicodeStringToAnsiString(
- IN OUT PNDIS_ANSI_STRING DestinationString,
- IN PNDIS_STRING SourceString);
-
-#else /* BINARY_COMPATIBLE */
-
/*
* NDIS_STATUS NdisAnsiStringToUnicodeString(
* IN OUT PNDIS_STRING DestinationString,
* IN PNDIS_ANSI_STRING SourceString);
*/
-#define NdisAnsiStringToUnicodeString(DestinationString, \
- SourceString) \
- RtlAnsiStringToUnicodeString((DestinationString), (SourceString), FALSE)
+NDIS_STATUS
+EXPIMP
+NdisAnsiStringToUnicodeString(
+ IN OUT PNDIS_STRING DestinationString,
+ IN PANSI_STRING SourceString);
/*
* BOOLEAN NdisEqualString(
* IN PNDIS_STRING String2,
* IN BOOLEAN CaseInsensitive)
*/
-#define NdisEqualString(String1, \
- String2, \
- CaseInsensitive) \
- RtlEqualUnicodeString((String1), (String2), (CaseInsensitive))
+BOOLEAN
+EXPIMP
+NdisEqualString(
+ IN PNDIS_STRING String1,
+ IN PNDIS_STRING String2,
+ IN BOOLEAN CaseInsensitive);
/*
* VOID NdisInitAnsiString(
* IN OUT PNDIS_ANSI_STRING DestinationString,
* IN PCSTR SourceString)
*/
-#define NdisInitAnsiString(DestinationString, \
- SourceString) \
- RtlInitString((DestinationString), (SourceString))
+VOID
+EXPIMP
+NdisInitAnsiString(
+ IN OUT PANSI_STRING DestinationString,
+ IN PCSTR SourceString);
/*
* VOID NdisInitUnicodeString(
* IN OUT PNDIS_STRING DestinationString,
* IN PCWSTR SourceString)
*/
-#define NdisInitUnicodeString(DestinationString, \
- SourceString) \
- RtlInitUnicodeString((DestinationString), (SourceString))
+VOID
+EXPIMP
+NdisInitUnicodeString(
+ IN OUT PNDIS_STRING DestinationString,
+ IN PCWSTR SourceString);
/*
* NDIS_STATUS NdisUnicodeStringToAnsiString(
* IN OUT PNDIS_ANSI_STRING DestinationString,
* IN PNDIS_STRING SourceString)
*/
-#define NdisUnicodeStringToAnsiString(DestinationString, \
- SourceString) \
- RtlUnicodeStringToAnsiString((DestinationString), (SourceString), FALSE)
-
-#endif /* BINARY_COMPATIBLE */
+NDIS_STATUS
+EXPIMP
+NdisUnicodeStringToAnsiString(
+ IN OUT PANSI_STRING DestinationString,
+ IN PNDIS_STRING SourceString);
#define NdisFreeString(_s) NdisFreeMemory((s).Buffer, (s).MaximumLength, 0)
#define NdisPrintString(_s) DbgPrint("%ls", (s).Buffer)
VOID
EXPIMP
NdisGetCurrentSystemTime(
- PLONGLONG pSystemTime
+ PLARGE_INTEGER pSystemTime
);
-/* NDIS 5.0 extensions */
-
-#ifdef NDIS50
-
VOID
EXPIMP
NdisAcquireReadWriteLock(
IN PNDIS_STRING DriverInstance,
IN NDIS_HANDLE DeviceContext OPTIONAL);
-#endif /* NDIS50 */
+//#endif /* NDIS50 */
/* Routines for NDIS protocol drivers */
-#if BINARY_COMPATIBLE
-
VOID
EXPIMP
NdisRequest(
VOID
EXPIMP
NdisTransferData(
- OUT PNDIS_STATUS Status,
- IN NDIS_HANDLE NdisBindingHandle,
- IN NDIS_HANDLE MacReceiveContext,
- IN UINT ByteOffset,
- IN UINT BytesToTransfer,
- IN OUT PNDIS_PACKET Packet,
- OUT PUINT BytesTransferred);
-
-#else /* BINARY_COMPATIBLE */
-
-#define NdisRequest(Status, \
- NdisBindingHandle, \
- NdisRequest) \
-{ \
- *(Status) = (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->RequestHandler)( \
- ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle, (NdisRequest)); \
-}
-
-#define NdisReset(Status, \
- NdisBindingHandle) \
-{ \
- *(Status) = (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->ResetHandler)( \
- ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle); \
-}
-
-#define NdisSend(Status, \
- NdisBindingHandle, \
- Packet) \
-{ \
- *(Status) = (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->u1.SendHandler)( \
- ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle, (Packet)); \
-}
-
-#define NdisSendPackets(NdisBindingHandle, \
- PacketArray, \
- NumberOfPackets) \
-{ \
- (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->SendPacketsHandler)( \
- (PNDIS_OPEN_BLOCK)(NdisBindingHandle), (PacketArray), (NumberOfPackets)); \
-}
-
+ OUT PNDIS_STATUS Status,
+ IN NDIS_HANDLE NdisBindingHandle,
+ IN NDIS_HANDLE MacReceiveContext,
+ IN UINT ByteOffset,
+ IN UINT BytesToTransfer,
+ IN OUT PNDIS_PACKET Packet,
+ OUT PUINT BytesTransferred);
+/*
#define NdisTransferData(Status, \
NdisBindingHandle, \
MacReceiveContext, \
(Packet), \
(BytesTransferred)); \
}
-
-#endif /* BINARY_COMPATIBLE */
+*/
VOID
#endif /* __NDIS_H */
/* EOF */
+
+/*
+ * XXX - these macros are disabled for the momentdue to the fact that there are definitions for them elsewhere.
+ * We will have to decide which to keep; we don't need both (no BINARY_COMPATIBLE)
+ */
+#if 0
+#define NdisAdjustBufferLength(Buffer, \
+ Length) \
+{ \
+ (Buffer)->ByteCount = (Length); \
+}
+
+#define NDIS_BUFFER_TO_SPAN_PAGES(Buffer) \
+( \
+ MmGetMdlByteCount(Buffer) == 0 ? \
+ 1 : \
+ ADDRESS_AND_SIZE_TO_SPAN_PAGES( \
+ MmGetMdlVirtualAddress(Buffer), \
+ MmGetMdlByteCount(Buffer)) \
+)
+
+#define NdisFreeBuffer(Buffer) \
+{ \
+ IoFreeMdl(Buffer) /* ??? */ \
+}
+
+#define NdisGetBufferPhysicalArraySize(Buffer, \
+ ArraySize) \
+{ \
+}
+
+#define NdisGetFirstBufferFromPacket(Packet, \
+ FirstBuffer, \
+ FirstBufferVA, \
+ FirstBufferLength, \
+ TotalBufferLength) \
+{ \
+ PNDIS_BUFFER _Buffer; \
+ \
+ _Buffer = (Packet)->Private.Head; \
+ *(FirstBuffer) = _Buffer; \
+ *(FirstBufferVA) = MmGetMdlVirtualAddress(_Buffer); \
+ if (_Buffer != NULL) { \
+ *(FirstBufferLength) = MmGetMdlByteCount(_Buffer); \
+ _Buffer = _Buffer->Next; \
+ } else \
+ *(FirstBufferLength) = 0; \
+ *(TotalBufferLength) = *(FirstBufferLength); \
+ while (_Buffer != NULL) { \
+ *(TotalBufferLength) += MmGetMdlByteCount(_Buffer); \
+ _Buffer = _Buffer->Next; \
+ } \
+}
+
+#define NdisQueryBuffer(Buffer, \
+ VirtualAddress, \
+ Length) \
+{ \
+ if (VirtualAddress) \
+ *((PVOID*)VirtualAddress) = MmGetSystemAddressForMdl(Buffer); \
+ \
+ *((PUINT)Length) = MmGetMdlByteCount(Buffer); \
+}
+
+#define NdisQueryBufferOffset(Buffer, \
+ Offset, \
+ Length) \
+{ \
+ *((PUINT)Offset) = MmGetMdlByteOffset(Buffer); \
+ *((PUINT)Length) = MmGetMdlByteCount(Buffer); \
+}
+
+#define NdisAnsiStringToUnicodeString(DestinationString, \
+ SourceString) \
+ RtlAnsiStringToUnicodeString((DestinationString), (SourceString), FALSE)
+
+#define NdisEqualString(String1, \
+ String2, \
+ CaseInsensitive) \
+ RtlEqualUnicodeString((String1), (String2), (CaseInsensitive))
+
+#define NdisInitAnsiString(DestinationString, \
+ SourceString) \
+ RtlInitString((DestinationString), (SourceString))
+
+#define NdisInitUnicodeString(DestinationString, \
+ SourceString) \
+ RtlInitUnicodeString((DestinationString), (SourceString))
+
+#define NdisUnicodeStringToAnsiString(DestinationString, \
+ SourceString) \
+ RtlUnicodeStringToAnsiString((DestinationString), (SourceString), FALSE)
+
+#define NdisRequest(Status, \
+ NdisBindingHandle, \
+ NdisRequest) \
+{ \
+ *(Status) = (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->RequestHandler)( \
+ ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle, (NdisRequest)); \
+}
+
+#define NdisReset(Status, \
+ NdisBindingHandle) \
+{ \
+ *(Status) = (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->ResetHandler)( \
+ ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle); \
+}
+
+#define NdisSend(Status, \
+ NdisBindingHandle, \
+ Packet) \
+{ \
+ *(Status) = (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->u1.SendHandler)( \
+ ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle, (Packet)); \
+}
+
+#define NdisSendPackets(NdisBindingHandle, \
+ PacketArray, \
+ NumberOfPackets) \
+{ \
+ (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->SendPacketsHandler)( \
+ (PNDIS_OPEN_BLOCK)(NdisBindingHandle), (PacketArray), (NumberOfPackets)); \
+}
+#endif