4.5 TDI Library Functions and Macros

Windows NT provides a small set of TDI library functions as a kernel-mode dynamic-link library (the tdi.sys export library) with which TDI drivers and kernel-mode clients link themselves. However, most of the system-supplied TdiBuildXxx called by kernel-mode clients are implemented as macros in the tdikrnl.h header that both clients and transports include.

Any kernel-mode TDI client can use the TdiBuildXxx macros as needed in preparing the TDI_XXX IOCTL IRPs, already mentioned in Section 4.3. After the client has set up such an IRP with a TdiBuildXxx macro, it submits the request to the underlying TDI driver by passing the IRP to IoCallDriver. Each of these macros fills in the relevant members of the client-provided IRP, except for the Status and Information members, which the underlying transport fills in after processing its client's request. Before using one of TdiBuildXxx IOCTL macros, a client can call TdiBuildInternalDeviceControlIrp to allocate the IRP if it has not already been allocated by a still higher level network component and given to the client.

A transport driver never uses the TdiBuildXxx macros. However, a TDI driver can use some of the remaining TDI library routines, such as TdiCompleteRequest and TdiCopyBufferToMdl, for assistance in processing client requests.

TDI library routines and macros include the following:

TdiBuildInternalDeviceControlIrp

Allocates an IRP if the client does not receive an IRP from a higher network layer.

TdiBuildAccept

Sets up an IRP for a client-submitted TDI_ACCEPT request.

TdiBuildAction

Sets up an IRP for a client-submitted TDI_ACTION request.

TdiBuildAssociateAddress

Sets up an IRP for a client-submitted TDI_ASSOCIATE_ADDRESS request.

TdiBuildConnect

Sets up an IRP for a client-submitted TDI_CONNECT request.

TdiBuildDisassociateAddress

Sets up an IRP for a client-submitted TDI_DISASSOCIATE_ADDRESS request.

TdiBuildListen

Sets up an IRP for a client-submitted TDI_LISTEN request.

TdiBuildQueryInformation

Sets up an IRP for a client-submitted TDI_QUERY_INFORMATION request.

TdiBuildReceive

Sets up an IRP for a client-submitted TDI_RECEIVE request.

TdiBuildReceiveDatagram

Sets up an IRP for a client-submitted TDI_RECEIVE_DATAGRAM request.

TdiBuildSend

Sets up an IRP for a client-submitted TDI_SEND request.

TdiBuildSendDatagram

Sets up an IRP for a client-submitted TDI_SEND_DATAGRAM request.

TdiBuildSetEventHandler

Sets up an IRP for a client-submitted TDI_SET_EVENT_HANDLER request.

TdiBuildSetInformation

Sets up an IRP for a client-submitted TDI_SET_INFORMATION request.

TdiBuildNetbiosAddress

Sets up a NetBIOS address for a client.

TdiBuildNetbiosAddressEa

Sets up a buffered NetBIOS address that a client can pass subsequently to ZwCreateFile to open the address.

TdiReturnChainedReceives

Relinquishes control of the buffer that was passed to a ClientEventChainedReceive(Xxx) handler after the client has consumed the received TSDU.

TdiCopyBufferToMdl

Copies a range of buffered data into a destination buffer mapped by a given MDL.

Both clients and transports can use this function.

TdiCopyMdlToBuffer

Copies data from buffer(s) mapped by a given MDL into a caller-supplied destination buffer.

Both clients and transports can use this function.

TdiCopyLookaheadData

Safely copies received data indicated to the transport by a NIC driver, whatever the nature of the memory (including mapped device memory) the NIC is using.

TdiMapUserRequest

Converts an IRP passed in to a transport's TdiDispatchDeviceControl routine into a TDI_XXX IOCTL IRP if TdiMapUserRequest recognizes the minor function code specified in the input IRP.

TdiCompleteRequest

Completes an IRP with the system-defined network-specific priority boost for a transport driver.