#include #include #include #include #define NDIS_M_MAX_MULTI_LIST 32 #define NDIS_M_MAX_LOOKAHEAD 526 // // declare these first since they point to each other // typedef struct _NDIS_M_DRIVER_BLOCK NDIS_M_DRIVER_BLOCK,*PNDIS_M_DRIVER_BLOCK; typedef struct _NDIS_MINIPORT_BLOCK NDIS_MINIPORT_BLOCK,*PNDIS_MINIPORT_BLOCK; typedef struct _NDIS_M_PROTOCOL_BLOCK NDIS_M_PROTOCOL_BLOCK,*PNDIS_M_PROTOCOL_BLOCK; typedef struct _NDIS_M_OPEN_BLOCK NDIS_M_OPEN_BLOCK,*PNDIS_M_OPEN_BLOCK; typedef struct _CO_CALL_PARAMETERS CO_CALL_PARAMETERS, *PCO_CALL_PARAMETERS; typedef struct _CO_MEDIA_PARAMETERS CO_MEDIA_PARAMETERS, *PCO_MEDIA_PARAMETERS; typedef struct _NDIS_CALL_MANAGER_CHARACTERISTICS *PNDIS_CALL_MANAGER_CHARACTERISTICS; // // Function types for NDIS_MINIPORT_CHARACTERISTICS // typedef BOOLEAN (*W_CHECK_FOR_HANG_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext ); typedef VOID (*W_DISABLE_INTERRUPT_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext ); typedef VOID (*W_ENABLE_INTERRUPT_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext ); typedef VOID (*W_HALT_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext ); typedef VOID (*W_HANDLE_INTERRUPT_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext ); typedef NDIS_STATUS (*W_INITIALIZE_HANDLER)( OUT PNDIS_STATUS OpenErrorStatus, OUT PUINT SelectedMediumIndex, IN PNDIS_MEDIUM MediumArray, IN UINT MediumArraySize, IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE WrapperConfigurationContext ); typedef VOID (*W_ISR_HANDLER)( OUT PBOOLEAN InterruptRecognized, OUT PBOOLEAN QueueMiniportHandleInterrupt, IN NDIS_HANDLE MiniportAdapterContext ); typedef NDIS_STATUS (*W_QUERY_INFORMATION_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_OID Oid, IN PVOID InformationBuffer, IN ULONG InformationBufferLength, OUT PULONG BytesWritten, OUT PULONG BytesNeeded ); typedef NDIS_STATUS (*W_RECONFIGURE_HANDLER)( OUT PNDIS_STATUS OpenErrorStatus, IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE WrapperConfigurationContext ); typedef NDIS_STATUS (*W_RESET_HANDLER)( OUT PBOOLEAN AddressingReset, IN NDIS_HANDLE MiniportAdapterContext ); typedef NDIS_STATUS (*W_SEND_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet, IN UINT Flags ); typedef NDIS_STATUS (*WM_SEND_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE NdisLinkHandle, IN PNDIS_WAN_PACKET Packet ); typedef NDIS_STATUS (*W_SET_INFORMATION_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_OID Oid, IN PVOID InformationBuffer, IN ULONG InformationBufferLength, OUT PULONG BytesRead, OUT PULONG BytesNeeded ); typedef NDIS_STATUS (*W_TRANSFER_DATA_HANDLER)( OUT PNDIS_PACKET Packet, OUT PUINT BytesTransferred, IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE MiniportReceiveContext, IN UINT ByteOffset, IN UINT BytesToTransfer ); typedef NDIS_STATUS (*WM_TRANSFER_DATA_HANDLER)( VOID ); typedef struct _NDIS30_MINIPORT_CHARACTERISTICS { UCHAR MajorNdisVersion; UCHAR MinorNdisVersion; USHORT Filler; UINT Reserved; W_CHECK_FOR_HANG_HANDLER CheckForHangHandler; W_DISABLE_INTERRUPT_HANDLER DisableInterruptHandler; W_ENABLE_INTERRUPT_HANDLER EnableInterruptHandler; W_HALT_HANDLER HaltHandler; W_HANDLE_INTERRUPT_HANDLER HandleInterruptHandler; W_INITIALIZE_HANDLER InitializeHandler; W_ISR_HANDLER ISRHandler; W_QUERY_INFORMATION_HANDLER QueryInformationHandler; W_RECONFIGURE_HANDLER ReconfigureHandler; W_RESET_HANDLER ResetHandler; union { W_SEND_HANDLER SendHandler; WM_SEND_HANDLER WanSendHandler; }; W_SET_INFORMATION_HANDLER SetInformationHandler; union { W_TRANSFER_DATA_HANDLER TransferDataHandler; WM_TRANSFER_DATA_HANDLER WanTransferDataHandler; }; } NDIS30_MINIPORT_CHARACTERISTICS; // // Miniport extensions for NDIS 4.0 // typedef VOID (*W_RETURN_PACKET_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet ); // // NDIS 4.0 extension // typedef VOID (*W_SEND_PACKETS_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets ); typedef VOID (*W_ALLOCATE_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PVOID VirtualAddress, IN PNDIS_PHYSICAL_ADDRESS PhysicalAddress, IN ULONG Length, IN PVOID Context ); typedef struct _NDIS40_MINIPORT_CHARACTERISTICS { #ifdef __cplusplus NDIS30_MINIPORT_CHARACTERISTICS Ndis30Chars; #else NDIS30_MINIPORT_CHARACTERISTICS; #endif // // Extensions for NDIS 4.0 // W_RETURN_PACKET_HANDLER ReturnPacketHandler; W_SEND_PACKETS_HANDLER SendPacketsHandler; W_ALLOCATE_COMPLETE_HANDLER AllocateCompleteHandler; } NDIS40_MINIPORT_CHARACTERISTICS; // // WARNING: NDIS v4.1 is under construction. Do not use. // // // Miniport extensions for NDIS 4.1 // // // NDIS 4.1 extension - however available for miniports only // // // W_CO_CREATE_VC_HANDLER is a synchronous call // typedef NDIS_STATUS (*W_CO_CREATE_VC_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE NdisVcHandle, OUT PNDIS_HANDLE MiniportVcContext ); typedef NDIS_STATUS (*W_CO_DELETE_VC_HANDLER)( IN NDIS_HANDLE MiniportVcContext ); typedef NDIS_STATUS (*W_CO_ACTIVATE_VC_HANDLER)( IN NDIS_HANDLE MiniportVcContext, IN OUT PCO_CALL_PARAMETERS CallParameters ); typedef NDIS_STATUS (*W_CO_DEACTIVATE_VC_HANDLER)( IN NDIS_HANDLE MiniportVcContext ); typedef VOID (*W_CO_SEND_PACKETS_HANDLER)( IN NDIS_HANDLE MiniportVcContext, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets ); typedef NDIS_STATUS (*W_CO_REQUEST_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE MiniportVcContext OPTIONAL, IN OUT PNDIS_REQUEST NdisRequest ); typedef struct _NDIS41_MINIPORT_CHARACTERISTICS { #ifdef __cplusplus NDIS40_MINIPORT_CHARACTERISTICS Ndis40Chars; #else NDIS40_MINIPORT_CHARACTERISTICS; #endif // // Extensions for NDIS 4.1 // W_CO_CREATE_VC_HANDLER CoCreateVcHandler; W_CO_DELETE_VC_HANDLER CoDeleteVcHandler; W_CO_ACTIVATE_VC_HANDLER CoActivateVcHandler; W_CO_DEACTIVATE_VC_HANDLER CoDeactivateVcHandler; W_CO_SEND_PACKETS_HANDLER CoSendPacketsHandler; W_CO_REQUEST_HANDLER CoRequestHandler; } NDIS41_MINIPORT_CHARACTERISTICS; #ifdef NDIS41_MINIPORT typedef struct _NDIS41_MINIPORT_CHARACTERISTICS NDIS_MINIPORT_CHARACTERISTICS; #else #ifdef NDIS40_MINIPORT typedef struct _NDIS40_MINIPORT_CHARACTERISTICS NDIS_MINIPORT_CHARACTERISTICS; #else typedef struct _NDIS30_MINIPORT_CHARACTERISTICS NDIS_MINIPORT_CHARACTERISTICS; #endif #endif typedef NDIS_MINIPORT_CHARACTERISTICS *PNDIS_MINIPORT_CHARACTERISTICS; typedef NDIS_MINIPORT_CHARACTERISTICS NDIS_WAN_MINIPORT_CHARACTERISTICS; typedef NDIS_WAN_MINIPORT_CHARACTERISTICS * PNDIS_MINIPORT_CHARACTERISTICS; // // one of these per Driver // struct _NDIS_M_DRIVER_BLOCK { PNDIS_MINIPORT_BLOCK MiniportQueue; // queue of mini-ports for this driver NDIS_HANDLE MiniportIdField; REFERENCE Ref; // contains spinlock for MiniportQueue UINT Length; // of this NDIS_DRIVER_BLOCK structure NDIS41_MINIPORT_CHARACTERISTICS MiniportCharacteristics; // handler addresses PNDIS_WRAPPER_HANDLE NdisDriverInfo; // Driver information. PNDIS_M_DRIVER_BLOCK NextDriver; PNDIS_MAC_BLOCK FakeMac; // For use by Windows 95. Not used for Windows NT. KEVENT MiniportsRemovedEvent;// used to find when all mini-ports are gone. BOOLEAN Unloading; // TRUE if unloading // Needed for PnP UNICODE_STRING BaseName; }; typedef struct _NDIS_MINIPORT_INTERRUPT { PKINTERRUPT InterruptObject; KSPIN_LOCK DpcCountLock; PVOID MiniportIdField; W_ISR_HANDLER MiniportIsr; W_HANDLE_INTERRUPT_HANDLER MiniportDpc; KDPC InterruptDpc; PNDIS_MINIPORT_BLOCK Miniport; UCHAR DpcCount; BOOLEAN Filler1; // // This is used to tell when all the Dpcs for the adapter are completed. // KEVENT DpcsCompletedEvent; BOOLEAN SharedInterrupt; BOOLEAN IsrRequested; } NDIS_MINIPORT_INTERRUPT, *PNDIS_MINIPORT_INTERRUPT; typedef struct _NDIS_MINIPORT_TIMER { KTIMER Timer; KDPC Dpc; PNDIS_TIMER_FUNCTION MiniportTimerFunction; PVOID MiniportTimerContext; PNDIS_MINIPORT_BLOCK Miniport; struct _NDIS_MINIPORT_TIMER *NextDeferredTimer; } NDIS_MINIPORT_TIMER, *PNDIS_MINIPORT_TIMER; // // Pending NdisOpenAdapter() structure (for miniports only). // typedef struct _MINIPORT_PENDING_OPEN *PMINIPORT_PENDING_OPEN; typedef struct _MINIPORT_PENDING_OPEN { PMINIPORT_PENDING_OPEN NextPendingOpen; PNDIS_HANDLE NdisBindingHandle; PNDIS_MINIPORT_BLOCK Miniport; PVOID NewOpenP; PVOID FileObject; NDIS_HANDLE NdisProtocolHandle; NDIS_HANDLE ProtocolBindingContext; PNDIS_STRING AdapterName; UINT OpenOptions; PSTRING AddressingInformation; ULONG Flags; NDIS_STATUS Status; NDIS_STATUS OpenErrorStatus; #if defined(NDIS_WRAPPER) WORK_QUEUE_ITEM WorkItem; #endif } MINIPORT_PENDING_OPEN, *PMINIPORT_PENDING_OPEN; // // Flag definitions for MINIPORT_PENDING_OPEN // #define fPENDING_OPEN_USING_ENCAPSULATION 0x00000001 // // Defines the type of work item. // typedef enum _NDIS_WORK_ITEM_TYPE { NdisWorkItemDpc, NdisWorkItemResetRequested, NdisWorkItemRequest, NdisWorkItemSend, NdisWorkItemHalt, NdisWorkItemSendLoopback, NdisWorkItemResetInProgress, NdisWorkItemTimer, NdisWorkItemPendingOpen, NdisWorkItemMiniportCallback, NdisMaxWorkItems } NDIS_WORK_ITEM_TYPE, *PNDIS_WORK_ITEM_TYPE; #define NUMBER_OF_WORK_ITEM_TYPES NdisMaxWorkItems #define NUMBER_OF_SINGLE_WORK_ITEMS 6 typedef VOID (*FILTER_PACKET_INDICATION_HANDLER)( IN NDIS_HANDLE Miniport, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets ); typedef VOID (*NDIS_M_SEND_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status ); typedef VOID (*NDIS_M_SEND_RESOURCES_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle ); typedef VOID (*NDIS_M_RESET_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status, IN BOOLEAN AddressingReset ); typedef VOID (FASTCALL *NDIS_M_PROCESS_DEFERRED)( IN PNDIS_MINIPORT_BLOCK Miniport ); typedef BOOLEAN (FASTCALL *NDIS_M_START_SENDS)( IN PNDIS_MINIPORT_BLOCK Miniport ); typedef NDIS_STATUS (FASTCALL *NDIS_M_QUEUE_WORK_ITEM)( IN PNDIS_MINIPORT_BLOCK Miniport, IN NDIS_WORK_ITEM_TYPE WorkItemType, IN PVOID WorkItemContext1, IN PVOID WorkItemContext2 ); typedef NDIS_STATUS (FASTCALL *NDIS_M_QUEUE_NEW_WORK_ITEM)( IN PNDIS_MINIPORT_BLOCK Miniport, IN NDIS_WORK_ITEM_TYPE WorkItemType, IN PVOID WorkItemContext1, IN PVOID WorkItemContext2 ); typedef VOID (FASTCALL *NDIS_M_DEQUEUE_WORK_ITEM)( IN PNDIS_MINIPORT_BLOCK Miniport, IN NDIS_WORK_ITEM_TYPE WorkItemType, OUT PVOID * WorkItemContext1, OUT PVOID * WorkItemContext2 ); // // Structure used by the logging apis // typedef struct _NDIS_LOG { PNDIS_MINIPORT_BLOCK Miniport; // The owning miniport block KSPIN_LOCK LogLock; // For serialization #if defined(NDIS_WRAPPER) PIRP Irp; // Pending Irp to consume this log #endif UINT TotalSize; // Size of the log buffer UINT CurrentSize;// Size of the log buffer UINT InPtr; // IN part of the circular buffer UINT OutPtr; // OUT part of the circular buffer UCHAR LogBuf[1]; // The circular buffer } NDIS_LOG, *PNDIS_LOG; typedef struct _NDIS_AF_LIST NDIS_AF_LIST, *PNDIS_AF_LIST; // // one of these per mini-port registered on a Driver // struct _NDIS_MINIPORT_BLOCK { ULONG NullValue; // used to distinquish between MACs and mini-ports PDEVICE_OBJECT DeviceObject; // created by the wrapper PNDIS_M_DRIVER_BLOCK DriverHandle; // pointer to our Driver block NDIS_HANDLE MiniportAdapterContext; // context when calling mini-port functions NDIS_STRING MiniportName; // how mini-port refers to us PNDIS_M_OPEN_BLOCK OpenQueue; // queue of opens for this mini-port PNDIS_MINIPORT_BLOCK NextMiniport; // used by driver's MiniportQueue REFERENCE Ref; // contains spinlock for OpenQueue BOOLEAN padding1; // normal ints: DO NOT REMOVE OR NDIS WILL BREAK!!! BOOLEAN padding2; // processing def: DO NOT REMOVE OR NDIS WILL BREAK!!! // // Synchronization stuff. // // The boolean is used to lock out several DPCs from running at the // same time. The difficultly is if DPC A releases the spin lock // and DPC B tries to run, we want to defer B until after A has // exited. // BOOLEAN LockAcquired; // EXPOSED via macros. Do not move UCHAR PmodeOpens; // Count of opens which turned on pmode/all_local NDIS_SPIN_LOCK Lock; PNDIS_MINIPORT_INTERRUPT Interrupt; ULONG Flags; // Flags to keep track of the // miniport's state. // //Work that the miniport needs to do. // KSPIN_LOCK WorkLock; SINGLE_LIST_ENTRY WorkQueue[NUMBER_OF_WORK_ITEM_TYPES]; SINGLE_LIST_ENTRY WorkItemFreeQueue; // // Stuff that got deferred. // KDPC Dpc; NDIS_TIMER WakeUpDpcTimer; // // Holds media specific information. // PETH_FILTER EthDB; // EXPOSED via macros. Do not move PTR_FILTER TrDB; // EXPOSED via macros. Do not move PFDDI_FILTER FddiDB; // EXPOSED via macros. Do not move PARC_FILTER ArcDB; // EXPOSED via macros. Do not move FILTER_PACKET_INDICATION_HANDLER PacketIndicateHandler; NDIS_M_SEND_COMPLETE_HANDLER SendCompleteHandler; NDIS_M_SEND_RESOURCES_HANDLER SendResourcesHandler; NDIS_M_RESET_COMPLETE_HANDLER ResetCompleteHandler; PVOID WrapperContext; NDIS_MEDIUM MediaType; // // contains mini-port information // ULONG BusNumber; NDIS_INTERFACE_TYPE BusType; NDIS_INTERFACE_TYPE AdapterType; // // Holds the map registers for this mini-port. // ULONG PhysicalMapRegistersNeeded; ULONG MaximumPhysicalMapping; PMAP_REGISTER_ENTRY MapRegisters; // EXPOSED via macros. Do not move // // WorkItem routines that can change depending on whether we // are fullduplex or not. // NDIS_M_PROCESS_DEFERRED ProcessDeferredHandler; NDIS_M_QUEUE_WORK_ITEM QueueWorkItemHandler; NDIS_M_QUEUE_NEW_WORK_ITEM QueueNewWorkItemHandler; NDIS_M_DEQUEUE_WORK_ITEM DeQueueWorkItemHandler; PNDIS_TIMER DeferredTimer; // // Resource information // PCM_RESOURCE_LIST Resources; // // This pointer is reserved. Used for debugging // PVOID Reserved; PADAPTER_OBJECT SystemAdapterObject; SINGLE_LIST_ENTRY SingleWorkItems[NUMBER_OF_SINGLE_WORK_ITEMS]; // // For efficiency // W_HANDLE_INTERRUPT_HANDLER HandleInterruptHandler; W_DISABLE_INTERRUPT_HANDLER DisableInterruptHandler; W_ENABLE_INTERRUPT_HANDLER EnableInterruptHandler; W_SEND_PACKETS_HANDLER SendPacketsHandler; NDIS_M_START_SENDS DeferredSendHandler; /**************** Stuff above is potentially accessed by macros. Add stuff below **********/ PNDIS_MAC_BLOCK FakeMac; ULONG InterruptLevel; ULONG InterruptVector; NDIS_INTERRUPT_MODE InterruptMode; UCHAR TrResetRing; UCHAR ArcnetAddress; // // This is the processor number that the miniport's // interrupt DPC and timers are running on. // UCHAR AssignedProcessor; NDIS_HANDLE ArcnetBufferPool; PARC_BUFFER_LIST ArcnetFreeBufferList; PARC_BUFFER_LIST ArcnetUsedBufferList; PUCHAR ArcnetLookaheadBuffer; UINT CheckForHangTimeout; // // These two are used temporarily while allocating the map registers. // KEVENT AllocationEvent; UINT CurrentMapRegister; // // Send information // NDIS_SPIN_LOCK SendLock; ULONG SendFlags; // Flags for send path. PNDIS_PACKET FirstPacket; // This pointer serves two purposes; // it is the head of the queue of ALL // packets that have been sent to // the miniport, it is also the head // of the packets that have been sent // down to the miniport by the wrapper. PNDIS_PACKET LastPacket; // This is tail pointer for the global // packet queue and this is the tail // pointer to the queue of packets // waiting to be sent to the miniport. PNDIS_PACKET FirstPendingPacket; // This is head of the queue of packets // waiting to be sent to miniport. PNDIS_PACKET LastMiniportPacket; // This is the tail pointer of the // queue of packets that have been // sent to the miniport by the wrapper. PNDIS_PACKET LoopbackHead; // Head of loopback queue. PNDIS_PACKET LoopbackTail; // Tail of loopback queue. ULONG SendResourcesAvailable; PPNDIS_PACKET PacketArray; UINT MaximumSendPackets; // // Transfer data information // PNDIS_PACKET FirstTDPacket; PNDIS_PACKET LastTDPacket; PNDIS_PACKET LoopbackPacket; // // Reset information // NDIS_STATUS ResetStatus; // // RequestInformation // PNDIS_REQUEST PendingRequest; PNDIS_REQUEST MiniportRequest; NDIS_STATUS RequestStatus; UINT MaximumLongAddresses; UINT MaximumShortAddresses; UINT CurrentLookahead; UINT MaximumLookahead; UINT MacOptions; KEVENT RequestEvent; UCHAR MulticastBuffer[NDIS_M_MAX_MULTI_LIST][6]; // // Temp stuff for using the old NDIS functions // ULONG ChannelNumber; UINT NumberOfAllocatedWorkItems; PNDIS_LOG Log; #if defined(NDIS_WRAPPER) // // List of registered address families. Valid for the call-manager, Null for the client // PNDIS_AF_LIST CallMgrAfList; // // Store information here to track adapters // ULONG BusId; ULONG SlotNumber; // // Pointer to the current thread. Used in layered miniport code. // LONG MiniportThread; LONG SendThread; // // To handle packets returned during RcvIndication // WORK_QUEUE_ITEM WorkItem; PNDIS_PACKET ReturnPacketsQueue; // // Needed for PnP. Upcased version. The buffer is allocated as part of the // NDIS_MINIPORT_BLOCK itself. // UNICODE_STRING BaseName; #endif }; // // Definitions for NDIS_MINIPORT_BLOCK GeneralFlags. // #define fMINIPORT_NORMAL_INTERRUPTS 0x00000001 #define fMINIPORT_IN_INITIALIZE 0x00000002 #define fMINIPORT_ARCNET_BROADCAST_SET 0x00000004 #define fMINIPORT_BUS_MASTER 0x00000008 #define fMINIPORT_DMA_32_BIT_ADDRESSES 0x00000010 #define fMINIPORT_BEING_REMOVED 0x00000020 #define fMINIPORT_HALTING 0x00000040 #define fMINIPORT_CLOSING 0x00000080 #define fMINIPORT_UNLOADING 0x00000100 #define fMINIPORT_REQUEST_TIMEOUT 0x00000200 #define fMINIPORT_INDICATES_PACKETS 0x00000400 #define fMINIPORT_IS_NDIS_4_0 0x00000800 #define fMINIPORT_PACKET_ARRAY_VALID 0x00001000 #define fMINIPORT_FULL_DUPLEX 0x00002000 #define fMINIPORT_IGNORE_PACKET_QUEUE 0x00004000 #define fMINIPORT_IGNORE_REQUEST_QUEUE 0x00008000 #define fMINIPORT_IGNORE_TOKEN_RING_ERRORS 0x00010000 #define fMINIPORT_IS_IN_ALL_LOCAL 0x00020000 #define fMINIPORT_INTERMEDIATE_DRIVER 0x00040000 #define fMINIPORT_IS_NDIS_4_1 0x00080000 #define fMINIPORT_IS_CO 0x00100000 #define fMINIPORT_DESERIALIZE 0x00200000 #define fMINIPORT_RP_WORK_ITEM_QUEUED 0x00400000 #define MINIPORT_LOCK_ACQUIRED(_Miniport) ((_Miniport)->LockAcquired) // // Send flags // #define fMINIPORT_SEND_COMPLETE_CALLED 0x00000001 #define fMINIPORT_SEND_PACKET_ARRAY 0x00000002 #define fMINIPORT_SEND_HALTING 0x00000004 #define fMINIPORT_SEND_LOOPBACK_DIRECTED 0x00000008 // // Flags used in both. // #define fMINIPORT_RESET_IN_PROGRESS 0x80000000 #define fMINIPORT_RESET_REQUESTED 0x40000000 #define fMINIPORT_PROCESS_DEFERRED 0x20000000 // // one of these per open on an mini-port/protocol // struct _NDIS_M_OPEN_BLOCK { PNDIS_M_DRIVER_BLOCK DriverHandle; // pointer to our driver PNDIS_MINIPORT_BLOCK MiniportHandle; // pointer to our mini-port PNDIS_PROTOCOL_BLOCK ProtocolHandle; // pointer to our protocol PNDIS_OPEN_BLOCK FakeOpen; // Pointer to fake open block NDIS_HANDLE ProtocolBindingContext; // context when calling ProtXX funcs NDIS_HANDLE MiniportAdapterContext; // context when calling MiniportXX funcs PNDIS_M_OPEN_BLOCK MiniportNextOpen; // used by mini-port's OpenQueue PFILE_OBJECT FileObject; // created by operating system ULONG Flags; NDIS_HANDLE CloseRequestHandle; // 0 indicates an internal close NDIS_HANDLE FilterHandle; NDIS_SPIN_LOCK SpinLock; // guards Closing ULONG References; UINT CurrentLookahead; ULONG ProtocolOptions; // // These are optimizations for getting to driver routines. They are not // necessary, but are here to save a dereference through the Driver block. // W_SEND_HANDLER SendHandler; W_TRANSFER_DATA_HANDLER TransferDataHandler; // // NDIS 4.0 miniport entry-points // W_SEND_PACKETS_HANDLER SendPacketsHandler; // // NDIS 4.1 miniport entry-points // W_CO_CREATE_VC_HANDLER MiniportCoCreateVcHandler; W_CO_REQUEST_HANDLER MiniportCoRequestHandler; // // 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; // // NDIS 4.0 protocol completion routines // RECEIVE_PACKET_HANDLER ReceivePacketHandler; // // NDIS 4.1 protocol completion routines // CO_REQUEST_COMPLETE_HANDLER CoRequestCompleteHandler; CO_CREATE_VC_HANDLER CoCreateVcHandler; CO_DELETE_VC_HANDLER CoDeleteVcHandler; PVOID CmActivateVcCompleteHandler; PVOID CmDeactivateVcCompleteHandler; BOOLEAN ReceivedAPacket; BOOLEAN IndicatingNow; // // this is the list of the call manager opens done on this adapter // struct _NDIS_CO_AF_BLOCK * NextAf; // // This is a bit mask of what the call manager modules this open supports. // Usually the field is null meaning no call manager // ULONG AddressFamilyMask; // // lists for queuing connections. There is both a queue for currently // active connections and a queue for connections that are not active. // LIST_ENTRY ActiveVcHead; LIST_ENTRY InactiveVcHead; }; // // Flags definition for NDIS_M_OPEN_BLOCK. // #define fMINIPORT_OPEN_CLOSING 0x00000001 #define fMINIPORT_OPEN_USING_ETH_ENCAPSULATION 0x00000002 #define fMINIPORT_OPEN_NO_LOOPBACK 0x00000004 #define fMINIPORT_OPEN_PMODE 0x00000008 #define fMINIPORT_OPEN_NO_PROT_RSVD 0x00000010 // // Routines for intermediate miniport drivers. // typedef VOID (*W_MINIPORT_CALLBACK)( IN NDIS_HANDLE MiniportAdapterContext, IN PVOID CallbackContext ); EXPORT NDIS_STATUS NdisIMQueueMiniportCallback( IN NDIS_HANDLE MiniportAdapterHandle, IN W_MINIPORT_CALLBACK CallbackRoutine, IN PVOID CallbackContext ); EXPORT BOOLEAN NdisIMSwitchToMiniport( IN NDIS_HANDLE MiniportAdapterHandle, OUT PNDIS_HANDLE SwitchHandle ); EXPORT VOID NdisIMRevertBack( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE SwitchHandle ); EXPORT VOID NdisMSetResetTimeout( IN NDIS_HANDLE MiniportAdapterHandle, IN UINT TimeInSeconds ); // // Operating System Requests // EXPORT NDIS_STATUS NdisMAllocateMapRegisters( IN NDIS_HANDLE MiniportAdapterHandle, IN UINT DmaChannel, IN BOOLEAN Dma32BitAddresses, IN ULONG PhysicalMapRegistersNeeded, IN ULONG MaximumPhysicalMapping ); EXPORT VOID NdisMFreeMapRegisters( IN NDIS_HANDLE MiniportAdapterHandle ); EXPORT NDIS_STATUS NdisMRegisterIoPortRange( OUT PVOID * PortOffset, IN NDIS_HANDLE MiniportAdapterHandle, IN UINT InitialPort, IN UINT NumberOfPorts ); EXPORT VOID NdisMDeregisterIoPortRange( IN NDIS_HANDLE MiniportAdapterHandle, IN UINT InitialPort, IN UINT NumberOfPorts, IN PVOID PortOffset ); EXPORT NDIS_STATUS NdisMMapIoSpace( OUT PVOID * VirtualAddress, IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, IN UINT Length ); EXPORT VOID NdisMUnmapIoSpace( IN NDIS_HANDLE MiniportAdapterHandle, IN PVOID VirtualAddress, IN UINT Length ); EXPORT NDIS_STATUS NdisMRegisterInterrupt( OUT PNDIS_MINIPORT_INTERRUPT Interrupt, IN NDIS_HANDLE MiniportAdapterHandle, IN UINT InterruptVector, IN UINT InterruptLevel, IN BOOLEAN RequestIsr, IN BOOLEAN SharedInterrupt, IN NDIS_INTERRUPT_MODE InterruptMode ); EXPORT VOID NdisMDeregisterInterrupt( IN PNDIS_MINIPORT_INTERRUPT Interrupt ); EXPORT BOOLEAN NdisMSynchronizeWithInterrupt( IN PNDIS_MINIPORT_INTERRUPT Interrupt, IN PVOID SynchronizeFunction, IN PVOID SynchronizeContext ); EXPORT VOID NdisMQueryAdapterResources( OUT PNDIS_STATUS Status, IN NDIS_HANDLE WrapperConfigurationContext, OUT PNDIS_RESOURCE_LIST ResourceList, IN OUT PUINT BufferSize ); // // Timers // /*++ VOID NdisMSetTimer( IN PNDIS_MINIPORT_TIMER Timer, IN UINT MillisecondsToDelay ); --*/ #define NdisMSetTimer(_Timer, _Delay) NdisSetTimer((PNDIS_TIMER)(_Timer), _Delay) VOID NdisMSetPeriodicTimer( IN PNDIS_MINIPORT_TIMER Timer, IN UINT MillisecondPeriod ); EXPORT VOID NdisMInitializeTimer( IN OUT PNDIS_MINIPORT_TIMER Timer, IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_TIMER_FUNCTION TimerFunction, IN PVOID FunctionContext ); EXPORT VOID NdisMCancelTimer( IN PNDIS_MINIPORT_TIMER Timer, OUT PBOOLEAN TimerCancelled ); EXPORT VOID NdisMSleep( IN ULONG MicrosecondsToSleep ); // // Physical Mapping // #if defined(_X86_) #define NdisMStartBufferPhysicalMappingMacro(_MiniportAdapterHandle, \ _Buffer, \ _PhysicalMapRegister, \ _Write, \ _PhysicalAddressArray, \ _ArraySize) \ { \ PNDIS_MINIPORT_BLOCK Miniport; \ PHYSICAL_ADDRESS LogicalAddress; \ PUCHAR VirtualAddress; \ ULONG LengthRemaining; \ ULONG LengthMapped; \ PULONG pageframe; \ PMDL Mdl; \ UINT CurrentArrayLocation; \ ULONG TransferLength; \ ULONG Pageoffset; \ \ Mdl=(PMDL)_Buffer; \ Miniport = (PNDIS_MINIPORT_BLOCK)(_MiniportAdapterHandle); \ CurrentArrayLocation = 0; \ \ if ((Miniport->MapRegisters[_PhysicalMapRegister].MapRegister == NULL) && \ (Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) && \ (Mdl->MdlFlags & MDL_NETWORK_HEADER) && \ ((Mdl->ByteOffset+Mdl->ByteCount) < PAGE_SIZE)) \ { \ LogicalAddress.QuadPart = (ULONGLONG)((*(PULONG)(Mdl+1) << PAGE_SHIFT)+ \ Mdl->ByteOffset); \ (_PhysicalAddressArray)[CurrentArrayLocation].PhysicalAddress = LogicalAddress;\ (_PhysicalAddressArray)[CurrentArrayLocation].Length = Mdl->ByteCount; \ ++CurrentArrayLocation; \ } \ else \ { \ VirtualAddress = (PUCHAR)MmGetMdlVirtualAddress(_Buffer); \ LengthRemaining = MmGetMdlByteCount(_Buffer); \ while (LengthRemaining > 0) \ { \ LengthMapped = LengthRemaining; \ if (Miniport->MapRegisters[_PhysicalMapRegister].MapRegister == NULL)\ { \ Pageoffset = BYTE_OFFSET(VirtualAddress); \ TransferLength = PAGE_SIZE - Pageoffset; \ pageframe = (PULONG)(Mdl+1); \ pageframe += ((ULONG)VirtualAddress - \ (ULONG)Mdl->StartVa) >> PAGE_SHIFT; \ LogicalAddress.QuadPart = \ (ULONGLONG)((*pageframe << PAGE_SHIFT)+Pageoffset); \ while (TransferLength < LengthMapped) \ { \ if (*pageframe+1 != *(pageframe+1)) \ break; \ TransferLength += PAGE_SIZE; \ pageframe++; \ } \ if (TransferLength < LengthMapped) \ { \ LengthMapped = TransferLength; \ } \ } \ else \ { \ LogicalAddress = IoMapTransfer(NULL, \ (_Buffer), \ Miniport->MapRegisters[_PhysicalMapRegister].MapRegister,\ VirtualAddress,&LengthMapped, \ (_Write)); \ } \ (_PhysicalAddressArray)[CurrentArrayLocation].PhysicalAddress = \ LogicalAddress; \ (_PhysicalAddressArray)[CurrentArrayLocation].Length = LengthMapped;\ LengthRemaining -= LengthMapped; \ VirtualAddress += LengthMapped; \ ++CurrentArrayLocation; \ } \ } \ Miniport->MapRegisters[_PhysicalMapRegister].WriteToDevice = (_Write); \ *(_ArraySize) = CurrentArrayLocation; \ } #else #define NdisMStartBufferPhysicalMappingMacro( \ _MiniportAdapterHandle, \ _Buffer, \ _PhysicalMapRegister, \ _Write, \ _PhysicalAddressArray, \ _ArraySize \ ) \ { \ PNDIS_MINIPORT_BLOCK _Miniport = (PNDIS_MINIPORT_BLOCK)(_MiniportAdapterHandle);\ PHYSICAL_ADDRESS _LogicalAddress; \ PUCHAR _VirtualAddress; \ ULONG _LengthRemaining; \ ULONG _LengthMapped; \ UINT _CurrentArrayLocation; \ \ _VirtualAddress = (PUCHAR)MmGetMdlVirtualAddress(_Buffer); \ _LengthRemaining = MmGetMdlByteCount(_Buffer); \ _CurrentArrayLocation = 0; \ \ while (_LengthRemaining > 0) \ { \ _LengthMapped = _LengthRemaining; \ _LogicalAddress = \ IoMapTransfer( \ NULL, \ (_Buffer), \ _Miniport->MapRegisters[_PhysicalMapRegister].MapRegister, \ _VirtualAddress, \ &_LengthMapped, \ (_Write)); \ (_PhysicalAddressArray)[_CurrentArrayLocation].PhysicalAddress = _LogicalAddress;\ (_PhysicalAddressArray)[_CurrentArrayLocation].Length = _LengthMapped; \ _LengthRemaining -= _LengthMapped; \ _VirtualAddress += _LengthMapped; \ ++_CurrentArrayLocation; \ } \ _Miniport->MapRegisters[_PhysicalMapRegister].WriteToDevice = (_Write); \ *(_ArraySize) = _CurrentArrayLocation; \ } #endif #if BINARY_COMPATIBLE EXPORT VOID NdisMStartBufferPhysicalMapping( IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_BUFFER Buffer, IN ULONG PhysicalMapRegister, IN BOOLEAN WriteToDevice, OUT PNDIS_PHYSICAL_ADDRESS_UNIT PhysicalAddressArray, OUT PUINT ArraySize ); #else #define NdisMStartBufferPhysicalMapping( \ _MiniportAdapterHandle, \ _Buffer, \ _PhysicalMapRegister, \ _Write, \ _PhysicalAddressArray, \ _ArraySize \ ) \ NdisMStartBufferPhysicalMappingMacro( \ (_MiniportAdapterHandle), \ (_Buffer), \ (_PhysicalMapRegister), \ (_Write), \ (_PhysicalAddressArray), \ (_ArraySize) \ ) #endif #if defined(_X86_) #define NdisMCompleteBufferPhysicalMappingMacro(_MiniportAdapterHandle, \ _Buffer, \ _PhysicalMapRegister) \ { \ PNDIS_MINIPORT_BLOCK _Miniport = (PNDIS_MINIPORT_BLOCK)(_MiniportAdapterHandle);\ \ if (_Miniport->MapRegisters[_PhysicalMapRegister].MapRegister != NULL) \ IoFlushAdapterBuffers(NULL, \ _Buffer, \ _Miniport->MapRegisters[_PhysicalMapRegister].MapRegister,\ MmGetMdlVirtualAddress(_Buffer), \ MmGetMdlByteCount(_Buffer), \ _Miniport->MapRegisters[_PhysicalMapRegister].WriteToDevice);\ } #else #define NdisMCompleteBufferPhysicalMappingMacro( \ _MiniportAdapterHandle, \ _Buffer, \ _PhysicalMapRegister \ ) \ { \ PNDIS_MINIPORT_BLOCK _Miniport = (PNDIS_MINIPORT_BLOCK)(_MiniportAdapterHandle);\ \ IoFlushAdapterBuffers(NULL, \ _Buffer, \ _Miniport->MapRegisters[_PhysicalMapRegister].MapRegister,\ MmGetMdlVirtualAddress(_Buffer), \ MmGetMdlByteCount(_Buffer), \ _Miniport->MapRegisters[_PhysicalMapRegister].WriteToDevice);\ } #endif #if BINARY_COMPATIBLE EXPORT VOID NdisMCompleteBufferPhysicalMapping( IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_BUFFER Buffer, IN ULONG PhysicalMapRegister ); #else #define NdisMCompleteBufferPhysicalMapping( \ _MiniportAdapterHandle, \ _Buffer, \ _PhysicalMapRegister \ ) \ NdisMCompleteBufferPhysicalMappingMacro( \ (_MiniportAdapterHandle), \ (_Buffer), \ (_PhysicalMapRegister) \ ) #endif // // Shared memory // EXPORT VOID NdisMAllocateSharedMemory( IN NDIS_HANDLE MiniportAdapterHandle, IN ULONG Length, IN BOOLEAN Cached, OUT PVOID * VirtualAddress, OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress ); EXPORT NDIS_STATUS NdisMAllocateSharedMemoryAsync( IN NDIS_HANDLE MiniportAdapterHandle, IN ULONG Length, IN BOOLEAN Cached, IN PVOID Context ); /*++ VOID NdisMUpdateSharedMemory( IN NDIS_HANDLE MiniportAdapterHandle, IN ULONG Length, IN PVOID VirtualAddress, IN NDIS_PHYSICAL_ADDRESS PhysicalAddress ) --*/ #define NdisMUpdateSharedMemory(_H, _L, _V, _P) NdisUpdateSharedMemory(_H, _L, _V, _P) EXPORT VOID NdisMFreeSharedMemory( IN NDIS_HANDLE MiniportAdapterHandle, IN ULONG Length, IN BOOLEAN Cached, IN PVOID VirtualAddress, IN NDIS_PHYSICAL_ADDRESS PhysicalAddress ); // // DMA operations. // EXPORT NDIS_STATUS NdisMRegisterDmaChannel( OUT PNDIS_HANDLE MiniportDmaHandle, IN NDIS_HANDLE MiniportAdapterHandle, IN UINT DmaChannel, IN BOOLEAN Dma32BitAddresses, IN PNDIS_DMA_DESCRIPTION DmaDescription, IN ULONG MaximumLength ); EXPORT VOID NdisMDeregisterDmaChannel( IN NDIS_HANDLE MiniportDmaHandle ); /*++ VOID NdisMSetupDmaTransfer( OUT PNDIS_STATUS Status, IN PNDIS_HANDLE MiniportDmaHandle, IN PNDIS_BUFFER Buffer, IN ULONG Offset, IN ULONG Length, IN BOOLEAN WriteToDevice ) --*/ #define NdisMSetupDmaTransfer(_S, _H, _B, _O, _L, _M_) \ NdisSetupDmaTransfer(_S, _H, _B, _O, _L, _M_) /*++ VOID NdisMCompleteDmaTransfer( OUT PNDIS_STATUS Status, IN PNDIS_HANDLE MiniportDmaHandle, IN PNDIS_BUFFER Buffer, IN ULONG Offset, IN ULONG Length, IN BOOLEAN WriteToDevice ) --*/ #define NdisMCompleteDmaTransfer(_S, _H, _B, _O, _L, _M_) \ NdisCompleteDmaTransfer(_S, _H, _B, _O, _L, _M_) EXPORT ULONG NdisMReadDmaCounter( IN NDIS_HANDLE MiniportDmaHandle ); // // Requests Used by Miniport Drivers // #define NdisMInitializeWrapper(_a,_b,_c,_d) NdisInitializeWrapper((_a),(_b),(_c),(_d)) EXPORT NDIS_STATUS NdisMRegisterMiniport( IN NDIS_HANDLE NdisWrapperHandle, IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, IN UINT CharacteristicsLength ); // // For use by intermediate miniports only // EXPORT NDIS_STATUS NdisIMRegisterLayeredMiniport( IN NDIS_HANDLE NdisWrapperHandle, IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, IN UINT CharacteristicsLength, OUT PNDIS_HANDLE DriverHandle ); // // For use by intermediate miniports only // EXPORT NDIS_STATUS NdisIMInitializeDeviceInstance( IN NDIS_HANDLE DriverHandle, IN PNDIS_STRING DriverInstance ); NDIS_STATUS NdisIMDeInitializeDeviceInstance( IN NDIS_HANDLE NdisMiniportHandle ); EXPORT VOID NdisMSetAttributes( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE MiniportAdapterContext, IN BOOLEAN BusMaster, IN NDIS_INTERFACE_TYPE AdapterType ); EXPORT VOID NdisMSetAttributesEx( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE MiniportAdapterContext, IN UINT CheckForHangTimeInSeconds OPTIONAL, IN ULONG AttributeFlags, IN NDIS_INTERFACE_TYPE AdapterType OPTIONAL ); #define NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT 0x00000001 #define NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT 0x00000002 #define NDIS_ATTRIBUTE_IGNORE_TOKEN_RING_ERRORS 0x00000004 #define NDIS_ATTRIBUTE_BUS_MASTER 0x00000008 #define NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER 0x00000010 /*++ EXPORT VOID NdisMSendComplete( IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status ) --*/ #if (defined(NDIS40_MINIPORT) || defined(NDIS41_MINIPORT)) #define NdisMSendComplete(_M, _P, _S) (*((PNDIS_MINIPORT_BLOCK)(_M))->SendCompleteHandler)(_M, _P, _S) #else EXPORT VOID NdisMSendComplete( IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status ); #endif /*++ EXPORT VOID NdisMSendResourcesAvailable( IN NDIS_HANDLE MiniportAdapterHandle ) --*/ #if (defined(NDIS40_MINIPORT) || defined(NDIS41_MINIPORT)) #define NdisMSendResourcesAvailable(_M) (*((PNDIS_MINIPORT_BLOCK)(_M))->SendResourcesHandler)(_M) #else EXPORT VOID NdisMSendResourcesAvailable( IN NDIS_HANDLE MiniportAdapterHandle ); #endif /*++ EXPORT VOID NdisMResetComplete( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status, IN BOOLEAN AddressingReset ) --*/ #if (defined(NDIS40_MINIPORT) || defined(NDIS41_MINIPORT)) #define NdisMResetComplete(_M, _S, _A) (*((PNDIS_MINIPORT_BLOCK)(_M))->ResetCompleteHandler)(_M, _S, _A) #else EXPORT VOID NdisMResetComplete( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status, IN BOOLEAN AddressingReset ); #endif EXPORT VOID NdisMTransferDataComplete( IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred ); EXPORT VOID NdisMSetInformationComplete( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status ); EXPORT VOID NdisMQueryInformationComplete( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status ); /*++ VOID NdisMIndicateReceivePacket( IN NDIS_HANDLE MiniportAdapterHandle, IN PPNDIS_PACKET ReceivedPackets, IN UINT NumberOfPackets ) --*/ #define NdisMIndicateReceivePacket(_H, _P, _N) \ { \ ASSERT(MINIPORT_LOCK_ACQUIRED((PNDIS_MINIPORT_BLOCK)(_H))); \ (*((PNDIS_MINIPORT_BLOCK)(_H))->PacketIndicateHandler)( \ _H, \ _P, \ _N); \ } /*++ VOID NdisMEthIndicateReceive( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE MiniportReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookaheadBuffer, IN UINT LookaheadBufferSize, IN UINT PacketSize ) --*/ #define NdisMEthIndicateReceive( _H, _C, _B, _SZ, _L, _LSZ, _PSZ) \ { \ ASSERT(MINIPORT_LOCK_ACQUIRED((PNDIS_MINIPORT_BLOCK)(_H))); \ EthFilterDprIndicateReceive( \ ((PNDIS_MINIPORT_BLOCK)(_H))->EthDB, \ _C, \ _B, \ _B, \ _SZ, \ _L, \ _LSZ, \ _PSZ \ ); \ } /*++ VOID NdisMTrIndicateReceive( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE MiniportReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookaheadBuffer, IN UINT LookaheadBufferSize, IN UINT PacketSize ) --*/ #define NdisMTrIndicateReceive( _H, _C, _B, _SZ, _L, _LSZ, _PSZ) \ { \ ASSERT(MINIPORT_LOCK_ACQUIRED((PNDIS_MINIPORT_BLOCK)(_H))); \ TrFilterDprIndicateReceive( \ ((PNDIS_MINIPORT_BLOCK)(_H))->TrDB, \ _C, \ _B, \ _SZ, \ _L, \ _LSZ, \ _PSZ \ ); \ } /*++ VOID NdisMFddiIndicateReceive( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE MiniportReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookaheadBuffer, IN UINT LookaheadBufferSize, IN UINT PacketSize ) --*/ #define NdisMFddiIndicateReceive( _H, _C, _B, _SZ, _L, _LSZ, _PSZ) \ { \ ASSERT(MINIPORT_LOCK_ACQUIRED((PNDIS_MINIPORT_BLOCK)(_H))); \ \ FddiFilterDprIndicateReceive( \ ((PNDIS_MINIPORT_BLOCK)(_H))->FddiDB, \ _C, \ (PUCHAR)_B + 1, \ ((((PUCHAR)_B)[0] & 0x40) ? FDDI_LENGTH_OF_LONG_ADDRESS \ : FDDI_LENGTH_OF_SHORT_ADDRESS), \ _B, \ _SZ, \ _L, \ _LSZ, \ _PSZ \ ); \ } /*++ VOID NdisMArcIndicateReceive( IN NDIS_HANDLE MiniportHandle, IN PUCHAR pRawHeader, // Pointer to Arcnet frame header IN PUCHAR pData, // Pointer to data portion of Arcnet frame IN UINT Length // Data Length ) --*/ #define NdisMArcIndicateReceive( _H, _HD, _D, _SZ) \ { \ ASSERT(MINIPORT_LOCK_ACQUIRED((PNDIS_MINIPORT_BLOCK)(_H))); \ ArcFilterDprIndicateReceive( \ ((PNDIS_MINIPORT_BLOCK)(_H))->ArcDB, \ _HD, \ _D, \ _SZ \ ); \ } /*++ VOID NdisMEthIndicateReceiveComplete( IN NDIS_HANDLE MiniportHandle ); --*/ #define NdisMEthIndicateReceiveComplete( _H ) \ { \ ASSERT(MINIPORT_LOCK_ACQUIRED(((PNDIS_MINIPORT_BLOCK)_H))); \ EthFilterDprIndicateReceiveComplete(((PNDIS_MINIPORT_BLOCK)_H)->EthDB); \ } /*++ VOID NdisMTrIndicateReceiveComplete( IN NDIS_HANDLE MiniportHandle ); --*/ #define NdisMTrIndicateReceiveComplete( _H ) \ { \ ASSERT(MINIPORT_LOCK_ACQUIRED(((PNDIS_MINIPORT_BLOCK)_H))); \ TrFilterDprIndicateReceiveComplete(((PNDIS_MINIPORT_BLOCK)_H)->TrDB); \ } /*++ VOID NdisMFddiIndicateReceiveComplete( IN NDIS_HANDLE MiniportHandle ); --*/ #define NdisMFddiIndicateReceiveComplete( _H ) \ { \ ASSERT(MINIPORT_LOCK_ACQUIRED(((PNDIS_MINIPORT_BLOCK)_H))); \ FddiFilterDprIndicateReceiveComplete(((PNDIS_MINIPORT_BLOCK)_H)->FddiDB); \ } /*++ VOID NdisMArcIndicateReceiveComplete( IN NDIS_HANDLE MiniportHandle ); --*/ #define NdisMArcIndicateReceiveComplete( _H ) \ { \ ASSERT(MINIPORT_LOCK_ACQUIRED(((PNDIS_MINIPORT_BLOCK)_H))); \ \ if (((PNDIS_MINIPORT_BLOCK)_H)->EthDB) \ { \ EthFilterDprIndicateReceiveComplete(((PNDIS_MINIPORT_BLOCK)_H)->EthDB); \ } \ \ ArcFilterDprIndicateReceiveComplete(((PNDIS_MINIPORT_BLOCK)_H)->ArcDB); \ } EXPORT VOID NdisMIndicateStatus( IN NDIS_HANDLE MiniportHandle, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize ); EXPORT VOID NdisMIndicateStatusComplete( IN NDIS_HANDLE MiniportHandle ); EXPORT VOID NdisMRegisterAdapterShutdownHandler( IN NDIS_HANDLE MiniportHandle, IN PVOID ShutdownContext, IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler ); EXPORT VOID NdisMDeregisterAdapterShutdownHandler( IN NDIS_HANDLE MiniportHandle ); EXPORT NDIS_STATUS NdisMPciAssignResources( IN NDIS_HANDLE MiniportHandle, IN ULONG SlotNumber, IN PNDIS_RESOURCE_LIST * AssignedResources ); // // Logging support for miniports // EXPORT NDIS_STATUS NdisMCreateLog( IN NDIS_HANDLE MiniportAdapterHandle, IN UINT Size, OUT PNDIS_HANDLE LogHandle ); EXPORT VOID NdisMCloseLog( IN NDIS_HANDLE LogHandle ); EXPORT NDIS_STATUS NdisMWriteLogData( IN NDIS_HANDLE LogHandle, IN PVOID LogBuffer, IN UINT LogBufferSize ); EXPORT VOID NdisMFlushLog( IN NDIS_HANDLE LogHandle ); // // NDIS 4.1 extensions for miniports // EXPORT VOID NdisMCoIndicateReceivePacket( IN NDIS_HANDLE NdisVcHandle, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets ); EXPORT VOID NdisMCoIndicateStatus( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE NdisVcHandle, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN ULONG StatusBufferSize ); EXPORT VOID NdisMCoReceiveComplete( IN NDIS_HANDLE MiniportAdapterHandle ); EXPORT VOID NdisMCoSendComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE NdisVcHandle, IN PNDIS_PACKET Packet ); EXPORT VOID NdisMCoActivateVcComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE NdisVcHandle, IN PCO_CALL_PARAMETERS CallParameters ); EXPORT VOID NdisMCoDeactivateVcComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE NdisVcHandle ); EXPORT VOID NdisMCoRequestComplete( IN NDIS_STATUS Status, IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_REQUEST Request ); EXPORT NDIS_STATUS NdisMCmRegisterAddressFamily( IN NDIS_HANDLE MiniportAdapterHandle, IN PCO_ADDRESS_FAMILY AddressFamily, IN PNDIS_CALL_MANAGER_CHARACTERISTICS CmCharacteristics, IN UINT SizeOfCmCharacteristics ); EXPORT NDIS_STATUS NdisMCmCreateVc( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE NdisAfHandle, IN NDIS_HANDLE MiniportVcContext, OUT PNDIS_HANDLE NdisVcHandle ); EXPORT NDIS_STATUS NdisMCmDeleteVc( IN NDIS_HANDLE NdisVcHandle ); EXPORT NDIS_STATUS NdisMCmActivateVc( IN NDIS_HANDLE NdisVcHandle, IN PCO_CALL_PARAMETERS CallParameters ); EXPORT NDIS_STATUS NdisMCmDeactivateVc( IN NDIS_HANDLE NdisVcHandle );