mirror of https://github.com/lianthony/NT4.0
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
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); \
|
|
}
|