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); \
401 IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE);\
404 IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE); \
411 * IN PDEVICE_OBJECT DevObj,
412 * IN PFILE_OBJECT FileObj,
413 * IN PVOID CompRoutine,
415 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
416 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
418 #define TdiBuildAccept( \
419 Irp, DevObj, FileObj, CompRoutine, Contxt, \
420 RequestConnectionInfo, ReturnConnectionInfo) \
422 PTDI_REQUEST_KERNEL_ACCEPT _Request; \
423 PIO_STACK_LOCATION _IrpSp; \
425 _IrpSp = IoGetNextIrpStackLocation(Irp); \
427 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
428 Contxt, _IrpSp, TDI_ACCEPT); \
430 _Request = (PTDI_REQUEST_KERNEL_ACCEPT)&_IrpSp->Parameters; \
431 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
432 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
439 * IN PDEVICE_OBJECT DevObj,
440 * IN PFILE_OBJECT FileObj,
441 * IN PVOID CompRoutine,
445 #define TdiBuildAction( \
446 Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr) \
448 PIO_STACK_LOCATION _IrpSp; \
450 _IrpSp = IoGetNextIrpStackLocation(Irp); \
452 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
453 Contxt, _IrpSp, TDI_ACTION); \
455 (Irp)->MdlAddress = (MdlAddr); \
460 * TdiBuildAssociateAddress(
462 * IN PDEVICE_OBJECT DevObj,
463 * IN PFILE_OBJECT FileObj,
464 * IN PVOID CompRoutine,
466 * IN HANDLE AddrHandle);
468 #define TdiBuildAssociateAddress( \
469 Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle) \
471 PTDI_REQUEST_KERNEL_ASSOCIATE _Request; \
472 PIO_STACK_LOCATION _IrpSp; \
474 _IrpSp = IoGetNextIrpStackLocation(Irp); \
476 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
477 Contxt, _IrpSp, TDI_ASSOCIATE_ADDRESS); \
479 _Request = (PTDI_REQUEST_KERNEL_ASSOCIATE)&_IrpSp->Parameters; \
480 _Request->AddressHandle = (HANDLE)(AddrHandle); \
487 * IN PDEVICE_OBJECT DevObj,
488 * IN PFILE_OBJECT FileObj,
489 * IN PVOID CompRoutine,
491 * IN PLARGE_INTEGER Time,
492 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
493 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
495 #define TdiBuildConnect( \
496 Irp, DevObj, FileObj, CompRoutine, Contxt, \
497 Time, RequestConnectionInfo, ReturnConnectionInfo) \
499 PTDI_REQUEST_KERNEL _Request; \
500 PIO_STACK_LOCATION _IrpSp; \
502 _IrpSp = IoGetNextIrpStackLocation(Irp); \
504 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
505 Contxt, _IrpSp, TDI_CONNECT); \
507 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
508 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
509 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
510 _Request->RequestSpecific = (PVOID)(Time); \
515 * TdiBuildDisassociateAddress(
517 * IN PDEVICE_OBJECT DevObj,
518 * IN PFILE_OBJECT FileObj,
519 * IN PVOID CompRoutine,
522 #define TdiBuildDisassociateAddress( \
523 Irp, DevObj, FileObj, CompRoutine, Contxt) \
525 PIO_STACK_LOCATION _IrpSp; \
527 _IrpSp = IoGetNextIrpStackLocation(Irp); \
529 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
530 Contxt, _IrpSp, TDI_DISASSOCIATE_ADDRESS); \
535 * TdiBuildDisconnect(
537 * IN PDEVICE_OBJECT DevObj,
538 * IN PFILE_OBJECT FileObj,
539 * IN PVOID CompRoutine,
541 * IN PLARGE_INTEGER Time,
543 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
544 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
546 #define TdiBuildDisconnect( \
547 Irp, DevObj, FileObj, CompRoutine, Contxt, Time, \
548 Flags, RequestConnectionInfo, ReturnConnectionInfo) \
550 PTDI_REQUEST_KERNEL _Request; \
551 PIO_STACK_LOCATION _IrpSp; \
553 _IrpSp = IoGetNextIrpStackLocation(Irp); \
555 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
556 Contxt, _IrpSp, TDI_DISCONNECT); \
558 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
559 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
560 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
561 _Request->RequestSpecific = (PVOID)(Time); \
562 _Request->RequestFlags = (Flags); \
567 * TdiBuildInternalDeviceControlIrp(
568 * IN CCHAR IrpSubFunction,
569 * IN PDEVICE_OBJECT DeviceObject,
570 * IN PFILE_OBJECT FileObject,
572 * IN PIO_STATUS_BLOCK IoStatusBlock);
574 #define TdiBuildInternalDeviceControlIrp( \
575 IrpSubFunction, DeviceObject, \
576 FileObject, Event, IoStatusBlock) \
577 IoBuildDeviceIoControlRequest( \
578 IrpSubFunction, DeviceObject, \
580 TRUE, Event, IoStatusBlock)
586 * IN PDEVICE_OBJECT DevObj,
587 * IN PFILE_OBJECT FileObj,
588 * IN PVOID CompRoutine,
591 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
592 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
594 #define TdiBuildListen( \
595 Irp, DevObj, FileObj, CompRoutine, Contxt, \
596 Flags, RequestConnectionInfo, ReturnConnectionInfo) \
598 PTDI_REQUEST_KERNEL _Request; \
599 PIO_STACK_LOCATION _IrpSp; \
601 _IrpSp = IoGetNextIrpStackLocation(Irp); \
603 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
604 Contxt, _IrpSp, TDI_LISTEN); \
606 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
607 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
608 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
609 _Request->RequestFlags = (Flags); \
615 TdiBuildNetbiosAddress(
616 IN PUCHAR NetbiosName
,
617 IN BOOLEAN IsGroupName
,
618 IN OUT PTA_NETBIOS_ADDRESS NetworkName
);
623 TdiBuildNetbiosAddressEa(
625 IN BOOLEAN IsGroupName
,
626 IN PUCHAR NetbiosName
);
630 * TdiBuildQueryInformation(
632 * IN PDEVICE_OBJECT DevObj,
633 * IN PFILE_OBJECT FileObj,
634 * IN PVOID CompRoutine,
639 #define TdiBuildQueryInformation( \
640 Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr) \
642 PTDI_REQUEST_KERNEL_QUERY_INFORMATION _Request; \
643 PIO_STACK_LOCATION _IrpSp; \
645 _IrpSp = IoGetNextIrpStackLocation(Irp); \
647 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
648 Contxt, _IrpSp, TDI_QUERY_INFORMATION); \
650 _Request = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&_IrpSp->Parameters; \
651 _Request->RequestConnectionInformation = NULL; \
652 _Request->QueryType = (ULONG)(QType); \
653 (Irp)->MdlAddress = (MdlAddr); \
660 * IN PDEVICE_OBJECT DevObj,
661 * IN PFILE_OBJECT FileObj,
662 * IN PVOID CompRoutine,
666 * IN ULONG ReceiveLen);
668 #define TdiBuildReceive( \
669 Irp, DevObj, FileObj, CompRoutine, Contxt, \
670 MdlAddr, InFlags, ReceiveLen) \
672 PTDI_REQUEST_KERNEL_RECEIVE _Request; \
673 PIO_STACK_LOCATION _IrpSp; \
675 _IrpSp = IoGetNextIrpStackLocation(Irp); \
677 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
678 Contxt, _IrpSp, TDI_RECEIVE); \
680 _Request = (PTDI_REQUEST_KERNEL_RECEIVE)&_IrpSp->Parameters; \
681 _Request->ReceiveFlags = (InFlags); \
682 _Request->ReceiveLength = (ReceiveLen); \
683 (Irp)->MdlAddress = (MdlAddr); \
688 * TdiBuildReceiveDatagram(
690 * IN PDEVICE_OBJECT DevObj,
691 * IN PFILE_OBJECT FileObj,
692 * IN PVOID CompRoutine,
695 * IN ULONG ReceiveLen,
696 * IN PTDI_CONNECTION_INFORMATION ReceiveDatagramInfo,
697 * OUT PTDI_CONNECTION_INFORMATION ReturnInfo,
700 #define TdiBuildReceiveDatagram( \
701 Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, \
702 ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags) \
704 PTDI_REQUEST_KERNEL_RECEIVEDG _Request; \
705 PIO_STACK_LOCATION _IrpSp; \
707 _IrpSp = IoGetNextIrpStackLocation(Irp); \
709 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
710 Contxt, _IrpSp, TDI_RECEIVE_DATAGRAM); \
712 _Request = (PTDI_REQUEST_KERNEL_RECEIVEDG)&_IrpSp->Parameters; \
713 _Request->ReceiveDatagramInformation = (ReceiveDatagramInfo); \
714 _Request->ReturnDatagramInformation = (ReturnInfo); \
715 _Request->ReceiveLength = (ReceiveLen); \
716 _Request->ReceiveFlags = (InFlags); \
717 (Irp)->MdlAddress = (MdlAddr); \
724 * IN PDEVICE_OBJECT DevObj,
725 * IN PFILE_OBJECT FileObj,
726 * IN PVOID CompRoutine,
732 #define TdiBuildSend( \
733 Irp, DevObj, FileObj, CompRoutine, Contxt, \
734 MdlAddr, InFlags, SendLen) \
736 PTDI_REQUEST_KERNEL_SEND _Request; \
737 PIO_STACK_LOCATION _IrpSp; \
739 _IrpSp = IoGetNextIrpStackLocation(Irp); \
741 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
742 Contxt, _IrpSp, TDI_SEND); \
744 _Request = (PTDI_REQUEST_KERNEL_SEND)&_IrpSp->Parameters; \
745 _Request->SendFlags = (InFlags); \
746 _Request->SendLength = (SendLen); \
747 (Irp)->MdlAddress = (MdlAddr); \
752 * TdiBuildSendDatagram(
754 * IN PDEVICE_OBJECT DevObj,
755 * IN PFILE_OBJECT FileObj,
756 * IN PVOID CompRoutine,
760 * IN PTDI_CONNECTION_INFORMATION SendDatagramInfo);
762 #define TdiBuildSendDatagram( \
763 Irp, DevObj, FileObj, CompRoutine, Contxt, \
764 MdlAddr, SendLen, SendDatagramInfo) \
766 PTDI_REQUEST_KERNEL_SENDDG _Request; \
767 PIO_STACK_LOCATION _IrpSp; \
769 _IrpSp = IoGetNextIrpStackLocation(Irp); \
771 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
772 Contxt, _IrpSp, TDI_SEND_DATAGRAM); \
774 _Request = (PTDI_REQUEST_KERNEL_SENDDG)&_IrpSp->Parameters; \
775 _Request->SendDatagramInformation = (SendDatagramInfo); \
776 _Request->SendLength = (SendLen); \
777 (Irp)->MdlAddress = (MdlAddr); \
782 * TdiBuildSetEventHandler(
784 * IN PDEVICE_OBJECT DevObj,
785 * IN PFILE_OBJECT FileObj,
786 * IN PVOID CompRoutine,
788 * IN INT InEventType,
789 * IN PVOID InEventHandler,
790 * IN PVOID InEventContext);
792 #define TdiBuildSetEventHandler( \
793 Irp, DevObj, FileObj, CompRoutine, Contxt, \
794 InEventType, InEventHandler, InEventContext) \
796 PTDI_REQUEST_KERNEL_SET_EVENT _Request; \
797 PIO_STACK_LOCATION _IrpSp; \
799 _IrpSp = IoGetNextIrpStackLocation(Irp); \
801 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
802 Contxt, _IrpSp, TDI_SET_EVENT_HANDLER); \
804 _Request = (PTDI_REQUEST_KERNEL_SET_EVENT)&_IrpSp->Parameters; \
805 _Request->EventType = (InEventType); \
806 _Request->EventHandler = (PVOID)(InEventHandler); \
807 _Request->EventContext = (PVOID)(InEventContext); \
812 * TdiBuildSetInformation(
814 * IN PDEVICE_OBJECT DevObj,
815 * IN PFILE_OBJECT FileObj,
816 * IN PVOID CompRoutine,
821 #define TdiBuildSetInformation( \
822 Irp, DevObj, FileObj, CompRoutine, Contxt, SType, MdlAddr) \
824 PTDI_REQUEST_KERNEL_SET_INFORMATION _Request; \
825 PIO_STACK_LOCATION _IrpSp; \
827 _IrpSp = IoGetNextIrpStackLocation(Irp); \
829 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
830 Contxt, _IrpSp, TDI_SET_INFORMATION); \
832 _Request = (PTDI_REQUEST_KERNEL_SET_INFORMATION)&_IrpSp->Parameters; \
833 _Request->RequestConnectionInformation = NULL; \
834 _Request->SetType = (ULONG)(SType); \
835 (Irp)->MdlAddress = (MdlAddr); \
838 /* TDI20_CLIENT_INTERFACE_INFO.TdiVersion constants */
839 #define TDI_CURRENT_MAJOR_VERSION 2
840 #define TDI_CURRENT_MINOR_VERSION 0
842 #define TDI_CURRENT_VERSION ((TDI_CURRENT_MINOR_VERSION) << 8 \
843 | (TDI_CURRENT_MAJOR_VERSION))
845 #define TDI_VERSION_ONE 0x0001
847 typedef enum _TDI_PNP_OPCODE
{
852 TDI_PNP_OP_PROVIDERREADY
,
854 TDI_PNP_OP_ADD_IGNORE_BINDING
,
855 TDI_PNP_OP_DELETE_IGNORE_BINDING
,
859 /* TDI_PNP_CONTEXT.ContextType */
860 #define TDI_PNP_CONTEXT_TYPE_IF_NAME 0x1
861 #define TDI_PNP_CONTEXT_TYPE_IF_ADDR 0x2
862 #define TDI_PNP_CONTEXT_TYPE_PDO 0x3
863 #define TDI_PNP_CONTEXT_TYPE_FIRST_OR_LAST_IF 0x4
865 typedef struct _TDI_PNP_CONTEXT
{
868 UCHAR ContextData
[1];
869 } TDI_PNP_CONTEXT
, *PTDI_PNP_CONTEXT
;
872 (DDKAPI
*TDI_ADD_ADDRESS_HANDLER
)(
873 IN PTA_ADDRESS Address
);
876 (DDKAPI
*TDI_ADD_ADDRESS_HANDLER_V2
)(
877 IN PTA_ADDRESS Address
,
878 IN PUNICODE_STRING DeviceName
,
879 IN PTDI_PNP_CONTEXT Context
);
882 (DDKAPI
*TDI_BINDING_HANDLER
)(
883 IN TDI_PNP_OPCODE PnPOpcode
,
884 IN PUNICODE_STRING DeviceName
,
885 IN PWSTR MultiSZBindList
);
888 (DDKAPI
*TDI_BIND_HANDLER
)(
889 IN PUNICODE_STRING DeviceName
);
892 (DDKAPI
*TDI_DEL_ADDRESS_HANDLER
)(
893 IN PTA_ADDRESS Address
);
896 (DDKAPI
*TDI_DEL_ADDRESS_HANDLER_V2
)(
897 IN PTA_ADDRESS Address
,
898 IN PUNICODE_STRING DeviceName
,
899 IN PTDI_PNP_CONTEXT Context
);
902 (DDKAPI
*TDI_PNP_POWER_HANDLER
)(
903 IN PUNICODE_STRING DeviceName
,
904 IN PNET_PNP_EVENT PowerEvent
,
905 IN PTDI_PNP_CONTEXT Context1
,
906 IN PTDI_PNP_CONTEXT Context2
);
909 (DDKAPI
*TDI_UNBIND_HANDLER
)(
910 IN PUNICODE_STRING DeviceName
);
913 (DDKAPI
*ProviderPnPPowerComplete
)(
914 IN PNET_PNP_EVENT NetEvent
,
915 IN NTSTATUS ProviderStatus
);
917 typedef struct _TDI20_CLIENT_INTERFACE_INFO
{
918 _ANONYMOUS_UNION
union {
919 _ANONYMOUS_STRUCT
struct {
920 UCHAR MajorTdiVersion
;
921 UCHAR MinorTdiVersion
;
926 PUNICODE_STRING ClientName
;
927 TDI_PNP_POWER_HANDLER PnPPowerHandler
;
928 _ANONYMOUS_UNION
union {
929 TDI_BINDING_HANDLER BindingHandler
;
930 _ANONYMOUS_STRUCT
struct {
931 TDI_BIND_HANDLER BindHandler
;
932 TDI_UNBIND_HANDLER UnBindHandler
;
935 _ANONYMOUS_UNION
union {
936 _ANONYMOUS_STRUCT
struct {
937 TDI_ADD_ADDRESS_HANDLER_V2 AddAddressHandlerV2
;
938 TDI_DEL_ADDRESS_HANDLER_V2 DelAddressHandlerV2
;
940 _ANONYMOUS_STRUCT
struct {
941 TDI_ADD_ADDRESS_HANDLER AddAddressHandler
;
942 TDI_DEL_ADDRESS_HANDLER DelAddressHandler
;
945 } TDI20_CLIENT_INTERFACE_INFO
, *PTDI20_CLIENT_INTERFACE_INFO
;
947 typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO
;
948 typedef TDI_CLIENT_INTERFACE_INFO
*PTDI_CLIENT_INTERFACE_INFO
;
955 * TdiCompleteRequest(
957 * IN NTSTATUS Status);
959 #define TdiCompleteRequest(Irp, Status) \
961 (Irp)->IoStatus.Status = (Status); \
962 IoCompleteRequest((Irp), IO_NETWORK_INCREMENT); \
969 IN PVOID SourceBuffer
,
970 IN ULONG SourceOffset
,
971 IN ULONG SourceBytesToCopy
,
972 IN PMDL DestinationMdlChain
,
973 IN ULONG DestinationOffset
,
974 IN PULONG BytesCopied
);
978 * TdiCopyLookaheadData(
979 * IN PVOID Destination,
982 * IN ULONG ReceiveFlags);
984 #define TdiCopyLookaheadData(Destination, Source, Length, ReceiveFlags) \
985 RtlCopyMemory(Destination, Source, Length)
990 TdiCopyMdlChainToMdlChain (
991 IN PMDL SourceMdlChain
,
992 IN ULONG SourceOffset
,
993 IN PMDL DestinationMdlChain
,
994 IN ULONG DestinationOffset
,
995 OUT PULONG BytesCopied
);
1001 IN PMDL SourceMdlChain
,
1002 IN ULONG SourceOffset
,
1003 IN PVOID DestinationBuffer
,
1004 IN ULONG DestinationOffset
,
1005 IN ULONG DestinationBufferSize
,
1006 OUT PULONG BytesCopied
);
1011 TdiDeregisterAddressChangeHandler(
1012 IN HANDLE BindingHandle
);
1017 TdiDeregisterDeviceObject(
1018 IN HANDLE DevRegistrationHandle
);
1023 TdiDeregisterNetAddress(
1024 IN HANDLE AddrRegistrationHandle
);
1029 TdiDeregisterPnPHandlers(
1030 IN HANDLE BindingHandle
);
1035 TdiDeregisterProvider(
1036 IN HANDLE ProviderHandle
);
1041 TdiEnumerateAddresses(
1042 IN HANDLE BindingHandle
);
1060 IN PDEVICE_OBJECT DeviceObject
,
1062 IN PIO_STACK_LOCATION IrpSp
);
1067 TdiMatchPdoWithChainedReceiveContext(
1068 IN PVOID TsduDescriptor
,
1074 TdiPnPPowerComplete(
1075 IN HANDLE BindingHandle
,
1076 IN PNET_PNP_EVENT PowerEvent
,
1077 IN NTSTATUS Status
);
1083 IN PUNICODE_STRING DeviceName
,
1084 IN PNET_PNP_EVENT PowerEvent
,
1085 IN PTDI_PNP_CONTEXT Context1
,
1086 IN PTDI_PNP_CONTEXT Context2
,
1087 IN ProviderPnPPowerComplete ProtocolCompletionHandler
);
1093 IN HANDLE ProviderHandle
);
1098 TdiRegisterAddressChangeHandler(
1099 IN TDI_ADD_ADDRESS_HANDLER AddHandler
,
1100 IN TDI_DEL_ADDRESS_HANDLER DeleteHandler
,
1101 OUT HANDLE
*BindingHandle
);
1106 TdiRegisterDeviceObject(
1107 IN PUNICODE_STRING DeviceName
,
1108 OUT HANDLE
*DevRegistrationHandle
);
1113 TdiRegisterNetAddress(
1114 IN PTA_ADDRESS Address
,
1115 IN PUNICODE_STRING DeviceName
,
1116 IN PTDI_PNP_CONTEXT Context
,
1117 OUT HANDLE
*AddrRegistrationHandle
);
1122 TdiRegisterNotificationHandler(
1123 IN TDI_BIND_HANDLER BindHandler
,
1124 IN TDI_UNBIND_HANDLER UnbindHandler
,
1125 OUT HANDLE
*BindingHandle
);
1130 TdiRegisterPnPHandlers(
1131 IN PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo
,
1132 IN ULONG InterfaceInfoSize
,
1133 OUT HANDLE
*BindingHandle
);
1138 TdiRegisterProvider(
1139 IN PUNICODE_STRING ProviderName
,
1140 OUT HANDLE
*ProviderHandle
);
1145 TdiReturnChainedReceives(
1146 IN PVOID
*TsduDescriptors
,
1147 IN ULONG NumberOfTsdus
);
1159 #endif /* __TDIKRNL_H */