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
;
147 #define TDI_EVENT_CONNECT 0
148 #define TDI_EVENT_DISCONNECT 1
149 #define TDI_EVENT_ERROR 2
150 #define TDI_EVENT_RECEIVE 3
151 #define TDI_EVENT_RECEIVE_DATAGRAM 4
152 #define TDI_EVENT_RECEIVE_EXPEDITED 5
153 #define TDI_EVENT_SEND_POSSIBLE 6
154 #define TDI_EVENT_CHAINED_RECEIVE 7
155 #define TDI_EVENT_CHAINED_RECEIVE_DATAGRAM 8
156 #define TDI_EVENT_CHAINED_RECEIVE_EXPEDITED 9
157 #define TDI_EVENT_ERROR_EX 10
160 (DDKAPI
*PTDI_IND_CONNECT
)(
161 IN PVOID TdiEventContext
,
162 IN LONG RemoteAddressLength
,
163 IN PVOID RemoteAddress
,
164 IN LONG UserDataLength
,
166 IN LONG OptionsLength
,
168 OUT CONNECTION_CONTEXT
*ConnectionContext
,
169 OUT PIRP
*AcceptIrp
);
174 TdiDefaultConnectHandler(
175 IN PVOID TdiEventContext
,
176 IN LONG RemoteAddressLength
,
177 IN PVOID RemoteAddress
,
178 IN LONG UserDataLength
,
180 IN LONG OptionsLength
,
182 OUT CONNECTION_CONTEXT
*ConnectionContext
,
183 OUT PIRP
*AcceptIrp
);
186 (DDKAPI
*PTDI_IND_DISCONNECT
)(
187 IN PVOID TdiEventContext
,
188 IN CONNECTION_CONTEXT ConnectionContext
,
189 IN LONG DisconnectDataLength
,
190 IN PVOID DisconnectData
,
191 IN LONG DisconnectInformationLength
,
192 IN PVOID DisconnectInformation
,
193 IN ULONG DisconnectFlags
);
198 TdiDefaultDisconnectHandler(
199 IN PVOID TdiEventContext
,
200 IN CONNECTION_CONTEXT ConnectionContext
,
201 IN LONG DisconnectDataLength
,
202 IN PVOID DisconnectData
,
203 IN LONG DisconnectInformationLength
,
204 IN PVOID DisconnectInformation
,
205 IN ULONG DisconnectFlags
);
208 (DDKAPI
*PTDI_IND_ERROR
)(
209 IN PVOID TdiEventContext
,
213 (DDKAPI
*PTDI_IND_ERROR_EX
)(
214 IN PVOID TdiEventContext
,
221 TdiDefaultErrorHandler(
222 IN PVOID TdiEventContext
,
226 (DDKAPI
*PTDI_IND_RECEIVE
)(
227 IN PVOID TdiEventContext
,
228 IN CONNECTION_CONTEXT ConnectionContext
,
229 IN ULONG ReceiveFlags
,
230 IN ULONG BytesIndicated
,
231 IN ULONG BytesAvailable
,
232 OUT ULONG
*BytesTaken
,
234 OUT PIRP
*IoRequestPacket
);
239 TdiDefaultReceiveHandler(
240 IN PVOID TdiEventContext
,
241 IN CONNECTION_CONTEXT ConnectionContext
,
242 IN ULONG ReceiveFlags
,
243 IN ULONG BytesIndicated
,
244 IN ULONG BytesAvailable
,
245 OUT ULONG
*BytesTaken
,
247 OUT PIRP
*IoRequestPacket
);
250 (DDKAPI
*PTDI_IND_RECEIVE_DATAGRAM
)(
251 IN PVOID TdiEventContext
,
252 IN LONG SourceAddressLength
,
253 IN PVOID SourceAddress
,
254 IN LONG OptionsLength
,
256 IN ULONG ReceiveDatagramFlags
,
257 IN ULONG BytesIndicated
,
258 IN ULONG BytesAvailable
,
259 OUT ULONG
*BytesTaken
,
261 OUT PIRP
*IoRequestPacket
);
265 TdiDefaultRcvDatagramHandler(
266 IN PVOID TdiEventContext
,
267 IN LONG SourceAddressLength
,
268 IN PVOID SourceAddress
,
269 IN LONG OptionsLength
,
271 IN ULONG ReceiveDatagramFlags
,
272 IN ULONG BytesIndicated
,
273 IN ULONG BytesAvailable
,
274 OUT ULONG
*BytesTaken
,
276 OUT PIRP
*IoRequestPacket
);
279 (DDKAPI
*PTDI_IND_RECEIVE_EXPEDITED
)(
280 IN PVOID TdiEventContext
,
281 IN CONNECTION_CONTEXT ConnectionContext
,
282 IN ULONG ReceiveFlags
,
283 IN ULONG BytesIndicated
,
284 IN ULONG BytesAvailable
,
285 OUT ULONG
*BytesTaken
,
287 OUT PIRP
*IoRequestPacket
);
292 TdiDefaultRcvExpeditedHandler(
293 IN PVOID TdiEventContext
,
294 IN CONNECTION_CONTEXT ConnectionContext
,
295 IN ULONG ReceiveFlags
,
296 IN ULONG BytesIndicated
,
297 IN ULONG BytesAvailable
,
298 OUT ULONG
*BytesTaken
,
300 OUT PIRP
*IoRequestPacket
);
303 (DDKAPI
*PTDI_IND_CHAINED_RECEIVE
)(
304 IN PVOID TdiEventContext
,
305 IN CONNECTION_CONTEXT ConnectionContext
,
306 IN ULONG ReceiveFlags
,
307 IN ULONG ReceiveLength
,
308 IN ULONG StartingOffset
,
310 IN PVOID TsduDescriptor
);
315 TdiDefaultChainedReceiveHandler(
316 IN PVOID TdiEventContext
,
317 IN CONNECTION_CONTEXT ConnectionContext
,
318 IN ULONG ReceiveFlags
,
319 IN ULONG ReceiveLength
,
320 IN ULONG StartingOffset
,
322 IN PVOID TsduDescriptor
);
325 (DDKAPI
*PTDI_IND_CHAINED_RECEIVE_DATAGRAM
)(
326 IN PVOID TdiEventContext
,
327 IN LONG SourceAddressLength
,
328 IN PVOID SourceAddress
,
329 IN LONG OptionsLength
,
331 IN ULONG ReceiveDatagramFlags
,
332 IN ULONG ReceiveDatagramLength
,
333 IN ULONG StartingOffset
,
335 IN PVOID TsduDescriptor
);
340 TdiDefaultChainedRcvDatagramHandler(
341 IN PVOID TdiEventContext
,
342 IN LONG SourceAddressLength
,
343 IN PVOID SourceAddress
,
344 IN LONG OptionsLength
,
346 IN ULONG ReceiveDatagramFlags
,
347 IN ULONG ReceiveDatagramLength
,
348 IN ULONG StartingOffset
,
350 IN PVOID TsduDescriptor
);
353 (DDKAPI
*PTDI_IND_CHAINED_RECEIVE_EXPEDITED
)(
354 IN PVOID TdiEventContext
,
355 IN CONNECTION_CONTEXT ConnectionContext
,
356 IN ULONG ReceiveFlags
,
357 IN ULONG ReceiveLength
,
358 IN ULONG StartingOffset
,
360 IN PVOID TsduDescriptor
);
365 TdiDefaultChainedRcvExpeditedHandler(
366 IN PVOID TdiEventContext
,
367 IN CONNECTION_CONTEXT ConnectionContext
,
368 IN ULONG ReceiveFlags
,
369 IN ULONG ReceiveLength
,
370 IN ULONG StartingOffset
,
372 IN PVOID TsduDescriptor
);
375 (DDKAPI
*PTDI_IND_SEND_POSSIBLE
)(
376 IN PVOID TdiEventContext
,
377 IN PVOID ConnectionContext
,
378 IN ULONG BytesAvailable
);
383 TdiDefaultSendPossibleHandler(
384 IN PVOID TdiEventContext
,
385 IN PVOID ConnectionContext
,
386 IN ULONG BytesAvailable
);
390 /* Macros and functions to build IRPs */
392 #define TdiBuildBaseIrp( \
393 bIrp, bDevObj, bFileObj, bCompRoutine, bContxt, bIrpSp, bMinor) \
395 bIrpSp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; \
396 bIrpSp->MinorFunction = (bMinor); \
397 bIrpSp->DeviceObject = (bDevObj); \
398 bIrpSp->FileObject = (bFileObj); \
400 IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE) \
402 IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE); \
409 * IN PDEVICE_OBJECT DevObj,
410 * IN PFILE_OBJECT FileObj,
411 * IN PVOID CompRoutine,
413 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
414 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
416 #define TdiBuildAccept( \
417 Irp, DevObj, FileObj, CompRoutine, Contxt, \
418 RequestConnectionInfo, ReturnConnectionInfo) \
420 PTDI_REQUEST_KERNEL_ACCEPT _Request; \
421 PIO_STACK_LOCATION _IrpSp; \
423 _IrpSp = IoGetNextIrpStackLocation(Irp); \
425 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
426 Contxt, _IrpSp, TDI_ACCEPT); \
428 _Request = (PTDI_REQUEST_KERNEL_ACCEPT)&_IrpSp->Parameters; \
429 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
430 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
437 * IN PDEVICE_OBJECT DevObj,
438 * IN PFILE_OBJECT FileObj,
439 * IN PVOID CompRoutine,
443 #define TdiBuildAction( \
444 Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr) \
446 PIO_STACK_LOCATION _IrpSp; \
448 _IrpSp = IoGetNextIrpStackLocation(Irp); \
450 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
451 Contxt, _IrpSp, TDI_ACTION); \
453 (Irp)->MdlAddress = (MdlAddr); \
458 * TdiBuildAssociateAddress(
460 * IN PDEVICE_OBJECT DevObj,
461 * IN PFILE_OBJECT FileObj,
462 * IN PVOID CompRoutine,
464 * IN HANDLE AddrHandle);
466 #define TdiBuildAssociateAddress( \
467 Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle) \
469 PTDI_REQUEST_KERNEL_ASSOCIATE _Request; \
470 PIO_STACK_LOCATION _IrpSp; \
472 _IrpSp = IoGetNextIrpStackLocation(Irp); \
474 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
475 Contxt, _IrpSp, TDI_ASSOCIATE_ADDRESS); \
477 _Request = (PTDI_REQUEST_KERNEL_ASSOCIATE)&_IrpSp->Parameters; \
478 _Request->AddressHandle = (HANDLE)(AddrHandle); \
485 * IN PDEVICE_OBJECT DevObj,
486 * IN PFILE_OBJECT FileObj,
487 * IN PVOID CompRoutine,
489 * IN PLARGE_INTEGER Time,
490 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
491 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
493 #define TdiBuildConnect( \
494 Irp, DevObj, FileObj, CompRoutine, Contxt, \
495 Time, RequestConnectionInfo, ReturnConnectionInfo) \
497 PTDI_REQUEST_KERNEL _Request; \
498 PIO_STACK_LOCATION _IrpSp; \
500 _IrpSp = IoGetNextIrpStackLocation(Irp); \
502 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
503 Contxt, _IrpSp, TDI_CONNECT); \
505 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
506 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
507 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
508 _Request->RequestSpecific = (PVOID)(Time); \
513 * TdiBuildDisassociateAddress(
515 * IN PDEVICE_OBJECT DevObj,
516 * IN PFILE_OBJECT FileObj,
517 * IN PVOID CompRoutine,
520 #define TdiBuildDisassociateAddress( \
521 Irp, DevObj, FileObj, CompRoutine, Contxt) \
523 PIO_STACK_LOCATION _IrpSp; \
525 _IrpSp = IoGetNextIrpStackLocation(Irp); \
527 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
528 Contxt, _IrpSp, TDI_DISASSOCIATE_ADDRESS); \
533 * TdiBuildDisconnect(
535 * IN PDEVICE_OBJECT DevObj,
536 * IN PFILE_OBJECT FileObj,
537 * IN PVOID CompRoutine,
539 * IN PLARGE_INTEGER Time,
541 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
542 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
544 #define TdiBuildDisconnect( \
545 Irp, DevObj, FileObj, CompRoutine, Contxt, Time, \
546 Flags, RequestConnectionInfo, ReturnConnectionInfo) \
548 PTDI_REQUEST_KERNEL _Request; \
549 PIO_STACK_LOCATION _IrpSp; \
551 _IrpSp = IoGetNextIrpStackLocation(Irp); \
553 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
554 Contxt, _IrpSp, TDI_DISCONNECT); \
556 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
557 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
558 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
559 _Request->RequestSpecific = (PVOID)(Time); \
560 _Request->RequestFlags = (Flags); \
565 * TdiBuildInternalDeviceControlIrp(
566 * IN CCHAR IrpSubFunction,
567 * IN PDEVICE_OBJECT DeviceObject,
568 * IN PFILE_OBJECT FileObject,
570 * IN PIO_STATUS_BLOCK IoStatusBlock);
572 #define TdiBuildInternalDeviceControlIrp( \
573 IrpSubFunction, DeviceObject, \
574 FileObject, Event, IoStatusBlock) \
575 IoBuildDeviceIoControlRequest( \
576 IrpSubFunction, DeviceObject, \
578 TRUE, Event, IoStatusBlock)
584 * IN PDEVICE_OBJECT DevObj,
585 * IN PFILE_OBJECT FileObj,
586 * IN PVOID CompRoutine,
589 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
590 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
592 #define TdiBuildListen( \
593 Irp, DevObj, FileObj, CompRoutine, Contxt, \
594 Flags, RequestConnectionInfo, ReturnConnectionInfo) \
596 PTDI_REQUEST_KERNEL _Request; \
597 PIO_STACK_LOCATION _IrpSp; \
599 _IrpSp = IoGetNextIrpStackLocation(Irp); \
601 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
602 Contxt, _IrpSp, TDI_LISTEN); \
604 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
605 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
606 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
607 _Request->RequestFlags = (Flags); \
613 TdiBuildNetbiosAddress(
614 IN PUCHAR NetbiosName
,
615 IN BOOLEAN IsGroupName
,
616 IN OUT PTA_NETBIOS_ADDRESS NetworkName
);
621 TdiBuildNetbiosAddressEa(
623 IN BOOLEAN IsGroupName
,
624 IN PUCHAR NetbiosName
);
628 * TdiBuildQueryInformation(
630 * IN PDEVICE_OBJECT DevObj,
631 * IN PFILE_OBJECT FileObj,
632 * IN PVOID CompRoutine,
637 #define TdiBuildQueryInformation( \
638 Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr) \
640 PTDI_REQUEST_KERNEL_QUERY_INFORMATION _Request; \
641 PIO_STACK_LOCATION _IrpSp; \
643 _IrpSp = IoGetNextIrpStackLocation(Irp); \
645 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
646 Contxt, _IrpSp, TDI_QUERY_INFORMATION); \
648 _Request = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&_IrpSp->Parameters; \
649 _Request->RequestConnectionInformation = NULL; \
650 _Request->QueryType = (ULONG)(QType); \
651 (Irp)->MdlAddress = (MdlAddr); \
658 * IN PDEVICE_OBJECT DevObj,
659 * IN PFILE_OBJECT FileObj,
660 * IN PVOID CompRoutine,
664 * IN ULONG ReceiveLen);
666 #define TdiBuildReceive( \
667 Irp, DevObj, FileObj, CompRoutine, Contxt, \
668 MdlAddr, InFlags, ReceiveLen) \
670 PTDI_REQUEST_KERNEL_RECEIVE _Request; \
671 PIO_STACK_LOCATION _IrpSp; \
673 _IrpSp = IoGetNextIrpStackLocation(Irp); \
675 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
676 Contxt, _IrpSp, TDI_RECEIVE); \
678 _Request = (PTDI_REQUEST_KERNEL_RECEIVE)&_IrpSp->Parameters; \
679 _Request->ReceiveFlags = (InFlags); \
680 _Request->ReceiveLength = (ReceiveLen); \
681 (Irp)->MdlAddress = (MdlAddr); \
686 * TdiBuildReceiveDatagram(
688 * IN PDEVICE_OBJECT DevObj,
689 * IN PFILE_OBJECT FileObj,
690 * IN PVOID CompRoutine,
693 * IN ULONG ReceiveLen,
694 * IN PTDI_CONNECTION_INFORMATION ReceiveDatagramInfo,
695 * OUT PTDI_CONNECTION_INFORMATION ReturnInfo,
698 #define TdiBuildReceiveDatagram( \
699 Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, \
700 ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags) \
702 PTDI_REQUEST_KERNEL_RECEIVEDG _Request; \
703 PIO_STACK_LOCATION _IrpSp; \
705 _IrpSp = IoGetNextIrpStackLocation(Irp); \
707 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
708 Contxt, _IrpSp, TDI_RECEIVE_DATAGRAM); \
710 _Request = (PTDI_REQUEST_KERNEL_RECEIVEDG)&_IrpSp->Parameters; \
711 _Request->ReceiveDatagramInformation = (ReceiveDatagramInfo); \
712 _Request->ReturnDatagramInformation = (ReturnInfo); \
713 _Request->ReceiveLength = (ReceiveLen); \
714 _Request->ReceiveFlags = (InFlags); \
715 (Irp)->MdlAddress = (MdlAddr); \
722 * IN PDEVICE_OBJECT DevObj,
723 * IN PFILE_OBJECT FileObj,
724 * IN PVOID CompRoutine,
730 #define TdiBuildSend( \
731 Irp, DevObj, FileObj, CompRoutine, Contxt, \
732 MdlAddr, InFlags, SendLen) \
734 PTDI_REQUEST_KERNEL_SEND _Request; \
735 PIO_STACK_LOCATION _IrpSp; \
737 _IrpSp = IoGetNextIrpStackLocation(Irp); \
739 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
740 Contxt, _IrpSp, TDI_SEND); \
742 _Request = (PTDI_REQUEST_KERNEL_SEND)&_IrpSp->Parameters; \
743 _Request->SendFlags = (InFlags); \
744 _Request->SendLength = (SendLen); \
745 (Irp)->MdlAddress = (MdlAddr); \
750 * TdiBuildSendDatagram(
752 * IN PDEVICE_OBJECT DevObj,
753 * IN PFILE_OBJECT FileObj,
754 * IN PVOID CompRoutine,
758 * IN PTDI_CONNECTION_INFORMATION SendDatagramInfo);
760 #define TdiBuildSendDatagram( \
761 Irp, DevObj, FileObj, CompRoutine, Contxt, \
762 MdlAddr, SendLen, SendDatagramInfo) \
764 PTDI_REQUEST_KERNEL_SENDDG _Request; \
765 PIO_STACK_LOCATION _IrpSp; \
767 _IrpSp = IoGetNextIrpStackLocation(Irp); \
769 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
770 Contxt, _IrpSp, TDI_SEND_DATAGRAM); \
772 _Request = (PTDI_REQUEST_KERNEL_SENDDG)&_IrpSp->Parameters; \
773 _Request->SendDatagramInformation = (SendDatagramInfo); \
774 _Request->SendLength = (SendLen); \
775 (Irp)->MdlAddress = (MdlAddr); \
780 * TdiBuildSetEventHandler(
782 * IN PDEVICE_OBJECT DevObj,
783 * IN PFILE_OBJECT FileObj,
784 * IN PVOID CompRoutine,
786 * IN INT InEventType,
787 * IN PVOID InEventHandler,
788 * IN PVOID InEventContext);
790 #define TdiBuildSetEventHandler( \
791 Irp, DevObj, FileObj, CompRoutine, Contxt, \
792 InEventType, InEventHandler, InEventContext) \
794 PTDI_REQUEST_KERNEL_SET_EVENT _Request; \
795 PIO_STACK_LOCATION _IrpSp; \
797 _IrpSp = IoGetNextIrpStackLocation(Irp); \
799 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
800 Contxt, _IrpSp, TDI_SET_EVENT_HANDLER); \
802 _Request = (PTDI_REQUEST_KERNEL_SET_EVENT)&_IrpSp->Parameters; \
803 _Request->EventType = (InEventType); \
804 _Request->EventHandler = (PVOID)(InEventHandler); \
805 _Request->EventContext = (PVOID)(InEventContext); \
810 * TdiBuildSetInformation(
812 * IN PDEVICE_OBJECT DevObj,
813 * IN PFILE_OBJECT FileObj,
814 * IN PVOID CompRoutine,
819 #define TdiBuildSetInformation( \
820 Irp, DevObj, FileObj, CompRoutine, Contxt, SType, MdlAddr) \
822 PTDI_REQUEST_KERNEL_SET_INFORMATION _Request; \
823 PIO_STACK_LOCATION _IrpSp; \
825 _IrpSp = IoGetNextIrpStackLocation(Irp); \
827 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
828 Contxt, _IrpSp, TDI_SET_INFORMATION); \
830 _Request = (PTDI_REQUEST_KERNEL_SET_INFORMATION)&_IrpSp->Parameters; \
831 _Request->RequestConnectionInformation = NULL; \
832 _Request->SetType = (ULONG)(SType); \
833 (Irp)->MdlAddress = (MdlAddr); \
836 /* TDI20_CLIENT_INTERFACE_INFO.TdiVersion constants */
837 #define TDI_CURRENT_MAJOR_VERSION 2
838 #define TDI_CURRENT_MINOR_VERSION 0
840 #define TDI_CURRENT_VERSION ((TDI_CURRENT_MINOR_VERSION) << 8 \
841 | (TDI_CURRENT_MAJOR_VERSION))
843 #define TDI_VERSION_ONE 0x0001
845 typedef enum _TDI_PNP_OPCODE
{
850 TDI_PNP_OP_PROVIDERREADY
,
852 TDI_PNP_OP_ADD_IGNORE_BINDING
,
853 TDI_PNP_OP_DELETE_IGNORE_BINDING
,
857 /* TDI_PNP_CONTEXT.ContextType */
858 #define TDI_PNP_CONTEXT_TYPE_IF_NAME 0x1
859 #define TDI_PNP_CONTEXT_TYPE_IF_ADDR 0x2
860 #define TDI_PNP_CONTEXT_TYPE_PDO 0x3
861 #define TDI_PNP_CONTEXT_TYPE_FIRST_OR_LAST_IF 0x4
863 typedef struct _TDI_PNP_CONTEXT
{
866 UCHAR ContextData
[1];
867 } TDI_PNP_CONTEXT
, *PTDI_PNP_CONTEXT
;
870 (DDKAPI
*TDI_ADD_ADDRESS_HANDLER
)(
871 IN PTA_ADDRESS Address
);
874 (DDKAPI
*TDI_ADD_ADDRESS_HANDLER_V2
)(
875 IN PTA_ADDRESS Address
,
876 IN PUNICODE_STRING DeviceName
,
877 IN PTDI_PNP_CONTEXT Context
);
880 (DDKAPI
*TDI_BINDING_HANDLER
)(
881 IN TDI_PNP_OPCODE PnPOpcode
,
882 IN PUNICODE_STRING DeviceName
,
883 IN PWSTR MultiSZBindList
);
886 (DDKAPI
*TDI_BIND_HANDLER
)(
887 IN PUNICODE_STRING DeviceName
);
890 (DDKAPI
*TDI_DEL_ADDRESS_HANDLER
)(
891 IN PTA_ADDRESS Address
);
894 (DDKAPI
*TDI_DEL_ADDRESS_HANDLER_V2
)(
895 IN PTA_ADDRESS Address
,
896 IN PUNICODE_STRING DeviceName
,
897 IN PTDI_PNP_CONTEXT Context
);
900 (DDKAPI
*TDI_PNP_POWER_HANDLER
)(
901 IN PUNICODE_STRING DeviceName
,
902 IN PNET_PNP_EVENT PowerEvent
,
903 IN PTDI_PNP_CONTEXT Context1
,
904 IN PTDI_PNP_CONTEXT Context2
);
907 (DDKAPI
*TDI_UNBIND_HANDLER
)(
908 IN PUNICODE_STRING DeviceName
);
911 (DDKAPI
*ProviderPnPPowerComplete
)(
912 IN PNET_PNP_EVENT NetEvent
,
913 IN NTSTATUS ProviderStatus
);
915 typedef struct _TDI20_CLIENT_INTERFACE_INFO
{
916 _ANONYMOUS_UNION
union {
917 _ANONYMOUS_STRUCT
struct {
918 UCHAR MajorTdiVersion
;
919 UCHAR MinorTdiVersion
;
924 PUNICODE_STRING ClientName
;
925 TDI_PNP_POWER_HANDLER PnPPowerHandler
;
926 _ANONYMOUS_UNION
union {
927 TDI_BINDING_HANDLER BindingHandler
;
928 _ANONYMOUS_STRUCT
struct {
929 TDI_BIND_HANDLER BindHandler
;
930 TDI_UNBIND_HANDLER UnBindHandler
;
933 _ANONYMOUS_UNION
union {
934 _ANONYMOUS_STRUCT
struct {
935 TDI_ADD_ADDRESS_HANDLER_V2 AddAddressHandlerV2
;
936 TDI_DEL_ADDRESS_HANDLER_V2 DelAddressHandlerV2
;
938 _ANONYMOUS_STRUCT
struct {
939 TDI_ADD_ADDRESS_HANDLER AddAddressHandler
;
940 TDI_DEL_ADDRESS_HANDLER DelAddressHandler
;
943 } TDI20_CLIENT_INTERFACE_INFO
, *PTDI20_CLIENT_INTERFACE_INFO
;
945 typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO
;
946 typedef TDI_CLIENT_INTERFACE_INFO
*PTDI_CLIENT_INTERFACE_INFO
;
953 * TdiCompleteRequest(
955 * IN NTSTATUS Status);
957 #define TdiCompleteRequest(Irp, Status) \
959 (Irp)->IoStatus.Status = (Status); \
960 IoCompleteRequest((Irp), IO_NETWORK_INCREMENT); \
967 IN PVOID SourceBuffer
,
968 IN ULONG SourceOffset
,
969 IN ULONG SourceBytesToCopy
,
970 IN PMDL DestinationMdlChain
,
971 IN ULONG DestinationOffset
,
972 IN PULONG BytesCopied
);
976 * TdiCopyLookaheadData(
977 * IN PVOID Destination,
980 * IN ULONG ReceiveFlags);
982 #define TdiCopyLookaheadData(Destination, Source, Length, ReceiveFlags) \
983 RtlCopyMemory(Destination, Source, Length)
988 TdiCopyMdlChainToMdlChain (
989 IN PMDL SourceMdlChain
,
990 IN ULONG SourceOffset
,
991 IN PMDL DestinationMdlChain
,
992 IN ULONG DestinationOffset
,
993 OUT PULONG BytesCopied
);
999 IN PMDL SourceMdlChain
,
1000 IN ULONG SourceOffset
,
1001 IN PVOID DestinationBuffer
,
1002 IN ULONG DestinationOffset
,
1003 IN ULONG DestinationBufferSize
,
1004 OUT PULONG BytesCopied
);
1009 TdiDeregisterAddressChangeHandler(
1010 IN HANDLE BindingHandle
);
1015 TdiDeregisterDeviceObject(
1016 IN HANDLE DevRegistrationHandle
);
1021 TdiDeregisterNetAddress(
1022 IN HANDLE AddrRegistrationHandle
);
1027 TdiDeregisterPnPHandlers(
1028 IN HANDLE BindingHandle
);
1033 TdiDeregisterProvider(
1034 IN HANDLE ProviderHandle
);
1039 TdiEnumerateAddresses(
1040 IN HANDLE BindingHandle
);
1058 IN PDEVICE_OBJECT DeviceObject
,
1060 IN PIO_STACK_LOCATION IrpSp
);
1065 TdiMatchPdoWithChainedReceiveContext(
1066 IN PVOID TsduDescriptor
,
1072 TdiPnPPowerComplete(
1073 IN HANDLE BindingHandle
,
1074 IN PNET_PNP_EVENT PowerEvent
,
1075 IN NTSTATUS Status
);
1081 IN PUNICODE_STRING DeviceName
,
1082 IN PNET_PNP_EVENT PowerEvent
,
1083 IN PTDI_PNP_CONTEXT Context1
,
1084 IN PTDI_PNP_CONTEXT Context2
,
1085 IN ProviderPnPPowerComplete ProtocolCompletionHandler
);
1091 IN HANDLE ProviderHandle
);
1096 TdiRegisterAddressChangeHandler(
1097 IN TDI_ADD_ADDRESS_HANDLER AddHandler
,
1098 IN TDI_DEL_ADDRESS_HANDLER DeleteHandler
,
1099 OUT HANDLE
*BindingHandle
);
1104 TdiRegisterDeviceObject(
1105 IN PUNICODE_STRING DeviceName
,
1106 OUT HANDLE
*DevRegistrationHandle
);
1111 TdiRegisterNetAddress(
1112 IN PTA_ADDRESS Address
,
1113 IN PUNICODE_STRING DeviceName
,
1114 IN PTDI_PNP_CONTEXT Context
,
1115 OUT HANDLE
*AddrRegistrationHandle
);
1120 TdiRegisterNotificationHandler(
1121 IN TDI_BIND_HANDLER BindHandler
,
1122 IN TDI_UNBIND_HANDLER UnbindHandler
,
1123 OUT HANDLE
*BindingHandle
);
1128 TdiRegisterPnPHandlers(
1129 IN PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo
,
1130 IN ULONG InterfaceInfoSize
,
1131 OUT HANDLE
*BindingHandle
);
1136 TdiRegisterProvider(
1137 IN PUNICODE_STRING ProviderName
,
1138 OUT HANDLE
*ProviderHandle
);
1143 TdiReturnChainedReceives(
1144 IN PVOID
*TsduDescriptors
,
1145 IN ULONG NumberOfTsdus
);
1157 #endif /* __TDIKRNL_H */