1977 lines
45 KiB
C
1977 lines
45 KiB
C
|
//
|
|||
|
// 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)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This file contains the definition of an NDIS_OID as
|
|||
|
// well as #defines for all the current OID values.
|
|||
|
//
|
|||
|
|
|||
|
#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 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 MIPS machine, I/O mapped memory can't be accessed with
|
|||
|
// the Rtl routines.
|
|||
|
//
|
|||
|
|
|||
|
#if defined(_M_IX86)
|
|||
|
|
|||
|
#define NdisMoveMappedMemory(Destination,Source,Length) RtlCopyMemory(Destination,Source,Length)
|
|||
|
#define NdisZeroMappedMemory(Destination,Length) RtlZeroMemory(Destination,Length)
|
|||
|
|
|||
|
#elif defined(_M_MRX000)
|
|||
|
|
|||
|
#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; \
|
|||
|
} \
|
|||
|
}
|
|||
|
|
|||
|
#elif defined(_PPC_)
|
|||
|
|
|||
|
#define NdisMoveMappedMemory(Destination,Source,Length) RtlCopyMemory32( Destination, Source, Length );
|
|||
|
#define NdisZeroMappedMemory(Destination,Length) \
|
|||
|
{ \
|
|||
|
PUCHAR _Dest = (Destination); \
|
|||
|
PUCHAR _End = _Dest + (Length); \
|
|||
|
while (_Dest < _End) { \
|
|||
|
*_Dest++ = 0; \
|
|||
|
} \
|
|||
|
}
|
|||
|
|
|||
|
#elif defined(_ALPHA_)
|
|||
|
|
|||
|
#define NdisMoveMappedMemory(Destination,Source,Length) \
|
|||
|
{ \
|
|||
|
PUCHAR _Src = (Source); \
|
|||
|
PUCHAR _Dest = (Destination); \
|
|||
|
PUCHAR _End = _Dest + (Length); \
|
|||
|
while (_Dest < _End) \
|
|||
|
{ \
|
|||
|
NdisReadRegisterUchar(_Src, _Dest); \
|
|||
|
_Src++; \
|
|||
|
_Dest++; \
|
|||
|
} \
|
|||
|
}
|
|||
|
#define NdisZeroMappedMemory(Destination,Length) \
|
|||
|
{ \
|
|||
|
PUCHAR _Dest = (Destination); \
|
|||
|
PUCHAR _End = _Dest + (Length); \
|
|||
|
while (_Dest < _End) { \
|
|||
|
NdisWriteRegisterUchar(_Dest,0); \
|
|||
|
_Dest++; \
|
|||
|
} \
|
|||
|
}
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// On Mips and Intel systems, these are the same. On Alpha, they are different.
|
|||
|
//
|
|||
|
|
|||
|
#if defined(_ALPHA_)
|
|||
|
|
|||
|
#define NdisMoveToMappedMemory(Destination,Source,Length) WRITE_REGISTER_BUFFER_UCHAR(Destination,Source,Length)
|
|||
|
#define NdisMoveFromMappedMemory(Destination,Source,Length) READ_REGISTER_BUFFER_UCHAR(Source,Destination,Length)
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#define NdisMoveToMappedMemory(Destination,Source,Length) NdisMoveMappedMemory(Destination,Source,Length)
|
|||
|
#define NdisMoveFromMappedMemory(Destination,Source,Length) NdisMoveMappedMemory(Destination,Source,Length)
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// definition of the basic spin lock structure
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _NDIS_SPIN_LOCK {
|
|||
|
KSPIN_LOCK SpinLock;
|
|||
|
KIRQL OldIrql;
|
|||
|
} NDIS_SPIN_LOCK, * PNDIS_SPIN_LOCK;
|
|||
|
|
|||
|
|
|||
|
typedef PVOID NDIS_HANDLE, *PNDIS_HANDLE;
|
|||
|
|
|||
|
typedef int NDIS_STATUS, *PNDIS_STATUS; // note default size
|
|||
|
|
|||
|
#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
|
|||
|
} NDIS_PARAMETER_TYPE, *PNDIS_PARAMETER_TYPE;
|
|||
|
|
|||
|
//
|
|||
|
// To store configuration information
|
|||
|
//
|
|||
|
typedef struct _NDIS_CONFIGURATION_PARAMETER {
|
|||
|
NDIS_PARAMETER_TYPE ParameterType;
|
|||
|
union {
|
|||
|
ULONG IntegerData;
|
|||
|
NDIS_STRING StringData;
|
|||
|
} ParameterData;
|
|||
|
} NDIS_CONFIGURATION_PARAMETER, *PNDIS_CONFIGURATION_PARAMETER;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Definitions for the "ProcessorType" keyword
|
|||
|
//
|
|||
|
typedef enum _NDIS_PROCESSOR_TYPE {
|
|||
|
NdisProcessorX86,
|
|||
|
NdisProcessorMips,
|
|||
|
NdisProcessorAlpha,
|
|||
|
NdisProcessorPpc
|
|||
|
} 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
|
|||
|
} 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 {
|
|||
|
ULONG LinkSpeed; // 100 bps units
|
|||
|
ULONG MaximumTotalSize; // suggested max for send packets
|
|||
|
NDIS_WAN_QUALITY Quality;
|
|||
|
USHORT SendWindow; // suggested by the MAC
|
|||
|
UCHAR Address[1]; // variable length, depends on address type
|
|||
|
} NDIS_WAN_LINE_UP, *PNDIS_WAN_LINE_UP;
|
|||
|
|
|||
|
//
|
|||
|
// The structure passed up on a WAN_LINE_DOWN indication
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _NDIS_WAN_LINE_DOWN {
|
|||
|
UCHAR Address[1]; // variable length, depends on address type
|
|||
|
} NDIS_WAN_LINE_DOWN, *PNDIS_WAN_LINE_DOWN;
|
|||
|
|
|||
|
//
|
|||
|
// The structure passed up on a WAN_FRAGMENT indication
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _NDIS_WAN_FRAGMENT {
|
|||
|
UCHAR Address[1]; // variable length, depends on address type
|
|||
|
} NDIS_WAN_FRAGMENT, *PNDIS_WAN_FRAGMENT;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// 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;
|
|||
|
PADAPTER_OBJECT SystemAdapterObject;
|
|||
|
BOOLEAN InProgress;
|
|||
|
} NDIS_DMA_BLOCK, *PNDIS_DMA_BLOCK;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Ndis Buffer is actually an Mdl
|
|||
|
//
|
|||
|
typedef MDL NDIS_BUFFER, * PNDIS_BUFFER;
|
|||
|
|
|||
|
//
|
|||
|
// Include an incomplete type for NDIS_PACKET structure so that
|
|||
|
// function types can refer to a type to be defined later.
|
|||
|
//
|
|||
|
struct _NDIS_PACKET;
|
|||
|
|
|||
|
//
|
|||
|
// packet pool definition
|
|||
|
//
|
|||
|
typedef struct _NDIS_PACKET_POOL {
|
|||
|
NDIS_SPIN_LOCK SpinLock;
|
|||
|
struct _NDIS_PACKET *FreeList; // linked list of free slots in pool
|
|||
|
UINT PacketLength; // amount needed in each packet
|
|||
|
UCHAR Buffer[1]; // actual pool memory
|
|||
|
} NDIS_PACKET_POOL, * 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;
|
|||
|
} NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// packet definition
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _NDIS_PACKET {
|
|||
|
NDIS_PACKET_PRIVATE Private;
|
|||
|
|
|||
|
union {
|
|||
|
|
|||
|
struct {
|
|||
|
UCHAR MiniportReserved[8];
|
|||
|
UCHAR WrapperReserved[8];
|
|||
|
};
|
|||
|
|
|||
|
struct {
|
|||
|
UCHAR MacReserved[16];
|
|||
|
};
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
UCHAR ProtocolReserved[1];
|
|||
|
|
|||
|
} NDIS_PACKET, * PNDIS_PACKET;
|
|||
|
|
|||
|
//
|
|||
|
// 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[16];
|
|||
|
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;
|
|||
|
|
|||
|
} NDIS_REQUEST, *PNDIS_REQUEST;
|
|||
|
|
|||
|
//
|
|||
|
// 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 {
|
|||
|
NDIS_SPIN_LOCK SpinLock;
|
|||
|
USHORT ReferenceCount;
|
|||
|
BOOLEAN Closing;
|
|||
|
} REFERENCE, * PREFERENCE;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This holds a map register entry.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _MAP_REGISTER_ENTRY {
|
|||
|
PVOID MapRegister;
|
|||
|
BOOLEAN WriteToDevice;
|
|||
|
} MAP_REGISTER_ENTRY, * PMAP_REGISTER_ENTRY;
|
|||
|
|
|||
|
//
|
|||
|
// 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_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_NOT_RESETTABLE ((NDIS_STATUS)0x80010001L)
|
|||
|
#define NDIS_STATUS_SOFT_ERRORS ((NDIS_STATUS)0x80010003L)
|
|||
|
#define NDIS_STATUS_HARD_ERRORS ((NDIS_STATUS)0x80010004L)
|
|||
|
|
|||
|
#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_TOKEN_RING_OPEN_ERROR ((NDIS_STATUS)0xC0011000L)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// 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
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Ndis Spin Locks
|
|||
|
//
|
|||
|
|
|||
|
#if BINARY_COMPATIBLE
|
|||
|
|
|||
|
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
|
|||
|
);
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#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)
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
//
|
|||
|
// 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
|
|||
|
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 WrapperConfigurationContext,
|
|||
|
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
|
|||
|
NdisReadBindingInformation(
|
|||
|
OUT PNDIS_STATUS Status,
|
|||
|
OUT PNDIS_STRING * Binding,
|
|||
|
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
|
|||
|
VOID
|
|||
|
NdisReadMcaPosInformation(
|
|||
|
OUT PNDIS_STATUS Status,
|
|||
|
IN NDIS_HANDLE WrapperConfigurationContext,
|
|||
|
IN PUINT ChannelNumber,
|
|||
|
OUT PNDIS_MCA_POS_DATA McaData
|
|||
|
);
|
|||
|
|
|||
|
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
|
|||
|
NDIS_STATUS
|
|||
|
NdisPciAssignResources(
|
|||
|
IN NDIS_HANDLE NdisMacHandle,
|
|||
|
IN NDIS_HANDLE NdisWrapperHandle,
|
|||
|
IN NDIS_HANDLE WrapperConfigurationContext,
|
|||
|
IN ULONG SlotNumber,
|
|||
|
OUT PNDIS_RESOURCE_LIST *AssignedResources
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// 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
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
#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
|
|||
|
NdisQueryBufferOffset(
|
|||
|
IN PNDIS_BUFFER Buffer,
|
|||
|
OUT PUINT Offset,
|
|||
|
OUT PUINT Length
|
|||
|
);
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#define NdisFreeBuffer(Buffer) IoFreeMdl(Buffer)
|
|||
|
|
|||
|
#define NdisQueryBuffer(_Buffer, _VirtualAddress, _Length) \
|
|||
|
{ \
|
|||
|
if ( ARGUMENT_PRESENT(_VirtualAddress) ) { \
|
|||
|
*(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdl(_Buffer); \
|
|||
|
} \
|
|||
|
*(_Length) = MmGetMdlByteCount(_Buffer); \
|
|||
|
}
|
|||
|
|
|||
|
#define NdisQueryBufferOffset(_Buffer, _Offset, _Length) \
|
|||
|
{ \
|
|||
|
*(_Offset) = MmGetMdlByteOffset(_Buffer); \
|
|||
|
*(_Length) = MmGetMdlByteCount(_Buffer); \
|
|||
|
}
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This macro is used to determine how many physical pieces
|
|||
|
// an NDIS_BUFFER will take up when mapped.
|
|||
|
//
|
|||
|
|
|||
|
#if BINARY_COMPATIBLE
|
|||
|
|
|||
|
EXPORT
|
|||
|
ULONG
|
|||
|
NDIS_BUFFER_TO_SPAN_PAGES(
|
|||
|
IN PNDIS_BUFFER Buffer
|
|||
|
);
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisGetBufferPhysicalArraySize(
|
|||
|
IN PNDIS_BUFFER Buffer,
|
|||
|
OUT PUINT ArraySize
|
|||
|
);
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#define NDIS_BUFFER_TO_SPAN_PAGES(_Buffer) \
|
|||
|
(MmGetMdlByteCount(_Buffer)==0 ? \
|
|||
|
1 : \
|
|||
|
(COMPUTE_PAGES_SPANNED(\
|
|||
|
MmGetMdlVirtualAddress(_Buffer), \
|
|||
|
MmGetMdlByteCount(_Buffer))))
|
|||
|
|
|||
|
#define NdisGetBufferPhysicalArraySize(Buffer, ArraySize) \
|
|||
|
(*(ArraySize) = NDIS_BUFFER_TO_SPAN_PAGES(Buffer))
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
/*++
|
|||
|
VOID
|
|||
|
NdisBufferGetSystemSpecific(
|
|||
|
IN PNDIS_BUFFER Buffer,
|
|||
|
OUT PVOID * SystemSpecific
|
|||
|
);
|
|||
|
--*/
|
|||
|
|
|||
|
#define NdisBufferGetSystemSpecific(Buffer, SystemSpecific) \
|
|||
|
*(SystemSpecific) = (Buffer)
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
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 == (PNDIS_BUFFER)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 == (PNDIS_BUFFER)NULL) \
|
|||
|
break; \
|
|||
|
TmpBuffer = TmpBuffer->Next; \
|
|||
|
} \
|
|||
|
if ((Packet)->Private.Head != (PNDIS_BUFFER)NULL) { \
|
|||
|
(Packet)->Private.Tail->Next = (Buffer); \
|
|||
|
} else { \
|
|||
|
(Packet)->Private.Head = (Buffer); \
|
|||
|
} \
|
|||
|
(Packet)->Private.Tail = TmpBuffer; \
|
|||
|
TmpBuffer->Next = (PNDIS_BUFFER)NULL; \
|
|||
|
(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
|
|||
|
);
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#define NdisQueryPacket(_Packet, _PhysicalBufferCount, _BufferCount, _FirstBuffer, _TotalPacketLength) \
|
|||
|
{ \
|
|||
|
\
|
|||
|
if ((_FirstBuffer) != NULL) \
|
|||
|
{ \
|
|||
|
PNDIS_BUFFER * __FirstBuffer = (_FirstBuffer); \
|
|||
|
*(__FirstBuffer) = (_Packet)->Private.Head; \
|
|||
|
} \
|
|||
|
if ((_PhysicalBufferCount) || (_BufferCount) || (_TotalPacketLength)) { \
|
|||
|
if (!(_Packet)->Private.ValidCounts) { \
|
|||
|
PNDIS_BUFFER TmpBuffer = (_Packet)->Private.Head; \
|
|||
|
UINT PTotalLength = 0, PPhysicalCount = 0, PAddedCount = 0; \
|
|||
|
UINT PacketLength; \
|
|||
|
\
|
|||
|
while (TmpBuffer != (PNDIS_BUFFER)NULL) { \
|
|||
|
NdisQueryBuffer(TmpBuffer, NULL, &PacketLength); \
|
|||
|
PTotalLength += PacketLength; \
|
|||
|
PPhysicalCount += 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; \
|
|||
|
} \
|
|||
|
} \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
VOID
|
|||
|
NdisGetNextBuffer(
|
|||
|
IN PNDIS_BUFFER CurrentBuffer,
|
|||
|
OUT PNDIS_BUFFER * NextBuffer
|
|||
|
);
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#define NdisGetNextBuffer(CurrentBuffer, NextBuffer) {\
|
|||
|
*(NextBuffer) = (CurrentBuffer)->Next; \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisCopyFromPacketToPacket(
|
|||
|
IN PNDIS_PACKET Destination,
|
|||
|
IN UINT DestinationOffset,
|
|||
|
IN UINT BytesToCopy,
|
|||
|
IN PNDIS_PACKET Source,
|
|||
|
IN UINT SourceOffset,
|
|||
|
OUT PUINT BytesCopied
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
EXPORT
|
|||
|
NDIS_STATUS
|
|||
|
NdisAllocateMemory(
|
|||
|
OUT PVOID *VirtualAddress,
|
|||
|
IN UINT Length,
|
|||
|
IN UINT MemoryFlags,
|
|||
|
IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress
|
|||
|
);
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisFreeMemory(
|
|||
|
IN PVOID VirtualAddress,
|
|||
|
IN UINT Length,
|
|||
|
IN UINT MemoryFlags
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
VOID
|
|||
|
NdisStallExecution(
|
|||
|
IN UINT MicrosecondsToStall
|
|||
|
)
|
|||
|
--*/
|
|||
|
|
|||
|
#define NdisStallExecution(MicroSecondsToStall) \
|
|||
|
KeStallExecutionProcessor(MicroSecondsToStall)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// 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)
|
|||
|
|
|||
|
/*++
|
|||
|
ULONG
|
|||
|
NdisGetCacheFillSize(
|
|||
|
)
|
|||
|
--*/
|
|||
|
#define NdisGetCacheFillSize() \
|
|||
|
HalGetDmaAlignmentRequirement()
|
|||
|
|
|||
|
//
|
|||
|
// This macro is used to convert a port number as the caller
|
|||
|
// thinks of it, to a port number as it should be passed to
|
|||
|
// READ/WRITE_PORT.
|
|||
|
//
|
|||
|
|
|||
|
#define NDIS_PORT_TO_PORT(Handle,Port) (((PNDIS_ADAPTER_BLOCK)(Handle))->PortOffset + (Port))
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// 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 Port,
|
|||
|
IN UCHAR Data
|
|||
|
)
|
|||
|
--*/
|
|||
|
#define NdisRawWritePortUchar(Port,Data) \
|
|||
|
WRITE_PORT_UCHAR((PUCHAR)(Port),(UCHAR)(Data))
|
|||
|
|
|||
|
/*++
|
|||
|
VOID
|
|||
|
NdisRawWritePortUshort(
|
|||
|
IN ULONG Port,
|
|||
|
IN USHORT Data
|
|||
|
)
|
|||
|
--*/
|
|||
|
#define NdisRawWritePortUshort(Port,Data) \
|
|||
|
WRITE_PORT_USHORT((PUSHORT)(Port),(USHORT)(Data))
|
|||
|
|
|||
|
/*++
|
|||
|
VOID
|
|||
|
NdisRawWritePortUlong(
|
|||
|
IN ULONG Port,
|
|||
|
IN ULONG Data
|
|||
|
)
|
|||
|
--*/
|
|||
|
#define NdisRawWritePortUlong(Port,Data) \
|
|||
|
WRITE_PORT_ULONG((PULONG)(Port),(ULONG)(Data))
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Raw Write Port Buffers
|
|||
|
//
|
|||
|
|
|||
|
/*++
|
|||
|
VOID
|
|||
|
NdisRawWritePortBufferUchar(
|
|||
|
IN ULONG Port,
|
|||
|
IN PUCHAR Buffer,
|
|||
|
IN ULONG Length
|
|||
|
)
|
|||
|
--*/
|
|||
|
#define NdisRawWritePortBufferUchar(Port,Buffer,Length) \
|
|||
|
WRITE_PORT_BUFFER_UCHAR((PUCHAR)(Port),(PUCHAR)(Buffer),(Length))
|
|||
|
|
|||
|
/*++
|
|||
|
VOID
|
|||
|
NdisRawWritePortBufferUshort(
|
|||
|
IN ULONG Port,
|
|||
|
IN PUSHORT Buffer,
|
|||
|
IN ULONG Length
|
|||
|
)
|
|||
|
--*/
|
|||
|
#if defined(_M_IX86)
|
|||
|
#define NdisRawWritePortBufferUshort(Port,Buffer,Length) \
|
|||
|
WRITE_PORT_BUFFER_USHORT((PUSHORT)(Port),(PUSHORT)(Buffer),(Length))
|
|||
|
#else
|
|||
|
#define NdisRawWritePortBufferUshort(Port,Buffer,Length) \
|
|||
|
{ \
|
|||
|
ULONG _Port = (ULONG)(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 Port,
|
|||
|
IN PULONG Buffer,
|
|||
|
IN ULONG Length
|
|||
|
)
|
|||
|
--*/
|
|||
|
#if defined(_M_IX86)
|
|||
|
#define NdisRawWritePortBufferUlong(Port,Buffer,Length) \
|
|||
|
WRITE_PORT_BUFFER_ULONG((PULONG)(Port),(PULONG)(Buffer),(Length))
|
|||
|
#else
|
|||
|
#define NdisRawWritePortBufferUlong(Port,Buffer,Length) \
|
|||
|
{ \
|
|||
|
ULONG _Port = (ULONG)(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 Port,
|
|||
|
OUT PUCHAR Data
|
|||
|
)
|
|||
|
--*/
|
|||
|
#define NdisRawReadPortUchar(Port, Data) \
|
|||
|
*(Data) = READ_PORT_UCHAR((PUCHAR)(Port))
|
|||
|
|
|||
|
/*++
|
|||
|
VOID
|
|||
|
NdisRawReadPortUshort(
|
|||
|
IN ULONG Port,
|
|||
|
OUT PUSHORT Data
|
|||
|
)
|
|||
|
--*/
|
|||
|
#define NdisRawReadPortUshort(Port,Data) \
|
|||
|
*(Data) = READ_PORT_USHORT((PUSHORT)(Port))
|
|||
|
|
|||
|
/*++
|
|||
|
VOID
|
|||
|
NdisRawReadPortUlong(
|
|||
|
IN ULONG Port,
|
|||
|
OUT PULONG Data
|
|||
|
)
|
|||
|
--*/
|
|||
|
#define NdisRawReadPortUlong(Port,Data) \
|
|||
|
*(Data) = READ_PORT_ULONG((PULONG)(Port))
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Raw Read Buffer Ports
|
|||
|
//
|
|||
|
|
|||
|
/*++
|
|||
|
VOID
|
|||
|
NdisRawReadPortBufferUchar(
|
|||
|
IN ULONG Port,
|
|||
|
OUT PUCHAR Buffer,
|
|||
|
IN ULONG Length
|
|||
|
)
|
|||
|
--*/
|
|||
|
#define NdisRawReadPortBufferUchar(Port,Buffer,Length) \
|
|||
|
READ_PORT_BUFFER_UCHAR((PUCHAR)(Port),(PUCHAR)(Buffer),(Length))
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
VOID
|
|||
|
NdisRawReadPortBufferUshort(
|
|||
|
IN ULONG Port,
|
|||
|
OUT PUSHORT Buffer,
|
|||
|
IN ULONG Length
|
|||
|
)
|
|||
|
--*/
|
|||
|
#if defined(_M_IX86)
|
|||
|
#define NdisRawReadPortBufferUshort(Port,Buffer,Length) \
|
|||
|
READ_PORT_BUFFER_USHORT((PUSHORT)(Port),(PUSHORT)(Buffer),(Length))
|
|||
|
#else
|
|||
|
#define NdisRawReadPortBufferUshort(Port,Buffer,Length) \
|
|||
|
{ \
|
|||
|
ULONG _Port = (ULONG)(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 Port,
|
|||
|
OUT PULONG Buffer,
|
|||
|
IN ULONG Length
|
|||
|
)
|
|||
|
--*/
|
|||
|
#if defined(_M_IX86)
|
|||
|
#define NdisRawReadPortBufferUlong(Port,Buffer,Length) \
|
|||
|
READ_PORT_BUFFER_ULONG((PULONG)(Port),(PULONG)(Buffer),(Length))
|
|||
|
#else
|
|||
|
#define NdisRawReadPortBufferUlong(Port,Buffer,Length) \
|
|||
|
{ \
|
|||
|
ULONG _Port = (ULONG)(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)
|
|||
|
#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 PUSHORT Register,
|
|||
|
IN USHORT Data
|
|||
|
)
|
|||
|
--*/
|
|||
|
|
|||
|
#if defined(_M_IX86)
|
|||
|
#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 PULONG Register,
|
|||
|
IN ULONG Data
|
|||
|
)
|
|||
|
--*/
|
|||
|
|
|||
|
#if defined(_M_IX86)
|
|||
|
#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)
|
|||
|
#define NdisReadRegisterUchar(Register,Data) \
|
|||
|
*((PUCHAR)(Data)) = *(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)
|
|||
|
#define NdisReadRegisterUshort(Register,Data) \
|
|||
|
*((PUSHORT)(Data)) = *(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)
|
|||
|
#define NdisReadRegisterUlong(Register,Data) \
|
|||
|
*((PULONG)(Data)) = *(Register)
|
|||
|
#else
|
|||
|
#define NdisReadRegisterUlong(Register,Data) \
|
|||
|
*(Data) = READ_REGISTER_ULONG((PULONG)(Register))
|
|||
|
#endif
|
|||
|
|
|||
|
#if BINARY_COMPATIBLE
|
|||
|
|
|||
|
EXPORT
|
|||
|
BOOLEAN
|
|||
|
NdisEqualString(
|
|||
|
IN PNDIS_STRING String1,
|
|||
|
IN PNDIS_STRING String2,
|
|||
|
IN BOOLEAN CaseInsensitive
|
|||
|
);
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#define NdisEqualString(_String1,_String2,CaseInsensitive) \
|
|||
|
RtlEqualUnicodeString((_String1), (_String2), CaseInsensitive)
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisWriteErrorLogEntry(
|
|||
|
IN NDIS_HANDLE NdisAdapterHandle,
|
|||
|
IN NDIS_ERROR_CODE ErrorCode,
|
|||
|
IN ULONG NumberOfErrorValues,
|
|||
|
...
|
|||
|
);
|
|||
|
|
|||
|
#define NdisInitializeString(Destination,Source) \
|
|||
|
{\
|
|||
|
PNDIS_STRING _D = (Destination);\
|
|||
|
UCHAR *_S = (Source);\
|
|||
|
WCHAR *_P;\
|
|||
|
_D->Length = (strlen(_S)) * sizeof(WCHAR);\
|
|||
|
_D->MaximumLength = _D->Length + sizeof(WCHAR);\
|
|||
|
NdisAllocateMemory((PVOID *)&(_D->Buffer), _D->MaximumLength, 0, (-1));\
|
|||
|
_P = _D->Buffer;\
|
|||
|
while(*_S != '\0'){\
|
|||
|
*_P = (WCHAR)(*_S);\
|
|||
|
_S++;\
|
|||
|
_P++;\
|
|||
|
}\
|
|||
|
*_P = UNICODE_NULL;\
|
|||
|
}
|
|||
|
|
|||
|
#define NdisFreeString(String) NdisFreeMemory((String).Buffer, (String).MaximumLength, 0)
|
|||
|
|
|||
|
#define NdisPrintString(String) DbgPrint("%ls",(String).Buffer)
|
|||
|
|
|||
|
|
|||
|
#if !defined(_ALPHA_)
|
|||
|
/*++
|
|||
|
|
|||
|
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)
|
|||
|
|
|||
|
#else // Alpha
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisCreateLookaheadBufferFromSharedMemory(
|
|||
|
IN PVOID pSharedMemory,
|
|||
|
IN UINT LookaheadLength,
|
|||
|
OUT PVOID *pLookaheadBuffer
|
|||
|
);
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisDestroyLookaheadBufferFromSharedMemory(
|
|||
|
IN PVOID pLookaheadBuffer
|
|||
|
);
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// 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_MAC_BLOCK NDIS_MAC_BLOCK, * PNDIS_MAC_BLOCK;
|
|||
|
typedef struct _NDIS_ADAPTER_BLOCK NDIS_ADAPTER_BLOCK, * PNDIS_ADAPTER_BLOCK;
|
|||
|
typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, * PNDIS_PROTOCOL_BLOCK;
|
|||
|
typedef struct _NDIS_OPEN_BLOCK NDIS_OPEN_BLOCK, * PNDIS_OPEN_BLOCK;
|
|||
|
|
|||
|
//
|
|||
|
// 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
|
|||
|
NdisSetTimer(
|
|||
|
IN PNDIS_TIMER Timer,
|
|||
|
IN UINT MillisecondsToDelay
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Function types for NDIS_PROTOCOL_CHARACTERISTICS
|
|||
|
//
|
|||
|
|
|||
|
typedef
|
|||
|
VOID
|
|||
|
(*SEND_COMPLETE_HANDLER) (
|
|||
|
IN NDIS_HANDLE ProtocolBindingContext,
|
|||
|
IN PNDIS_PACKET Packet,
|
|||
|
IN NDIS_STATUS Status
|
|||
|
);
|
|||
|
|
|||
|
typedef
|
|||
|
VOID
|
|||
|
(*TRANSFER_DATA_COMPLETE_HANDLER) (
|
|||
|
IN NDIS_HANDLE ProtocolBindingContext,
|
|||
|
IN PNDIS_PACKET Packet,
|
|||
|
IN NDIS_STATUS Status,
|
|||
|
IN UINT BytesTransferred
|
|||
|
);
|
|||
|
|
|||
|
typedef
|
|||
|
NDIS_STATUS
|
|||
|
(*RECEIVE_HANDLER) (
|
|||
|
IN NDIS_HANDLE ProtocolBindingContext,
|
|||
|
IN NDIS_HANDLE MacReceiveContext,
|
|||
|
IN PVOID HeaderBuffer,
|
|||
|
IN UINT HeaderBufferSize,
|
|||
|
IN PVOID LookAheadBuffer,
|
|||
|
IN UINT LookaheadBufferSize,
|
|||
|
IN UINT PacketSize
|
|||
|
);
|
|||
|
|
|||
|
typedef
|
|||
|
VOID
|
|||
|
(*RECEIVE_COMPLETE_HANDLER) (
|
|||
|
IN NDIS_HANDLE ProtocolBindingContext
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// 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
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Override bus number
|
|||
|
//
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisOverrideBusNumber(
|
|||
|
IN NDIS_HANDLE WrapperConfigurationContext,
|
|||
|
IN NDIS_HANDLE MiniportAdapterHandle OPTIONAL,
|
|||
|
IN ULONG BusNumber
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisImmediateReadPortUchar(
|
|||
|
IN NDIS_HANDLE WrapperConfigurationContext,
|
|||
|
IN ULONG Port,
|
|||
|
OUT PUCHAR Data
|
|||
|
);
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisImmediateReadPortUshort(
|
|||
|
IN NDIS_HANDLE WrapperConfigurationContext,
|
|||
|
IN ULONG Port,
|
|||
|
OUT PUSHORT Data
|
|||
|
);
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisImmediateReadPortUlong(
|
|||
|
IN NDIS_HANDLE WrapperConfigurationContext,
|
|||
|
IN ULONG Port,
|
|||
|
OUT PULONG Data
|
|||
|
);
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisImmediateWritePortUchar(
|
|||
|
IN NDIS_HANDLE WrapperConfigurationContext,
|
|||
|
IN ULONG Port,
|
|||
|
IN UCHAR Data
|
|||
|
);
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisImmediateWritePortUshort(
|
|||
|
IN NDIS_HANDLE WrapperConfigurationContext,
|
|||
|
IN ULONG Port,
|
|||
|
IN USHORT Data
|
|||
|
);
|
|||
|
|
|||
|
EXPORT
|
|||
|
VOID
|
|||
|
NdisImmediateWritePortUlong(
|
|||
|
IN NDIS_HANDLE WrapperConfigurationContext,
|
|||
|
IN ULONG Port,
|
|||
|
IN ULONG Data
|
|||
|
);
|
|||
|
|
|||
|
EXPORT
|
|||
|
ULONG
|
|||
|
NdisImmediateReadPciSlotInformation(
|
|||
|
IN NDIS_HANDLE WrapperConfigurationContext,
|
|||
|
IN ULONG SlotNumber,
|
|||
|
IN ULONG Offset,
|
|||
|
IN PVOID Buffer,
|
|||
|
IN ULONG Length
|
|||
|
);
|
|||
|
|
|||
|
EXPORT
|
|||
|
ULONG
|
|||
|
NdisImmediateWritePciSlotInformation(
|
|||
|
IN NDIS_HANDLE WrapperConfigurationContext,
|
|||
|
IN ULONG SlotNumber,
|
|||
|
IN ULONG Offset,
|
|||
|
IN PVOID Buffer,
|
|||
|
IN ULONG Length
|
|||
|
);
|
|||
|
|