Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

3273 lines
103 KiB

//
// Indicate that we're building for NT. NDIS_NT is always used for
// miniport builds.
//
#define NDIS_NT 1
#if defined(NDIS_DOS)
#undef NDIS_DOS
#endif
//
// Define status codes and event log codes.
//
#include <ntstatus.h>
#include <netevent.h>
//
// Define a couple of extra types.
//
#if !defined(_WINDEF_) // these are defined in windows.h too
typedef signed int INT, *PINT;
typedef unsigned int UINT, *PUINT;
#endif
typedef UNICODE_STRING NDIS_STRING, *PNDIS_STRING;
//
// Portability extentions
//
#define NDIS_INIT_FUNCTION(_F) alloc_text(INIT,_F)
#define NDIS_PAGABLE_FUNCTION(_F) alloc_text(PAGE,_F)
#define NDIS_PAGEABLE_FUNCTION(_F) alloc_text(PAGE,_F)
//
// This file contains the definition of an NDIS_OID as
// well as #defines for all the current OID values.
//
//
// Define NDIS_STATUS and NDIS_HANDLE here
//
typedef PVOID NDIS_HANDLE, *PNDIS_HANDLE;
typedef int NDIS_STATUS, *PNDIS_STATUS; // note default size
//
// for Miniports versions 5.0 and up, provide a consistent way to match
// Ndis version in their characteristics with their makefile defines
//
#if (!defined(NDIS_MINIPORT_MAJOR_VERSION) && !defined(NDIS_MINIPORT_MINOR_VERSION))
#if (defined(NDIS51_MINIPORT))
#define NDIS_MINIPORT_MAJOR_VERSION 5
#define NDIS_MINIPORT_MINOR_VERSION 1
#elif (defined(NDIS50_MINIPORT))
#define NDIS_MINIPORT_MAJOR_VERSION 5
#define NDIS_MINIPORT_MINOR_VERSION 0
#endif
#endif
//
// for protocol versions 5.0 and up, provide a consistent way to match
// Ndis version in their characteristics with their makefile defines
//
#if (!defined(NDIS_PROTOCOL_MAJOR_VERSION) && !defined(NDIS_PROTOCOL_MINOR_VERSION))
#if (defined(NDIS51))
#define NDIS_PROTOCOL_MAJOR_VERSION 5
#define NDIS_PROTOCOL_MINOR_VERSION 1
#elif (defined(NDIS50))
#define NDIS_PROTOCOL_MAJOR_VERSION 5
#define NDIS_PROTOCOL_MINOR_VERSION 0
#endif
#endif
#include <ntddndis.h>
//
// Ndis defines for configuration manager data structures
//
typedef CM_MCA_POS_DATA NDIS_MCA_POS_DATA, *PNDIS_MCA_POS_DATA;
typedef CM_EISA_SLOT_INFORMATION NDIS_EISA_SLOT_INFORMATION, *PNDIS_EISA_SLOT_INFORMATION;
typedef CM_EISA_FUNCTION_INFORMATION NDIS_EISA_FUNCTION_INFORMATION, *PNDIS_EISA_FUNCTION_INFORMATION;
//
// Define an exported function.
//
#if defined(NDIS_WRAPPER)
#define EXPORT
#else
#define EXPORT DECLSPEC_IMPORT
#endif
//
// Memory manipulation functions.
//
#define NdisMoveMemory(Destination, Source, Length) RtlCopyMemory(Destination, Source, Length)
#define NdisZeroMemory(Destination, Length) RtlZeroMemory(Destination, Length)
#define NdisEqualMemory(Source1, Source2, Length) RtlEqualMemory(Source1, Source2, Length)
#define NdisFillMemory(Destination, Length, Fill) RtlFillMemory(Destination, Length, Fill)
#define NdisRetrieveUlong(Destination, Source) RtlRetrieveUlong(Destination, Source)
#define NdisStoreUlong(Destination, Value) RtlStoreUlong(Destination, Value)
#define NDIS_STRING_CONST(x) {sizeof(L##x)-2, sizeof(L##x), L##x}
//
// On a RISC machine, I/O mapped memory can't be accessed with
// the Rtl routines.
//
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisMoveMappedMemory(Destination,Source,Length) RtlCopyMemory(Destination,Source,Length)
#define NdisZeroMappedMemory(Destination,Length) RtlZeroMemory(Destination,Length)
#elif defined(_M_IA64)
#define NdisMoveMappedMemory(Destination,Source,Length) \
{ \
PUCHAR _Src = (Source); \
PUCHAR _Dest = (Destination); \
PUCHAR _End = _Dest + (Length); \
while (_Dest < _End) \
{ \
*_Dest++ = *_Src++; \
} \
}
#define NdisZeroMappedMemory(Destination,Length) \
{ \
PUCHAR _Dest = (Destination); \
PUCHAR _End = _Dest + (Length); \
while (_Dest < _End) \
{ \
*_Dest++ = 0; \
} \
}
#endif
#define NdisMoveToMappedMemory(Destination,Source,Length) \
NdisMoveMappedMemory(Destination,Source,Length)
#define NdisMoveFromMappedMemory(Destination,Source,Length) \
NdisMoveMappedMemory(Destination,Source,Length)
//
// definition of the basic spin lock structure
//
typedef struct _NDIS_SPIN_LOCK
{
KSPIN_LOCK SpinLock;
KIRQL OldIrql;
} NDIS_SPIN_LOCK, * PNDIS_SPIN_LOCK;
//
// definition of the ndis event structure
//
typedef struct _NDIS_EVENT
{
KEVENT Event;
} NDIS_EVENT, *PNDIS_EVENT;
#pragma warning(push)
#pragma warning(disable:4115) // named type definition in parenthesis
typedef VOID (*NDIS_PROC)(struct _NDIS_WORK_ITEM *, PVOID);
#pragma warning(pop)
//
// Definition of an ndis work-item
//
typedef struct _NDIS_WORK_ITEM
{
PVOID Context;
NDIS_PROC Routine;
UCHAR WrapperReserved[8*sizeof(PVOID)];
} NDIS_WORK_ITEM, *PNDIS_WORK_ITEM;
#define NdisInterruptLatched Latched
#define NdisInterruptLevelSensitive LevelSensitive
typedef KINTERRUPT_MODE NDIS_INTERRUPT_MODE, *PNDIS_INTERRUPT_MODE;
//
// Configuration definitions
//
//
// Possible data types
//
typedef enum _NDIS_PARAMETER_TYPE
{
NdisParameterInteger,
NdisParameterHexInteger,
NdisParameterString,
NdisParameterMultiString,
NdisParameterBinary
} NDIS_PARAMETER_TYPE, *PNDIS_PARAMETER_TYPE;
typedef struct
{
USHORT Length;
PVOID Buffer;
} BINARY_DATA;
//
// To store configuration information
//
typedef struct _NDIS_CONFIGURATION_PARAMETER
{
NDIS_PARAMETER_TYPE ParameterType;
union
{
ULONG IntegerData;
NDIS_STRING StringData;
BINARY_DATA BinaryData;
} ParameterData;
} NDIS_CONFIGURATION_PARAMETER, *PNDIS_CONFIGURATION_PARAMETER;
//
// Definitions for the "ProcessorType" keyword
//
typedef enum _NDIS_PROCESSOR_TYPE
{
NdisProcessorX86,
NdisProcessorMips,
NdisProcessorAlpha,
NdisProcessorPpc,
NdisProcessorAmd64
} NDIS_PROCESSOR_TYPE, *PNDIS_PROCESSOR_TYPE;
//
// Definitions for the "Environment" keyword
//
typedef enum _NDIS_ENVIRONMENT_TYPE
{
NdisEnvironmentWindows,
NdisEnvironmentWindowsNt
} NDIS_ENVIRONMENT_TYPE, *PNDIS_ENVIRONMENT_TYPE;
//
// Possible Hardware Architecture. Define these to
// match the HAL INTERFACE_TYPE enum.
//
typedef enum _NDIS_INTERFACE_TYPE
{
NdisInterfaceInternal = Internal,
NdisInterfaceIsa = Isa,
NdisInterfaceEisa = Eisa,
NdisInterfaceMca = MicroChannel,
NdisInterfaceTurboChannel = TurboChannel,
NdisInterfacePci = PCIBus,
NdisInterfacePcMcia = PCMCIABus,
NdisInterfaceCBus = CBus,
NdisInterfaceMPIBus = MPIBus,
NdisInterfaceMPSABus = MPSABus,
NdisInterfaceProcessorInternal = ProcessorInternal,
NdisInterfaceInternalPowerBus = InternalPowerBus,
NdisInterfacePNPISABus = PNPISABus,
NdisInterfacePNPBus = PNPBus,
NdisMaximumInterfaceType
} NDIS_INTERFACE_TYPE, *PNDIS_INTERFACE_TYPE;
//
// Definition for shutdown handler
//
typedef
VOID
(*ADAPTER_SHUTDOWN_HANDLER) (
IN PVOID ShutdownContext
);
//
// Stuff for PCI configuring
//
typedef CM_PARTIAL_RESOURCE_LIST NDIS_RESOURCE_LIST, *PNDIS_RESOURCE_LIST;
//
// The structure passed up on a WAN_LINE_UP indication
//
typedef struct _NDIS_WAN_LINE_UP
{
IN ULONG LinkSpeed; // 100 bps units
IN ULONG MaximumTotalSize; // suggested max for send packets
IN NDIS_WAN_QUALITY Quality;
IN USHORT SendWindow; // suggested by the MAC
IN UCHAR RemoteAddress[6];
IN OUT UCHAR LocalAddress[6];
IN ULONG ProtocolBufferLength; // Length of protocol info buffer
IN PUCHAR ProtocolBuffer; // Information used by protocol
IN USHORT ProtocolType; // Protocol ID
IN OUT NDIS_STRING DeviceName;
} NDIS_WAN_LINE_UP, *PNDIS_WAN_LINE_UP;
//
// The structure passed up on a WAN_LINE_DOWN indication
//
typedef struct _NDIS_WAN_LINE_DOWN
{
IN UCHAR RemoteAddress[6];
IN UCHAR LocalAddress[6];
} NDIS_WAN_LINE_DOWN, *PNDIS_WAN_LINE_DOWN;
//
// The structure passed up on a WAN_FRAGMENT indication
//
typedef struct _NDIS_WAN_FRAGMENT
{
IN UCHAR RemoteAddress[6];
IN UCHAR LocalAddress[6];
} NDIS_WAN_FRAGMENT, *PNDIS_WAN_FRAGMENT;
//
// The structure passed up on a WAN_GET_STATS indication
//
typedef struct _NDIS_WAN_GET_STATS
{
IN UCHAR LocalAddress[6];
OUT ULONG BytesSent;
OUT ULONG BytesRcvd;
OUT ULONG FramesSent;
OUT ULONG FramesRcvd;
OUT ULONG CRCErrors; // Serial-like info only
OUT ULONG TimeoutErrors; // Serial-like info only
OUT ULONG AlignmentErrors; // Serial-like info only
OUT ULONG SerialOverrunErrors; // Serial-like info only
OUT ULONG FramingErrors; // Serial-like info only
OUT ULONG BufferOverrunErrors; // Serial-like info only
OUT ULONG BytesTransmittedUncompressed; // Compression info only
OUT ULONG BytesReceivedUncompressed; // Compression info only
OUT ULONG BytesTransmittedCompressed; // Compression info only
OUT ULONG BytesReceivedCompressed; // Compression info only
} NDIS_WAN_GET_STATS, *PNDIS_WAN_GET_STATS;
//
// DMA Channel information
//
typedef struct _NDIS_DMA_DESCRIPTION
{
BOOLEAN DemandMode;
BOOLEAN AutoInitialize;
BOOLEAN DmaChannelSpecified;
DMA_WIDTH DmaWidth;
DMA_SPEED DmaSpeed;
ULONG DmaPort;
ULONG DmaChannel;
} NDIS_DMA_DESCRIPTION, *PNDIS_DMA_DESCRIPTION;
//
// Internal structure representing an NDIS DMA channel
//
typedef struct _NDIS_DMA_BLOCK
{
PVOID MapRegisterBase;
KEVENT AllocationEvent;
PVOID SystemAdapterObject;
PVOID Miniport;
BOOLEAN InProgress;
} NDIS_DMA_BLOCK, *PNDIS_DMA_BLOCK;
#if defined(NDIS_WRAPPER)
//
// definitions for PnP state
//
typedef enum _NDIS_PNP_DEVICE_STATE
{
NdisPnPDeviceAdded,
NdisPnPDeviceStarted,
NdisPnPDeviceQueryStopped,
NdisPnPDeviceStopped,
NdisPnPDeviceQueryRemoved,
NdisPnPDeviceRemoved,
NdisPnPDeviceSurpriseRemoved
} NDIS_PNP_DEVICE_STATE;
//
// flags to use in PnPCapabilities Flag
//
#define NDIS_DEVICE_NOT_STOPPABLE 0x00000001 // the debvice is not stoppable i.e. ISA
#define NDIS_DEVICE_NOT_REMOVEABLE 0x00000002 // the device can not be safely removed
#define NDIS_DEVICE_NOT_SUSPENDABLE 0x00000004 // the device can not be safely suspended
#define NDIS_DEVICE_DISABLE_PM 0x00000008 // disable all PM features
#define NDIS_DEVICE_DISABLE_WAKE_UP 0x00000010 // disable device waking up the system
#define NDIS_DEVICE_DISABLE_WAKE_ON_RECONNECT 0x00000020 // disable device waking up the -system- due to a cable re-connect
#define NDIS_DEVICE_RESERVED 0x00000040 // should not be used
#define NDIS_DEVICE_DISABLE_WAKE_ON_MAGIC_PACKET 0x00000080 // disable device waking up the -system- due to a magic packet
#define NDIS_DEVICE_DISABLE_WAKE_ON_PATTERN_MATCH 0x00000100 // disable device waking up the -system- due to a pattern match
#endif // NDIS_WRAPPER defined
//
// Ndis Buffer is actually an Mdl
//
typedef MDL NDIS_BUFFER, *PNDIS_BUFFER;
struct _NDIS_PACKET;
typedef NDIS_HANDLE PNDIS_PACKET_POOL;
//
//
// wrapper-specific part of a packet
//
typedef struct _NDIS_PACKET_PRIVATE
{
UINT PhysicalCount; // number of physical pages in packet.
UINT TotalLength; // Total amount of data in the packet.
PNDIS_BUFFER Head; // first buffer in the chain
PNDIS_BUFFER Tail; // last buffer in the chain
// if Head is NULL the chain is empty; Tail doesn't have to be NULL also
PNDIS_PACKET_POOL Pool; // so we know where to free it back to
UINT Count;
ULONG Flags;
BOOLEAN ValidCounts;
UCHAR NdisPacketFlags; // See fPACKET_xxx bits below
USHORT NdisPacketOobOffset;
} NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE;
//
// The bits define the bits in the Flags
//
#define NDIS_FLAGS_PROTOCOL_ID_MASK 0x0000000F // The low 4 bits are defined for protocol-id
// The values are defined in ntddndis.h
#define NDIS_FLAGS_MULTICAST_PACKET 0x00000010 // don't use
#define NDIS_FLAGS_RESERVED2 0x00000020 // don't use
#define NDIS_FLAGS_RESERVED3 0x00000040 // don't use
#define NDIS_FLAGS_DONT_LOOPBACK 0x00000080 // Write only
#define NDIS_FLAGS_IS_LOOPBACK_PACKET 0x00000100 // Read only
#define NDIS_FLAGS_LOOPBACK_ONLY 0x00000200 // Write only
#define NDIS_FLAGS_RESERVED4 0x00000400 // don't use
#define NDIS_FLAGS_DOUBLE_BUFFERED 0x00000800 // used by ndis
#define NDIS_FLAGS_SENT_AT_DPC 0x00001000 // the protocol sent this packet at DPC
#define NDIS_FLAGS_USES_SG_BUFFER_LIST 0x00002000 // used by Ndis
#define NDIS_FLAGS_CONTAINS_ARCNET_HEADER 0x00004000 // used by Ndis
//
// Low-bits in the NdisPacketFlags are reserved by NDIS Wrapper for internal use
//
#define fPACKET_WRAPPER_RESERVED 0x3F
#define fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO 0x40
#define fPACKET_ALLOCATED_BY_NDIS 0x80
//
// Definition for layout of the media-specific data. More than one class of media-specific
// information can be tagged onto a packet.
//
typedef enum _NDIS_CLASS_ID
{
NdisClass802_3Priority,
NdisClassWirelessWanMbxMailbox,
NdisClassIrdaPacketInfo,
NdisClassAtmAALInfo
} NDIS_CLASS_ID;
typedef struct _MEDIA_SPECIFIC_INFORMATION
{
UINT NextEntryOffset;
NDIS_CLASS_ID ClassId;
UINT Size;
UCHAR ClassInformation[1];
} MEDIA_SPECIFIC_INFORMATION, *PMEDIA_SPECIFIC_INFORMATION;
typedef struct _NDIS_PACKET_OOB_DATA
{
union
{
ULONGLONG TimeToSend;
ULONGLONG TimeSent;
};
ULONGLONG TimeReceived;
UINT HeaderSize;
UINT SizeMediaSpecificInfo;
PVOID MediaSpecificInformation;
NDIS_STATUS Status;
} NDIS_PACKET_OOB_DATA, *PNDIS_PACKET_OOB_DATA;
#define NDIS_GET_PACKET_PROTOCOL_TYPE(_Packet_) ((_Packet_)->Private.Flags & NDIS_PROTOCOL_ID_MASK)
#define NDIS_OOB_DATA_FROM_PACKET(_p) \
(PNDIS_PACKET_OOB_DATA)((PUCHAR)(_p) + \
(_p)->Private.NdisPacketOobOffset)
#define NDIS_GET_PACKET_HEADER_SIZE(_Packet) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->HeaderSize
#define NDIS_GET_PACKET_STATUS(_Packet) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->Status
#define NDIS_GET_PACKET_TIME_TO_SEND(_Packet) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->TimeToSend
#define NDIS_GET_PACKET_TIME_SENT(_Packet) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->TimeSent
#define NDIS_GET_PACKET_TIME_RECEIVED(_Packet) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->TimeReceived
#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;\
} \
}
#define NDIS_SET_PACKET_HEADER_SIZE(_Packet, _HdrSize) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->HeaderSize = (_HdrSize)
#define NDIS_SET_PACKET_STATUS(_Packet, _Status) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->Status = (_Status)
#define NDIS_SET_PACKET_TIME_TO_SEND(_Packet, _TimeToSend) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->TimeToSend = (_TimeToSend)
#define NDIS_SET_PACKET_TIME_SENT(_Packet, _TimeSent) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->TimeSent = (_TimeSent)
#define NDIS_SET_PACKET_TIME_RECEIVED(_Packet, _TimeReceived) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->TimeReceived = (_TimeReceived)
#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);\
} \
}
//
// packet definition
//
typedef struct _NDIS_PACKET
{
NDIS_PACKET_PRIVATE Private;
union
{
struct // For Connection-less miniports
{
UCHAR MiniportReserved[2*sizeof(PVOID)];
UCHAR WrapperReserved[2*sizeof(PVOID)];
};
struct
{
//
// For de-serialized miniports. And by implication conn-oriented miniports.
//
UCHAR MiniportReservedEx[3*sizeof(PVOID)];
UCHAR WrapperReservedEx[sizeof(PVOID)];
};
struct
{
UCHAR MacReserved[4*sizeof(PVOID)];
};
};
ULONG_PTR Reserved[2]; // For compatibility with Win95
UCHAR ProtocolReserved[1];
} NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET;
//
// NDIS per-packet information.
//
typedef enum _NDIS_PER_PACKET_INFO
{
TcpIpChecksumPacketInfo,
IpSecPacketInfo,
TcpLargeSendPacketInfo,
ClassificationHandlePacketInfo,
NdisReserved,
ScatterGatherListPacketInfo,
Ieee8021QInfo,
OriginalPacketInfo,
PacketCancelId,
MaxPerPacketInfo
} NDIS_PER_PACKET_INFO, *PNDIS_PER_PACKET_INFO;
typedef struct _NDIS_PACKET_EXTENSION
{
PVOID NdisPacketInfo[MaxPerPacketInfo];
} NDIS_PACKET_EXTENSION, *PNDIS_PACKET_EXTENSION;
#define NDIS_PACKET_EXTENSION_FROM_PACKET(_P) ((PNDIS_PACKET_EXTENSION)((PUCHAR)(_P) + (_P)->Private.NdisPacketOobOffset + sizeof(NDIS_PACKET_OOB_DATA)))
#define NDIS_PER_PACKET_INFO_FROM_PACKET(_P, _Id) ((PNDIS_PACKET_EXTENSION)((PUCHAR)(_P) + (_P)->Private.NdisPacketOobOffset + sizeof(NDIS_PACKET_OOB_DATA)))->NdisPacketInfo[(_Id)]
#define NDIS_GET_ORIGINAL_PACKET(_P) NDIS_PER_PACKET_INFO_FROM_PACKET(_P, OriginalPacketInfo)
#define NDIS_SET_ORIGINAL_PACKET(_P, _OP) NDIS_PER_PACKET_INFO_FROM_PACKET(_P, OriginalPacketInfo) = _OP
#define NDIS_GET_PACKET_CANCEL_ID(_P) NDIS_PER_PACKET_INFO_FROM_PACKET(_P, PacketCancelId)
#define NDIS_SET_PACKET_CANCEL_ID(_P, _cId) NDIS_PER_PACKET_INFO_FROM_PACKET(_P, PacketCancelId) = _cId
typedef struct _NDIS_PACKET_STACK
{
ULONG_PTR IMReserved[2];
ULONG_PTR NdisReserved[4];
} NDIS_PACKET_STACK, *PNDIS_PACKET_STACK;
//
// Per-packet information for TcpIpChecksumPacketInfo.
//
typedef struct _NDIS_TCP_IP_CHECKSUM_PACKET_INFO
{
union
{
struct
{
ULONG NdisPacketChecksumV4:1;
ULONG NdisPacketChecksumV6:1;
ULONG NdisPacketTcpChecksum:1;
ULONG NdisPacketUdpChecksum:1;
ULONG NdisPacketIpChecksum:1;
} Transmit;
struct
{
ULONG NdisPacketTcpChecksumFailed:1;
ULONG NdisPacketUdpChecksumFailed:1;
ULONG NdisPacketIpChecksumFailed:1;
ULONG NdisPacketTcpChecksumSucceeded:1;
ULONG NdisPacketUdpChecksumSucceeded:1;
ULONG NdisPacketIpChecksumSucceeded:1;
ULONG NdisPacketLoopback:1;
} Receive;
ULONG Value;
};
} NDIS_TCP_IP_CHECKSUM_PACKET_INFO, *PNDIS_TCP_IP_CHECKSUM_PACKET_INFO;
//
// Per-packet information for Ieee8021QInfo.
//
typedef struct _NDIS_PACKET_8021Q_INFO
{
union
{
struct
{
UINT32 UserPriority:3; // 802.1p priority
UINT32 CanonicalFormatId:1; // always 0
UINT32 VlanId:12; // VLAN Identification
UINT32 Reserved:16; // set to 0
} TagHeader;
PVOID Value;
};
} NDIS_PACKET_8021Q_INFO, *PNDIS_PACKET_8021Q_INFO;
//
// Old definitions, to be obsoleted.
//
#define Ieee8021pPriority Ieee8021QInfo
typedef UINT IEEE8021PPRIORITY;
#define MAX_HASHES 4
#define TRUNCATED_HASH_LEN 12
#define CRYPTO_SUCCESS 0
#define CRYPTO_GENERIC_ERROR 1
#define CRYPTO_TRANSPORT_AH_AUTH_FAILED 2
#define CRYPTO_TRANSPORT_ESP_AUTH_FAILED 3
#define CRYPTO_TUNNEL_AH_AUTH_FAILED 4
#define CRYPTO_TUNNEL_ESP_AUTH_FAILED 5
#define CRYPTO_INVALID_PACKET_SYNTAX 6
#define CRYPTO_INVALID_PROTOCOL 7
typedef struct _NDIS_IPSEC_PACKET_INFO
{
union
{
struct
{
NDIS_HANDLE OffloadHandle;
NDIS_HANDLE NextOffloadHandle;
} Transmit;
struct
{
ULONG SA_DELETE_REQ:1;
ULONG CRYPTO_DONE:1;
ULONG NEXT_CRYPTO_DONE:1;
ULONG CryptoStatus;
} Receive;
};
} NDIS_IPSEC_PACKET_INFO, *PNDIS_IPSEC_PACKET_INFO;
///
// NDIS Task Off-Load data structures.
///
#define NDIS_TASK_OFFLOAD_VERSION 1
//
// The following defines are used in the Task field above to define
// the type of task offloading necessary.
//
typedef enum _NDIS_TASK
{
TcpIpChecksumNdisTask,
IpSecNdisTask,
TcpLargeSendNdisTask,
MaxNdisTask
} NDIS_TASK, *PNDIS_TASK;
typedef enum _NDIS_ENCAPSULATION
{
UNSPECIFIED_Encapsulation,
NULL_Encapsulation,
IEEE_802_3_Encapsulation,
IEEE_802_5_Encapsulation,
LLC_SNAP_ROUTED_Encapsulation,
LLC_SNAP_BRIDGED_Encapsulation
} NDIS_ENCAPSULATION;
//
// Encapsulation header format
//
typedef struct _NDIS_ENCAPSULATION_FORMAT
{
NDIS_ENCAPSULATION Encapsulation; // Encapsulation type
struct
{
ULONG FixedHeaderSize:1;
ULONG Reserved:31;
} Flags;
ULONG EncapsulationHeaderSize; // Encapsulation header size
} NDIS_ENCAPSULATION_FORMAT,*PNDIS_ENCAPSULATION_FORMAT;
//
// OFFLOAD header structure for OID_TCP_TASK_OFFLOAD
//
typedef struct _NDIS_TASK_OFFLOAD_HEADER
{
ULONG Version; // set to NDIS_TASK_OFFLOAD_VERSION
ULONG Size; // Size of this structure
ULONG Reserved; // Reserved for future use
ULONG OffsetFirstTask; // Offset to the first
NDIS_ENCAPSULATION_FORMAT EncapsulationFormat; // Encapsulation information.
// NDIS_TASK_OFFLOAD structure(s)
} NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER;
//
// Task offload Structure, which follows the above header in ndis query
//
typedef struct _NDIS_TASK_OFFLOAD
{
ULONG Version; // NDIS_TASK_OFFLOAD_VERSION
ULONG Size; // Size of this structure. Used for version checking.
NDIS_TASK Task; // Task.
ULONG OffsetNextTask; // Offset to the next NDIS_TASK_OFFLOAD
ULONG TaskBufferLength; // Length of the task offload information.
UCHAR TaskBuffer[1]; // The task offload information.
} NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
//
// Offload structure for NDIS_TASK_TCP_IP_CHECKSUM
//
typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
{
struct
{
ULONG IpOptionsSupported:1;
ULONG TcpOptionsSupported:1;
ULONG TcpChecksum:1;
ULONG UdpChecksum:1;
ULONG IpChecksum:1;
} V4Transmit;
struct
{
ULONG IpOptionsSupported:1;
ULONG TcpOptionsSupported:1;
ULONG TcpChecksum:1;
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;
ULONG TcpChecksum:1;
ULONG UdpChecksum:1;
} V6Receive;
} NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM;
//
// Off-load structure for NDIS_TASK_TCP_LARGE_SEND
//
typedef struct _NDIS_TASK_TCP_LARGE_SEND
{
ULONG Version;
ULONG MaxOffLoadSize;
ULONG MinSegmentCount;
BOOLEAN TcpOptions;
BOOLEAN IpOptions;
} NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND;
typedef struct _NDIS_TASK_IPSEC
{
struct
{
ULONG AH_ESP_COMBINED;
ULONG TRANSPORT_TUNNEL_COMBINED;
ULONG V4_OPTIONS;
ULONG RESERVED;
} Supported;
struct
{
ULONG MD5:1;
ULONG SHA_1:1;
ULONG Transport:1;
ULONG Tunnel:1;
ULONG Send:1;
ULONG Receive:1;
} V4AH;
struct
{
ULONG DES:1;
ULONG RESERVED:1;
ULONG TRIPLE_DES:1;
ULONG NULL_ESP:1;
ULONG Transport:1;
ULONG Tunnel:1;
ULONG Send:1;
ULONG Receive:1;
} V4ESP;
} NDIS_TASK_IPSEC, *PNDIS_TASK_IPSEC;
#define IPSEC_TPT_UDPESP_ENCAPTYPE_IKE 0x00000001
#define IPSEC_TUN_UDPESP_ENCAPTYPE_IKE 0x00000002
#define IPSEC_TPTOVERTUN_UDPESP_ENCAPTYPE_IKE 0x00000004
#define IPSEC_TPT_UDPESP_OVER_PURE_TUN_ENCAPTYPE_IKE 0x00000008
#define IPSEC_TPT_UDPESP_ENCAPTYPE_OTHER 0x00000010
#define IPSEC_TUN_UDPESP_ENCAPTYPE_OTHER 0x00000020
#define IPSEC_TPTOVERTUN_UDPESP_ENCAPTYPE_OTHER 0x00000040
#define IPSEC_TPT_UDPESP_OVER_PURE_TUN_ENCAPTYPE_OTHER 0x00000080
typedef UINT IEEE8021PPRIORITY;
//
// WAN Packet. This is used by WAN miniports only. This is the legacy model.
// Co-Ndis is the preferred model for WAN miniports
//
typedef struct _NDIS_WAN_PACKET
{
LIST_ENTRY WanPacketQueue;
PUCHAR CurrentBuffer;
ULONG CurrentLength;
PUCHAR StartBuffer;
PUCHAR EndBuffer;
PVOID ProtocolReserved1;
PVOID ProtocolReserved2;
PVOID ProtocolReserved3;
PVOID ProtocolReserved4;
PVOID MacReserved1;
PVOID MacReserved2;
PVOID MacReserved3;
PVOID MacReserved4;
} NDIS_WAN_PACKET, *PNDIS_WAN_PACKET;
//
// Routines to get/set packet flags
//
/*++
UINT
NdisGetPacketFlags(
IN PNDIS_PACKET Packet
);
--*/
#define NdisGetPacketFlags(_Packet) (_Packet)->Private.Flags
/*++
VOID
NdisSetPacketFlags(
IN PNDIS_PACKET Packet,
IN UINT Flags
);
--*/
#define NdisSetPacketFlags(_Packet, _Flags) (_Packet)->Private.Flags |= (_Flags)
#define NdisClearPacketFlags(_Packet, _Flags) (_Packet)->Private.Flags &= ~(_Flags)
//
// Request types used by NdisRequest; constants are added for
// all entry points in the MAC, for those that want to create
// their own internal requests.
//
typedef enum _NDIS_REQUEST_TYPE
{
NdisRequestQueryInformation,
NdisRequestSetInformation,
NdisRequestQueryStatistics,
NdisRequestOpen,
NdisRequestClose,
NdisRequestSend,
NdisRequestTransferData,
NdisRequestReset,
NdisRequestGeneric1,
NdisRequestGeneric2,
NdisRequestGeneric3,
NdisRequestGeneric4
} NDIS_REQUEST_TYPE, *PNDIS_REQUEST_TYPE;
//
// Structure of requests sent via NdisRequest
//
typedef struct _NDIS_REQUEST
{
UCHAR MacReserved[4*sizeof(PVOID)];
NDIS_REQUEST_TYPE RequestType;
union _DATA
{
struct _QUERY_INFORMATION
{
NDIS_OID Oid;
PVOID InformationBuffer;
UINT InformationBufferLength;
UINT BytesWritten;
UINT BytesNeeded;
} QUERY_INFORMATION;
struct _SET_INFORMATION
{
NDIS_OID Oid;
PVOID InformationBuffer;
UINT InformationBufferLength;
UINT BytesRead;
UINT BytesNeeded;
} SET_INFORMATION;
} DATA;
#if (defined(NDIS50) || defined(NDIS51) || defined(NDIS50_MINIPORT) || defined(NDIS51_MINIPORT))
UCHAR NdisReserved[9*sizeof(PVOID)];
union
{
UCHAR CallMgrReserved[2*sizeof(PVOID)];
UCHAR ProtocolReserved[2*sizeof(PVOID)];
};
UCHAR MiniportReserved[2*sizeof(PVOID)];
#endif
} NDIS_REQUEST, *PNDIS_REQUEST;
//
// NDIS Address Family definitions.
//
typedef ULONG NDIS_AF, *PNDIS_AF;
#define CO_ADDRESS_FAMILY_Q2931 ((NDIS_AF)0x1) // ATM
#define CO_ADDRESS_FAMILY_PSCHED ((NDIS_AF)0x2) // Packet scheduler
#define CO_ADDRESS_FAMILY_L2TP ((NDIS_AF)0x3)
#define CO_ADDRESS_FAMILY_IRDA ((NDIS_AF)0x4)
#define CO_ADDRESS_FAMILY_1394 ((NDIS_AF)0x5)
#define CO_ADDRESS_FAMILY_PPP ((NDIS_AF)0x6)
#define CO_ADDRESS_FAMILY_INFINIBAND ((NDIS_AF)0x7)
#define CO_ADDRESS_FAMILY_TAPI ((NDIS_AF)0x800)
#define CO_ADDRESS_FAMILY_TAPI_PROXY ((NDIS_AF)0x801)
//
// The following is OR'ed with the base AF to denote proxy support
//
#define CO_ADDRESS_FAMILY_PROXY 0x80000000
//
// Address family structure registered/opened via
// NdisCmRegisterAddressFamily
// NdisClOpenAddressFamily
//
typedef struct
{
NDIS_AF AddressFamily; // one of the CO_ADDRESS_FAMILY_xxx values above
ULONG MajorVersion; // the major version of call manager
ULONG MinorVersion; // the minor version of call manager
} CO_ADDRESS_FAMILY, *PCO_ADDRESS_FAMILY;
//
// Definition for a SAP
//
typedef struct
{
ULONG SapType;
ULONG SapLength;
UCHAR Sap[1];
} CO_SAP, *PCO_SAP;
//
// Definitions for physical address.
//
typedef PHYSICAL_ADDRESS NDIS_PHYSICAL_ADDRESS, *PNDIS_PHYSICAL_ADDRESS;
typedef struct _NDIS_PHYSICAL_ADDRESS_UNIT
{
NDIS_PHYSICAL_ADDRESS PhysicalAddress;
UINT Length;
} NDIS_PHYSICAL_ADDRESS_UNIT, *PNDIS_PHYSICAL_ADDRESS_UNIT;
/*++
ULONG
NdisGetPhysicalAddressHigh(
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress
);
--*/
#define NdisGetPhysicalAddressHigh(_PhysicalAddress) \
((_PhysicalAddress).HighPart)
/*++
VOID
NdisSetPhysicalAddressHigh(
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG Value
);
--*/
#define NdisSetPhysicalAddressHigh(_PhysicalAddress, _Value) \
((_PhysicalAddress).HighPart) = (_Value)
/*++
ULONG
NdisGetPhysicalAddressLow(
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress
);
--*/
#define NdisGetPhysicalAddressLow(_PhysicalAddress) \
((_PhysicalAddress).LowPart)
/*++
VOID
NdisSetPhysicalAddressLow(
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG Value
);
--*/
#define NdisSetPhysicalAddressLow(_PhysicalAddress, _Value) \
((_PhysicalAddress).LowPart) = (_Value)
//
// Macro to initialize an NDIS_PHYSICAL_ADDRESS constant
//
#define NDIS_PHYSICAL_ADDRESS_CONST(_Low, _High) \
{ (ULONG)(_Low), (LONG)(_High) }
//
// block used for references...
//
typedef struct _REFERENCE
{
KSPIN_LOCK SpinLock;
USHORT ReferenceCount;
BOOLEAN Closing;
} REFERENCE, * PREFERENCE;
//
// block used for references using a ULONG
//
typedef struct _ULONG_REFERENCE
{
KSPIN_LOCK SpinLock;
ULONG ReferenceCount;
BOOLEAN Closing;
} ULONG_REFERENCE, *PULONG_REFERENCE;
//
// Types of Memory (not mutually exclusive)
//
#define NDIS_MEMORY_CONTIGUOUS 0x00000001
#define NDIS_MEMORY_NONCACHED 0x00000002
//
// Open options
//
#define NDIS_OPEN_RECEIVE_NOT_REENTRANT 0x00000001
//
// NDIS_STATUS values
//
#define NDIS_STATUS_SUCCESS ((NDIS_STATUS)STATUS_SUCCESS)
#define NDIS_STATUS_PENDING ((NDIS_STATUS) STATUS_PENDING)
#define NDIS_STATUS_NOT_RECOGNIZED ((NDIS_STATUS)0x00010001L)
#define NDIS_STATUS_NOT_COPIED ((NDIS_STATUS)0x00010002L)
#define NDIS_STATUS_NOT_ACCEPTED ((NDIS_STATUS)0x00010003L)
#define NDIS_STATUS_CALL_ACTIVE ((NDIS_STATUS)0x00010007L)
#define NDIS_STATUS_ONLINE ((NDIS_STATUS)0x40010003L)
#define NDIS_STATUS_RESET_START ((NDIS_STATUS)0x40010004L)
#define NDIS_STATUS_RESET_END ((NDIS_STATUS)0x40010005L)
#define NDIS_STATUS_RING_STATUS ((NDIS_STATUS)0x40010006L)
#define NDIS_STATUS_CLOSED ((NDIS_STATUS)0x40010007L)
#define NDIS_STATUS_WAN_LINE_UP ((NDIS_STATUS)0x40010008L)
#define NDIS_STATUS_WAN_LINE_DOWN ((NDIS_STATUS)0x40010009L)
#define NDIS_STATUS_WAN_FRAGMENT ((NDIS_STATUS)0x4001000AL)
#define NDIS_STATUS_MEDIA_CONNECT ((NDIS_STATUS)0x4001000BL)
#define NDIS_STATUS_MEDIA_DISCONNECT ((NDIS_STATUS)0x4001000CL)
#define NDIS_STATUS_HARDWARE_LINE_UP ((NDIS_STATUS)0x4001000DL)
#define NDIS_STATUS_HARDWARE_LINE_DOWN ((NDIS_STATUS)0x4001000EL)
#define NDIS_STATUS_INTERFACE_UP ((NDIS_STATUS)0x4001000FL)
#define NDIS_STATUS_INTERFACE_DOWN ((NDIS_STATUS)0x40010010L)
#define NDIS_STATUS_MEDIA_BUSY ((NDIS_STATUS)0x40010011L)
#define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION ((NDIS_STATUS)0x40010012L)
#define NDIS_STATUS_WW_INDICATION NDIS_STATUS_MEDIA_SPECIFIC_INDICATION
#define NDIS_STATUS_LINK_SPEED_CHANGE ((NDIS_STATUS)0x40010013L)
#define NDIS_STATUS_WAN_GET_STATS ((NDIS_STATUS)0x40010014L)
#define NDIS_STATUS_WAN_CO_FRAGMENT ((NDIS_STATUS)0x40010015L)
#define NDIS_STATUS_WAN_CO_LINKPARAMS ((NDIS_STATUS)0x40010016L)
#define NDIS_STATUS_NOT_RESETTABLE ((NDIS_STATUS)0x80010001L)
#define NDIS_STATUS_SOFT_ERRORS ((NDIS_STATUS)0x80010003L)
#define NDIS_STATUS_HARD_ERRORS ((NDIS_STATUS)0x80010004L)
#define NDIS_STATUS_BUFFER_OVERFLOW ((NDIS_STATUS)STATUS_BUFFER_OVERFLOW)
#define NDIS_STATUS_FAILURE ((NDIS_STATUS) STATUS_UNSUCCESSFUL)
#define NDIS_STATUS_RESOURCES ((NDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES)
#define NDIS_STATUS_CLOSING ((NDIS_STATUS)0xC0010002L)
#define NDIS_STATUS_BAD_VERSION ((NDIS_STATUS)0xC0010004L)
#define NDIS_STATUS_BAD_CHARACTERISTICS ((NDIS_STATUS)0xC0010005L)
#define NDIS_STATUS_ADAPTER_NOT_FOUND ((NDIS_STATUS)0xC0010006L)
#define NDIS_STATUS_OPEN_FAILED ((NDIS_STATUS)0xC0010007L)
#define NDIS_STATUS_DEVICE_FAILED ((NDIS_STATUS)0xC0010008L)
#define NDIS_STATUS_MULTICAST_FULL ((NDIS_STATUS)0xC0010009L)
#define NDIS_STATUS_MULTICAST_EXISTS ((NDIS_STATUS)0xC001000AL)
#define NDIS_STATUS_MULTICAST_NOT_FOUND ((NDIS_STATUS)0xC001000BL)
#define NDIS_STATUS_REQUEST_ABORTED ((NDIS_STATUS)0xC001000CL)
#define NDIS_STATUS_RESET_IN_PROGRESS ((NDIS_STATUS)0xC001000DL)
#define NDIS_STATUS_CLOSING_INDICATING ((NDIS_STATUS)0xC001000EL)
#define NDIS_STATUS_NOT_SUPPORTED ((NDIS_STATUS)STATUS_NOT_SUPPORTED)
#define NDIS_STATUS_INVALID_PACKET ((NDIS_STATUS)0xC001000FL)
#define NDIS_STATUS_OPEN_LIST_FULL ((NDIS_STATUS)0xC0010010L)
#define NDIS_STATUS_ADAPTER_NOT_READY ((NDIS_STATUS)0xC0010011L)
#define NDIS_STATUS_ADAPTER_NOT_OPEN ((NDIS_STATUS)0xC0010012L)
#define NDIS_STATUS_NOT_INDICATING ((NDIS_STATUS)0xC0010013L)
#define NDIS_STATUS_INVALID_LENGTH ((NDIS_STATUS)0xC0010014L)
#define NDIS_STATUS_INVALID_DATA ((NDIS_STATUS)0xC0010015L)
#define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L)
#define NDIS_STATUS_INVALID_OID ((NDIS_STATUS)0xC0010017L)
#define NDIS_STATUS_ADAPTER_REMOVED ((NDIS_STATUS)0xC0010018L)
#define NDIS_STATUS_UNSUPPORTED_MEDIA ((NDIS_STATUS)0xC0010019L)
#define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((NDIS_STATUS)0xC001001AL)
#define NDIS_STATUS_FILE_NOT_FOUND ((NDIS_STATUS)0xC001001BL)
#define NDIS_STATUS_ERROR_READING_FILE ((NDIS_STATUS)0xC001001CL)
#define NDIS_STATUS_ALREADY_MAPPED ((NDIS_STATUS)0xC001001DL)
#define NDIS_STATUS_RESOURCE_CONFLICT ((NDIS_STATUS)0xC001001EL)
#define NDIS_STATUS_NO_CABLE ((NDIS_STATUS)0xC001001FL)
#define NDIS_STATUS_INVALID_SAP ((NDIS_STATUS)0xC0010020L)
#define NDIS_STATUS_SAP_IN_USE ((NDIS_STATUS)0xC0010021L)
#define NDIS_STATUS_INVALID_ADDRESS ((NDIS_STATUS)0xC0010022L)
#define NDIS_STATUS_VC_NOT_ACTIVATED ((NDIS_STATUS)0xC0010023L)
#define NDIS_STATUS_DEST_OUT_OF_ORDER ((NDIS_STATUS)0xC0010024L) // cause 27
#define NDIS_STATUS_VC_NOT_AVAILABLE ((NDIS_STATUS)0xC0010025L) // cause 35,45
#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE ((NDIS_STATUS)0xC0010026L) // cause 37
#define NDIS_STATUS_INCOMPATABLE_QOS ((NDIS_STATUS)0xC0010027L) // cause 49
#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((NDIS_STATUS)0xC0010028L) // cause 93
#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION ((NDIS_STATUS)0xC0010029L) // cause 3
#define NDIS_STATUS_TOKEN_RING_OPEN_ERROR ((NDIS_STATUS)0xC0011000L)
#define NDIS_STATUS_INVALID_DEVICE_REQUEST ((NDIS_STATUS)STATUS_INVALID_DEVICE_REQUEST)
#define NDIS_STATUS_NETWORK_UNREACHABLE ((NDIS_STATUS)STATUS_NETWORK_UNREACHABLE)
//
// used in error logging
//
#define NDIS_ERROR_CODE ULONG
#define NDIS_ERROR_CODE_RESOURCE_CONFLICT EVENT_NDIS_RESOURCE_CONFLICT
#define NDIS_ERROR_CODE_OUT_OF_RESOURCES EVENT_NDIS_OUT_OF_RESOURCE
#define NDIS_ERROR_CODE_HARDWARE_FAILURE EVENT_NDIS_HARDWARE_FAILURE
#define NDIS_ERROR_CODE_ADAPTER_NOT_FOUND EVENT_NDIS_ADAPTER_NOT_FOUND
#define NDIS_ERROR_CODE_INTERRUPT_CONNECT EVENT_NDIS_INTERRUPT_CONNECT
#define NDIS_ERROR_CODE_DRIVER_FAILURE EVENT_NDIS_DRIVER_FAILURE
#define NDIS_ERROR_CODE_BAD_VERSION EVENT_NDIS_BAD_VERSION
#define NDIS_ERROR_CODE_TIMEOUT EVENT_NDIS_TIMEOUT
#define NDIS_ERROR_CODE_NETWORK_ADDRESS EVENT_NDIS_NETWORK_ADDRESS
#define NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION EVENT_NDIS_UNSUPPORTED_CONFIGURATION
#define NDIS_ERROR_CODE_INVALID_VALUE_FROM_ADAPTER EVENT_NDIS_INVALID_VALUE_FROM_ADAPTER
#define NDIS_ERROR_CODE_MISSING_CONFIGURATION_PARAMETER EVENT_NDIS_MISSING_CONFIGURATION_PARAMETER
#define NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS EVENT_NDIS_BAD_IO_BASE_ADDRESS
#define NDIS_ERROR_CODE_RECEIVE_SPACE_SMALL EVENT_NDIS_RECEIVE_SPACE_SMALL
#define NDIS_ERROR_CODE_ADAPTER_DISABLED EVENT_NDIS_ADAPTER_DISABLED
#if BINARY_COMPATIBLE
#if USE_KLOCKS
#define DISPATCH_LEVEL 2
#define NdisAllocateSpinLock(_SpinLock) KeInitializeSpinLock(&(_SpinLock)->SpinLock)
#define NdisFreeSpinLock(_SpinLock)
#define NdisAcquireSpinLock(_SpinLock) KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql)
#define NdisReleaseSpinLock(_SpinLock) KeReleaseSpinLock(&(_SpinLock)->SpinLock,(_SpinLock)->OldIrql)
#define NdisDprAcquireSpinLock(_SpinLock) \
{ \
KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock); \
(_SpinLock)->OldIrql = DISPATCH_LEVEL; \
}
#define NdisDprReleaseSpinLock(_SpinLock) KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock)
#else
//
// Ndis Spin Locks
//
EXPORT
VOID
NdisAllocateSpinLock(
IN PNDIS_SPIN_LOCK SpinLock
);
EXPORT
VOID
NdisFreeSpinLock(
IN PNDIS_SPIN_LOCK SpinLock
);
EXPORT
VOID
NdisAcquireSpinLock(
IN PNDIS_SPIN_LOCK SpinLock
);
EXPORT
VOID
NdisReleaseSpinLock(
IN PNDIS_SPIN_LOCK SpinLock
);
EXPORT
VOID
NdisDprAcquireSpinLock(
IN PNDIS_SPIN_LOCK SpinLock
);
EXPORT
VOID
NdisDprReleaseSpinLock(
IN PNDIS_SPIN_LOCK SpinLock
);
#endif
EXPORT
VOID
NdisGetCurrentSystemTime(
PLARGE_INTEGER pSystemTime
);
//
// Interlocked support functions
//
EXPORT
LONG
NdisInterlockedIncrement(
IN PLONG Addend
);
EXPORT
LONG
NdisInterlockedDecrement(
IN PLONG Addend
);
EXPORT
VOID
NdisInterlockedAddUlong(
IN PULONG Addend,
IN ULONG Increment,
IN PNDIS_SPIN_LOCK SpinLock
);
EXPORT
PLIST_ENTRY
NdisInterlockedInsertHeadList(
IN PLIST_ENTRY ListHead,
IN PLIST_ENTRY ListEntry,
IN PNDIS_SPIN_LOCK SpinLock
);
EXPORT
PLIST_ENTRY
NdisInterlockedInsertTailList(
IN PLIST_ENTRY ListHead,
IN PLIST_ENTRY ListEntry,
IN PNDIS_SPIN_LOCK SpinLock
);
EXPORT
PLIST_ENTRY
NdisInterlockedRemoveHeadList(
IN PLIST_ENTRY ListHead,
IN PNDIS_SPIN_LOCK SpinLock
);
EXPORT
LARGE_INTEGER
NdisInterlockedAddLargeInteger(
IN PLARGE_INTEGER Addend,
IN ULONG Increment,
IN PKSPIN_LOCK Lock
);
#else // BINARY_COMPATIBLE
#define NdisAllocateSpinLock(_SpinLock) KeInitializeSpinLock(&(_SpinLock)->SpinLock)
#define NdisFreeSpinLock(_SpinLock)
#define NdisAcquireSpinLock(_SpinLock) KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql)
#define NdisReleaseSpinLock(_SpinLock) KeReleaseSpinLock(&(_SpinLock)->SpinLock,(_SpinLock)->OldIrql)
#define NdisDprAcquireSpinLock(_SpinLock) \
{ \
KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock); \
(_SpinLock)->OldIrql = DISPATCH_LEVEL; \
}
#define NdisDprReleaseSpinLock(_SpinLock) KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock)
#define NdisGetCurrentSystemTime(_pSystemTime) \
{ \
KeQuerySystemTime(_pSystemTime); \
}
//
// Interlocked support functions
//
#define NdisInterlockedIncrement(Addend) InterlockedIncrement(Addend)
#define NdisInterlockedDecrement(Addend) InterlockedDecrement(Addend)
#define NdisInterlockedAddUlong(_Addend, _Increment, _SpinLock) \
ExInterlockedAddUlong(_Addend, _Increment, &(_SpinLock)->SpinLock)
#define NdisInterlockedInsertHeadList(_ListHead, _ListEntry, _SpinLock) \
ExInterlockedInsertHeadList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
#define NdisInterlockedInsertTailList(_ListHead, _ListEntry, _SpinLock) \
ExInterlockedInsertTailList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
#define NdisInterlockedRemoveHeadList(_ListHead, _SpinLock) \
ExInterlockedRemoveHeadList(_ListHead, &(_SpinLock)->SpinLock)
#define NdisInterlockedPushEntryList(ListHead, ListEntry, Lock) \
ExInterlockedPushEntryList(ListHead, ListEntry, &(Lock)->SpinLock)
#define NdisInterlockedPopEntryList(ListHead, Lock) \
ExInterlockedPopEntryList(ListHead, &(Lock)->SpinLock)
#endif // BINARY_COMPATIBLE
#ifndef MAXIMUM_PROCESSORS
#ifdef _WIN64
#define MAXIMUM_PROCESSORS 64
#else
#define MAXIMUM_PROCESSORS 32
#endif
#endif
typedef union _NDIS_RW_LOCK_REFCOUNT
{
UINT RefCount;
UCHAR cacheLine[16]; // One refCount per cache line
} NDIS_RW_LOCK_REFCOUNT;
typedef struct _NDIS_RW_LOCK
{
union
{
struct
{
KSPIN_LOCK SpinLock;
PVOID Context;
};
UCHAR Reserved[16];
};
NDIS_RW_LOCK_REFCOUNT RefCount[MAXIMUM_PROCESSORS];
} NDIS_RW_LOCK, *PNDIS_RW_LOCK;
typedef struct _LOCK_STATE
{
USHORT LockState;
KIRQL OldIrql;
} LOCK_STATE, *PLOCK_STATE;
EXPORT
VOID
NdisInitializeReadWriteLock(
IN PNDIS_RW_LOCK Lock
);
EXPORT
VOID
NdisAcquireReadWriteLock(
IN PNDIS_RW_LOCK Lock,
IN BOOLEAN fWrite, // TRUE -> Write, FALSE -> Read
IN PLOCK_STATE LockState
);
EXPORT
VOID
NdisReleaseReadWriteLock(
IN PNDIS_RW_LOCK Lock,
IN PLOCK_STATE LockState
);
#define NdisInterlockedAddLargeStatistic(_Addend, _Increment) \
ExInterlockedAddLargeStatistic((PLARGE_INTEGER)_Addend, _Increment)
//
// S-List support
//
#define NdisInterlockedPushEntrySList(SListHead, SListEntry, Lock) \
ExInterlockedPushEntrySList(SListHead, SListEntry, &(Lock)->SpinLock)
#define NdisInterlockedPopEntrySList(SListHead, Lock) \
ExInterlockedPopEntrySList(SListHead, &(Lock)->SpinLock)
#define NdisInterlockedFlushSList(SListHead) ExInterlockedFlushSList(SListHead)
#define NdisInitializeSListHead(SListHead) ExInitializeSListHead(SListHead)
#define NdisQueryDepthSList(SListHead) ExQueryDepthSList(SListHead)
EXPORT
VOID
NdisGetCurrentProcessorCpuUsage(
OUT PULONG pCpuUsage
);
EXPORT
VOID
NdisGetCurrentProcessorCounts(
OUT PULONG pIdleCount,
OUT PULONG pKernelAndUser,
OUT PULONG pIndex
);
EXPORT
VOID
NdisGetSystemUpTime(
OUT PULONG pSystemUpTime
);
//
// List manipulation
//
/*++
VOID
NdisInitializeListHead(
IN PLIST_ENTRY ListHead
);
--*/
#define NdisInitializeListHead(_ListHead) InitializeListHead(_ListHead)
//
// Configuration Requests
//
EXPORT
VOID
NdisOpenConfiguration(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE ConfigurationHandle,
IN NDIS_HANDLE WrapperConfigurationContext
);
EXPORT
VOID
NdisOpenConfigurationKeyByName(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE ConfigurationHandle,
IN PNDIS_STRING SubKeyName,
OUT PNDIS_HANDLE SubKeyHandle
);
EXPORT
VOID
NdisOpenConfigurationKeyByIndex(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE ConfigurationHandle,
IN ULONG Index,
OUT PNDIS_STRING KeyName,
OUT PNDIS_HANDLE KeyHandle
);
EXPORT
VOID
NdisReadConfiguration(
OUT PNDIS_STATUS Status,
OUT PNDIS_CONFIGURATION_PARAMETER *ParameterValue,
IN NDIS_HANDLE ConfigurationHandle,
IN PNDIS_STRING Keyword,
IN NDIS_PARAMETER_TYPE ParameterType
);
EXPORT
VOID
NdisWriteConfiguration(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE ConfigurationHandle,
IN PNDIS_STRING Keyword,
IN PNDIS_CONFIGURATION_PARAMETER ParameterValue
);
EXPORT
VOID
NdisCloseConfiguration(
IN NDIS_HANDLE ConfigurationHandle
);
EXPORT
VOID
NdisReadNetworkAddress(
OUT PNDIS_STATUS Status,
OUT PVOID * NetworkAddress,
OUT PUINT NetworkAddressLength,
IN NDIS_HANDLE ConfigurationHandle
);
EXPORT
VOID
NdisReadEisaSlotInformation(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE WrapperConfigurationContext,
OUT PUINT SlotNumber,
OUT PNDIS_EISA_FUNCTION_INFORMATION EisaData
);
EXPORT
VOID
NdisReadEisaSlotInformationEx(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE WrapperConfigurationContext,
OUT PUINT SlotNumber,
OUT PNDIS_EISA_FUNCTION_INFORMATION *EisaData,
OUT PUINT NumberOfFunctions
);
EXPORT
ULONG
NdisReadPciSlotInformation(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG SlotNumber,
IN ULONG Offset,
IN PVOID Buffer,
IN ULONG Length
);
EXPORT
ULONG
NdisWritePciSlotInformation(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG SlotNumber,
IN ULONG Offset,
IN PVOID Buffer,
IN ULONG Length
);
EXPORT
ULONG
NdisReadPcmciaAttributeMemory(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Offset,
IN PVOID Buffer,
IN ULONG Length
);
EXPORT
ULONG
NdisWritePcmciaAttributeMemory(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Offset,
IN PVOID Buffer,
IN ULONG Length
);
//
// Buffer Pool
//
EXPORT
VOID
NdisAllocateBufferPool(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE PoolHandle,
IN UINT NumberOfDescriptors
);
EXPORT
VOID
NdisFreeBufferPool(
IN NDIS_HANDLE PoolHandle
);
EXPORT
VOID
NdisAllocateBuffer(
OUT PNDIS_STATUS Status,
OUT PNDIS_BUFFER * Buffer,
IN NDIS_HANDLE PoolHandle,
IN PVOID VirtualAddress,
IN UINT Length
);
EXPORT
VOID
NdisCopyBuffer(
OUT PNDIS_STATUS Status,
OUT PNDIS_BUFFER * Buffer,
IN NDIS_HANDLE PoolHandle,
IN PVOID MemoryDescriptor,
IN UINT Offset,
IN UINT Length
);
//
// VOID
// NdisCopyLookaheadData(
// IN PVOID Destination,
// IN PVOID Source,
// IN ULONG Length,
// IN ULONG ReceiveFlags
// );
//
#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
//
// Packet Pool
//
EXPORT
VOID
NdisAllocatePacketPool(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE PoolHandle,
IN UINT NumberOfDescriptors,
IN UINT ProtocolReservedLength
);
EXPORT
VOID
NdisAllocatePacketPoolEx(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE PoolHandle,
IN UINT NumberOfDescriptors,
IN UINT NumberOfOverflowDescriptors,
IN UINT ProtocolReservedLength
);
EXPORT
VOID
NdisSetPacketPoolProtocolId(
IN NDIS_HANDLE PacketPoolHandle,
IN UINT ProtocolId
);
EXPORT
UINT
NdisPacketPoolUsage(
IN NDIS_HANDLE PoolHandle
);
EXPORT
UINT
NdisPacketSize(
IN UINT ProtocolReservedSize
);
EXPORT
NDIS_HANDLE
NdisGetPoolFromPacket(
IN PNDIS_PACKET Packet
);
EXPORT
PNDIS_PACKET_STACK
NdisIMGetCurrentPacketStack(
IN PNDIS_PACKET Packet,
OUT BOOLEAN * StacksRemaining
);
EXPORT
VOID
NdisFreePacketPool(
IN NDIS_HANDLE PoolHandle
);
EXPORT
VOID
NdisFreePacket(
IN PNDIS_PACKET Packet
);
EXPORT
VOID
NdisDprFreePacket(
IN PNDIS_PACKET Packet
);
EXPORT
VOID
NdisDprFreePacketNonInterlocked(
IN PNDIS_PACKET Packet
);
EXPORT
VOID
NdisAllocatePacket(
OUT PNDIS_STATUS Status,
OUT PNDIS_PACKET * Packet,
IN NDIS_HANDLE PoolHandle
);
EXPORT
VOID
NdisDprAllocatePacket(
OUT PNDIS_STATUS Status,
OUT PNDIS_PACKET * Packet,
IN NDIS_HANDLE PoolHandle
);
EXPORT
VOID
NdisDprAllocatePacketNonInterlocked(
OUT PNDIS_STATUS Status,
OUT PNDIS_PACKET * Packet,
IN NDIS_HANDLE PoolHandle
);
// VOID
// NdisReinitializePacket(
// IN OUT PNDIS_PACKET Packet
// );
#define NdisReinitializePacket(Packet) \
{ \
(Packet)->Private.Head = (PNDIS_BUFFER)NULL; \
(Packet)->Private.ValidCounts = FALSE; \
}
//
// Block Pool APIs
//
typedef
VOID
(__stdcall *NDIS_BLOCK_INITIALIZER) (
IN PUCHAR Block,
IN SIZE_T NumberOfBytes
);
NDIS_HANDLE
NdisCreateBlockPool(
IN USHORT BlockSize,
IN USHORT FreeBlockLinkOffset,
IN ULONG Tag,
IN NDIS_BLOCK_INITIALIZER InitFunction OPTIONAL
);
VOID
NdisDestroyBlockPool(
IN NDIS_HANDLE BlockPoolHandle
);
PUCHAR
NdisAllocateFromBlockPool(
IN NDIS_HANDLE BlockPoolHandle
);
VOID
NdisFreeToBlockPool(
IN PUCHAR Block
);
#if BINARY_COMPATIBLE
EXPORT
VOID
NdisFreeBuffer(
IN PNDIS_BUFFER Buffer
);
EXPORT
VOID
NdisQueryBuffer(
IN PNDIS_BUFFER Buffer,
OUT PVOID * VirtualAddress OPTIONAL,
OUT PUINT Length
);
EXPORT
VOID
NdisQueryBufferSafe(
IN PNDIS_BUFFER Buffer,
OUT PVOID * VirtualAddress OPTIONAL,
OUT PUINT Length,
IN MM_PAGE_PRIORITY Priority
);
EXPORT
VOID
NdisQueryBufferOffset(
IN PNDIS_BUFFER Buffer,
OUT PUINT Offset,
OUT PUINT Length
);
//
// This is a combination of NdisQueryPacket and NdisQueryBuffer and
// optimized for protocols to get the first Buffer, its VA and its size.
//
VOID
NdisGetFirstBufferFromPacket(
IN PNDIS_PACKET Packet,
OUT PNDIS_BUFFER * FirstBuffer,
OUT PVOID * FirstBufferVA,
OUT PUINT FirstBufferLength,
OUT PUINT TotalBufferLength
);
VOID
NdisGetFirstBufferFromPacketSafe(
IN PNDIS_PACKET Packet,
OUT PNDIS_BUFFER * FirstBuffer,
OUT PVOID * FirstBufferVA,
OUT PUINT FirstBufferLength,
OUT PUINT TotalBufferLength,
IN MM_PAGE_PRIORITY Priority
);
//
// This is used to determine how many physical pieces
// an NDIS_BUFFER will take up when mapped.
//
EXPORT
ULONG
NDIS_BUFFER_TO_SPAN_PAGES(
IN PNDIS_BUFFER Buffer
);
EXPORT
VOID
NdisGetBufferPhysicalArraySize(
IN PNDIS_BUFFER Buffer,
OUT PUINT ArraySize
);
#else // BINARY_COMPATIBLE
#define NdisFreeBuffer(Buffer) IoFreeMdl(Buffer)
#define NdisQueryBuffer(_Buffer, _VirtualAddress, _Length) \
{ \
if (ARGUMENT_PRESENT(_VirtualAddress)) \
{ \
*(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdl(_Buffer); \
} \
*(_Length) = MmGetMdlByteCount(_Buffer); \
}
#define NdisQueryBufferSafe(_Buffer, _VirtualAddress, _Length, _Priority) \
{ \
if (ARGUMENT_PRESENT(_VirtualAddress)) \
{ \
*(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdlSafe(_Buffer, _Priority); \
} \
*(_Length) = MmGetMdlByteCount(_Buffer); \
}
#define NdisQueryBufferOffset(_Buffer, _Offset, _Length) \
{ \
*(_Offset) = MmGetMdlByteOffset(_Buffer); \
*(_Length) = MmGetMdlByteCount(_Buffer); \
}
#define NdisGetFirstBufferFromPacket(_Packet, \
_FirstBuffer, \
_FirstBufferVA, \
_FirstBufferLength, \
_TotalBufferLength) \
{ \
PNDIS_BUFFER _pBuf; \
\
_pBuf = (_Packet)->Private.Head; \
*(_FirstBuffer) = _pBuf; \
if (_pBuf) \
{ \
*(_FirstBufferVA) = MmGetSystemAddressForMdl(_pBuf); \
*(_FirstBufferLength) = \
*(_TotalBufferLength) = MmGetMdlByteCount(_pBuf); \
for (_pBuf = _pBuf->Next; \
_pBuf != NULL; \
_pBuf = _pBuf->Next) \
{ \
*(_TotalBufferLength) += MmGetMdlByteCount(_pBuf); \
} \
} \
else \
{ \
*(_FirstBufferVA) = 0; \
*(_FirstBufferLength) = 0; \
*(_TotalBufferLength) = 0; \
} \
}
#define NdisGetFirstBufferFromPacketSafe(_Packet, \
_FirstBuffer, \
_FirstBufferVA, \
_FirstBufferLength, \
_TotalBufferLength, \
_Priority) \
{ \
PNDIS_BUFFER _pBuf; \
\
_pBuf = (_Packet)->Private.Head; \
*(_FirstBuffer) = _pBuf; \
if (_pBuf) \
{ \
*(_FirstBufferVA) = MmGetSystemAddressForMdlSafe(_pBuf, _Priority); \
*(_FirstBufferLength) = *(_TotalBufferLength) = MmGetMdlByteCount(_pBuf); \
for (_pBuf = _pBuf->Next; \
_pBuf != NULL; \
_pBuf = _pBuf->Next) \
{ \
*(_TotalBufferLength) += MmGetMdlByteCount(_pBuf); \
} \
} \
else \
{ \
*(_FirstBufferVA) = 0; \
*(_FirstBufferLength) = 0; \
*(_TotalBufferLength) = 0; \
} \
}
#define NDIS_BUFFER_TO_SPAN_PAGES(_Buffer) \
(MmGetMdlByteCount(_Buffer)==0 ? \
1 : \
(ADDRESS_AND_SIZE_TO_SPAN_PAGES( \
MmGetMdlVirtualAddress(_Buffer), \
MmGetMdlByteCount(_Buffer))))
#define NdisGetBufferPhysicalArraySize(Buffer, ArraySize) \
(*(ArraySize) = NDIS_BUFFER_TO_SPAN_PAGES(Buffer))
#endif // BINARY_COMPATIBLE
/*++
NDIS_BUFFER_LINKAGE(
IN PNDIS_BUFFER Buffer
);
--*/
#define NDIS_BUFFER_LINKAGE(Buffer) ((Buffer)->Next)
/*++
VOID
NdisRecalculatePacketCounts(
IN OUT PNDIS_PACKET Packet
);
--*/
#define NdisRecalculatePacketCounts(Packet) \
{ \
{ \
PNDIS_BUFFER TmpBuffer = (Packet)->Private.Head; \
if (TmpBuffer) \
{ \
while (TmpBuffer->Next) \
{ \
TmpBuffer = TmpBuffer->Next; \
} \
(Packet)->Private.Tail = TmpBuffer; \
} \
(Packet)->Private.ValidCounts = FALSE; \
} \
}
/*++
VOID
NdisChainBufferAtFront(
IN OUT PNDIS_PACKET Packet,
IN OUT PNDIS_BUFFER Buffer
);
--*/
#define NdisChainBufferAtFront(Packet, Buffer) \
{ \
PNDIS_BUFFER TmpBuffer = (Buffer); \
\
for (;;) \
{ \
if (TmpBuffer->Next == (PNDIS_BUFFER)NULL) \
break; \
TmpBuffer = TmpBuffer->Next; \
} \
if ((Packet)->Private.Head == NULL) \
{ \
(Packet)->Private.Tail = TmpBuffer; \
} \
TmpBuffer->Next = (Packet)->Private.Head; \
(Packet)->Private.Head = (Buffer); \
(Packet)->Private.ValidCounts = FALSE; \
}
/*++
VOID
NdisChainBufferAtBack(
IN OUT PNDIS_PACKET Packet,
IN OUT PNDIS_BUFFER Buffer
);
--*/
#define NdisChainBufferAtBack(Packet, Buffer) \
{ \
PNDIS_BUFFER TmpBuffer = (Buffer); \
\
for (;;) \
{ \
if (TmpBuffer->Next == NULL) \
break; \
TmpBuffer = TmpBuffer->Next; \
} \
if ((Packet)->Private.Head != NULL) \
{ \
(Packet)->Private.Tail->Next = (Buffer); \
} \
else \
{ \
(Packet)->Private.Head = (Buffer); \
} \
(Packet)->Private.Tail = TmpBuffer; \
(Packet)->Private.ValidCounts = FALSE; \
}
EXPORT
VOID
NdisUnchainBufferAtFront(
IN OUT PNDIS_PACKET Packet,
OUT PNDIS_BUFFER * Buffer
);
EXPORT
VOID
NdisUnchainBufferAtBack(
IN OUT PNDIS_PACKET Packet,
OUT PNDIS_BUFFER * Buffer
);
/*++
VOID
NdisQueryPacket(
IN PNDIS_PACKET _Packet,
OUT PUINT _PhysicalBufferCount OPTIONAL,
OUT PUINT _BufferCount OPTIONAL,
OUT PNDIS_BUFFER * _FirstBuffer OPTIONAL,
OUT PUINT _TotalPacketLength OPTIONAL
);
--*/
#pragma warning(push)
#pragma warning(disable:4127)
__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) != NULL)
{
PNDIS_BUFFER * __FirstBuffer = (_FirstBuffer);
*(__FirstBuffer) = (_Packet)->Private.Head;
}
if ((_TotalPacketLength) || (_BufferCount) || (_PhysicalBufferCount))
{
if (!(_Packet)->Private.ValidCounts)
{
PNDIS_BUFFER TmpBuffer = (_Packet)->Private.Head;
UINT PTotalLength = 0, PPhysicalCount = 0, PAddedCount = 0;
UINT PacketLength, Offset;
while (TmpBuffer != (PNDIS_BUFFER)NULL)
{
NdisQueryBufferOffset(TmpBuffer, &Offset, &PacketLength);
PTotalLength += PacketLength;
PPhysicalCount += (UINT)NDIS_BUFFER_TO_SPAN_PAGES(TmpBuffer);
++PAddedCount;
TmpBuffer = TmpBuffer->Next;
}
(_Packet)->Private.Count = PAddedCount;
(_Packet)->Private.TotalLength = PTotalLength;
(_Packet)->Private.PhysicalCount = PPhysicalCount;
(_Packet)->Private.ValidCounts = TRUE;
}
if (_PhysicalBufferCount)
{
PUINT __PhysicalBufferCount = (_PhysicalBufferCount);
*(__PhysicalBufferCount) = (_Packet)->Private.PhysicalCount;
}
if (_BufferCount)
{
PUINT __BufferCount = (_BufferCount);
*(__BufferCount) = (_Packet)->Private.Count;
}
if (_TotalPacketLength)
{
PUINT __TotalPacketLength = (_TotalPacketLength);
*(__TotalPacketLength) = (_Packet)->Private.TotalLength;
}
}
}
#pragma warning(pop)
/*++
VOID
NdisQueryPacketLength(
IN PNDIS_PACKET _Packet,
OUT PUINT _TotalPacketLength OPTIONAL
);
--*/
#define NdisQueryPacketLength(_Packet, \
_TotalPacketLength) \
{ \
if (!(_Packet)->Private.ValidCounts) \
{ \
NdisQueryPacket(_Packet, NULL, NULL, NULL, _TotalPacketLength); \
} \
else *(_TotalPacketLength) = (_Packet)->Private.TotalLength; \
}
/*++
VOID
NdisGetNextBuffer(
IN PNDIS_BUFFER CurrentBuffer,
OUT PNDIS_BUFFER * NextBuffer
);
--*/
#define NdisGetNextBuffer(CurrentBuffer, NextBuffer) \
{ \
*(NextBuffer) = (CurrentBuffer)->Next; \
}
#if BINARY_COMPATIBLE
VOID
NdisAdjustBufferLength(
IN PNDIS_BUFFER Buffer,
IN UINT Length
);
#else // BINARY_COMPATIBLE
#define NdisAdjustBufferLength(Buffer, Length) (((Buffer)->ByteCount) = (Length))
#endif // BINARY_COMPATIBLE
EXPORT
VOID
NdisCopyFromPacketToPacket(
IN PNDIS_PACKET Destination,
IN UINT DestinationOffset,
IN UINT BytesToCopy,
IN PNDIS_PACKET Source,
IN UINT SourceOffset,
OUT PUINT BytesCopied
);
EXPORT
VOID
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
);
EXPORT
NDIS_STATUS
NdisAllocateMemory(
OUT PVOID * VirtualAddress,
IN UINT Length,
IN UINT MemoryFlags,
IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress
);
EXPORT
NDIS_STATUS
NdisAllocateMemoryWithTag(
OUT PVOID * VirtualAddress,
IN UINT Length,
IN ULONG Tag
);
EXPORT
VOID
NdisFreeMemory(
IN PVOID VirtualAddress,
IN UINT Length,
IN UINT MemoryFlags
);
/*++
VOID
NdisStallExecution(
IN UINT MicrosecondsToStall
)
--*/
#define NdisStallExecution(MicroSecondsToStall) KeStallExecutionProcessor(MicroSecondsToStall)
EXPORT
VOID
NdisInitializeEvent(
IN PNDIS_EVENT Event
);
EXPORT
VOID
NdisSetEvent(
IN PNDIS_EVENT Event
);
EXPORT
VOID
NdisResetEvent(
IN PNDIS_EVENT Event
);
EXPORT
BOOLEAN
NdisWaitEvent(
IN PNDIS_EVENT Event,
IN UINT msToWait
);
/*++
VOID
NdisInitializeWorkItem(
IN PNDIS_WORK_ITEM WorkItem,
IN NDIS_PROC Routine,
IN PVOID Context
);
--*/
#define NdisInitializeWorkItem(_WI_, _R_, _C_) \
{ \
(_WI_)->Context = _C_; \
(_WI_)->Routine = _R_; \
}
EXPORT
NDIS_STATUS
NdisScheduleWorkItem(
IN PNDIS_WORK_ITEM WorkItem
);
//
// Simple I/O support
//
EXPORT
VOID
NdisOpenFile(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE FileHandle,
OUT PUINT FileLength,
IN PNDIS_STRING FileName,
IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress
);
EXPORT
VOID
NdisCloseFile(
IN NDIS_HANDLE FileHandle
);
EXPORT
VOID
NdisMapFile(
OUT PNDIS_STATUS Status,
OUT PVOID * MappedBuffer,
IN NDIS_HANDLE FileHandle
);
EXPORT
VOID
NdisUnmapFile(
IN NDIS_HANDLE FileHandle
);
//
// Portability extensions
//
/*++
VOID
NdisFlushBuffer(
IN PNDIS_BUFFER Buffer,
IN BOOLEAN WriteToDevice
)
--*/
#define NdisFlushBuffer(Buffer,WriteToDevice) \
KeFlushIoBuffers((Buffer),!(WriteToDevice), TRUE)
EXPORT
ULONG
NdisGetSharedDataAlignment(
VOID
);
//
// Write Port
//
/*++
VOID
NdisWritePortUchar(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Port,
IN UCHAR Data
)
--*/
#define NdisWritePortUchar(Handle,Port,Data) \
WRITE_PORT_UCHAR((PUCHAR)(NDIS_PORT_TO_PORT(Handle,Port)),(UCHAR)(Data))
/*++
VOID
NdisWritePortUshort(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Port,
IN USHORT Data
)
--*/
#define NdisWritePortUshort(Handle,Port,Data) \
WRITE_PORT_USHORT((PUSHORT)(NDIS_PORT_TO_PORT(Handle,Port)),(USHORT)(Data))
/*++
VOID
NdisWritePortUlong(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Port,
IN ULONG Data
)
--*/
#define NdisWritePortUlong(Handle,Port,Data) \
WRITE_PORT_ULONG((PULONG)(NDIS_PORT_TO_PORT(Handle,Port)),(ULONG)(Data))
//
// Write Port Buffers
//
/*++
VOID
NdisWritePortBufferUchar(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Port,
IN PUCHAR Buffer,
IN ULONG Length
)
--*/
#define NdisWritePortBufferUchar(Handle,Port,Buffer,Length) \
NdisRawWritePortBufferUchar(NDIS_PORT_TO_PORT((Handle),(Port)),(Buffer),(Length))
/*++
VOID
NdisWritePortBufferUshort(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Port,
IN PUSHORT Buffer,
IN ULONG Length
)
--*/
#define NdisWritePortBufferUshort(Handle,Port,Buffer,Length) \
NdisRawWritePortBufferUshort(NDIS_PORT_TO_PORT((Handle),(Port)),(Buffer),(Length))
/*++
VOID
NdisWritePortBufferUlong(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Port,
IN PULONG Buffer,
IN ULONG Length
)
--*/
#define NdisWritePortBufferUlong(Handle,Port,Buffer,Length) \
NdisRawWritePortBufferUlong(NDIS_PORT_TO_PORT((Handle),(Port)),(Buffer),(Length))
//
// Read Ports
//
/*++
VOID
NdisReadPortUchar(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Port,
OUT PUCHAR Data
)
--*/
#define NdisReadPortUchar(Handle,Port, Data) \
NdisRawReadPortUchar(NDIS_PORT_TO_PORT((Handle),(Port)),(Data))
/*++
VOID
NdisReadPortUshort(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Port,
OUT PUSHORT Data
)
--*/
#define NdisReadPortUshort(Handle,Port,Data) \
NdisRawReadPortUshort(NDIS_PORT_TO_PORT((Handle),(Port)),(Data))
/*++
VOID
NdisReadPortUlong(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Port,
OUT PULONG Data
)
--*/
#define NdisReadPortUlong(Handle,Port,Data) \
NdisRawReadPortUlong(NDIS_PORT_TO_PORT((Handle),(Port)),(Data))
//
// Read Buffer Ports
//
/*++
VOID
NdisReadPortBufferUchar(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Port,
OUT PUCHAR Buffer,
IN ULONG Length
)
--*/
#define NdisReadPortBufferUchar(Handle,Port,Buffer,Length) \
NdisRawReadPortBufferUchar(NDIS_PORT_TO_PORT((Handle),(Port)),(Buffer),(Length))
/*++
VOID
NdisReadPortBufferUshort(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Port,
OUT PUSHORT Buffer,
IN ULONG Length
)
--*/
#define NdisReadPortBufferUshort(Handle,Port,Buffer,Length) \
NdisRawReadPortBufferUshort(NDIS_PORT_TO_PORT((Handle),(Port)),(Buffer),(Length))
/*++
VOID
NdisReadPortBufferUlong(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Port,
OUT PULONG Buffer,
IN ULONG Length
)
--*/
#define NdisReadPortBufferUlong(Handle,Port,Buffer) \
NdisRawReadPortBufferUlong(NDIS_PORT_TO_PORT((Handle),(Port)),(Buffer),(Length))
//
// Raw Routines
//
//
// Write Port Raw
//
/*++
VOID
NdisRawWritePortUchar(
IN ULONG_PTR Port,
IN UCHAR Data
)
--*/
#define NdisRawWritePortUchar(Port,Data) \
WRITE_PORT_UCHAR((PUCHAR)(Port),(UCHAR)(Data))
/*++
VOID
NdisRawWritePortUshort(
IN ULONG_PTR Port,
IN USHORT Data
)
--*/
#define NdisRawWritePortUshort(Port,Data) \
WRITE_PORT_USHORT((PUSHORT)(Port),(USHORT)(Data))
/*++
VOID
NdisRawWritePortUlong(
IN ULONG_PTR Port,
IN ULONG Data
)
--*/
#define NdisRawWritePortUlong(Port,Data) \
WRITE_PORT_ULONG((PULONG)(Port),(ULONG)(Data))
//
// Raw Write Port Buffers
//
/*++
VOID
NdisRawWritePortBufferUchar(
IN ULONG_PTR Port,
IN PUCHAR Buffer,
IN ULONG Length
)
--*/
#define NdisRawWritePortBufferUchar(Port,Buffer,Length) \
WRITE_PORT_BUFFER_UCHAR((PUCHAR)(Port),(PUCHAR)(Buffer),(Length))
/*++
VOID
NdisRawWritePortBufferUshort(
IN ULONG_PTR Port,
IN PUSHORT Buffer,
IN ULONG Length
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisRawWritePortBufferUshort(Port,Buffer,Length) \
WRITE_PORT_BUFFER_USHORT((PUSHORT)(Port),(PUSHORT)(Buffer),(Length))
#else
#define NdisRawWritePortBufferUshort(Port,Buffer,Length) \
{ \
ULONG_PTR _Port = (ULONG_PTR)(Port); \
PUSHORT _Current = (Buffer); \
PUSHORT _End = _Current + (Length); \
for ( ; _Current < _End; ++_Current) \
{ \
WRITE_PORT_USHORT((PUSHORT)_Port,*(UNALIGNED USHORT *)_Current);\
} \
}
#endif
/*++
VOID
NdisRawWritePortBufferUlong(
IN ULONG_PTR Port,
IN PULONG Buffer,
IN ULONG Length
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisRawWritePortBufferUlong(Port,Buffer,Length) \
WRITE_PORT_BUFFER_ULONG((PULONG)(Port),(PULONG)(Buffer),(Length))
#else
#define NdisRawWritePortBufferUlong(Port,Buffer,Length) \
{ \
ULONG_PTR _Port = (ULONG_PTR)(Port); \
PULONG _Current = (Buffer); \
PULONG _End = _Current + (Length); \
for ( ; _Current < _End; ++_Current) \
{ \
WRITE_PORT_ULONG((PULONG)_Port,*(UNALIGNED ULONG *)_Current); \
} \
}
#endif
//
// Raw Read Ports
//
/*++
VOID
NdisRawReadPortUchar(
IN ULONG_PTR Port,
OUT PUCHAR Data
)
--*/
#define NdisRawReadPortUchar(Port, Data) \
*(Data) = READ_PORT_UCHAR((PUCHAR)(Port))
/*++
VOID
NdisRawReadPortUshort(
IN ULONG_PTR Port,
OUT PUSHORT Data
)
--*/
#define NdisRawReadPortUshort(Port,Data) \
*(Data) = READ_PORT_USHORT((PUSHORT)(Port))
/*++
VOID
NdisRawReadPortUlong(
IN ULONG_PTR Port,
OUT PULONG Data
)
--*/
#define NdisRawReadPortUlong(Port,Data) \
*(Data) = READ_PORT_ULONG((PULONG)(Port))
//
// Raw Read Buffer Ports
//
/*++
VOID
NdisRawReadPortBufferUchar(
IN ULONG_PTR Port,
OUT PUCHAR Buffer,
IN ULONG Length
)
--*/
#define NdisRawReadPortBufferUchar(Port,Buffer,Length) \
READ_PORT_BUFFER_UCHAR((PUCHAR)(Port),(PUCHAR)(Buffer),(Length))
/*++
VOID
NdisRawReadPortBufferUshort(
IN ULONG_PTR Port,
OUT PUSHORT Buffer,
IN ULONG Length
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisRawReadPortBufferUshort(Port,Buffer,Length) \
READ_PORT_BUFFER_USHORT((PUSHORT)(Port),(PUSHORT)(Buffer),(Length))
#else
#define NdisRawReadPortBufferUshort(Port,Buffer,Length) \
{ \
ULONG_PTR _Port = (ULONG_PTR)(Port); \
PUSHORT _Current = (Buffer); \
PUSHORT _End = _Current + (Length); \
for ( ; _Current < _End; ++_Current) \
{ \
*(UNALIGNED USHORT *)_Current = READ_PORT_USHORT((PUSHORT)_Port); \
} \
}
#endif
/*++
VOID
NdisRawReadPortBufferUlong(
IN ULONG_PTR Port,
OUT PULONG Buffer,
IN ULONG Length
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisRawReadPortBufferUlong(Port,Buffer,Length) \
READ_PORT_BUFFER_ULONG((PULONG)(Port),(PULONG)(Buffer),(Length))
#else
#define NdisRawReadPortBufferUlong(Port,Buffer,Length) \
{ \
ULONG_PTR _Port = (ULONG_PTR)(Port); \
PULONG _Current = (Buffer); \
PULONG _End = _Current + (Length); \
for ( ; _Current < _End; ++_Current) \
{ \
*(UNALIGNED ULONG *)_Current = READ_PORT_ULONG((PULONG)_Port); \
} \
}
#endif
//
// Write Registers
//
/*++
VOID
NdisWriteRegisterUchar(
IN PUCHAR Register,
IN UCHAR Data
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisWriteRegisterUchar(Register,Data) \
WRITE_REGISTER_UCHAR((Register),(Data))
#else
#define NdisWriteRegisterUchar(Register,Data) \
{ \
WRITE_REGISTER_UCHAR((Register),(Data)); \
READ_REGISTER_UCHAR(Register); \
}
#endif
/*++
VOID
NdisWriteRegisterUshort(
IN PUCHAR Register,
IN USHORT Data
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisWriteRegisterUshort(Register,Data) \
WRITE_REGISTER_USHORT((Register),(Data))
#else
#define NdisWriteRegisterUshort(Register,Data) \
{ \
WRITE_REGISTER_USHORT((Register),(Data)); \
READ_REGISTER_USHORT(Register); \
}
#endif
/*++
VOID
NdisWriteRegisterUlong(
IN PUCHAR Register,
IN ULONG Data
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisWriteRegisterUlong(Register,Data) WRITE_REGISTER_ULONG((Register),(Data))
#else
#define NdisWriteRegisterUlong(Register,Data) \
{ \
WRITE_REGISTER_ULONG((Register),(Data)); \
READ_REGISTER_ULONG(Register); \
}
#endif
/*++
VOID
NdisReadRegisterUchar(
IN PUCHAR Register,
OUT PUCHAR Data
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisReadRegisterUchar(Register,Data) *(Data) = *((volatile UCHAR * const)(Register))
#else
#define NdisReadRegisterUchar(Register,Data) *(Data) = READ_REGISTER_UCHAR((PUCHAR)(Register))
#endif
/*++
VOID
NdisReadRegisterUshort(
IN PUSHORT Register,
OUT PUSHORT Data
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisReadRegisterUshort(Register,Data) *(Data) = *((volatile USHORT * const)(Register))
#else
#define NdisReadRegisterUshort(Register,Data) *(Data) = READ_REGISTER_USHORT((PUSHORT)(Register))
#endif
/*++
VOID
NdisReadRegisterUlong(
IN PULONG Register,
OUT PULONG Data
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisReadRegisterUlong(Register,Data) *(Data) = *((volatile ULONG * const)(Register))
#else
#define NdisReadRegisterUlong(Register,Data) *(Data) = READ_REGISTER_ULONG((PULONG)(Register))
#endif
#define NdisEqualAnsiString(_String1,_String2, _CaseInsensitive) \
RtlEqualAnsiString(_String1, _String2, _CaseInsensitive)
#define NdisEqualString(_String1, _String2, _CaseInsensitive) \
RtlEqualUnicodeString(_String1, _String2, _CaseInsensitive)
#define NdisEqualUnicodeString(_String1, _String2, _CaseInsensitive) \
RtlEqualUnicodeString(_String1, _String2, _CaseInsensitive)
EXPORT
VOID __cdecl
NdisWriteErrorLogEntry(
IN NDIS_HANDLE NdisAdapterHandle,
IN NDIS_ERROR_CODE ErrorCode,
IN ULONG NumberOfErrorValues,
...
);
EXPORT
VOID
NdisInitializeString(
OUT PNDIS_STRING Destination,
IN PUCHAR Source
);
#define NdisFreeString(String) NdisFreeMemory((String).Buffer, (String).MaximumLength, 0)
#define NdisPrintString(String) DbgPrint("%ls",(String).Buffer)
/*++
VOID
NdisCreateLookaheadBufferFromSharedMemory(
IN PVOID pSharedMemory,
IN UINT LookaheadLength,
OUT PVOID * pLookaheadBuffer
);
--*/
#define NdisCreateLookaheadBufferFromSharedMemory(_S, _L, _B) ((*(_B)) = (_S))
/*++
VOID
NdisDestroyLookaheadBufferFromSharedMemory(
IN PVOID pLookaheadBuffer
);
--*/
#define NdisDestroyLookaheadBufferFromSharedMemory(_B)
//
// The following declarations are shared between ndismac.h and ndismini.h. They
// are meant to be for internal use only. They should not be used directly by
// miniport drivers.
//
//
// declare these first since they point to each other
//
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 _CO_CALL_PARAMETERS CO_CALL_PARAMETERS, *PCO_CALL_PARAMETERS;
typedef struct _CO_MEDIA_PARAMETERS CO_MEDIA_PARAMETERS, *PCO_MEDIA_PARAMETERS;
typedef struct _NDIS_CALL_MANAGER_CHARACTERISTICS *PNDIS_CALL_MANAGER_CHARACTERISTICS;
typedef struct _NDIS_AF_LIST NDIS_AF_LIST, *PNDIS_AF_LIST;
typedef struct _X_FILTER ETH_FILTER, *PETH_FILTER;
typedef struct _X_FILTER FDDI_FILTER, *PFDDI_FILTER;
typedef struct _X_FILTER TR_FILTER, *PTR_FILTER;
typedef struct _X_FILTER NULL_FILTER, *PNULL_FILTER;
//
// Timers.
//
typedef
VOID
(*PNDIS_TIMER_FUNCTION) (
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
);
typedef struct _NDIS_TIMER
{
KTIMER Timer;
KDPC Dpc;
} NDIS_TIMER, *PNDIS_TIMER;
EXPORT
VOID
NdisInitializeTimer(
IN OUT PNDIS_TIMER Timer,
IN PNDIS_TIMER_FUNCTION TimerFunction,
IN PVOID FunctionContext
);
VOID
NdisCancelTimer(
IN PNDIS_TIMER Timer,
OUT PBOOLEAN TimerCancelled
);
EXPORT
VOID
NdisSetTimer(
IN PNDIS_TIMER Timer,
IN UINT MillisecondsToDelay
);
EXPORT
VOID
NdisSetTimerEx(
IN PNDIS_TIMER Timer,
IN UINT MillisecondsToDelay,
IN PVOID FunctionContext
);
//
// DMA operations.
//
EXPORT
VOID
NdisAllocateDmaChannel(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE NdisDmaHandle,
IN NDIS_HANDLE NdisAdapterHandle,
IN PNDIS_DMA_DESCRIPTION DmaDescription,
IN ULONG MaximumLength
);
EXPORT
VOID
NdisSetupDmaTransfer(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE NdisDmaHandle,
IN PNDIS_BUFFER Buffer,
IN ULONG Offset,
IN ULONG Length,
IN BOOLEAN WriteToDevice
);
EXPORT
VOID
NdisCompleteDmaTransfer(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE NdisDmaHandle,
IN PNDIS_BUFFER Buffer,
IN ULONG Offset,
IN ULONG Length,
IN BOOLEAN WriteToDevice
);
//
// Wrapper initialization and termination.
//
EXPORT
VOID
NdisInitializeWrapper(
OUT PNDIS_HANDLE NdisWrapperHandle,
IN PVOID SystemSpecific1,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
);
EXPORT
VOID
NdisTerminateWrapper(
IN NDIS_HANDLE NdisWrapperHandle,
IN PVOID SystemSpecific
);
//
// Shared memory
//
#define NdisUpdateSharedMemory(_H, _L, _V, _P)
//
// System processor count
//
EXPORT
CCHAR
NdisSystemProcessorCount(
VOID
);
EXPORT
PVOID
NdisGetRoutineAddress(
IN PNDIS_STRING NdisRoutineName
);
EXPORT
UINT
NdisGetVersion(
VOID
);
//
// Ansi/Unicode support routines
//
#if BINARY_COMPATIBLE
EXPORT
VOID
NdisInitAnsiString(
IN OUT PANSI_STRING DestinationString,
IN PCSTR SourceString
);
EXPORT
VOID
NdisInitUnicodeString(
IN OUT PUNICODE_STRING DestinationString,
IN PCWSTR SourceString
);
EXPORT
NDIS_STATUS
NdisAnsiStringToUnicodeString(
IN OUT PUNICODE_STRING DestinationString,
IN PANSI_STRING SourceString
);
EXPORT
NDIS_STATUS
NdisUnicodeStringToAnsiString(
IN OUT PANSI_STRING DestinationString,
IN PUNICODE_STRING SourceString
);
EXPORT
NDIS_STATUS
NdisUpcaseUnicodeString(
OUT PUNICODE_STRING DestinationString,
IN PUNICODE_STRING SourceString
);
#else // BINARY_COMPATIBLE
#define NdisInitAnsiString(_as, s) RtlInitString(_as, s)
#define NdisInitUnicodeString(_us, s) RtlInitUnicodeString(_us, s)
#define NdisAnsiStringToUnicodeString(_us, _as) RtlAnsiStringToUnicodeString(_us, _as, FALSE)
#define NdisUnicodeStringToAnsiString(_as, _us) RtlUnicodeStringToAnsiString(_as, _us, FALSE)
#define NdisUpcaseUnicodeString(_d, _s) RtlUpcaseUnicodeString(_d, _s, FALSE)
#endif // BINARY_COMPATIBLE
//
// Non-paged lookaside list support routines
//
#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)
EXPORT
VOID
NdisSetPacketStatus(
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status,
IN NDIS_HANDLE Handle,
IN ULONG Code
);
#define NDIS_MAX_EVENT_LOG_DATA_SIZE ((ERROR_LOG_MAXIMUM_SIZE - sizeof(IO_ERROR_LOG_PACKET) + sizeof(ULONG)) & ~3)
#if NDIS_RECV_SCALE
#define NDIS_MAX_PROCESSOR_COUNT 32
typedef struct _NDIS_RECEIVE_SCALE_HASH_MAP
{
CCHAR TargetCpu[NDIS_MAX_PROCESSOR_COUNT];
} NDIS_RECEIVE_SCALE_HASH_MAP, *PNDIS_RECEIVE_SCALE_HASH_MAP;
//
// used in OID_GEN_RECEIVE_SCALE_PARAMETERS
//
typedef struct _NDIS_RECEIVE_SCALE_PARAMETERS
{
USHORT EthType;
USHORT CurrentHashFunction;
NDIS_RECEIVE_SCALE_HASH_MAP HashMap;
} NDIS_RECEIVE_SCALE_PARAMETERS, *PNDIS_RECEIVE_SCALE_PARAMETERS;
#endif
#define NDIS_CURRENT_PROCESSOR KeGetCurrentProcessorNumber()
#if defined(NDIS_WRAPPER)
typedef struct _OID_LIST OID_LIST, *POID_LIST;
#endif // NDIS_WRAPPER defined