/*
* 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;
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 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
NTAPI
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
(NTAPI *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
NTAPI
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
(NTAPI *PTDI_IND_ERROR)(
IN PVOID TdiEventContext,
IN NTSTATUS Status);
typedef NTSTATUS
(NTAPI *PTDI_IND_ERROR_EX)(
IN PVOID TdiEventContext,
IN NTSTATUS Status,
IN PVOID Buffer);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDefaultErrorHandler(
IN PVOID TdiEventContext,
IN NTSTATUS Status);
typedef NTSTATUS
(NTAPI *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
NTAPI
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
(NTAPI *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 NTAPI
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
(NTAPI *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
NTAPI
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
(NTAPI *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
NTAPI
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
(NTAPI *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
NTAPI
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
(NTAPI *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
NTAPI
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
(NTAPI *PTDI_IND_SEND_POSSIBLE)(
IN PVOID TdiEventContext,
IN PVOID ConnectionContext,
IN ULONG BytesAvailable);
TDIKRNLAPI
NTSTATUS
NTAPI
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( \
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,
IN OUT PTA_NETBIOS_ADDRESS NetworkName);
TDIKRNLAPI
NTSTATUS
NTAPI
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
(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); \
}
TDIKRNLAPI
NTSTATUS
NTAPI
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
NTAPI
TdiCopyMdlChainToMdlChain (
IN PMDL SourceMdlChain,
IN ULONG SourceOffset,
IN PMDL DestinationMdlChain,
IN ULONG DestinationOffset,
OUT PULONG BytesCopied);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiCopyMdlToBuffer(
IN PMDL SourceMdlChain,
IN ULONG SourceOffset,
IN PVOID DestinationBuffer,
IN ULONG DestinationOffset,
IN ULONG DestinationBufferSize,
OUT PULONG BytesCopied);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDeregisterAddressChangeHandler(
IN HANDLE BindingHandle);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDeregisterDeviceObject(
IN HANDLE DevRegistrationHandle);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDeregisterNetAddress(
IN HANDLE AddrRegistrationHandle);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDeregisterPnPHandlers(
IN HANDLE BindingHandle);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiDeregisterProvider(
IN HANDLE ProviderHandle);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiEnumerateAddresses(
IN HANDLE BindingHandle);
TDIKRNLAPI
VOID
NTAPI
TdiInitialize(
VOID);
TDIKRNLAPI
VOID
NTAPI
TdiMapBuffer(
IN PMDL MdlChain);
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);
TDIKRNLAPI
VOID
NTAPI
TdiPnPPowerComplete(
IN HANDLE BindingHandle,
IN PNET_PNP_EVENT PowerEvent,
IN NTSTATUS Status);
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);
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);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiRegisterDeviceObject(
IN PUNICODE_STRING DeviceName,
OUT HANDLE *DevRegistrationHandle);
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);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiRegisterPnPHandlers(
IN PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo,
IN ULONG InterfaceInfoSize,
OUT HANDLE *BindingHandle);
TDIKRNLAPI
NTSTATUS
NTAPI
TdiRegisterProvider(
IN PUNICODE_STRING ProviderName,
OUT HANDLE *ProviderHandle);
TDIKRNLAPI
VOID
NTAPI
TdiReturnChainedReceives(
IN PVOID *TsduDescriptors,
IN ULONG NumberOfTsdus);
TDIKRNLAPI
VOID
NTAPI
TdiUnmapBuffer(
IN PMDL MdlChain);
#ifdef __cplusplus
}
#endif
#endif /* __TDIKRNL_H */