Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

1218 lines
30 KiB

typedef
BOOLEAN
(*PNDIS_INTERRUPT_SERVICE) (
IN PVOID InterruptContext
);
typedef
VOID
(*PNDIS_DEFERRED_PROCESSING) (
IN PVOID SystemSpecific1,
IN PVOID InterruptContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
);
typedef struct _NDIS_INTERRUPT {
PKINTERRUPT InterruptObject;
KSPIN_LOCK DpcCountLock;
PNDIS_INTERRUPT_SERVICE MacIsr; // Pointer to Mac ISR routine
PNDIS_DEFERRED_PROCESSING MacDpc; // Pointer to Mac DPC routine
KDPC InterruptDpc;
PVOID InterruptContext; // Pointer to context for calling
// adapters ISR and DPC.
UCHAR DpcCount;
BOOLEAN Removing; // TRUE if removing interrupt
//
// This is used to tell when all the Dpcs for the adapter are completed.
//
KEVENT DpcsCompletedEvent;
} NDIS_INTERRUPT, *PNDIS_INTERRUPT;
//
// Ndis Adapter Information
//
typedef
NDIS_STATUS
(*PNDIS_ACTIVATE_CALLBACK) (
IN NDIS_HANDLE NdisAdatperHandle,
IN NDIS_HANDLE MacAdapterContext,
IN ULONG DmaChannel
);
typedef struct _NDIS_PORT_DESCRIPTOR {
ULONG InitialPort;
ULONG NumberOfPorts;
PVOID *PortOffset;
} NDIS_PORT_DESCRIPTOR, *PNDIS_PORT_DESCRIPTOR;
typedef struct _NDIS_ADAPTER_INFORMATION {
ULONG DmaChannel;
BOOLEAN Master;
BOOLEAN Dma32BitAddresses;
PNDIS_ACTIVATE_CALLBACK ActivateCallback;
NDIS_INTERFACE_TYPE AdapterType;
ULONG PhysicalMapRegistersNeeded;
ULONG MaximumPhysicalMapping;
ULONG NumberOfPortDescriptors;
NDIS_PORT_DESCRIPTOR PortDescriptors[1]; // as many as needed
} NDIS_ADAPTER_INFORMATION, *PNDIS_ADAPTER_INFORMATION;
//
// Function types for NDIS_MAC_CHARACTERISTICS
//
typedef
NDIS_STATUS
(*OPEN_ADAPTER_HANDLER) (
OUT PNDIS_STATUS OpenErrorStatus,
OUT NDIS_HANDLE *MacBindingHandle,
OUT PUINT SelectedMediumIndex,
IN PNDIS_MEDIUM MediumArray,
IN UINT MediumArraySize,
IN NDIS_HANDLE NdisBindingContext,
IN NDIS_HANDLE MacAdapterContext,
IN UINT OpenOptions,
IN PSTRING AddressingInformation OPTIONAL
);
typedef
NDIS_STATUS
(*CLOSE_ADAPTER_HANDLER) (
IN NDIS_HANDLE MacBindingHandle
);
typedef
NDIS_STATUS
(*SEND_HANDLER) (
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_PACKET Packet
);
typedef
NDIS_STATUS
(*TRANSFER_DATA_HANDLER) (
IN NDIS_HANDLE MacBindingHandle,
IN NDIS_HANDLE MacReceiveContext,
IN UINT ByteOffset,
IN UINT BytesToTransfer,
OUT PNDIS_PACKET Packet,
OUT PUINT BytesTransferred
);
typedef
NDIS_STATUS
(*RESET_HANDLER) (
IN NDIS_HANDLE MacBindingHandle
);
typedef
NDIS_STATUS
(*REQUEST_HANDLER) (
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_REQUEST NdisRequest
);
typedef
NDIS_STATUS
(*QUERY_GLOBAL_STATISTICS_HANDLER) (
IN NDIS_HANDLE MacAdapterContext,
IN PNDIS_REQUEST NdisRequest
);
typedef
VOID
(*UNLOAD_MAC_HANDLER) (
IN NDIS_HANDLE MacMacContext
);
typedef
NDIS_STATUS
(*ADD_ADAPTER_HANDLER) (
IN NDIS_HANDLE MacMacContext,
IN NDIS_HANDLE WrapperConfigurationContext,
IN PNDIS_STRING AdapterName
);
typedef
VOID
(*REMOVE_ADAPTER_HANDLER) (
IN NDIS_HANDLE MacAdapterContext
);
typedef struct _NDIS_MAC_CHARACTERISTICS {
UCHAR MajorNdisVersion;
UCHAR MinorNdisVersion;
UINT Reserved;
OPEN_ADAPTER_HANDLER OpenAdapterHandler;
CLOSE_ADAPTER_HANDLER CloseAdapterHandler;
SEND_HANDLER SendHandler;
TRANSFER_DATA_HANDLER TransferDataHandler;
RESET_HANDLER ResetHandler;
REQUEST_HANDLER RequestHandler;
QUERY_GLOBAL_STATISTICS_HANDLER QueryGlobalStatisticsHandler;
UNLOAD_MAC_HANDLER UnloadMacHandler;
ADD_ADAPTER_HANDLER AddAdapterHandler;
REMOVE_ADAPTER_HANDLER RemoveAdapterHandler;
NDIS_STRING Name;
} NDIS_MAC_CHARACTERISTICS, *PNDIS_MAC_CHARACTERISTICS;
//
// Function types for NDIS_PROTOCOL_CHARACTERISTICS
//
//
typedef
VOID
(*OPEN_ADAPTER_COMPLETE_HANDLER) (
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status,
IN NDIS_STATUS OpenErrorStatus
);
typedef
VOID
(*CLOSE_ADAPTER_COMPLETE_HANDLER) (
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status
);
typedef
VOID
(*RESET_COMPLETE_HANDLER) (
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status
);
typedef
VOID
(*REQUEST_COMPLETE_HANDLER) (
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_REQUEST NdisRequest,
IN NDIS_STATUS Status
);
typedef
VOID
(*STATUS_HANDLER) (
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS GeneralStatus,
IN PVOID StatusBuffer,
IN UINT StatusBufferSize
);
typedef
VOID
(*STATUS_COMPLETE_HANDLER) (
IN NDIS_HANDLE ProtocolBindingContext
);
typedef struct _NDIS_PROTOCOL_CHARACTERISTICS {
UCHAR MajorNdisVersion;
UCHAR MinorNdisVersion;
UINT Reserved;
OPEN_ADAPTER_COMPLETE_HANDLER OpenAdapterCompleteHandler;
CLOSE_ADAPTER_COMPLETE_HANDLER CloseAdapterCompleteHandler;
SEND_COMPLETE_HANDLER SendCompleteHandler;
TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;
RESET_COMPLETE_HANDLER ResetCompleteHandler;
REQUEST_COMPLETE_HANDLER RequestCompleteHandler;
RECEIVE_HANDLER ReceiveHandler;
RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler;
STATUS_HANDLER StatusHandler;
STATUS_COMPLETE_HANDLER StatusCompleteHandler;
NDIS_STRING Name;
} NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS;
//
// MAC specific considerations.
//
struct _NDIS_WRAPPER_HANDLE {
//
// These store the PDRIVER_OBJECT that
// the MAC passes to NdisInitializeWrapper until it can be
// used by NdisRegisterMac and NdisTerminateWrapper.
//
PDRIVER_OBJECT NdisWrapperDriver;
HANDLE NdisWrapperConfigurationHandle;
};
//
// one of these per MAC
//
struct _NDIS_MAC_BLOCK {
PNDIS_ADAPTER_BLOCK AdapterQueue; // queue of adapters for this MAC
NDIS_HANDLE MacMacContext; // Context for calling MACUnload and
// MACAddAdapter.
REFERENCE Ref; // contains spinlock for AdapterQueue
UINT Length; // of this NDIS_MAC_BLOCK structure
NDIS_MAC_CHARACTERISTICS MacCharacteristics; // handler addresses
PNDIS_WRAPPER_HANDLE NdisMacInfo; // Mac information.
PNDIS_MAC_BLOCK NextMac;
KEVENT AdaptersRemovedEvent; // used to find when all adapters are gone.
BOOLEAN Unloading; // TRUE if unloading
//
// Extensions added for NT 3.5 support
//
PCM_RESOURCE_LIST PciAssignedResources;
};
//
// one of these per adapter registered on a MAC
//
struct _NDIS_ADAPTER_BLOCK {
PDEVICE_OBJECT DeviceObject; // created by NdisRegisterAdapter
PNDIS_MAC_BLOCK MacHandle; // pointer to our MAC block
NDIS_HANDLE MacAdapterContext; // context when calling MacOpenAdapter
NDIS_STRING AdapterName; // how NdisOpenAdapter refers to us
PNDIS_OPEN_BLOCK OpenQueue; // queue of opens for this adapter
PNDIS_ADAPTER_BLOCK NextAdapter; // used by MAC's AdapterQueue
REFERENCE Ref; // contains spinlock for OpenQueue
BOOLEAN BeingRemoved; // TRUE if adapter is being removed
//
// Resource information
//
PCM_RESOURCE_LIST Resources;
//
// Obsolete field.
//
ULONG NotUsed;
//
// Wrapper context.
//
PVOID WrapperContext;
//
// contains adapter information
//
ULONG BusNumber;
NDIS_INTERFACE_TYPE BusType;
ULONG ChannelNumber;
NDIS_INTERFACE_TYPE AdapterType;
BOOLEAN Master;
ULONG PhysicalMapRegistersNeeded;
ULONG MaximumPhysicalMapping;
ULONG InitialPort;
ULONG NumberOfPorts;
//
// Holds the mapping for ports, if needed.
//
PUCHAR InitialPortMapping;
//
// TRUE if InitialPortMapping was mapped with NdisMapIoSpace.
//
BOOLEAN InitialPortMapped;
//
// This is the offset added to the port passed to NdisXXXPort to
// get to the real value to be passed to the NDIS_XXX_PORT macros.
// It equals InitialPortMapping - InitialPort; that is, the
// mapped "address" of port 0, even if we didn't actually
// map port 0.
//
PUCHAR PortOffset;
//
// Holds the map registers for this adapter.
//
PMAP_REGISTER_ENTRY MapRegisters;
//
// These two are used temporarily while allocating
// the map registers.
//
KEVENT AllocationEvent;
UINT CurrentMapRegister;
PADAPTER_OBJECT SystemAdapterObject;
};
//
// one of these per protocol registered
//
struct _NDIS_PROTOCOL_BLOCK {
PNDIS_OPEN_BLOCK OpenQueue; // queue of opens for this protocol
REFERENCE Ref; // contains spinlock for OpenQueue
UINT Length; // of this NDIS_PROTOCOL_BLOCK struct
NDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics; // handler addresses
};
//
// one of these per open on an adapter/protocol
//
struct _NDIS_OPEN_BLOCK {
PNDIS_MAC_BLOCK MacHandle; // pointer to our MAC
NDIS_HANDLE MacBindingHandle; // context when calling MacXX funcs
PNDIS_ADAPTER_BLOCK AdapterHandle; // pointer to our adapter
PNDIS_PROTOCOL_BLOCK ProtocolHandle; // pointer to our protocol
NDIS_HANDLE ProtocolBindingContext; // context when calling ProtXX funcs
PNDIS_OPEN_BLOCK AdapterNextOpen; // used by adapter's OpenQueue
PNDIS_OPEN_BLOCK ProtocolNextOpen; // used by protocol's OpenQueue
PFILE_OBJECT FileObject; // created by operating system
BOOLEAN Closing; // TRUE when removing this struct
NDIS_HANDLE CloseRequestHandle; // 0 indicates an internal close
NDIS_SPIN_LOCK SpinLock; // guards Closing
//
// These are optimizations for getting to MAC routines. They are not
// necessary, but are here to save a dereference through the MAC block.
//
SEND_HANDLER SendHandler;
TRANSFER_DATA_HANDLER TransferDataHandler;
//
// These are optimizations for getting to PROTOCOL routines. They are not
// necessary, but are here to save a dereference through the PROTOCOL block.
//
SEND_COMPLETE_HANDLER SendCompleteHandler;
TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;
RECEIVE_HANDLER ReceiveHandler;
RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler;
//
// Extentions to the OPEN_BLOCK since Product 1.
//
RECEIVE_HANDLER PostNt31ReceiveHandler;
RECEIVE_COMPLETE_HANDLER PostNt31ReceiveCompleteHandler;
PNDIS_OPEN_BLOCK NextGlobalOpen;
};
//
// Routines to access packet flags
//
/*++
VOID
NdisSetSendFlags(
IN PNDIS_PACKET Packet,
IN UINT Flags
);
--*/
#define NdisSetSendFlags(_Packet,_Flags) \
(_Packet)->Private.Flags = (_Flags)
/*++
VOID
NdisQuerySendFlags(
IN PNDIS_PACKET Packet,
OUT PUINT Flags
);
--*/
#define NdisQuerySendFlags(_Packet,_Flags) \
*(_Flags) = (_Packet)->Private.Flags
//
// Packet Pool
//
EXPORT
VOID
NdisAllocatePacketPool(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE PoolHandle,
IN UINT NumberOfDescriptors,
IN UINT ProtocolReservedLength
);
// VOID
// NdisFreePacketPool(
// IN NDIS_HANDLE PoolHandle
// );
#define NdisFreePacketPool(PoolHandle) {\
NdisFreeSpinLock(&((PNDIS_PACKET_POOL)PoolHandle)->SpinLock);\
ExFreePool(PoolHandle); \
}
EXPORT
VOID
NdisAllocatePacket(
OUT PNDIS_STATUS Status,
OUT PNDIS_PACKET * Packet,
IN NDIS_HANDLE PoolHandle
);
// VOID
// NdisFreePacket(
// IN PNDIS_PACKET Packet
// );
#define NdisFreePacket(Packet) {\
NdisAcquireSpinLock(&(Packet)->Private.Pool->SpinLock); \
(Packet)->Private.Head = (PNDIS_BUFFER)(Packet)->Private.Pool->FreeList; \
(Packet)->Private.Pool->FreeList = (Packet); \
NdisReleaseSpinLock(&(Packet)->Private.Pool->SpinLock); \
}
// VOID
// NdisReinitializePacket(
// IN OUT PNDIS_PACKET Packet
// );
#define NdisReinitializePacket(Packet) { \
(Packet)->Private.Head = (PNDIS_BUFFER)NULL; \
(Packet)->Private.ValidCounts = FALSE; \
}
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
)
--*/
#define NdisCancelTimer(NdisTimer,TimerCancelled) \
(*(TimerCancelled) = KeCancelTimer(&((NdisTimer)->Timer)))
//
// Shared memory
//
EXPORT
VOID
NdisAllocateSharedMemory(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Length,
IN BOOLEAN Cached,
OUT PVOID *VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress
);
EXPORT
VOID
NdisFreeSharedMemory(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Length,
IN BOOLEAN Cached,
IN PVOID VirtualAddress,
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress
);
//
// Requests used by Protocol Modules
//
EXPORT
VOID
NdisRegisterProtocol(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE NdisProtocolHandle,
IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,
IN UINT CharacteristicsLength
);
EXPORT
VOID
NdisDeregisterProtocol(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE NdisProtocolHandle
);
EXPORT
VOID
NdisOpenAdapter(
OUT PNDIS_STATUS Status,
OUT PNDIS_STATUS OpenErrorStatus,
OUT PNDIS_HANDLE NdisBindingHandle,
OUT PUINT SelectedMediumIndex,
IN PNDIS_MEDIUM MediumArray,
IN UINT MediumArraySize,
IN NDIS_HANDLE NdisProtocolHandle,
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_STRING AdapterName,
IN UINT OpenOptions,
IN PSTRING AddressingInformation OPTIONAL
);
EXPORT
VOID
NdisCloseAdapter(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE NdisBindingHandle
);
// VOID
// NdisSend(
// OUT PNDIS_STATUS Status,
// IN NDIS_HANDLE NdisBindingHandle,
// IN PNDIS_PACKET Packet
// );
#define NdisSend(Status, \
NdisBindingHandle, \
Packet \
) \
{\
*(Status) = \
(((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->SendHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle, \
(Packet)); \
}
// VOID
// NdisTransferData(
// OUT PNDIS_STATUS Status,
// IN NDIS_HANDLE NdisBindingHandle,
// IN NDIS_HANDLE MacReceiveContext,
// IN UINT ByteOffset,
// IN UINT BytesToTransfer,
// IN OUT PNDIS_PACKET Packet,
// OUT PUINT BytesTransferred
// );
#define NdisTransferData( \
Status, \
NdisBindingHandle, \
MacReceiveContext, \
ByteOffset, \
BytesToTransfer, \
Packet, \
BytesTransferred \
) \
{\
*(Status) = \
(((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->TransferDataHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle, \
(MacReceiveContext), \
(ByteOffset), \
(BytesToTransfer), \
(Packet), \
(BytesTransferred)); \
}
// VOID
// NdisReset(
// OUT PNDIS_STATUS Status,
// IN NDIS_HANDLE NdisBindingHandle
// );
#define NdisReset( \
Status, \
NdisBindingHandle \
) \
{ \
*(Status) = \
(((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacHandle->MacCharacteristics.ResetHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle); \
}
// VOID
// NdisRequest(
// OUT PNDIS_STATUS Status,
// IN NDIS_HANDLE NdisBindingHandle,
// IN PNDIS_REQUEST NdisRequest
// );
#define NdisRequest( \
Status,\
NdisBindingHandle, \
NdisRequest \
) \
{ \
*(Status) = \
(((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacHandle->MacCharacteristics.RequestHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle, \
(NdisRequest)); \
}
//
// 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
NdisFreeDmaChannel(
IN PNDIS_HANDLE NdisDmaHandle
);
EXPORT
VOID
NdisSetupDmaTransfer(
OUT PNDIS_STATUS Status,
IN PNDIS_HANDLE NdisDmaHandle,
IN PNDIS_BUFFER Buffer,
IN ULONG Offset,
IN ULONG Length,
IN BOOLEAN WriteToDevice
);
EXPORT
VOID
NdisCompleteDmaTransfer(
OUT PNDIS_STATUS Status,
IN PNDIS_HANDLE NdisDmaHandle,
IN PNDIS_BUFFER Buffer,
IN ULONG Offset,
IN ULONG Length,
IN BOOLEAN WriteToDevice
);
/*++
ULONG
NdisReadDmaCounter(
IN NDIS_HANDLE NdisDmaHandle
)
--*/
#define NdisReadDmaCounter(_NdisDmaHandle) \
HalReadDmaCounter(((PNDIS_DMA_BLOCK)(_NdisDmaHandle))->SystemAdapterObject)
//
// Requests Used by MAC Drivers
//
EXPORT
VOID
NdisRegisterMac(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE NdisMacHandle,
IN NDIS_HANDLE NdisWrapperHandle,
IN NDIS_HANDLE MacMacContext,
IN PNDIS_MAC_CHARACTERISTICS MacCharacteristics,
IN UINT CharacteristicsLength
);
EXPORT
VOID
NdisDeregisterMac(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE NdisMacHandle
);
EXPORT
NDIS_STATUS
NdisRegisterAdapter(
OUT PNDIS_HANDLE NdisAdapterHandle,
IN NDIS_HANDLE NdisMacHandle,
IN NDIS_HANDLE MacAdapterContext,
IN NDIS_HANDLE WrapperConfigurationContext,
IN PNDIS_STRING AdapterName,
IN PVOID AdapterInformation
);
EXPORT
NDIS_STATUS
NdisDeregisterAdapter(
IN NDIS_HANDLE NdisAdapterHandle
);
EXPORT
VOID
NdisRegisterAdapterShutdownHandler(
IN NDIS_HANDLE NdisAdapterHandle,
IN PVOID ShutdownContext,
IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler
);
EXPORT
VOID
NdisDeregisterAdapterShutdownHandler(
IN NDIS_HANDLE NdisAdapterHandle
);
EXPORT
VOID
NdisReleaseAdapterResources(
IN NDIS_HANDLE NdisAdapterHandle
);
EXPORT
VOID
NdisCompleteOpenAdapter(
IN NDIS_HANDLE NdisBindingContext,
IN NDIS_STATUS Status,
IN NDIS_STATUS OpenErrorStatus
);
EXPORT
VOID
NdisCompleteCloseAdapter(
IN NDIS_HANDLE NdisBindingContext,
IN NDIS_STATUS Status
);
// VOID
// NdisCompleteSend(
// IN NDIS_HANDLE NdisBindingContext,
// IN PNDIS_PACKET Packet,
// IN NDIS_STATUS Status
// );
#define NdisCompleteSend( \
NdisBindingContext, \
Packet, \
Status \
) \
{\
(((PNDIS_OPEN_BLOCK)(NdisBindingContext))->SendCompleteHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \
(Packet), \
(Status)); \
}
// VOID
// NdisCompleteTransferData(
// IN NDIS_HANDLE NdisBindingContext,
// IN PNDIS_PACKET Packet,
// IN NDIS_STATUS Status,
// IN UINT BytesTransferred
// );
#define NdisCompleteTransferData( \
NdisBindingContext, \
Packet, \
Status, \
BytesTransferred \
) \
{\
(((PNDIS_OPEN_BLOCK)(NdisBindingContext))->TransferDataCompleteHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \
(Packet), \
(Status), \
(BytesTransferred)); \
}
// VOID
// NdisCompleteReset(
// IN NDIS_HANDLE NdisBindingContext,
// IN NDIS_STATUS Status
// );
#define NdisCompleteReset( \
NdisBindingContext, \
Status \
) \
{ \
(((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolHandle->ProtocolCharacteristics.ResetCompleteHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \
Status); \
}
// VOID
// NdisCompleteRequest(
// IN NDIS_HANDLE NdisBindingContext,
// IN PNDIS_REQUEST NdisRequest,
// IN NDIS_STATUS Status
// );
#define NdisCompleteRequest( \
NdisBindingContext, \
NdisRequest, \
Status) \
{ \
(((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolHandle->ProtocolCharacteristics.RequestCompleteHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \
NdisRequest, \
Status); \
}
// VOID
// NdisIndicateReceive(
// OUT PNDIS_STATUS Status,
// IN NDIS_HANDLE NdisBindingContext,
// IN NDIS_HANDLE MacReceiveContext,
// IN PVOID HeaderBuffer,
// IN UINT HeaderBufferSize,
// IN PVOID LookaheadBuffer,
// IN UINT LookaheadBufferSize,
// IN UINT PacketSize
// );
#define NdisIndicateReceive( \
Status, \
NdisBindingContext, \
MacReceiveContext, \
HeaderBuffer, \
HeaderBufferSize, \
LookaheadBuffer, \
LookaheadBufferSize, \
PacketSize \
) \
{\
KIRQL oldIrql;\
KeRaiseIrql( DISPATCH_LEVEL, &oldIrql );\
*(Status) = \
(((PNDIS_OPEN_BLOCK)(NdisBindingContext))->PostNt31ReceiveHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \
(MacReceiveContext), \
(HeaderBuffer), \
(HeaderBufferSize), \
(LookaheadBuffer), \
(LookaheadBufferSize), \
(PacketSize)); \
KeLowerIrql( oldIrql );\
}
//
// Used by the filter packages for indicating receives
//
#define FilterIndicateReceive( \
Status, \
NdisBindingContext, \
MacReceiveContext, \
HeaderBuffer, \
HeaderBufferSize, \
LookaheadBuffer, \
LookaheadBufferSize, \
PacketSize \
) \
{\
*(Status) = \
(((PNDIS_OPEN_BLOCK)(NdisBindingContext))->PostNt31ReceiveHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \
(MacReceiveContext), \
(HeaderBuffer), \
(HeaderBufferSize), \
(LookaheadBuffer), \
(LookaheadBufferSize), \
(PacketSize)); \
}
// VOID
// NdisIndicateReceiveComplete(
// IN NDIS_HANDLE NdisBindingContext
// );
#define NdisIndicateReceiveComplete(NdisBindingContext) \
{\
KIRQL oldIrql;\
KeRaiseIrql( DISPATCH_LEVEL, &oldIrql );\
(((PNDIS_OPEN_BLOCK)(NdisBindingContext))->PostNt31ReceiveCompleteHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext);\
KeLowerIrql( oldIrql );\
}
//
// Used by the filter packages for indicating receive completion
//
#define FilterIndicateReceiveComplete(NdisBindingContext) \
{\
(((PNDIS_OPEN_BLOCK)(NdisBindingContext))->PostNt31ReceiveCompleteHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext);\
}
// VOID
// NdisIndicateStatus(
// IN NDIS_HANDLE NdisBindingContext,
// IN NDIS_STATUS GeneralStatus,
// IN PVOID StatusBuffer,
// IN UINT StatusBufferSize
// );
#define NdisIndicateStatus( \
NdisBindingContext, \
GeneralStatus, \
StatusBuffer, \
StatusBufferSize \
) \
{\
(((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolHandle->ProtocolCharacteristics.StatusHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \
(GeneralStatus), \
(StatusBuffer), \
(StatusBufferSize)); \
}
// VOID
// NdisIndicateStatusComplete(
// IN NDIS_HANDLE NdisBindingContext
// );
#define NdisIndicateStatusComplete( \
NdisBindingContext \
) \
{ \
(((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolHandle->ProtocolCharacteristics.StatusCompleteHandler) ( \
((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext); \
}
EXPORT
VOID
NdisCompleteQueryStatistics(
IN NDIS_HANDLE NdisAdapterHandle,
IN PNDIS_REQUEST NdisRequest,
IN NDIS_STATUS Status
);
//
// Interlocked support functions
//
/*++
VOID
NdisInterlockedAddUlong(
IN PULONG Addend,
IN ULONG Increment,
IN PNDIS_SPIN_LOCK SpinLock
);
--*/
#define NdisInterlockedAddUlong(_Addend, _Increment, _SpinLock) \
ExInterlockedAddUlong(_Addend, _Increment, &(_SpinLock)->SpinLock)
/*++
PLIST_ENTRY
NdisInterlockedInsertHeadList(
IN PLIST_ENTRY ListHead,
IN PLIST_ENTRY ListEntry,
IN PNDIS_SPIN_LOCK SpinLock
);
--*/
#define NdisInterlockedInsertHeadList(_ListHead, _ListEntry, _SpinLock) \
ExInterlockedInsertHeadList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
/*++
PLIST_ENTRY
NdisInterlockedInsertTailList(
IN PLIST_ENTRY ListHead,
IN PLIST_ENTRY ListEntry,
IN PNDIS_SPIN_LOCK SpinLock
);
--*/
#define NdisInterlockedInsertTailList(_ListHead, _ListEntry, _SpinLock) \
ExInterlockedInsertTailList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
/*++
PLIST_ENTRY
NdisInterlockedRemoveHeadList(
IN PLIST_ENTRY ListHead,
IN PNDIS_SPIN_LOCK SpinLock
);
--*/
#define NdisInterlockedRemoveHeadList(_ListHead, _SpinLock) \
ExInterlockedRemoveHeadList(_ListHead, &(_SpinLock)->SpinLock)
/*++
VOID
NdisAdjustBufferLength(
IN PNDIS_BUFFER Buffer,
IN UINT Length
);
--*/
#define NdisAdjustBufferLength(Buffer, Length) \
(((Buffer)->ByteCount) = (Length))
//
// Operating System Requests
//
EXPORT
VOID
NdisMapIoSpace(
OUT PNDIS_STATUS Status,
OUT PVOID * VirtualAddress,
IN NDIS_HANDLE NdisAdapterHandle,
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress,
IN UINT Length
);
#if defined(_ALPHA_)
/*++
VOID
NdisUnmapIoSpace(
IN NDIS_HANDLE NdisAdapterHandle,
IN PVOID VirtualAddress,
IN UINT Length
)
--*/
#define NdisUnmapIoSpace(Handle,VirtualAddress,Length) {}
#else
/*++
VOID
NdisUnmapIoSpace(
IN NDIS_HANDLE NdisAdapterHandle,
IN PVOID VirtualAddress,
IN UINT Length
)
--*/
#define NdisUnmapIoSpace(Handle,VirtualAddress,Length) \
MmUnmapIoSpace((VirtualAddress), (Length));
#endif
EXPORT
VOID
NdisInitializeInterrupt(
OUT PNDIS_STATUS Status,
IN OUT PNDIS_INTERRUPT Interrupt,
IN NDIS_HANDLE NdisAdapterHandle,
IN PNDIS_INTERRUPT_SERVICE InterruptServiceRoutine,
IN PVOID InterruptContext,
IN PNDIS_DEFERRED_PROCESSING DeferredProcessingRoutine,
IN UINT InterruptVector,
IN UINT InterruptLevel,
IN BOOLEAN SharedInterrupt,
IN NDIS_INTERRUPT_MODE InterruptMode
);
EXPORT
VOID
NdisRemoveInterrupt(
IN PNDIS_INTERRUPT Interrupt
);
/*++
BOOLEAN
NdisSynchronizeWithInterrupt(
IN PNDIS_INTERRUPT Interrupt,
IN PVOID SynchronizeFunction,
IN PVOID SynchronizeContext
)
--*/
#define NdisSynchronizeWithInterrupt(Interrupt,Function,Context) \
KeSynchronizeExecution( \
(Interrupt)->InterruptObject,\
(PKSYNCHRONIZE_ROUTINE)Function,\
Context \
)
//
// Physical Mapping
//
//
// VOID
// NdisStartBufferPhysicalMapping(
// IN NDIS_HANDLE NdisAdapterHandle,
// IN PNDIS_BUFFER Buffer,
// IN ULONG PhysicalMapRegister,
// IN BOOLEAN WriteToDevice,
// OUT PNDIS_PHYSICAL_ADDRESS_UNIT PhysicalAddressArray,
// OUT PUINT ArraySize
// );
//
#define NdisStartBufferPhysicalMapping( \
_NdisAdapterHandle, \
_Buffer, \
_PhysicalMapRegister, \
_Write, \
_PhysicalAddressArray, \
_ArraySize \
) \
{ \
PNDIS_ADAPTER_BLOCK _AdaptP = (PNDIS_ADAPTER_BLOCK)(_NdisAdapterHandle); \
PHYSICAL_ADDRESS _LogicalAddress; \
PUCHAR _VirtualAddress; \
ULONG _LengthRemaining; \
ULONG _LengthMapped; \
UINT _CurrentArrayLocation; \
_VirtualAddress = MmGetMdlVirtualAddress(_Buffer); \
_LengthRemaining = MmGetMdlByteCount(_Buffer); \
_CurrentArrayLocation = 0; \
while (_LengthRemaining > 0) { \
_LengthMapped = _LengthRemaining; \
_LogicalAddress = IoMapTransfer( \
NULL, \
_Buffer, \
_AdaptP->MapRegisters[_PhysicalMapRegister].MapRegister, \
_VirtualAddress, \
&_LengthMapped, \
_Write); \
_PhysicalAddressArray[_CurrentArrayLocation].PhysicalAddress = _LogicalAddress; \
_PhysicalAddressArray[_CurrentArrayLocation].Length = _LengthMapped; \
_LengthRemaining -= _LengthMapped; \
_VirtualAddress += _LengthMapped; \
++_CurrentArrayLocation; \
} \
_AdaptP->MapRegisters[_PhysicalMapRegister].WriteToDevice = _Write; \
*(_ArraySize) = _CurrentArrayLocation; \
}
//
// VOID
// NdisCompleteBufferPhysicalMapping(
// IN NDIS_HANDLE NdisAdapterHandle,
// IN PNDIS_BUFFER Buffer,
// IN ULONG PhysicalMapRegister
// );
//
#define NdisCompleteBufferPhysicalMapping( \
NdisAdapterHandle, \
Buffer, \
PhysicalMapRegister \
) \
{ \
PNDIS_ADAPTER_BLOCK _AdaptP = (PNDIS_ADAPTER_BLOCK)NdisAdapterHandle; \
IoFlushAdapterBuffers( \
NULL, \
Buffer, \
_AdaptP->MapRegisters[PhysicalMapRegister].MapRegister, \
MmGetMdlVirtualAddress(Buffer), \
MmGetMdlByteCount(Buffer), \
_AdaptP->MapRegisters[PhysicalMapRegister].WriteToDevice); \
}