4 * TDI kernel mode definitions
6 * This file is part of the w32api package.
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
11 * THIS SOFTWARE IS NOT COPYRIGHTED
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
35 #define TDIKRNLAPI DECLSPEC_IMPORT
39 typedef struct _TDI_REQUEST_KERNEL
{
41 PTDI_CONNECTION_INFORMATION RequestConnectionInformation
;
42 PTDI_CONNECTION_INFORMATION ReturnConnectionInformation
;
43 PVOID RequestSpecific
;
44 } TDI_REQUEST_KERNEL
, *PTDI_REQUEST_KERNEL
;
47 #define TDI_ASSOCIATE_ADDRESS 0x01
48 #define TDI_DISASSOCIATE_ADDRESS 0x02
49 #define TDI_CONNECT 0x03
50 #define TDI_LISTEN 0x04
51 #define TDI_ACCEPT 0x05
52 #define TDI_DISCONNECT 0x06
54 #define TDI_RECEIVE 0x08
55 #define TDI_SEND_DATAGRAM 0x09
56 #define TDI_RECEIVE_DATAGRAM 0x0A
57 #define TDI_SET_EVENT_HANDLER 0x0B
58 #define TDI_QUERY_INFORMATION 0x0C
59 #define TDI_SET_INFORMATION 0x0D
60 #define TDI_ACTION 0x0E
62 #define TDI_DIRECT_SEND 0x27
63 #define TDI_DIRECT_SEND_DATAGRAM 0x29
65 #define TDI_TRANSPORT_ADDRESS_FILE 1
66 #define TDI_CONNECTION_FILE 2
67 #define TDI_CONTROL_CHANNEL_FILE 3
69 /* Internal TDI IOCTLS */
70 #define IOCTL_TDI_QUERY_DIRECT_SEND_HANDLER _TDI_CONTROL_CODE(0x80, METHOD_NEITHER)
71 #define IOCTL_TDI_QUERY_DIRECT_SENDDG_HANDLER _TDI_CONTROL_CODE(0x81, METHOD_NEITHER)
73 /* TdiAssociateAddress */
74 typedef struct _TDI_REQUEST_KERNEL_ASSOCIATE
{
76 } TDI_REQUEST_KERNEL_ASSOCIATE
, *PTDI_REQUEST_KERNEL_ASSOCIATE
;
78 /* TdiDisassociateAddress */
79 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISASSOCIATE
,
80 *PTDI_REQUEST_KERNEL_DISASSOCIATE
;
83 typedef struct _TDI_REQUEST_KERNEL_ACCEPT
{
84 PTDI_CONNECTION_INFORMATION RequestConnectionInformation
;
85 PTDI_CONNECTION_INFORMATION ReturnConnectionInformation
;
86 } TDI_REQUEST_KERNEL_ACCEPT
, *PTDI_REQUEST_KERNEL_ACCEPT
;
89 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_CONNECT
,
90 *PTDI_REQUEST_KERNEL_CONNECT
;
93 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISCONNECT
,
94 *PTDI_REQUEST_KERNEL_DISCONNECT
;
97 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_LISTEN
,
98 *PTDI_REQUEST_KERNEL_LISTEN
;
101 typedef struct _TDI_REQUEST_KERNEL_RECEIVE
{
104 } TDI_REQUEST_KERNEL_RECEIVE
, *PTDI_REQUEST_KERNEL_RECEIVE
;
106 /* TdiReceiveDatagram */
107 typedef struct _TDI_REQUEST_KERNEL_RECEIVEDG
{
109 PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation
;
110 PTDI_CONNECTION_INFORMATION ReturnDatagramInformation
;
112 } TDI_REQUEST_KERNEL_RECEIVEDG
, *PTDI_REQUEST_KERNEL_RECEIVEDG
;
115 typedef struct _TDI_REQUEST_KERNEL_SEND
{
118 } TDI_REQUEST_KERNEL_SEND
, *PTDI_REQUEST_KERNEL_SEND
;
120 /* TdiSendDatagram */
121 typedef struct _TDI_REQUEST_KERNEL_SENDDG
{
123 PTDI_CONNECTION_INFORMATION SendDatagramInformation
;
124 } TDI_REQUEST_KERNEL_SENDDG
, *PTDI_REQUEST_KERNEL_SENDDG
;
126 /* TdiSetEventHandler */
127 typedef struct _TDI_REQUEST_KERNEL_SET_EVENT
{
131 } TDI_REQUEST_KERNEL_SET_EVENT
, *PTDI_REQUEST_KERNEL_SET_EVENT
;
133 /* TdiQueryInformation */
134 typedef struct _TDI_REQUEST_KERNEL_QUERY_INFO
{
136 PTDI_CONNECTION_INFORMATION RequestConnectionInformation
;
137 } TDI_REQUEST_KERNEL_QUERY_INFORMATION
, *PTDI_REQUEST_KERNEL_QUERY_INFORMATION
;
139 /* TdiSetInformation */
140 typedef struct _TDI_REQUEST_KERNEL_SET_INFO
{
142 PTDI_CONNECTION_INFORMATION RequestConnectionInformation
;
143 } TDI_REQUEST_KERNEL_SET_INFORMATION
, *PTDI_REQUEST_KERNEL_SET_INFORMATION
;
146 #define TDI_EVENT_CONNECT 0
147 #define TDI_EVENT_DISCONNECT 1
148 #define TDI_EVENT_ERROR 2
149 #define TDI_EVENT_RECEIVE 3
150 #define TDI_EVENT_RECEIVE_DATAGRAM 4
151 #define TDI_EVENT_RECEIVE_EXPEDITED 5
152 #define TDI_EVENT_SEND_POSSIBLE 6
153 #define TDI_EVENT_CHAINED_RECEIVE 7
154 #define TDI_EVENT_CHAINED_RECEIVE_DATAGRAM 8
155 #define TDI_EVENT_CHAINED_RECEIVE_EXPEDITED 9
156 #define TDI_EVENT_ERROR_EX 10
159 (NTAPI
*PTDI_IND_CONNECT
)(
160 IN PVOID TdiEventContext
,
161 IN LONG RemoteAddressLength
,
162 IN PVOID RemoteAddress
,
163 IN LONG UserDataLength
,
165 IN LONG OptionsLength
,
167 OUT CONNECTION_CONTEXT
*ConnectionContext
,
168 OUT PIRP
*AcceptIrp
);
173 TdiDefaultConnectHandler(
174 IN PVOID TdiEventContext
,
175 IN LONG RemoteAddressLength
,
176 IN PVOID RemoteAddress
,
177 IN LONG UserDataLength
,
179 IN LONG OptionsLength
,
181 OUT CONNECTION_CONTEXT
*ConnectionContext
,
182 OUT PIRP
*AcceptIrp
);
185 (NTAPI
*PTDI_IND_DISCONNECT
)(
186 IN PVOID TdiEventContext
,
187 IN CONNECTION_CONTEXT ConnectionContext
,
188 IN LONG DisconnectDataLength
,
189 IN PVOID DisconnectData
,
190 IN LONG DisconnectInformationLength
,
191 IN PVOID DisconnectInformation
,
192 IN ULONG DisconnectFlags
);
197 TdiDefaultDisconnectHandler(
198 IN PVOID TdiEventContext
,
199 IN CONNECTION_CONTEXT ConnectionContext
,
200 IN LONG DisconnectDataLength
,
201 IN PVOID DisconnectData
,
202 IN LONG DisconnectInformationLength
,
203 IN PVOID DisconnectInformation
,
204 IN ULONG DisconnectFlags
);
207 (NTAPI
*PTDI_IND_ERROR
)(
208 IN PVOID TdiEventContext
,
212 (NTAPI
*PTDI_IND_ERROR_EX
)(
213 IN PVOID TdiEventContext
,
220 TdiDefaultErrorHandler(
221 IN PVOID TdiEventContext
,
225 (NTAPI
*PTDI_IND_RECEIVE
)(
226 IN PVOID TdiEventContext
,
227 IN CONNECTION_CONTEXT ConnectionContext
,
228 IN ULONG ReceiveFlags
,
229 IN ULONG BytesIndicated
,
230 IN ULONG BytesAvailable
,
231 OUT ULONG
*BytesTaken
,
233 OUT PIRP
*IoRequestPacket
);
238 TdiDefaultReceiveHandler(
239 IN PVOID TdiEventContext
,
240 IN CONNECTION_CONTEXT ConnectionContext
,
241 IN ULONG ReceiveFlags
,
242 IN ULONG BytesIndicated
,
243 IN ULONG BytesAvailable
,
244 OUT ULONG
*BytesTaken
,
246 OUT PIRP
*IoRequestPacket
);
249 (NTAPI
*PTDI_IND_RECEIVE_DATAGRAM
)(
250 IN PVOID TdiEventContext
,
251 IN LONG SourceAddressLength
,
252 IN PVOID SourceAddress
,
253 IN LONG OptionsLength
,
255 IN ULONG ReceiveDatagramFlags
,
256 IN ULONG BytesIndicated
,
257 IN ULONG BytesAvailable
,
258 OUT ULONG
*BytesTaken
,
260 OUT PIRP
*IoRequestPacket
);
264 TdiDefaultRcvDatagramHandler(
265 IN PVOID TdiEventContext
,
266 IN LONG SourceAddressLength
,
267 IN PVOID SourceAddress
,
268 IN LONG OptionsLength
,
270 IN ULONG ReceiveDatagramFlags
,
271 IN ULONG BytesIndicated
,
272 IN ULONG BytesAvailable
,
273 OUT ULONG
*BytesTaken
,
275 OUT PIRP
*IoRequestPacket
);
278 (NTAPI
*PTDI_IND_RECEIVE_EXPEDITED
)(
279 IN PVOID TdiEventContext
,
280 IN CONNECTION_CONTEXT ConnectionContext
,
281 IN ULONG ReceiveFlags
,
282 IN ULONG BytesIndicated
,
283 IN ULONG BytesAvailable
,
284 OUT ULONG
*BytesTaken
,
286 OUT PIRP
*IoRequestPacket
);
291 TdiDefaultRcvExpeditedHandler(
292 IN PVOID TdiEventContext
,
293 IN CONNECTION_CONTEXT ConnectionContext
,
294 IN ULONG ReceiveFlags
,
295 IN ULONG BytesIndicated
,
296 IN ULONG BytesAvailable
,
297 OUT ULONG
*BytesTaken
,
299 OUT PIRP
*IoRequestPacket
);
302 (NTAPI
*PTDI_IND_CHAINED_RECEIVE
)(
303 IN PVOID TdiEventContext
,
304 IN CONNECTION_CONTEXT ConnectionContext
,
305 IN ULONG ReceiveFlags
,
306 IN ULONG ReceiveLength
,
307 IN ULONG StartingOffset
,
309 IN PVOID TsduDescriptor
);
314 TdiDefaultChainedReceiveHandler(
315 IN PVOID TdiEventContext
,
316 IN CONNECTION_CONTEXT ConnectionContext
,
317 IN ULONG ReceiveFlags
,
318 IN ULONG ReceiveLength
,
319 IN ULONG StartingOffset
,
321 IN PVOID TsduDescriptor
);
324 (NTAPI
*PTDI_IND_CHAINED_RECEIVE_DATAGRAM
)(
325 IN PVOID TdiEventContext
,
326 IN LONG SourceAddressLength
,
327 IN PVOID SourceAddress
,
328 IN LONG OptionsLength
,
330 IN ULONG ReceiveDatagramFlags
,
331 IN ULONG ReceiveDatagramLength
,
332 IN ULONG StartingOffset
,
334 IN PVOID TsduDescriptor
);
339 TdiDefaultChainedRcvDatagramHandler(
340 IN PVOID TdiEventContext
,
341 IN LONG SourceAddressLength
,
342 IN PVOID SourceAddress
,
343 IN LONG OptionsLength
,
345 IN ULONG ReceiveDatagramFlags
,
346 IN ULONG ReceiveDatagramLength
,
347 IN ULONG StartingOffset
,
349 IN PVOID TsduDescriptor
);
352 (NTAPI
*PTDI_IND_CHAINED_RECEIVE_EXPEDITED
)(
353 IN PVOID TdiEventContext
,
354 IN CONNECTION_CONTEXT ConnectionContext
,
355 IN ULONG ReceiveFlags
,
356 IN ULONG ReceiveLength
,
357 IN ULONG StartingOffset
,
359 IN PVOID TsduDescriptor
);
364 TdiDefaultChainedRcvExpeditedHandler(
365 IN PVOID TdiEventContext
,
366 IN CONNECTION_CONTEXT ConnectionContext
,
367 IN ULONG ReceiveFlags
,
368 IN ULONG ReceiveLength
,
369 IN ULONG StartingOffset
,
371 IN PVOID TsduDescriptor
);
374 (NTAPI
*PTDI_IND_SEND_POSSIBLE
)(
375 IN PVOID TdiEventContext
,
376 IN PVOID ConnectionContext
,
377 IN ULONG BytesAvailable
);
382 TdiDefaultSendPossibleHandler(
383 IN PVOID TdiEventContext
,
384 IN PVOID ConnectionContext
,
385 IN ULONG BytesAvailable
);
389 /* Macros and functions to build IRPs */
391 #define TdiBuildBaseIrp( \
392 bIrp, bDevObj, bFileObj, bCompRoutine, bContxt, bIrpSp, bMinor) \
394 bIrpSp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; \
395 bIrpSp->MinorFunction = (bMinor); \
396 bIrpSp->DeviceObject = (bDevObj); \
397 bIrpSp->FileObject = (bFileObj); \
400 IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE);\
403 IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE); \
410 * IN PDEVICE_OBJECT DevObj,
411 * IN PFILE_OBJECT FileObj,
412 * IN PVOID CompRoutine,
414 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
415 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
417 #define TdiBuildAccept( \
418 Irp, DevObj, FileObj, CompRoutine, Contxt, \
419 RequestConnectionInfo, ReturnConnectionInfo) \
421 PTDI_REQUEST_KERNEL_ACCEPT _Request; \
422 PIO_STACK_LOCATION _IrpSp; \
424 _IrpSp = IoGetNextIrpStackLocation(Irp); \
426 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
427 Contxt, _IrpSp, TDI_ACCEPT); \
429 _Request = (PTDI_REQUEST_KERNEL_ACCEPT)&_IrpSp->Parameters; \
430 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
431 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
438 * IN PDEVICE_OBJECT DevObj,
439 * IN PFILE_OBJECT FileObj,
440 * IN PVOID CompRoutine,
444 #define TdiBuildAction( \
445 Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr) \
447 PIO_STACK_LOCATION _IrpSp; \
449 _IrpSp = IoGetNextIrpStackLocation(Irp); \
451 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
452 Contxt, _IrpSp, TDI_ACTION); \
454 (Irp)->MdlAddress = (MdlAddr); \
459 * TdiBuildAssociateAddress(
461 * IN PDEVICE_OBJECT DevObj,
462 * IN PFILE_OBJECT FileObj,
463 * IN PVOID CompRoutine,
465 * IN HANDLE AddrHandle);
467 #define TdiBuildAssociateAddress( \
468 Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle) \
470 PTDI_REQUEST_KERNEL_ASSOCIATE _Request; \
471 PIO_STACK_LOCATION _IrpSp; \
473 _IrpSp = IoGetNextIrpStackLocation(Irp); \
475 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
476 Contxt, _IrpSp, TDI_ASSOCIATE_ADDRESS); \
478 _Request = (PTDI_REQUEST_KERNEL_ASSOCIATE)&_IrpSp->Parameters; \
479 _Request->AddressHandle = (HANDLE)(AddrHandle); \
486 * IN PDEVICE_OBJECT DevObj,
487 * IN PFILE_OBJECT FileObj,
488 * IN PVOID CompRoutine,
490 * IN PLARGE_INTEGER Time,
491 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
492 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
494 #define TdiBuildConnect( \
495 Irp, DevObj, FileObj, CompRoutine, Contxt, \
496 Time, RequestConnectionInfo, ReturnConnectionInfo) \
498 PTDI_REQUEST_KERNEL _Request; \
499 PIO_STACK_LOCATION _IrpSp; \
501 _IrpSp = IoGetNextIrpStackLocation(Irp); \
503 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
504 Contxt, _IrpSp, TDI_CONNECT); \
506 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
507 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
508 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
509 _Request->RequestSpecific = (PVOID)(Time); \
514 * TdiBuildDisassociateAddress(
516 * IN PDEVICE_OBJECT DevObj,
517 * IN PFILE_OBJECT FileObj,
518 * IN PVOID CompRoutine,
521 #define TdiBuildDisassociateAddress( \
522 Irp, DevObj, FileObj, CompRoutine, Contxt) \
524 PIO_STACK_LOCATION _IrpSp; \
526 _IrpSp = IoGetNextIrpStackLocation(Irp); \
528 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
529 Contxt, _IrpSp, TDI_DISASSOCIATE_ADDRESS); \
534 * TdiBuildDisconnect(
536 * IN PDEVICE_OBJECT DevObj,
537 * IN PFILE_OBJECT FileObj,
538 * IN PVOID CompRoutine,
540 * IN PLARGE_INTEGER Time,
542 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
543 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
545 #define TdiBuildDisconnect( \
546 Irp, DevObj, FileObj, CompRoutine, Contxt, Time, \
547 Flags, RequestConnectionInfo, ReturnConnectionInfo) \
549 PTDI_REQUEST_KERNEL _Request; \
550 PIO_STACK_LOCATION _IrpSp; \
552 _IrpSp = IoGetNextIrpStackLocation(Irp); \
554 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
555 Contxt, _IrpSp, TDI_DISCONNECT); \
557 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
558 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
559 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
560 _Request->RequestSpecific = (PVOID)(Time); \
561 _Request->RequestFlags = (Flags); \
566 * TdiBuildInternalDeviceControlIrp(
567 * IN CCHAR IrpSubFunction,
568 * IN PDEVICE_OBJECT DeviceObject,
569 * IN PFILE_OBJECT FileObject,
571 * IN PIO_STATUS_BLOCK IoStatusBlock);
573 #define TdiBuildInternalDeviceControlIrp( \
574 IrpSubFunction, DeviceObject, \
575 FileObject, Event, IoStatusBlock) \
576 IoBuildDeviceIoControlRequest( \
577 IrpSubFunction, DeviceObject, \
579 TRUE, Event, IoStatusBlock)
585 * IN PDEVICE_OBJECT DevObj,
586 * IN PFILE_OBJECT FileObj,
587 * IN PVOID CompRoutine,
590 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
591 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
593 #define TdiBuildListen( \
594 Irp, DevObj, FileObj, CompRoutine, Contxt, \
595 Flags, RequestConnectionInfo, ReturnConnectionInfo) \
597 PTDI_REQUEST_KERNEL _Request; \
598 PIO_STACK_LOCATION _IrpSp; \
600 _IrpSp = IoGetNextIrpStackLocation(Irp); \
602 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
603 Contxt, _IrpSp, TDI_LISTEN); \
605 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
606 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
607 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
608 _Request->RequestFlags = (Flags); \
614 TdiBuildNetbiosAddress(
615 IN PUCHAR NetbiosName
,
616 IN BOOLEAN IsGroupName
,
617 IN OUT PTA_NETBIOS_ADDRESS NetworkName
);
622 TdiBuildNetbiosAddressEa(
624 IN BOOLEAN IsGroupName
,
625 IN PUCHAR NetbiosName
);
629 * TdiBuildQueryInformation(
631 * IN PDEVICE_OBJECT DevObj,
632 * IN PFILE_OBJECT FileObj,
633 * IN PVOID CompRoutine,
638 #define TdiBuildQueryInformation( \
639 Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr) \
641 PTDI_REQUEST_KERNEL_QUERY_INFORMATION _Request; \
642 PIO_STACK_LOCATION _IrpSp; \
644 _IrpSp = IoGetNextIrpStackLocation(Irp); \
646 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
647 Contxt, _IrpSp, TDI_QUERY_INFORMATION); \
649 _Request = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&_IrpSp->Parameters; \
650 _Request->RequestConnectionInformation = NULL; \
651 _Request->QueryType = (ULONG)(QType); \
652 (Irp)->MdlAddress = (MdlAddr); \
659 * IN PDEVICE_OBJECT DevObj,
660 * IN PFILE_OBJECT FileObj,
661 * IN PVOID CompRoutine,
665 * IN ULONG ReceiveLen);
667 #define TdiBuildReceive( \
668 Irp, DevObj, FileObj, CompRoutine, Contxt, \
669 MdlAddr, InFlags, ReceiveLen) \
671 PTDI_REQUEST_KERNEL_RECEIVE _Request; \
672 PIO_STACK_LOCATION _IrpSp; \
674 _IrpSp = IoGetNextIrpStackLocation(Irp); \
676 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
677 Contxt, _IrpSp, TDI_RECEIVE); \
679 _Request = (PTDI_REQUEST_KERNEL_RECEIVE)&_IrpSp->Parameters; \
680 _Request->ReceiveFlags = (InFlags); \
681 _Request->ReceiveLength = (ReceiveLen); \
682 (Irp)->MdlAddress = (MdlAddr); \
687 * TdiBuildReceiveDatagram(
689 * IN PDEVICE_OBJECT DevObj,
690 * IN PFILE_OBJECT FileObj,
691 * IN PVOID CompRoutine,
694 * IN ULONG ReceiveLen,
695 * IN PTDI_CONNECTION_INFORMATION ReceiveDatagramInfo,
696 * OUT PTDI_CONNECTION_INFORMATION ReturnInfo,
699 #define TdiBuildReceiveDatagram( \
700 Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, \
701 ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags) \
703 PTDI_REQUEST_KERNEL_RECEIVEDG _Request; \
704 PIO_STACK_LOCATION _IrpSp; \
706 _IrpSp = IoGetNextIrpStackLocation(Irp); \
708 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
709 Contxt, _IrpSp, TDI_RECEIVE_DATAGRAM); \
711 _Request = (PTDI_REQUEST_KERNEL_RECEIVEDG)&_IrpSp->Parameters; \
712 _Request->ReceiveDatagramInformation = (ReceiveDatagramInfo); \
713 _Request->ReturnDatagramInformation = (ReturnInfo); \
714 _Request->ReceiveLength = (ReceiveLen); \
715 _Request->ReceiveFlags = (InFlags); \
716 (Irp)->MdlAddress = (MdlAddr); \
723 * IN PDEVICE_OBJECT DevObj,
724 * IN PFILE_OBJECT FileObj,
725 * IN PVOID CompRoutine,
731 #define TdiBuildSend( \
732 Irp, DevObj, FileObj, CompRoutine, Contxt, \
733 MdlAddr, InFlags, SendLen) \
735 PTDI_REQUEST_KERNEL_SEND _Request; \
736 PIO_STACK_LOCATION _IrpSp; \
738 _IrpSp = IoGetNextIrpStackLocation(Irp); \
740 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
741 Contxt, _IrpSp, TDI_SEND); \
743 _Request = (PTDI_REQUEST_KERNEL_SEND)&_IrpSp->Parameters; \
744 _Request->SendFlags = (InFlags); \
745 _Request->SendLength = (SendLen); \
746 (Irp)->MdlAddress = (MdlAddr); \
751 * TdiBuildSendDatagram(
753 * IN PDEVICE_OBJECT DevObj,
754 * IN PFILE_OBJECT FileObj,
755 * IN PVOID CompRoutine,
759 * IN PTDI_CONNECTION_INFORMATION SendDatagramInfo);
761 #define TdiBuildSendDatagram( \
762 Irp, DevObj, FileObj, CompRoutine, Contxt, \
763 MdlAddr, SendLen, SendDatagramInfo) \
765 PTDI_REQUEST_KERNEL_SENDDG _Request; \
766 PIO_STACK_LOCATION _IrpSp; \
768 _IrpSp = IoGetNextIrpStackLocation(Irp); \
770 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
771 Contxt, _IrpSp, TDI_SEND_DATAGRAM); \
773 _Request = (PTDI_REQUEST_KERNEL_SENDDG)&_IrpSp->Parameters; \
774 _Request->SendDatagramInformation = (SendDatagramInfo); \
775 _Request->SendLength = (SendLen); \
776 (Irp)->MdlAddress = (MdlAddr); \
781 * TdiBuildSetEventHandler(
783 * IN PDEVICE_OBJECT DevObj,
784 * IN PFILE_OBJECT FileObj,
785 * IN PVOID CompRoutine,
787 * IN INT InEventType,
788 * IN PVOID InEventHandler,
789 * IN PVOID InEventContext);
791 #define TdiBuildSetEventHandler( \
792 Irp, DevObj, FileObj, CompRoutine, Contxt, \
793 InEventType, InEventHandler, InEventContext) \
795 PTDI_REQUEST_KERNEL_SET_EVENT _Request; \
796 PIO_STACK_LOCATION _IrpSp; \
798 _IrpSp = IoGetNextIrpStackLocation(Irp); \
800 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
801 Contxt, _IrpSp, TDI_SET_EVENT_HANDLER); \
803 _Request = (PTDI_REQUEST_KERNEL_SET_EVENT)&_IrpSp->Parameters; \
804 _Request->EventType = (InEventType); \
805 _Request->EventHandler = (PVOID)(InEventHandler); \
806 _Request->EventContext = (PVOID)(InEventContext); \
811 * TdiBuildSetInformation(
813 * IN PDEVICE_OBJECT DevObj,
814 * IN PFILE_OBJECT FileObj,
815 * IN PVOID CompRoutine,
820 #define TdiBuildSetInformation( \
821 Irp, DevObj, FileObj, CompRoutine, Contxt, SType, MdlAddr) \
823 PTDI_REQUEST_KERNEL_SET_INFORMATION _Request; \
824 PIO_STACK_LOCATION _IrpSp; \
826 _IrpSp = IoGetNextIrpStackLocation(Irp); \
828 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
829 Contxt, _IrpSp, TDI_SET_INFORMATION); \
831 _Request = (PTDI_REQUEST_KERNEL_SET_INFORMATION)&_IrpSp->Parameters; \
832 _Request->RequestConnectionInformation = NULL; \
833 _Request->SetType = (ULONG)(SType); \
834 (Irp)->MdlAddress = (MdlAddr); \
837 /* TDI20_CLIENT_INTERFACE_INFO.TdiVersion constants */
838 #define TDI_CURRENT_MAJOR_VERSION 2
839 #define TDI_CURRENT_MINOR_VERSION 0
841 #define TDI_CURRENT_VERSION ((TDI_CURRENT_MINOR_VERSION) << 8 \
842 | (TDI_CURRENT_MAJOR_VERSION))
844 #define TDI_VERSION_ONE 0x0001
846 typedef enum _TDI_PNP_OPCODE
{
851 TDI_PNP_OP_PROVIDERREADY
,
853 TDI_PNP_OP_ADD_IGNORE_BINDING
,
854 TDI_PNP_OP_DELETE_IGNORE_BINDING
,
858 /* TDI_PNP_CONTEXT.ContextType */
859 #define TDI_PNP_CONTEXT_TYPE_IF_NAME 0x1
860 #define TDI_PNP_CONTEXT_TYPE_IF_ADDR 0x2
861 #define TDI_PNP_CONTEXT_TYPE_PDO 0x3
862 #define TDI_PNP_CONTEXT_TYPE_FIRST_OR_LAST_IF 0x4
864 typedef struct _TDI_PNP_CONTEXT
{
867 UCHAR ContextData
[1];
868 } TDI_PNP_CONTEXT
, *PTDI_PNP_CONTEXT
;
871 (NTAPI
*TDI_ADD_ADDRESS_HANDLER
)(
872 IN PTA_ADDRESS Address
);
875 (NTAPI
*TDI_ADD_ADDRESS_HANDLER_V2
)(
876 IN PTA_ADDRESS Address
,
877 IN PUNICODE_STRING DeviceName
,
878 IN PTDI_PNP_CONTEXT Context
);
881 (NTAPI
*TDI_BINDING_HANDLER
)(
882 IN TDI_PNP_OPCODE PnPOpcode
,
883 IN PUNICODE_STRING DeviceName
,
884 IN PWSTR MultiSZBindList
);
887 (NTAPI
*TDI_BIND_HANDLER
)(
888 IN PUNICODE_STRING DeviceName
);
891 (NTAPI
*TDI_DEL_ADDRESS_HANDLER
)(
892 IN PTA_ADDRESS Address
);
895 (NTAPI
*TDI_DEL_ADDRESS_HANDLER_V2
)(
896 IN PTA_ADDRESS Address
,
897 IN PUNICODE_STRING DeviceName
,
898 IN PTDI_PNP_CONTEXT Context
);
901 (NTAPI
*TDI_PNP_POWER_HANDLER
)(
902 IN PUNICODE_STRING DeviceName
,
903 IN PNET_PNP_EVENT PowerEvent
,
904 IN PTDI_PNP_CONTEXT Context1
,
905 IN PTDI_PNP_CONTEXT Context2
);
908 (NTAPI
*TDI_UNBIND_HANDLER
)(
909 IN PUNICODE_STRING DeviceName
);
912 (NTAPI
*ProviderPnPPowerComplete
)(
913 IN PNET_PNP_EVENT NetEvent
,
914 IN NTSTATUS ProviderStatus
);
916 typedef struct _TDI20_CLIENT_INTERFACE_INFO
{
917 _ANONYMOUS_UNION
union {
918 _ANONYMOUS_STRUCT
struct {
919 UCHAR MajorTdiVersion
;
920 UCHAR MinorTdiVersion
;
925 PUNICODE_STRING ClientName
;
926 TDI_PNP_POWER_HANDLER PnPPowerHandler
;
927 _ANONYMOUS_UNION
union {
928 TDI_BINDING_HANDLER BindingHandler
;
929 _ANONYMOUS_STRUCT
struct {
930 TDI_BIND_HANDLER BindHandler
;
931 TDI_UNBIND_HANDLER UnBindHandler
;
934 _ANONYMOUS_UNION
union {
935 _ANONYMOUS_STRUCT
struct {
936 TDI_ADD_ADDRESS_HANDLER_V2 AddAddressHandlerV2
;
937 TDI_DEL_ADDRESS_HANDLER_V2 DelAddressHandlerV2
;
939 _ANONYMOUS_STRUCT
struct {
940 TDI_ADD_ADDRESS_HANDLER AddAddressHandler
;
941 TDI_DEL_ADDRESS_HANDLER DelAddressHandler
;
944 } TDI20_CLIENT_INTERFACE_INFO
, *PTDI20_CLIENT_INTERFACE_INFO
;
946 typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO
;
947 typedef TDI_CLIENT_INTERFACE_INFO
*PTDI_CLIENT_INTERFACE_INFO
;
954 * TdiCompleteRequest(
956 * IN NTSTATUS Status);
958 #define TdiCompleteRequest(Irp, Status) \
960 (Irp)->IoStatus.Status = (Status); \
961 IoCompleteRequest((Irp), IO_NETWORK_INCREMENT); \
968 IN PVOID SourceBuffer
,
969 IN ULONG SourceOffset
,
970 IN ULONG SourceBytesToCopy
,
971 IN PMDL DestinationMdlChain
,
972 IN ULONG DestinationOffset
,
973 IN PULONG BytesCopied
);
977 * TdiCopyLookaheadData(
978 * IN PVOID Destination,
981 * IN ULONG ReceiveFlags);
983 #define TdiCopyLookaheadData(Destination, Source, Length, ReceiveFlags) \
984 RtlCopyMemory(Destination, Source, Length)
989 TdiCopyMdlChainToMdlChain (
990 IN PMDL SourceMdlChain
,
991 IN ULONG SourceOffset
,
992 IN PMDL DestinationMdlChain
,
993 IN ULONG DestinationOffset
,
994 OUT PULONG BytesCopied
);
1000 IN PMDL SourceMdlChain
,
1001 IN ULONG SourceOffset
,
1002 IN PVOID DestinationBuffer
,
1003 IN ULONG DestinationOffset
,
1004 IN ULONG DestinationBufferSize
,
1005 OUT PULONG BytesCopied
);
1010 TdiDeregisterAddressChangeHandler(
1011 IN HANDLE BindingHandle
);
1016 TdiDeregisterDeviceObject(
1017 IN HANDLE DevRegistrationHandle
);
1022 TdiDeregisterNetAddress(
1023 IN HANDLE AddrRegistrationHandle
);
1028 TdiDeregisterPnPHandlers(
1029 IN HANDLE BindingHandle
);
1034 TdiDeregisterProvider(
1035 IN HANDLE ProviderHandle
);
1040 TdiEnumerateAddresses(
1041 IN HANDLE BindingHandle
);
1059 IN PDEVICE_OBJECT DeviceObject
,
1061 IN PIO_STACK_LOCATION IrpSp
);
1066 TdiMatchPdoWithChainedReceiveContext(
1067 IN PVOID TsduDescriptor
,
1073 TdiPnPPowerComplete(
1074 IN HANDLE BindingHandle
,
1075 IN PNET_PNP_EVENT PowerEvent
,
1076 IN NTSTATUS Status
);
1082 IN PUNICODE_STRING DeviceName
,
1083 IN PNET_PNP_EVENT PowerEvent
,
1084 IN PTDI_PNP_CONTEXT Context1
,
1085 IN PTDI_PNP_CONTEXT Context2
,
1086 IN ProviderPnPPowerComplete ProtocolCompletionHandler
);
1092 IN HANDLE ProviderHandle
);
1097 TdiRegisterAddressChangeHandler(
1098 IN TDI_ADD_ADDRESS_HANDLER AddHandler
,
1099 IN TDI_DEL_ADDRESS_HANDLER DeleteHandler
,
1100 OUT HANDLE
*BindingHandle
);
1105 TdiRegisterDeviceObject(
1106 IN PUNICODE_STRING DeviceName
,
1107 OUT HANDLE
*DevRegistrationHandle
);
1112 TdiRegisterNetAddress(
1113 IN PTA_ADDRESS Address
,
1114 IN PUNICODE_STRING DeviceName
,
1115 IN PTDI_PNP_CONTEXT Context
,
1116 OUT HANDLE
*AddrRegistrationHandle
);
1121 TdiRegisterNotificationHandler(
1122 IN TDI_BIND_HANDLER BindHandler
,
1123 IN TDI_UNBIND_HANDLER UnbindHandler
,
1124 OUT HANDLE
*BindingHandle
);
1129 TdiRegisterPnPHandlers(
1130 IN PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo
,
1131 IN ULONG InterfaceInfoSize
,
1132 OUT HANDLE
*BindingHandle
);
1137 TdiRegisterProvider(
1138 IN PUNICODE_STRING ProviderName
,
1139 OUT HANDLE
*ProviderHandle
);
1144 TdiReturnChainedReceives(
1145 IN PVOID
*TsduDescriptors
,
1146 IN ULONG NumberOfTsdus
);
1158 #endif /* __TDIKRNL_H */