// // 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 VOID (*SEND_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status ); typedef VOID (*WAN_SEND_COMPLETE_HANDLER) ( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_WAN_PACKET Packet, IN NDIS_STATUS Status ); typedef VOID (*TRANSFER_DATA_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred ); typedef VOID (*WAN_TRANSFER_DATA_COMPLETE_HANDLER)( VOID ); typedef NDIS_STATUS (*RECEIVE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookaheadBufferSize, IN UINT PacketSize ); typedef NDIS_STATUS (*WAN_RECEIVE_HANDLER)( IN NDIS_HANDLE NdisLinkHandle, IN PUCHAR Packet, IN ULONG PacketSize ); typedef VOID (*RECEIVE_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext ); // // Protocol characteristics for down-level NDIS 3.0 protocols // typedef struct _NDIS30_PROTOCOL_CHARACTERISTICS { UCHAR MajorNdisVersion; UCHAR MinorNdisVersion; USHORT Filler; union { UINT Reserved; UINT Flags; }; OPEN_ADAPTER_COMPLETE_HANDLER OpenAdapterCompleteHandler; CLOSE_ADAPTER_COMPLETE_HANDLER CloseAdapterCompleteHandler; union { SEND_COMPLETE_HANDLER SendCompleteHandler; WAN_SEND_COMPLETE_HANDLER WanSendCompleteHandler; }; union { TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler; WAN_TRANSFER_DATA_COMPLETE_HANDLER WanTransferDataCompleteHandler; }; RESET_COMPLETE_HANDLER ResetCompleteHandler; REQUEST_COMPLETE_HANDLER RequestCompleteHandler; union { RECEIVE_HANDLER ReceiveHandler; WAN_RECEIVE_HANDLER WanReceiveHandler; }; RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler; STATUS_HANDLER StatusHandler; STATUS_COMPLETE_HANDLER StatusCompleteHandler; NDIS_STRING Name; } NDIS30_PROTOCOL_CHARACTERISTICS; // // Function types extensions for NDIS 4.0 Protocols // typedef INT (*RECEIVE_PACKET_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet ); typedef VOID (*BIND_HANDLER)( OUT PNDIS_STATUS Status, IN NDIS_HANDLE BindContext, IN PNDIS_STRING DeviceName, IN PVOID SystemSpecific1, IN PVOID SystemSpecific2 ); typedef VOID (*UNBIND_HANDLER)( OUT PNDIS_STATUS Status, IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE UnbindContext ); typedef NDIS_STATUS (*PNP_EVENT_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNET_PNP_EVENT NetPnPEvent ); typedef VOID (*UNLOAD_PROTOCOL_HANDLER)( VOID ); // // Protocol characteristics for NDIS 4.0 protocols // typedef struct _NDIS40_PROTOCOL_CHARACTERISTICS { #ifdef __cplusplus NDIS30_PROTOCOL_CHARACTERISTICS Ndis30Chars; #else NDIS30_PROTOCOL_CHARACTERISTICS; #endif // // Start of NDIS 4.0 extensions. // RECEIVE_PACKET_HANDLER ReceivePacketHandler; // // PnP protocol entry-points // BIND_HANDLER BindAdapterHandler; UNBIND_HANDLER UnbindAdapterHandler; PNP_EVENT_HANDLER PnPEventHandler; UNLOAD_PROTOCOL_HANDLER UnloadHandler; } NDIS40_PROTOCOL_CHARACTERISTICS; // // Protocol (5.0) handler proto-types - used by clients as well as call manager modules // typedef VOID (*CO_SEND_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN PNDIS_PACKET Packet ); typedef VOID (*CO_STATUS_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize ); typedef UINT (*CO_RECEIVE_PACKET_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE ProtocolVcContext, IN PNDIS_PACKET Packet ); typedef NDIS_STATUS (*CO_REQUEST_HANDLER)( IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, IN OUT PNDIS_REQUEST NdisRequest ); typedef VOID (*CO_REQUEST_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolAfContext OPTIONAL, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, IN PNDIS_REQUEST NdisRequest ); // // CO_CREATE_VC_HANDLER and CO_DELETE_VC_HANDLER are synchronous calls // typedef NDIS_STATUS (*CO_CREATE_VC_HANDLER)( IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE NdisVcHandle, OUT PNDIS_HANDLE ProtocolVcContext ); typedef NDIS_STATUS (*CO_DELETE_VC_HANDLER)( IN NDIS_HANDLE ProtocolVcContext ); typedef VOID (*CO_AF_REGISTER_NOTIFY_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PCO_ADDRESS_FAMILY AddressFamily ); typedef struct _NDIS50_PROTOCOL_CHARACTERISTICS { #ifdef __cplusplus NDIS40_PROTOCOL_CHARACTERISTICS Ndis40Chars; #else NDIS40_PROTOCOL_CHARACTERISTICS; #endif // // Placeholders for protocol extensions for PnP/PM etc. // PVOID ReservedHandlers[4]; // // Start of NDIS 5.0 extensions. // CO_SEND_COMPLETE_HANDLER CoSendCompleteHandler; CO_STATUS_HANDLER CoStatusHandler; CO_RECEIVE_PACKET_HANDLER CoReceivePacketHandler; CO_AF_REGISTER_NOTIFY_HANDLER CoAfRegisterNotifyHandler; } NDIS50_PROTOCOL_CHARACTERISTICS; #if (defined(NDIS50) || defined(NDIS51)) typedef NDIS50_PROTOCOL_CHARACTERISTICS NDIS_PROTOCOL_CHARACTERISTICS; #else #if NDIS40 typedef NDIS40_PROTOCOL_CHARACTERISTICS NDIS_PROTOCOL_CHARACTERISTICS; #else typedef NDIS30_PROTOCOL_CHARACTERISTICS NDIS_PROTOCOL_CHARACTERISTICS; #endif #endif typedef NDIS_PROTOCOL_CHARACTERISTICS *PNDIS_PROTOCOL_CHARACTERISTICS; // // 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 ); EXPORT VOID NdisCompleteBindAdapter( IN NDIS_HANDLE BindAdapterContext, IN NDIS_STATUS Status, IN NDIS_STATUS OpenStatus ); EXPORT VOID NdisCompleteUnbindAdapter( IN NDIS_HANDLE UnbindAdapterContext, IN NDIS_STATUS Status ); EXPORT VOID NdisSetProtocolFilter( OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN RECEIVE_HANDLER ReceiveHandler, IN RECEIVE_PACKET_HANDLER ReceivePacketHandler, IN NDIS_MEDIUM Medium, IN UINT Offset, IN UINT Size, IN PUCHAR Pattern ); EXPORT VOID NdisOpenProtocolConfiguration( OUT PNDIS_STATUS Status, OUT PNDIS_HANDLE ConfigurationHandle, IN PNDIS_STRING ProtocolSection ); EXPORT VOID NdisGetDriverHandle( IN NDIS_HANDLE NdisBindingHandle, OUT PNDIS_HANDLE NdisDriverHandle ); EXPORT VOID NdisReEnumerateProtocolBindings( IN NDIS_HANDLE NdisProtocolHandle ); EXPORT NDIS_STATUS NdisWriteEventLogEntry( IN PVOID LogHandle, IN NDIS_STATUS EventCode, IN ULONG UniqueEventValue, IN USHORT NumStrings, IN PVOID StringsList OPTIONAL, IN ULONG DataSize, IN PVOID Data OPTIONAL ); // // The following routine is used by transports to complete pending // network PnP events. // EXPORT VOID NdisCompletePnPEvent( IN NDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN PNET_PNP_EVENT NetPnPEvent ); // // The following routine is used by a transport to query the localized // friendly instance name of the adapter that they are bound to. There // are two variations of this, one uses the binding handle and the other // the binding context. Some transports need this before they bind - like // TCP/IP for instance. // EXPORT NDIS_STATUS NdisQueryAdapterInstanceName( OUT PNDIS_STRING pAdapterInstanceName, IN NDIS_HANDLE NdisBindingHandle ); EXPORT NDIS_STATUS NdisQueryBindInstanceName( OUT PNDIS_STRING pAdapterInstanceName, IN NDIS_HANDLE BindingContext ); // // The following is used by TDI/NDIS interface as part of Network PnP. // For use by TDI alone. // typedef NTSTATUS (*TDI_REGISTER_CALLBACK)( IN PUNICODE_STRING DeviceName, OUT HANDLE * TdiHandle ); typedef NTSTATUS (*TDI_PNP_HANDLER)( IN PUNICODE_STRING UpperComponent, IN PUNICODE_STRING LowerComponent, IN PUNICODE_STRING BindList, IN PVOID ReconfigBuffer, IN UINT ReconfigBufferSize, IN UINT Operation ); EXPORT VOID NdisRegisterTdiCallBack( IN TDI_REGISTER_CALLBACK RegsterCallback, IN TDI_PNP_HANDLER PnPHandler ); EXPORT VOID NdisRegisterTdiPnpHandler( IN TDI_PNP_HANDLER PnPHandler ); VOID NdisReset( OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle ); VOID NdisRequest( OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN PNDIS_REQUEST NdisRequest ); #if BINARY_COMPATIBLE VOID NdisSend( OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN PNDIS_PACKET Packet ); VOID NdisSendPackets( IN NDIS_HANDLE NdisBindingHandle, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets ); 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 ); #else // BINARY_COMPATIBLE #ifdef __cplusplus #define NdisSend(Status, NdisBindingHandle, Packet) \ { \ *(Status) = \ (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.SendHandler)( \ ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.BindingHandle, \ (Packet)); \ } #define NdisSendPackets(NdisBindingHandle, PacketArray, NumberOfPackets) \ { \ (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.SendPacketsHandler)( \ (PNDIS_OPEN_BLOCK)(NdisBindingHandle), \ (PacketArray), \ (NumberOfPackets)); \ } #define WanMiniportSend(Status, \ NdisBindingHandle, \ NdisLinkHandle, \ WanPacket) \ { \ *(Status) = \ ((((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.WanSendHandler))( \ ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.BindingHandle, \ (NdisLinkHandle), \ (PNDIS_PACKET)(WanPacket)); \ } #define NdisTransferData(Status, \ NdisBindingHandle, \ MacReceiveContext, \ ByteOffset, \ BytesToTransfer, \ Packet, \ BytesTransferred) \ { \ *(Status) = \ (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.TransferDataHandler)( \ ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.BindingHandle, \ (MacReceiveContext), \ (ByteOffset), \ (BytesToTransfer), \ (Packet), \ (BytesTransferred)); \ } #else #define NdisSend(Status, NdisBindingHandle, Packet) \ { \ *(Status) = \ (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->SendHandler)( \ ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->BindingHandle, \ (Packet)); \ } #define NdisSendPackets(NdisBindingHandle, PacketArray, NumberOfPackets) \ { \ (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->SendPacketsHandler)( \ (PNDIS_OPEN_BLOCK)(NdisBindingHandle), \ (PacketArray), \ (NumberOfPackets)); \ } #define WanMiniportSend(Status, \ NdisBindingHandle, \ NdisLinkHandle, \ WanPacket) \ { \ *(Status) = \ ((((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->WanSendHandler))( \ ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->BindingHandle, \ (NdisLinkHandle), \ (PNDIS_PACKET)(WanPacket)); \ } #define NdisTransferData(Status, \ NdisBindingHandle, \ MacReceiveContext, \ ByteOffset, \ BytesToTransfer, \ Packet, \ BytesTransferred) \ { \ *(Status) = \ (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->TransferDataHandler)( \ ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->BindingHandle, \ (MacReceiveContext), \ (ByteOffset), \ (BytesToTransfer), \ (Packet), \ (BytesTransferred)); \ } #endif // ifdef __cplusplus #endif // BINARY_COMPATIBLE // // 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 // // The following is the minimum size of packets a miniport must allocate // when it indicates packets via NdisMIndicatePacket or NdisMCoIndicatePacket // #define PROTOCOL_RESERVED_SIZE_IN_PACKET (4 * sizeof(PVOID)) EXPORT VOID NdisReturnPackets( IN PNDIS_PACKET * PacketsToReturn, IN UINT NumberOfPackets ); EXPORT PNDIS_PACKET NdisGetReceivedPacket( IN NDIS_HANDLE NdisBindingHandle, IN NDIS_HANDLE MacContext ); // // Macros to portably manipulate NDIS buffers. // #if BINARY_COMPATIBLE EXPORT ULONG NdisBufferLength( IN PNDIS_BUFFER Buffer ); EXPORT PVOID NdisBufferVirtualAddress( IN PNDIS_BUFFER Buffer ); #else // BINARY_COMPATIBLE #define NdisBufferLength(Buffer) MmGetMdlByteCount(Buffer) #define NdisBufferVirtualAddress(_Buffer) MmGetSystemAddressForMdl(_Buffer) #define NdisBufferVirtualAddressSafe(_Buffer, _Priority) MmGetSystemAddressForMdlSafe(_Buffer, _Priority) #endif // BINARY_COMPATIBLE // // Ndis 5.1 entry points for setting/gettign packet's CancelId and cancelling send packets // // #if (defined(NDIS50) || defined(NDIS51) || defined(NDIS50_MINIPORT) || defined(NDIS51_MINIPORT)) /* EXPORT VOID NdisSetPacketCancelId( IN PNDIS_PACKET Packet, IN PVOID CancelId ); */ #define NdisSetPacketCancelId(_Packet, _CancelId) NDIS_SET_PACKET_CANCEL_ID(_Packet, _CancelId); /* EXPORT PVOID NdisGetPacketCancelId( IN PNDIS_PACKET Packet ); */ #define NdisGetPacketCancelId(_Packet) NDIS_GET_PACKET_CANCEL_ID(_Packet); EXPORT VOID NdisCancelSendPackets( IN NDIS_HANDLE NdisBindingHandle, IN PVOID CancelId ); EXPORT NDIS_STATUS NdisQueryPendingIOCount( IN PVOID NdisBindingHandle, IN OUT PULONG IoCount ); EXPORT UCHAR NdisGeneratePartialCancelId( VOID ); // #endif // NDIS51