/* * tdikrnl.h * * TDI kernel mode definitions * * This file is part of the MinGW package. * * Contributors: * Created by Casper S. Hornstrup * * THIS SOFTWARE IS NOT COPYRIGHTED * * This source code is offered for use in the public domain. You may * use, modify or distribute it freely. * * This code is distributed in the hope that it will be useful but * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY * DISCLAMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */ #ifndef __TDIKRNL_H #define __TDIKRNL_H #if __GNUC__ >=3 #pragma GCC system_header #endif #ifdef __cplusplus extern "C" { #endif #pragma pack(push,4) #include "ntddk.h" #include "tdi.h" #if defined(_TDI_) #define TDIKRNLAPI DECLSPEC_EXPORT #else #define TDIKRNLAPI DECLSPEC_IMPORT #endif typedef struct _TDI_REQUEST_KERNEL { ULONG RequestFlags; PTDI_CONNECTION_INFORMATION RequestConnectionInformation; PTDI_CONNECTION_INFORMATION ReturnConnectionInformation; PVOID RequestSpecific; } TDI_REQUEST_KERNEL, *PTDI_REQUEST_KERNEL; /* Request codes */ #define TDI_ASSOCIATE_ADDRESS 0x01 #define TDI_DISASSOCIATE_ADDRESS 0x02 #define TDI_CONNECT 0x03 #define TDI_LISTEN 0x04 #define TDI_ACCEPT 0x05 #define TDI_DISCONNECT 0x06 #define TDI_SEND 0x07 #define TDI_RECEIVE 0x08 #define TDI_SEND_DATAGRAM 0x09 #define TDI_RECEIVE_DATAGRAM 0x0A #define TDI_SET_EVENT_HANDLER 0x0B #define TDI_QUERY_INFORMATION 0x0C #define TDI_SET_INFORMATION 0x0D #define TDI_ACTION 0x0E #define TDI_DIRECT_SEND 0x27 #define TDI_DIRECT_SEND_DATAGRAM 0x29 #define TDI_TRANSPORT_ADDRESS_FILE 1 #define TDI_CONNECTION_FILE 2 #define TDI_CONTROL_CHANNEL_FILE 3 /* Internal TDI IOCTLS */ #define IOCTL_TDI_QUERY_DIRECT_SEND_HANDLER _TDI_CONTROL_CODE(0x80, METHOD_NEITHER) #define IOCTL_TDI_QUERY_DIRECT_SENDDG_HANDLER _TDI_CONTROL_CODE(0x81, METHOD_NEITHER) /* TdiAssociateAddress */ typedef struct _TDI_REQUEST_KERNEL_ASSOCIATE { HANDLE AddressHandle; } TDI_REQUEST_KERNEL_ASSOCIATE, *PTDI_REQUEST_KERNEL_ASSOCIATE; /* TdiDisassociateAddress */ typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISASSOCIATE, *PTDI_REQUEST_KERNEL_DISASSOCIATE; /* TdiAccept */ typedef struct _TDI_REQUEST_KERNEL_ACCEPT { PTDI_CONNECTION_INFORMATION RequestConnectionInformation; PTDI_CONNECTION_INFORMATION ReturnConnectionInformation; } TDI_REQUEST_KERNEL_ACCEPT, *PTDI_REQUEST_KERNEL_ACCEPT; /* TdiConnect */ typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_CONNECT, *PTDI_REQUEST_KERNEL_CONNECT; /* TdiDisconnect */ typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISCONNECT, *PTDI_REQUEST_KERNEL_DISCONNECT; /* TdiListen */ typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_LISTEN, *PTDI_REQUEST_KERNEL_LISTEN; /* TdiReceive */ typedef struct _TDI_REQUEST_KERNEL_RECEIVE { ULONG ReceiveLength; ULONG ReceiveFlags; } TDI_REQUEST_KERNEL_RECEIVE, *PTDI_REQUEST_KERNEL_RECEIVE; /* TdiReceiveDatagram */ typedef struct _TDI_REQUEST_KERNEL_RECEIVEDG { ULONG ReceiveLength; PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation; PTDI_CONNECTION_INFORMATION ReturnDatagramInformation; ULONG ReceiveFlags; } TDI_REQUEST_KERNEL_RECEIVEDG, *PTDI_REQUEST_KERNEL_RECEIVEDG; /* TdiSend */ typedef struct _TDI_REQUEST_KERNEL_SEND { ULONG SendLength; ULONG SendFlags; } TDI_REQUEST_KERNEL_SEND, *PTDI_REQUEST_KERNEL_SEND; /* TdiSendDatagram */ typedef struct _TDI_REQUEST_KERNEL_SENDDG { ULONG SendLength; PTDI_CONNECTION_INFORMATION SendDatagramInformation; } TDI_REQUEST_KERNEL_SENDDG, *PTDI_REQUEST_KERNEL_SENDDG; /* TdiSetEventHandler */ typedef struct _TDI_REQUEST_KERNEL_SET_EVENT { LONG EventType; PVOID EventHandler; PVOID EventContext; } TDI_REQUEST_KERNEL_SET_EVENT, *PTDI_REQUEST_KERNEL_SET_EVENT; /* TdiQueryInformation */ typedef struct _TDI_REQUEST_KERNEL_QUERY_INFO { LONG QueryType; PTDI_CONNECTION_INFORMATION RequestConnectionInformation; } TDI_REQUEST_KERNEL_QUERY_INFORMATION, *PTDI_REQUEST_KERNEL_QUERY_INFORMATION; /* TdiSetInformation */ typedef struct _TDI_REQUEST_KERNEL_SET_INFO { LONG SetType; PTDI_CONNECTION_INFORMATION RequestConnectionInformation; } TDI_REQUEST_KERNEL_SET_INFORMATION, *PTDI_REQUEST_KERNEL_SET_INFORMATION; /* Event types */ #define TDI_EVENT_CONNECT 0 #define TDI_EVENT_DISCONNECT 1 #define TDI_EVENT_ERROR 2 #define TDI_EVENT_RECEIVE 3 #define TDI_EVENT_RECEIVE_DATAGRAM 4 #define TDI_EVENT_RECEIVE_EXPEDITED 5 #define TDI_EVENT_SEND_POSSIBLE 6 #define TDI_EVENT_CHAINED_RECEIVE 7 #define TDI_EVENT_CHAINED_RECEIVE_DATAGRAM 8 #define TDI_EVENT_CHAINED_RECEIVE_EXPEDITED 9 #define TDI_EVENT_ERROR_EX 10 typedef NTSTATUS DDKAPI (*PTDI_IND_CONNECT)( IN PVOID TdiEventContext, IN LONG RemoteAddressLength, IN PVOID RemoteAddress, IN LONG UserDataLength, IN PVOID UserData, IN LONG OptionsLength, IN PVOID Options, OUT CONNECTION_CONTEXT *ConnectionContext, OUT PIRP *AcceptIrp); TDIKRNLAPI NTSTATUS DDKAPI TdiDefaultConnectHandler( IN PVOID TdiEventContext, IN LONG RemoteAddressLength, IN PVOID RemoteAddress, IN LONG UserDataLength, IN PVOID UserData, IN LONG OptionsLength, IN PVOID Options, OUT CONNECTION_CONTEXT *ConnectionContext, OUT PIRP *AcceptIrp); typedef NTSTATUS DDKAPI (*PTDI_IND_DISCONNECT)( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN LONG DisconnectDataLength, IN PVOID DisconnectData, IN LONG DisconnectInformationLength, IN PVOID DisconnectInformation, IN ULONG DisconnectFlags); TDIKRNLAPI NTSTATUS DDKAPI TdiDefaultDisconnectHandler( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN LONG DisconnectDataLength, IN PVOID DisconnectData, IN LONG DisconnectInformationLength, IN PVOID DisconnectInformation, IN ULONG DisconnectFlags); typedef NTSTATUS DDKAPI (*PTDI_IND_ERROR)( IN PVOID TdiEventContext, IN NTSTATUS Status); typedef NTSTATUS DDKAPI (*PTDI_IND_ERROR_EX)( IN PVOID TdiEventContext, IN NTSTATUS Status, IN PVOID Buffer); TDIKRNLAPI NTSTATUS DDKAPI TdiDefaultErrorHandler( IN PVOID TdiEventContext, IN NTSTATUS Status); typedef NTSTATUS DDKAPI (*PTDI_IND_RECEIVE)( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *BytesTaken, IN PVOID Tsdu, OUT PIRP *IoRequestPacket); TDIKRNLAPI NTSTATUS DDKAPI TdiDefaultReceiveHandler( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *BytesTaken, IN PVOID Tsdu, OUT PIRP *IoRequestPacket); typedef NTSTATUS DDKAPI (*PTDI_IND_RECEIVE_DATAGRAM)( IN PVOID TdiEventContext, IN LONG SourceAddressLength, IN PVOID SourceAddress, IN LONG OptionsLength, IN PVOID Options, IN ULONG ReceiveDatagramFlags, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *BytesTaken, IN PVOID Tsdu, OUT PIRP *IoRequestPacket); TDIKRNLAPI NTSTATUS DDKAPI TdiDefaultRcvDatagramHandler( IN PVOID TdiEventContext, IN LONG SourceAddressLength, IN PVOID SourceAddress, IN LONG OptionsLength, IN PVOID Options, IN ULONG ReceiveDatagramFlags, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *BytesTaken, IN PVOID Tsdu, OUT PIRP *IoRequestPacket); typedef NTSTATUS DDKAPI (*PTDI_IND_RECEIVE_EXPEDITED)( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *BytesTaken, IN PVOID Tsdu, OUT PIRP *IoRequestPacket); TDIKRNLAPI NTSTATUS DDKAPI TdiDefaultRcvExpeditedHandler( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *BytesTaken, IN PVOID Tsdu, OUT PIRP *IoRequestPacket); typedef NTSTATUS DDKAPI (*PTDI_IND_CHAINED_RECEIVE)( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG ReceiveLength, IN ULONG StartingOffset, IN PMDL Tsdu, IN PVOID TsduDescriptor); TDIKRNLAPI NTSTATUS DDKAPI TdiDefaultChainedReceiveHandler( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG ReceiveLength, IN ULONG StartingOffset, IN PMDL Tsdu, IN PVOID TsduDescriptor); typedef NTSTATUS DDKAPI (*PTDI_IND_CHAINED_RECEIVE_DATAGRAM)( IN PVOID TdiEventContext, IN LONG SourceAddressLength, IN PVOID SourceAddress, IN LONG OptionsLength, IN PVOID Options, IN ULONG ReceiveDatagramFlags, IN ULONG ReceiveDatagramLength, IN ULONG StartingOffset, IN PMDL Tsdu, IN PVOID TsduDescriptor); TDIKRNLAPI NTSTATUS DDKAPI TdiDefaultChainedRcvDatagramHandler( IN PVOID TdiEventContext, IN LONG SourceAddressLength, IN PVOID SourceAddress, IN LONG OptionsLength, IN PVOID Options, IN ULONG ReceiveDatagramFlags, IN ULONG ReceiveDatagramLength, IN ULONG StartingOffset, IN PMDL Tsdu, IN PVOID TsduDescriptor); typedef NTSTATUS DDKAPI (*PTDI_IND_CHAINED_RECEIVE_EXPEDITED)( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG ReceiveLength, IN ULONG StartingOffset, IN PMDL Tsdu, IN PVOID TsduDescriptor); TDIKRNLAPI NTSTATUS DDKAPI TdiDefaultChainedRcvExpeditedHandler( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG ReceiveLength, IN ULONG StartingOffset, IN PMDL Tsdu, IN PVOID TsduDescriptor); typedef NTSTATUS DDKAPI (*PTDI_IND_SEND_POSSIBLE)( IN PVOID TdiEventContext, IN PVOID ConnectionContext, IN ULONG BytesAvailable); TDIKRNLAPI NTSTATUS DDKAPI TdiDefaultSendPossibleHandler( IN PVOID TdiEventContext, IN PVOID ConnectionContext, IN ULONG BytesAvailable); /* Macros and functions to build IRPs */ #define TdiBuildBaseIrp( \ bIrp, bDevObj, bFileObj, bCompRoutine, bContxt, bIrpSp, bMinor) \ { \ bIrpSp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; \ bIrpSp->MinorFunction = (bMinor); \ bIrpSp->DeviceObject = (bDevObj); \ bIrpSp->FileObject = (bFileObj); \ if (bCompRoutine) \ IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE) \ else \ IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE); \ } /* * VOID * TdiBuildAccept( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo, * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo); */ #define TdiBuildAccept( \ Irp, DevObj, FileObj, CompRoutine, Contxt, \ RequestConnectionInfo, ReturnConnectionInfo) \ { \ PTDI_REQUEST_KERNEL_ACCEPT _Request; \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_ACCEPT); \ \ _Request = (PTDI_REQUEST_KERNEL_ACCEPT)&_IrpSp->Parameters; \ _Request->RequestConnectionInformation = (RequestConnectionInfo); \ _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \ } /* * VOID * TdiBuildAction( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN PMDL MdlAddr); */ #define TdiBuildAction( \ Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr) \ { \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_ACTION); \ \ (Irp)->MdlAddress = (MdlAddr); \ } /* * VOID * TdiBuildAssociateAddress( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN HANDLE AddrHandle); */ #define TdiBuildAssociateAddress( \ Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle) \ { \ PTDI_REQUEST_KERNEL_ASSOCIATE _Request; \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_ASSOCIATE_ADDRESS); \ \ _Request = (PTDI_REQUEST_KERNEL_ASSOCIATE)&_IrpSp->Parameters; \ _Request->AddressHandle = (HANDLE)(AddrHandle); \ } /* * VOID * TdiBuildConnect( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN PLARGE_INTEGER Time, * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo, * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo); */ #define TdiBuildConnect( \ Irp, DevObj, FileObj, CompRoutine, Contxt, \ Time, RequestConnectionInfo, ReturnConnectionInfo) \ { \ PTDI_REQUEST_KERNEL _Request; \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_CONNECT); \ \ _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \ _Request->RequestConnectionInformation = (RequestConnectionInfo); \ _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \ _Request->RequestSpecific = (PVOID)(Time); \ } /* * VOID * TdiBuildDisassociateAddress( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt); */ #define TdiBuildDisassociateAddress( \ Irp, DevObj, FileObj, CompRoutine, Contxt) \ { \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_DISASSOCIATE_ADDRESS); \ } /* * VOID * TdiBuildDisconnect( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN PLARGE_INTEGER Time, * IN PULONG Flags, * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo, * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo); */ #define TdiBuildDisconnect( \ Irp, DevObj, FileObj, CompRoutine, Contxt, Time, \ Flags, RequestConnectionInfo, ReturnConnectionInfo) \ { \ PTDI_REQUEST_KERNEL _Request; \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_DISCONNECT); \ \ _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \ _Request->RequestConnectionInformation = (RequestConnectionInfo); \ _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \ _Request->RequestSpecific = (PVOID)(Time); \ _Request->RequestFlags = (Flags); \ } /* * PIRP * TdiBuildInternalDeviceControlIrp( * IN CCHAR IrpSubFunction, * IN PDEVICE_OBJECT DeviceObject, * IN PFILE_OBJECT FileObject, * IN PKEVENT Event, * IN PIO_STATUS_BLOCK IoStatusBlock); */ #define TdiBuildInternalDeviceControlIrp( \ IrpSubFunction, DeviceObject, \ FileObject, Event, IoStatusBlock) \ IoBuildDeviceIoControlRequest( \ 0x00000003, DeviceObject, \ NULL, 0, NULL, 0, \ TRUE, Event, IoStatusBlock) /* * VOID * TdiBuildListen( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN ULONG Flags, * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo, * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo); */ #define TdiBuildListen( \ Irp, DevObj, FileObj, CompRoutine, Contxt, \ Flags, RequestConnectionInfo, ReturnConnectionInfo) \ { \ PTDI_REQUEST_KERNEL _Request; \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_LISTEN); \ \ _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \ _Request->RequestConnectionInformation = (RequestConnectionInfo); \ _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \ _Request->RequestFlags = (Flags); \ } TDIKRNLAPI VOID DDKAPI TdiBuildNetbiosAddress( IN PUCHAR NetbiosName, IN BOOLEAN IsGroupName, IN OUT PTA_NETBIOS_ADDRESS NetworkName); TDIKRNLAPI NTSTATUS DDKAPI TdiBuildNetbiosAddressEa( IN PUCHAR Buffer, IN BOOLEAN IsGroupName, IN PUCHAR NetbiosName); /* * VOID * TdiBuildQueryInformation( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN UINT QType, * IN PMDL MdlAddr); */ #define TdiBuildQueryInformation( \ Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr) \ { \ PTDI_REQUEST_KERNEL_QUERY_INFORMATION _Request; \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_QUERY_INFORMATION); \ \ _Request = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&_IrpSp->Parameters; \ _Request->RequestConnectionInformation = NULL; \ _Request->QueryType = (ULONG)(QType); \ (Irp)->MdlAddress = (MdlAddr); \ } /* * VOID * TdiBuildReceive( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN PMDL MdlAddr, * IN ULONG InFlags, * IN ULONG ReceiveLen); */ #define TdiBuildReceive( \ Irp, DevObj, FileObj, CompRoutine, Contxt, \ MdlAddr, InFlags, ReceiveLen) \ { \ PTDI_REQUEST_KERNEL_RECEIVE _Request; \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_RECEIVE); \ \ _Request = (PTDI_REQUEST_KERNEL_RECEIVE)&_IrpSp->Parameters; \ _Request->ReceiveFlags = (InFlags); \ _Request->ReceiveLength = (ReceiveLen); \ (Irp)->MdlAddress = (MdlAddr); \ } /* * VOID * TdiBuildReceiveDatagram( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN PMDL MdlAddr, * IN ULONG ReceiveLen, * IN PTDI_CONNECTION_INFORMATION ReceiveDatagramInfo, * OUT PTDI_CONNECTION_INFORMATION ReturnInfo, * ULONG InFlags); */ #define TdiBuildReceiveDatagram( \ Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, \ ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags) \ { \ PTDI_REQUEST_KERNEL_RECEIVEDG _Request; \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_RECEIVE_DATAGRAM); \ \ _Request = (PTDI_REQUEST_KERNEL_RECEIVEDG)&_IrpSp->Parameters; \ _Request->ReceiveDatagramInformation = (ReceiveDatagramInfo); \ _Request->ReturnDatagramInformation = (ReturnInfo); \ _Request->ReceiveLength = (ReceiveLen); \ _Request->ReceiveFlags = (InFlags); \ (Irp)->MdlAddress = (MdlAddr); \ } /* * VOID * TdiBuildSend( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN PMDL MdlAddr, * IN ULONG InFlags, * IN ULONG SendLen); */ #define TdiBuildSend( \ Irp, DevObj, FileObj, CompRoutine, Contxt, \ MdlAddr, InFlags, SendLen) \ { \ PTDI_REQUEST_KERNEL_SEND _Request; \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_SEND); \ \ _Request = (PTDI_REQUEST_KERNEL_SEND)&_IrpSp->Parameters; \ _Request->SendFlags = (InFlags); \ _Request->SendLength = (SendLen); \ (Irp)->MdlAddress = (MdlAddr); \ } /* * VOID * TdiBuildSendDatagram( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN PMDL MdlAddr, * IN ULONG SendLen, * IN PTDI_CONNECTION_INFORMATION SendDatagramInfo); */ #define TdiBuildSendDatagram( \ Irp, DevObj, FileObj, CompRoutine, Contxt, \ MdlAddr, SendLen, SendDatagramInfo) \ { \ PTDI_REQUEST_KERNEL_SENDDG _Request; \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_SEND_DATAGRAM); \ \ _Request = (PTDI_REQUEST_KERNEL_SENDDG)&_IrpSp->Parameters; \ _Request->SendDatagramInformation = (SendDatagramInfo); \ _Request->SendLength = (SendLen); \ (Irp)->MdlAddress = (MdlAddr); \ } /* * VOID * TdiBuildSetEventHandler( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN INT InEventType, * IN PVOID InEventHandler, * IN PVOID InEventContext); */ #define TdiBuildSetEventHandler( \ Irp, DevObj, FileObj, CompRoutine, Contxt, \ InEventType, InEventHandler, InEventContext) \ { \ PTDI_REQUEST_KERNEL_SET_EVENT _Request; \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_SET_EVENT_HANDLER); \ \ _Request = (PTDI_REQUEST_KERNEL_SET_EVENT)&_IrpSp->Parameters; \ _Request->EventType = (InEventType); \ _Request->EventHandler = (PVOID)(InEventHandler); \ _Request->EventContext = (PVOID)(InEventContext); \ } /* * VOID * TdiBuildSetInformation( * IN PIRP Irp, * IN PDEVICE_OBJECT DevObj, * IN PFILE_OBJECT FileObj, * IN PVOID CompRoutine, * IN PVOID Contxt, * IN UINT SType, * IN PMDL MdlAddr); */ #define TdiBuildSetInformation( \ Irp, DevObj, FileObj, CompRoutine, Contxt, SType, MdlAddr) \ { \ PTDI_REQUEST_KERNEL_SET_INFORMATION _Request; \ PIO_STACK_LOCATION _IrpSp; \ \ _IrpSp = IoGetNextIrpStackLocation(Irp); \ \ TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ Contxt, _IrpSp, TDI_SET_INFORMATION); \ \ _Request = (PTDI_REQUEST_KERNEL_SET_INFORMATION)&_IrpSp->Parameters; \ _Request->RequestConnectionInformation = NULL; \ _Request->SetType = (ULONG)(SType); \ (Irp)->MdlAddress = (MdlAddr); \ } /* TDI20_CLIENT_INTERFACE_INFO.TdiVersion constants */ #define TDI_CURRENT_MAJOR_VERSION 2 #define TDI_CURRENT_MINOR_VERSION 0 #define TDI_CURRENT_VERSION ((TDI_CURRENT_MINOR_VERSION) << 8 \ | (TDI_CURRENT_MAJOR_VERSION)) #define TDI_VERSION_ONE 0x0001 typedef enum _TDI_PNP_OPCODE { TDI_PNP_OP_MIN, TDI_PNP_OP_ADD, TDI_PNP_OP_DEL, TDI_PNP_OP_UPDATE, TDI_PNP_OP_PROVIDERREADY, TDI_PNP_OP_NETREADY, TDI_PNP_OP_ADD_IGNORE_BINDING, TDI_PNP_OP_DELETE_IGNORE_BINDING, TDI_PNP_OP_MAX, } TDI_PNP_OPCODE; /* TDI_PNP_CONTEXT.ContextType */ #define TDI_PNP_CONTEXT_TYPE_IF_NAME 0x1 #define TDI_PNP_CONTEXT_TYPE_IF_ADDR 0x2 #define TDI_PNP_CONTEXT_TYPE_PDO 0x3 #define TDI_PNP_CONTEXT_TYPE_FIRST_OR_LAST_IF 0x4 typedef struct _TDI_PNP_CONTEXT { USHORT ContextSize; USHORT ContextType; UCHAR ContextData[1]; } TDI_PNP_CONTEXT, *PTDI_PNP_CONTEXT; typedef VOID DDKAPI (*TDI_ADD_ADDRESS_HANDLER)( IN PTA_ADDRESS Address); typedef VOID DDKAPI (*TDI_ADD_ADDRESS_HANDLER_V2)( IN PTA_ADDRESS Address, IN PUNICODE_STRING DeviceName, IN PTDI_PNP_CONTEXT Context); typedef VOID DDKAPI (*TDI_BINDING_HANDLER)( IN TDI_PNP_OPCODE PnPOpcode, IN PUNICODE_STRING DeviceName, IN PWSTR MultiSZBindList); typedef VOID DDKAPI (*TDI_BIND_HANDLER)( IN PUNICODE_STRING DeviceName); typedef VOID DDKAPI (*TDI_DEL_ADDRESS_HANDLER)( IN PTA_ADDRESS Address); typedef VOID DDKAPI (*TDI_DEL_ADDRESS_HANDLER_V2)( IN PTA_ADDRESS Address, IN PUNICODE_STRING DeviceName, IN PTDI_PNP_CONTEXT Context); typedef NTSTATUS DDKAPI (*TDI_PNP_POWER_HANDLER)( IN PUNICODE_STRING DeviceName, IN PNET_PNP_EVENT PowerEvent, IN PTDI_PNP_CONTEXT Context1, IN PTDI_PNP_CONTEXT Context2); typedef VOID DDKAPI (*TDI_UNBIND_HANDLER)( IN PUNICODE_STRING DeviceName); typedef VOID DDKAPI (*ProviderPnPPowerComplete)( IN PNET_PNP_EVENT NetEvent, IN NTSTATUS ProviderStatus); typedef struct _TDI20_CLIENT_INTERFACE_INFO { union { struct { UCHAR MajorTdiVersion; UCHAR MinorTdiVersion; }; USHORT TdiVersion; }; USHORT Unused; PUNICODE_STRING ClientName; TDI_PNP_POWER_HANDLER PnPPowerHandler; union { TDI_BINDING_HANDLER BindingHandler; struct { TDI_BIND_HANDLER BindHandler; TDI_UNBIND_HANDLER UnBindHandler; }; }; union { struct { TDI_ADD_ADDRESS_HANDLER_V2 AddAddressHandlerV2; TDI_DEL_ADDRESS_HANDLER_V2 DelAddressHandlerV2; }; struct { TDI_ADD_ADDRESS_HANDLER AddAddressHandler; TDI_DEL_ADDRESS_HANDLER DelAddressHandler; }; }; } TDI20_CLIENT_INTERFACE_INFO, *PTDI20_CLIENT_INTERFACE_INFO; typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO; typedef TDI_CLIENT_INTERFACE_INFO *PTDI_CLIENT_INTERFACE_INFO; /* TDI functions */ /* * VOID * TdiCompleteRequest( * IN PIRP Irp, * IN NTSTATUS Status); */ #define TdiCompleteRequest(Irp, Status) \ { \ (Irp)->IoStatus.Status = (Status); \ IoCompleteRequest((Irp), IO_NETWORK_INCREMENT); \ } TDIKRNLAPI NTSTATUS DDKAPI TdiCopyBufferToMdl( IN PVOID SourceBuffer, IN ULONG SourceOffset, IN ULONG SourceBytesToCopy, IN PMDL DestinationMdlChain, IN ULONG DestinationOffset, IN PULONG BytesCopied); /* * VOID * TdiCopyLookaheadData( * IN PVOID Destination, * IN PVOID Source, * IN ULONG Length, * IN ULONG ReceiveFlags); */ #define TdiCopyLookaheadData(Destination, Source, Length, ReceiveFlags) \ RtlCopyMemory(Destination, Source, Length) TDIKRNLAPI NTSTATUS DDKAPI TdiCopyMdlChainToMdlChain ( IN PMDL SourceMdlChain, IN ULONG SourceOffset, IN PMDL DestinationMdlChain, IN ULONG DestinationOffset, OUT PULONG BytesCopied); TDIKRNLAPI NTSTATUS DDKAPI TdiCopyMdlToBuffer( IN PMDL SourceMdlChain, IN ULONG SourceOffset, IN PVOID DestinationBuffer, IN ULONG DestinationOffset, IN ULONG DestinationBufferSize, OUT PULONG BytesCopied); TDIKRNLAPI NTSTATUS DDKAPI TdiDeregisterAddressChangeHandler( IN HANDLE BindingHandle); TDIKRNLAPI NTSTATUS DDKAPI TdiDeregisterDeviceObject( IN HANDLE DevRegistrationHandle); TDIKRNLAPI NTSTATUS DDKAPI TdiDeregisterNetAddress( IN HANDLE AddrRegistrationHandle); TDIKRNLAPI NTSTATUS DDKAPI TdiDeregisterPnPHandlers( IN HANDLE BindingHandle); TDIKRNLAPI NTSTATUS DDKAPI TdiDeregisterProvider( IN HANDLE ProviderHandle); TDIKRNLAPI NTSTATUS DDKAPI TdiEnumerateAddresses( IN HANDLE BindingHandle); TDIKRNLAPI VOID DDKAPI TdiInitialize( VOID); TDIKRNLAPI VOID DDKAPI TdiMapBuffer( IN PMDL MdlChain); TDIKRNLAPI NTSTATUS DDKAPI TdiMapUserRequest( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp); TDIKRNLAPI BOOLEAN DDKAPI TdiMatchPdoWithChainedReceiveContext( IN PVOID TsduDescriptor, IN PVOID PDO); TDIKRNLAPI VOID DDKAPI TdiPnPPowerComplete( IN HANDLE BindingHandle, IN PNET_PNP_EVENT PowerEvent, IN NTSTATUS Status); TDIKRNLAPI NTSTATUS DDKAPI TdiPnPPowerRequest( IN PUNICODE_STRING DeviceName, IN PNET_PNP_EVENT PowerEvent, IN PTDI_PNP_CONTEXT Context1, IN PTDI_PNP_CONTEXT Context2, IN ProviderPnPPowerComplete ProtocolCompletionHandler); TDIKRNLAPI NTSTATUS DDKAPI TdiProviderReady( IN HANDLE ProviderHandle); TDIKRNLAPI NTSTATUS DDKAPI TdiRegisterAddressChangeHandler( IN TDI_ADD_ADDRESS_HANDLER AddHandler, IN TDI_DEL_ADDRESS_HANDLER DeleteHandler, OUT HANDLE *BindingHandle); TDIKRNLAPI NTSTATUS DDKAPI TdiRegisterDeviceObject( IN PUNICODE_STRING DeviceName, OUT HANDLE *DevRegistrationHandle); TDIKRNLAPI NTSTATUS DDKAPI TdiRegisterNetAddress( IN PTA_ADDRESS Address, IN PUNICODE_STRING DeviceName, IN PTDI_PNP_CONTEXT Context, OUT HANDLE *AddrRegistrationHandle); TDIKRNLAPI NTSTATUS DDKAPI TdiRegisterNotificationHandler( IN TDI_BIND_HANDLER BindHandler, IN TDI_UNBIND_HANDLER UnbindHandler, OUT HANDLE *BindingHandle); TDIKRNLAPI NTSTATUS DDKAPI TdiRegisterPnPHandlers( IN PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo, IN ULONG InterfaceInfoSize, OUT HANDLE *BindingHandle); TDIKRNLAPI NTSTATUS DDKAPI TdiRegisterProvider( IN PUNICODE_STRING ProviderName, OUT HANDLE *ProviderHandle); TDIKRNLAPI VOID DDKAPI TdiReturnChainedReceives( IN PVOID *TsduDescriptors, IN ULONG NumberOfTsdus); TDIKRNLAPI VOID DDKAPI TdiUnmapBuffer( IN PMDL MdlChain); #pragma pack(pop) #ifdef __cplusplus } #endif #endif /* __TDIKRNL_H */