reactos/sdk/include/ddk/tdikrnl.h

1175 lines
38 KiB
C

/*
* tdikrnl.h
*
* TDI kernel mode definitions
*
* This file is part of the w32api package.
*
* Contributors:
* Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
*
* 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
* DISCLAIMED. This includes but is not limited to warranties of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
*/
#ifndef __TDIKRNL_H
#define __TDIKRNL_H
#include "tdi.h"
#ifdef __cplusplus
extern "C" {
#endif
#if defined(_TDI_)
#define TDIKRNLAPI
#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;
_Field_size_bytes_(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
(NTAPI *PTDI_IND_CONNECT)(
_In_opt_ PVOID TdiEventContext,
_In_ LONG RemoteAddressLength,
_In_reads_bytes_(RemoteAddressLength) PVOID RemoteAddress,
_In_ LONG UserDataLength,
_In_reads_bytes_opt_(UserDataLength) PVOID UserData,
_In_ LONG OptionsLength,
_In_reads_bytes_opt_(OptionsLength) PVOID Options,
_Out_ CONNECTION_CONTEXT *ConnectionContext,
_Out_ PIRP *AcceptIrp);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDefaultConnectHandler(
_In_opt_ PVOID TdiEventContext,
_In_ LONG RemoteAddressLength,
_In_reads_bytes_(RemoteAddressLength) PVOID RemoteAddress,
_In_ LONG UserDataLength,
_In_reads_bytes_opt_(UserDataLength) PVOID UserData,
_In_ LONG OptionsLength,
_In_reads_bytes_opt_(OptionsLength) PVOID Options,
_Out_ CONNECTION_CONTEXT *ConnectionContext,
_Out_ PIRP *AcceptIrp);
typedef NTSTATUS
(NTAPI *PTDI_IND_DISCONNECT)(
_In_opt_ PVOID TdiEventContext,
_In_opt_ CONNECTION_CONTEXT ConnectionContext,
_In_ LONG DisconnectDataLength,
_In_reads_bytes_opt_(DisconnectDataLength) PVOID DisconnectData,
_In_ LONG DisconnectInformationLength,
_In_reads_bytes_opt_(DisconnectInformationLength) PVOID DisconnectInformation,
_In_ ULONG DisconnectFlags);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDefaultDisconnectHandler(
_In_opt_ PVOID TdiEventContext,
_In_opt_ CONNECTION_CONTEXT ConnectionContext,
_In_ LONG DisconnectDataLength,
_In_reads_bytes_opt_(DisconnectDataLength) PVOID DisconnectData,
_In_ LONG DisconnectInformationLength,
_In_reads_bytes_opt_(DisconnectInformationLength) PVOID DisconnectInformation,
_In_ ULONG DisconnectFlags);
typedef NTSTATUS
(NTAPI *PTDI_IND_ERROR)(
_In_opt_ PVOID TdiEventContext,
_In_ NTSTATUS Status);
typedef NTSTATUS
(NTAPI *PTDI_IND_ERROR_EX)(
_In_opt_ PVOID TdiEventContext,
_In_ NTSTATUS Status,
_In_ PVOID Buffer);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDefaultErrorHandler(
_In_opt_ PVOID TdiEventContext,
_In_ NTSTATUS Status);
typedef NTSTATUS
(NTAPI *PTDI_IND_RECEIVE)(
_In_opt_ PVOID TdiEventContext,
_In_opt_ CONNECTION_CONTEXT ConnectionContext,
_In_ ULONG ReceiveFlags,
_In_ ULONG BytesIndicated,
_In_ ULONG BytesAvailable,
_Out_ ULONG *BytesTaken,
_In_ PVOID Tsdu,
_Out_opt_ PIRP *IoRequestPacket);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDefaultReceiveHandler(
_In_opt_ PVOID TdiEventContext,
_In_opt_ CONNECTION_CONTEXT ConnectionContext,
_In_ ULONG ReceiveFlags,
_In_ ULONG BytesIndicated,
_In_ ULONG BytesAvailable,
_Out_ ULONG *BytesTaken,
_In_ PVOID Tsdu,
_Out_opt_ PIRP *IoRequestPacket);
typedef NTSTATUS
(NTAPI *PTDI_IND_RECEIVE_DATAGRAM)(
_In_opt_ PVOID TdiEventContext,
_In_ LONG SourceAddressLength,
_In_reads_bytes_(SourceAddressLength) PVOID SourceAddress,
_In_ LONG OptionsLength,
_In_reads_bytes_opt_(OptionsLength) PVOID Options,
_In_ ULONG ReceiveDatagramFlags,
_In_ ULONG BytesIndicated,
_In_ ULONG BytesAvailable,
_Out_ ULONG *BytesTaken,
_In_ PVOID Tsdu,
_Out_opt_ PIRP *IoRequestPacket);
TDIKRNLAPI
NTSTATUS NTAPI
TdiDefaultRcvDatagramHandler(
_In_opt_ PVOID TdiEventContext,
_In_ LONG SourceAddressLength,
_In_reads_bytes_(SourceAddressLength) PVOID SourceAddress,
_In_ LONG OptionsLength,
_In_reads_bytes_opt_(OptionsLength) PVOID Options,
_In_ ULONG ReceiveDatagramFlags,
_In_ ULONG BytesIndicated,
_In_ ULONG BytesAvailable,
_Out_ ULONG *BytesTaken,
_In_ PVOID Tsdu,
_Out_opt_ PIRP *IoRequestPacket);
typedef NTSTATUS
(NTAPI *PTDI_IND_RECEIVE_EXPEDITED)(
_In_opt_ PVOID TdiEventContext,
_In_opt_ CONNECTION_CONTEXT ConnectionContext,
_In_ ULONG ReceiveFlags,
_In_ ULONG BytesIndicated,
_In_ ULONG BytesAvailable,
_Out_ ULONG *BytesTaken,
_In_ PVOID Tsdu,
_Out_opt_ PIRP *IoRequestPacket);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDefaultRcvExpeditedHandler(
_In_opt_ PVOID TdiEventContext,
_In_opt_ CONNECTION_CONTEXT ConnectionContext,
_In_ ULONG ReceiveFlags,
_In_ ULONG BytesIndicated,
_In_ ULONG BytesAvailable,
_Out_ ULONG *BytesTaken,
_In_ PVOID Tsdu,
_Out_opt_ PIRP *IoRequestPacket);
typedef NTSTATUS
(NTAPI *PTDI_IND_CHAINED_RECEIVE)(
_In_opt_ PVOID TdiEventContext,
_In_opt_ CONNECTION_CONTEXT ConnectionContext,
_In_ ULONG ReceiveFlags,
_In_ ULONG ReceiveLength,
_In_ ULONG StartingOffset,
_In_ PMDL Tsdu,
_In_ PVOID TsduDescriptor);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDefaultChainedReceiveHandler(
_In_opt_ PVOID TdiEventContext,
_In_opt_ CONNECTION_CONTEXT ConnectionContext,
_In_ ULONG ReceiveFlags,
_In_ ULONG ReceiveLength,
_In_ ULONG StartingOffset,
_In_ PMDL Tsdu,
_In_ PVOID TsduDescriptor);
typedef NTSTATUS
(NTAPI *PTDI_IND_CHAINED_RECEIVE_DATAGRAM)(
_In_opt_ PVOID TdiEventContext,
_In_ LONG SourceAddressLength,
_In_reads_bytes_(SourceAddressLength) PVOID SourceAddress,
_In_ LONG OptionsLength,
_In_reads_bytes_opt_(OptionsLength) PVOID Options,
_In_ ULONG ReceiveDatagramFlags,
_In_ ULONG ReceiveDatagramLength,
_In_ ULONG StartingOffset,
_In_ PMDL Tsdu,
_In_ PVOID TsduDescriptor);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDefaultChainedRcvDatagramHandler(
_In_opt_ PVOID TdiEventContext,
_In_ LONG SourceAddressLength,
_In_reads_bytes_(SourceAddressLength) PVOID SourceAddress,
_In_ LONG OptionsLength,
_In_reads_bytes_opt_(OptionsLength) PVOID Options,
_In_ ULONG ReceiveDatagramFlags,
_In_ ULONG ReceiveDatagramLength,
_In_ ULONG StartingOffset,
_In_ PMDL Tsdu,
_In_ PVOID TsduDescriptor);
typedef NTSTATUS
(NTAPI *PTDI_IND_CHAINED_RECEIVE_EXPEDITED)(
_In_opt_ PVOID TdiEventContext,
_In_opt_ CONNECTION_CONTEXT ConnectionContext,
_In_ ULONG ReceiveFlags,
_In_ ULONG ReceiveLength,
_In_ ULONG StartingOffset,
_In_ PMDL Tsdu,
_In_ PVOID TsduDescriptor);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDefaultChainedRcvExpeditedHandler(
_In_opt_ PVOID TdiEventContext,
_In_opt_ CONNECTION_CONTEXT ConnectionContext,
_In_ ULONG ReceiveFlags,
_In_ ULONG ReceiveLength,
_In_ ULONG StartingOffset,
_In_ PMDL Tsdu,
_In_ PVOID TsduDescriptor);
typedef NTSTATUS
(NTAPI *PTDI_IND_SEND_POSSIBLE)(
_In_opt_ PVOID TdiEventContext,
_In_opt_ PVOID ConnectionContext,
_In_ ULONG BytesAvailable);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDefaultSendPossibleHandler(
_In_opt_ PVOID TdiEventContext,
_In_opt_ 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( \
IrpSubFunction, 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
NTAPI
TdiBuildNetbiosAddress(
_In_ PUCHAR NetbiosName,
_In_ BOOLEAN IsGroupName,
_Inout_ PTA_NETBIOS_ADDRESS NetworkName);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiBuildNetbiosAddressEa(
_Out_ 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
(NTAPI *TDI_ADD_ADDRESS_HANDLER)(
_In_ PTA_ADDRESS Address);
typedef VOID
(NTAPI *TDI_ADD_ADDRESS_HANDLER_V2)(
_In_ PTA_ADDRESS Address,
_In_ PUNICODE_STRING DeviceName,
_In_ PTDI_PNP_CONTEXT Context);
typedef VOID
(NTAPI *TDI_BINDING_HANDLER)(
_In_ TDI_PNP_OPCODE PnPOpcode,
_In_ PUNICODE_STRING DeviceName,
_In_ PWSTR MultiSZBindList);
typedef VOID
(NTAPI *TDI_BIND_HANDLER)(
_In_ PUNICODE_STRING DeviceName);
typedef VOID
(NTAPI *TDI_DEL_ADDRESS_HANDLER)(
_In_ PTA_ADDRESS Address);
typedef VOID
(NTAPI *TDI_DEL_ADDRESS_HANDLER_V2)(
_In_ PTA_ADDRESS Address,
_In_ PUNICODE_STRING DeviceName,
_In_ PTDI_PNP_CONTEXT Context);
typedef NTSTATUS
(NTAPI *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
(NTAPI *TDI_UNBIND_HANDLER)(
_In_ PUNICODE_STRING DeviceName);
typedef VOID
(NTAPI *ProviderPnPPowerComplete)(
_In_ PNET_PNP_EVENT NetEvent,
_In_ NTSTATUS ProviderStatus);
typedef struct _TDI20_CLIENT_INTERFACE_INFO {
_ANONYMOUS_UNION union {
_ANONYMOUS_STRUCT struct {
UCHAR MajorTdiVersion;
UCHAR MinorTdiVersion;
} DUMMYSTRUCTNAME;
USHORT TdiVersion;
} DUMMYUNIONNAME;
USHORT Unused;
PUNICODE_STRING ClientName;
TDI_PNP_POWER_HANDLER PnPPowerHandler;
_ANONYMOUS_UNION union {
TDI_BINDING_HANDLER BindingHandler;
_ANONYMOUS_STRUCT struct {
TDI_BIND_HANDLER BindHandler;
TDI_UNBIND_HANDLER UnBindHandler;
} DUMMYSTRUCTNAME;
}DUMMYUNIONNAME2;
_ANONYMOUS_UNION union {
_ANONYMOUS_STRUCT struct {
TDI_ADD_ADDRESS_HANDLER_V2 AddAddressHandlerV2;
TDI_DEL_ADDRESS_HANDLER_V2 DelAddressHandlerV2;
} DUMMYSTRUCTNAME;
_ANONYMOUS_STRUCT struct {
TDI_ADD_ADDRESS_HANDLER AddAddressHandler;
TDI_DEL_ADDRESS_HANDLER DelAddressHandler;
} DUMMYSTRUCTNAME2;
} DUMMYUNIONNAME3;
} 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); \
}
_IRQL_requires_max_(DISPATCH_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiCopyBufferToMdl(
_In_ PVOID SourceBuffer,
_In_ ULONG SourceOffset,
_In_ ULONG SourceBytesToCopy,
_In_ PMDL DestinationMdlChain,
_In_ ULONG DestinationOffset,
_Out_ 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)
_IRQL_requires_max_(DISPATCH_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiCopyMdlChainToMdlChain(
_In_ PMDL SourceMdlChain,
_In_ ULONG SourceOffset,
_In_ PMDL DestinationMdlChain,
_In_ ULONG DestinationOffset,
_Out_ PULONG BytesCopied);
_IRQL_requires_max_(DISPATCH_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiCopyMdlToBuffer(
_In_ PMDL SourceMdlChain,
_In_ ULONG SourceOffset,
_Out_writes_bytes_(DestinationBufferSize) PVOID DestinationBuffer,
_In_ ULONG DestinationOffset,
_In_ ULONG DestinationBufferSize,
_Out_ PULONG BytesCopied);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDeregisterAddressChangeHandler(
_In_ HANDLE BindingHandle);
_IRQL_requires_max_(APC_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDeregisterDeviceObject(
_In_ HANDLE DevRegistrationHandle);
_IRQL_requires_max_(APC_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDeregisterNetAddress(
_In_ HANDLE AddrRegistrationHandle);
_IRQL_requires_max_(APC_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDeregisterPnPHandlers(
_In_ HANDLE BindingHandle);
_IRQL_requires_max_(APC_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDeregisterProvider(
_In_ HANDLE ProviderHandle);
_IRQL_requires_max_(APC_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiEnumerateAddresses(
_In_ HANDLE BindingHandle);
_IRQL_requires_max_(PASSIVE_LEVEL)
TDIKRNLAPI
VOID
NTAPI
TdiInitialize(VOID);
TDIKRNLAPI
VOID
NTAPI
TdiMapBuffer(
_In_ PMDL MdlChain);
_IRQL_requires_max_(PASSIVE_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiMapUserRequest(
_In_ PDEVICE_OBJECT DeviceObject,
_In_ PIRP Irp,
_In_ PIO_STACK_LOCATION IrpSp);
TDIKRNLAPI
BOOLEAN
NTAPI
TdiMatchPdoWithChainedReceiveContext(
_In_ PVOID TsduDescriptor,
_In_ PVOID PDO);
_IRQL_requires_max_(APC_LEVEL)
TDIKRNLAPI
VOID
NTAPI
TdiPnPPowerComplete(
_In_ HANDLE BindingHandle,
_In_ PNET_PNP_EVENT PowerEvent,
_In_ NTSTATUS Status);
_IRQL_requires_max_(APC_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiPnPPowerRequest(
_In_ PUNICODE_STRING DeviceName,
_In_ PNET_PNP_EVENT PowerEvent,
_In_ PTDI_PNP_CONTEXT Context1,
_In_ PTDI_PNP_CONTEXT Context2,
_In_ ProviderPnPPowerComplete ProtocolCompletionHandler);
_IRQL_requires_max_(APC_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiProviderReady(
_In_ HANDLE ProviderHandle);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiRegisterAddressChangeHandler(
_In_ TDI_ADD_ADDRESS_HANDLER AddHandler,
_In_ TDI_DEL_ADDRESS_HANDLER DeleteHandler,
_Out_ HANDLE *BindingHandle);
_IRQL_requires_max_(APC_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiRegisterDeviceObject(
_In_ PUNICODE_STRING DeviceName,
_Out_ HANDLE *DevRegistrationHandle);
_IRQL_requires_max_(APC_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiRegisterNetAddress(
_In_ PTA_ADDRESS Address,
_In_ PUNICODE_STRING DeviceName,
_In_ PTDI_PNP_CONTEXT Context,
_Out_ HANDLE *AddrRegistrationHandle);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiRegisterNotificationHandler(
_In_ TDI_BIND_HANDLER BindHandler,
_In_ TDI_UNBIND_HANDLER UnbindHandler,
_Out_ HANDLE *BindingHandle);
_IRQL_requires_max_(APC_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiRegisterPnPHandlers(
_In_reads_bytes_(InterfaceInfoSize) PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo,
_In_ ULONG InterfaceInfoSize,
_Out_ HANDLE *BindingHandle);
_IRQL_requires_max_(APC_LEVEL)
TDIKRNLAPI
NTSTATUS
NTAPI
TdiRegisterProvider(
_In_ PUNICODE_STRING ProviderName,
_Out_ HANDLE *ProviderHandle);
_IRQL_requires_max_(DISPATCH_LEVEL)
TDIKRNLAPI
VOID
NTAPI
TdiReturnChainedReceives(
_In_ PVOID *TsduDescriptors,
_In_ ULONG NumberOfTsdus);
TDIKRNLAPI
VOID
NTAPI
TdiUnmapBuffer(
_In_ PMDL MdlChain);
#ifdef __cplusplus
}
#endif
#endif /* __TDIKRNL_H */