3 * @copy 2012 MinGW.org project
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
24 /* Created by Casper S. Hornstrup <chorns@users.sourceforge.net> */
27 #pragma GCC system_header
31 * TDI kernel mode definitions
42 #define TDIKRNLAPI DECLSPEC_EXPORT
44 #define TDIKRNLAPI DECLSPEC_IMPORT
48 typedef struct _TDI_REQUEST_KERNEL {
50 PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
51 PTDI_CONNECTION_INFORMATION ReturnConnectionInformation;
52 PVOID RequestSpecific;
53 } TDI_REQUEST_KERNEL, *PTDI_REQUEST_KERNEL;
56 #define TDI_ASSOCIATE_ADDRESS 0x01
57 #define TDI_DISASSOCIATE_ADDRESS 0x02
58 #define TDI_CONNECT 0x03
59 #define TDI_LISTEN 0x04
60 #define TDI_ACCEPT 0x05
61 #define TDI_DISCONNECT 0x06
63 #define TDI_RECEIVE 0x08
64 #define TDI_SEND_DATAGRAM 0x09
65 #define TDI_RECEIVE_DATAGRAM 0x0A
66 #define TDI_SET_EVENT_HANDLER 0x0B
67 #define TDI_QUERY_INFORMATION 0x0C
68 #define TDI_SET_INFORMATION 0x0D
69 #define TDI_ACTION 0x0E
71 #define TDI_DIRECT_SEND 0x27
72 #define TDI_DIRECT_SEND_DATAGRAM 0x29
74 #define TDI_TRANSPORT_ADDRESS_FILE 1
75 #define TDI_CONNECTION_FILE 2
76 #define TDI_CONTROL_CHANNEL_FILE 3
78 /* Internal TDI IOCTLS */
79 #define IOCTL_TDI_QUERY_DIRECT_SEND_HANDLER _TDI_CONTROL_CODE(0x80, METHOD_NEITHER)
80 #define IOCTL_TDI_QUERY_DIRECT_SENDDG_HANDLER _TDI_CONTROL_CODE(0x81, METHOD_NEITHER)
82 /* TdiAssociateAddress */
83 typedef struct _TDI_REQUEST_KERNEL_ASSOCIATE {
85 } TDI_REQUEST_KERNEL_ASSOCIATE, *PTDI_REQUEST_KERNEL_ASSOCIATE;
87 /* TdiDisassociateAddress */
88 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISASSOCIATE,
89 *PTDI_REQUEST_KERNEL_DISASSOCIATE;
92 typedef struct _TDI_REQUEST_KERNEL_ACCEPT {
93 PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
94 PTDI_CONNECTION_INFORMATION ReturnConnectionInformation;
95 } TDI_REQUEST_KERNEL_ACCEPT, *PTDI_REQUEST_KERNEL_ACCEPT;
98 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_CONNECT,
99 *PTDI_REQUEST_KERNEL_CONNECT;
102 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISCONNECT,
103 *PTDI_REQUEST_KERNEL_DISCONNECT;
106 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_LISTEN,
107 *PTDI_REQUEST_KERNEL_LISTEN;
110 typedef struct _TDI_REQUEST_KERNEL_RECEIVE {
113 } TDI_REQUEST_KERNEL_RECEIVE, *PTDI_REQUEST_KERNEL_RECEIVE;
115 /* TdiReceiveDatagram */
116 typedef struct _TDI_REQUEST_KERNEL_RECEIVEDG {
118 PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation;
119 PTDI_CONNECTION_INFORMATION ReturnDatagramInformation;
121 } TDI_REQUEST_KERNEL_RECEIVEDG, *PTDI_REQUEST_KERNEL_RECEIVEDG;
124 typedef struct _TDI_REQUEST_KERNEL_SEND {
127 } TDI_REQUEST_KERNEL_SEND, *PTDI_REQUEST_KERNEL_SEND;
129 /* TdiSendDatagram */
130 typedef struct _TDI_REQUEST_KERNEL_SENDDG {
132 PTDI_CONNECTION_INFORMATION SendDatagramInformation;
133 } TDI_REQUEST_KERNEL_SENDDG, *PTDI_REQUEST_KERNEL_SENDDG;
135 /* TdiSetEventHandler */
136 typedef struct _TDI_REQUEST_KERNEL_SET_EVENT {
140 } TDI_REQUEST_KERNEL_SET_EVENT, *PTDI_REQUEST_KERNEL_SET_EVENT;
142 /* TdiQueryInformation */
143 typedef struct _TDI_REQUEST_KERNEL_QUERY_INFO {
145 PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
146 } TDI_REQUEST_KERNEL_QUERY_INFORMATION, *PTDI_REQUEST_KERNEL_QUERY_INFORMATION;
148 /* TdiSetInformation */
149 typedef struct _TDI_REQUEST_KERNEL_SET_INFO {
151 PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
152 } TDI_REQUEST_KERNEL_SET_INFORMATION, *PTDI_REQUEST_KERNEL_SET_INFORMATION;
156 #define TDI_EVENT_CONNECT 0
157 #define TDI_EVENT_DISCONNECT 1
158 #define TDI_EVENT_ERROR 2
159 #define TDI_EVENT_RECEIVE 3
160 #define TDI_EVENT_RECEIVE_DATAGRAM 4
161 #define TDI_EVENT_RECEIVE_EXPEDITED 5
162 #define TDI_EVENT_SEND_POSSIBLE 6
163 #define TDI_EVENT_CHAINED_RECEIVE 7
164 #define TDI_EVENT_CHAINED_RECEIVE_DATAGRAM 8
165 #define TDI_EVENT_CHAINED_RECEIVE_EXPEDITED 9
166 #define TDI_EVENT_ERROR_EX 10
168 typedef NTSTATUS DDKAPI
170 /*IN*/ PVOID TdiEventContext,
171 /*IN*/ LONG RemoteAddressLength,
172 /*IN*/ PVOID RemoteAddress,
173 /*IN*/ LONG UserDataLength,
174 /*IN*/ PVOID UserData,
175 /*IN*/ LONG OptionsLength,
176 /*IN*/ PVOID Options,
177 /*OUT*/ CONNECTION_CONTEXT *ConnectionContext,
178 /*OUT*/ PIRP *AcceptIrp);
183 TdiDefaultConnectHandler(
184 /*IN*/ PVOID TdiEventContext,
185 /*IN*/ LONG RemoteAddressLength,
186 /*IN*/ PVOID RemoteAddress,
187 /*IN*/ LONG UserDataLength,
188 /*IN*/ PVOID UserData,
189 /*IN*/ LONG OptionsLength,
190 /*IN*/ PVOID Options,
191 /*OUT*/ CONNECTION_CONTEXT *ConnectionContext,
192 /*OUT*/ PIRP *AcceptIrp);
194 typedef NTSTATUS DDKAPI
195 (*PTDI_IND_DISCONNECT)(
196 /*IN*/ PVOID TdiEventContext,
197 /*IN*/ CONNECTION_CONTEXT ConnectionContext,
198 /*IN*/ LONG DisconnectDataLength,
199 /*IN*/ PVOID DisconnectData,
200 /*IN*/ LONG DisconnectInformationLength,
201 /*IN*/ PVOID DisconnectInformation,
202 /*IN*/ ULONG DisconnectFlags);
207 TdiDefaultDisconnectHandler(
208 /*IN*/ PVOID TdiEventContext,
209 /*IN*/ CONNECTION_CONTEXT ConnectionContext,
210 /*IN*/ LONG DisconnectDataLength,
211 /*IN*/ PVOID DisconnectData,
212 /*IN*/ LONG DisconnectInformationLength,
213 /*IN*/ PVOID DisconnectInformation,
214 /*IN*/ ULONG DisconnectFlags);
216 typedef NTSTATUS DDKAPI
218 /*IN*/ PVOID TdiEventContext,
219 /*IN*/ NTSTATUS Status);
221 typedef NTSTATUS DDKAPI
222 (*PTDI_IND_ERROR_EX)(
223 /*IN*/ PVOID TdiEventContext,
224 /*IN*/ NTSTATUS Status,
225 /*IN*/ PVOID Buffer);
230 TdiDefaultErrorHandler(
231 /*IN*/ PVOID TdiEventContext,
232 /*IN*/ NTSTATUS Status);
234 typedef NTSTATUS DDKAPI
236 /*IN*/ PVOID TdiEventContext,
237 /*IN*/ CONNECTION_CONTEXT ConnectionContext,
238 /*IN*/ ULONG ReceiveFlags,
239 /*IN*/ ULONG BytesIndicated,
240 /*IN*/ ULONG BytesAvailable,
241 /*OUT*/ ULONG *BytesTaken,
243 /*OUT*/ PIRP *IoRequestPacket);
248 TdiDefaultReceiveHandler(
249 /*IN*/ PVOID TdiEventContext,
250 /*IN*/ CONNECTION_CONTEXT ConnectionContext,
251 /*IN*/ ULONG ReceiveFlags,
252 /*IN*/ ULONG BytesIndicated,
253 /*IN*/ ULONG BytesAvailable,
254 /*OUT*/ ULONG *BytesTaken,
256 /*OUT*/ PIRP *IoRequestPacket);
258 typedef NTSTATUS DDKAPI
259 (*PTDI_IND_RECEIVE_DATAGRAM)(
260 /*IN*/ PVOID TdiEventContext,
261 /*IN*/ LONG SourceAddressLength,
262 /*IN*/ PVOID SourceAddress,
263 /*IN*/ LONG OptionsLength,
264 /*IN*/ PVOID Options,
265 /*IN*/ ULONG ReceiveDatagramFlags,
266 /*IN*/ ULONG BytesIndicated,
267 /*IN*/ ULONG BytesAvailable,
268 /*OUT*/ ULONG *BytesTaken,
270 /*OUT*/ PIRP *IoRequestPacket);
274 TdiDefaultRcvDatagramHandler(
275 /*IN*/ PVOID TdiEventContext,
276 /*IN*/ LONG SourceAddressLength,
277 /*IN*/ PVOID SourceAddress,
278 /*IN*/ LONG OptionsLength,
279 /*IN*/ PVOID Options,
280 /*IN*/ ULONG ReceiveDatagramFlags,
281 /*IN*/ ULONG BytesIndicated,
282 /*IN*/ ULONG BytesAvailable,
283 /*OUT*/ ULONG *BytesTaken,
285 /*OUT*/ PIRP *IoRequestPacket);
287 typedef NTSTATUS DDKAPI
288 (*PTDI_IND_RECEIVE_EXPEDITED)(
289 /*IN*/ PVOID TdiEventContext,
290 /*IN*/ CONNECTION_CONTEXT ConnectionContext,
291 /*IN*/ ULONG ReceiveFlags,
292 /*IN*/ ULONG BytesIndicated,
293 /*IN*/ ULONG BytesAvailable,
294 /*OUT*/ ULONG *BytesTaken,
296 /*OUT*/ PIRP *IoRequestPacket);
301 TdiDefaultRcvExpeditedHandler(
302 /*IN*/ PVOID TdiEventContext,
303 /*IN*/ CONNECTION_CONTEXT ConnectionContext,
304 /*IN*/ ULONG ReceiveFlags,
305 /*IN*/ ULONG BytesIndicated,
306 /*IN*/ ULONG BytesAvailable,
307 /*OUT*/ ULONG *BytesTaken,
309 /*OUT*/ PIRP *IoRequestPacket);
311 typedef NTSTATUS DDKAPI
312 (*PTDI_IND_CHAINED_RECEIVE)(
313 /*IN*/ PVOID TdiEventContext,
314 /*IN*/ CONNECTION_CONTEXT ConnectionContext,
315 /*IN*/ ULONG ReceiveFlags,
316 /*IN*/ ULONG ReceiveLength,
317 /*IN*/ ULONG StartingOffset,
319 /*IN*/ PVOID TsduDescriptor);
324 TdiDefaultChainedReceiveHandler(
325 /*IN*/ PVOID TdiEventContext,
326 /*IN*/ CONNECTION_CONTEXT ConnectionContext,
327 /*IN*/ ULONG ReceiveFlags,
328 /*IN*/ ULONG ReceiveLength,
329 /*IN*/ ULONG StartingOffset,
331 /*IN*/ PVOID TsduDescriptor);
333 typedef NTSTATUS DDKAPI
334 (*PTDI_IND_CHAINED_RECEIVE_DATAGRAM)(
335 /*IN*/ PVOID TdiEventContext,
336 /*IN*/ LONG SourceAddressLength,
337 /*IN*/ PVOID SourceAddress,
338 /*IN*/ LONG OptionsLength,
339 /*IN*/ PVOID Options,
340 /*IN*/ ULONG ReceiveDatagramFlags,
341 /*IN*/ ULONG ReceiveDatagramLength,
342 /*IN*/ ULONG StartingOffset,
344 /*IN*/ PVOID TsduDescriptor);
349 TdiDefaultChainedRcvDatagramHandler(
350 /*IN*/ PVOID TdiEventContext,
351 /*IN*/ LONG SourceAddressLength,
352 /*IN*/ PVOID SourceAddress,
353 /*IN*/ LONG OptionsLength,
354 /*IN*/ PVOID Options,
355 /*IN*/ ULONG ReceiveDatagramFlags,
356 /*IN*/ ULONG ReceiveDatagramLength,
357 /*IN*/ ULONG StartingOffset,
359 /*IN*/ PVOID TsduDescriptor);
361 typedef NTSTATUS DDKAPI
362 (*PTDI_IND_CHAINED_RECEIVE_EXPEDITED)(
363 /*IN*/ PVOID TdiEventContext,
364 /*IN*/ CONNECTION_CONTEXT ConnectionContext,
365 /*IN*/ ULONG ReceiveFlags,
366 /*IN*/ ULONG ReceiveLength,
367 /*IN*/ ULONG StartingOffset,
369 /*IN*/ PVOID TsduDescriptor);
374 TdiDefaultChainedRcvExpeditedHandler(
375 /*IN*/ PVOID TdiEventContext,
376 /*IN*/ CONNECTION_CONTEXT ConnectionContext,
377 /*IN*/ ULONG ReceiveFlags,
378 /*IN*/ ULONG ReceiveLength,
379 /*IN*/ ULONG StartingOffset,
381 /*IN*/ PVOID TsduDescriptor);
383 typedef NTSTATUS DDKAPI
384 (*PTDI_IND_SEND_POSSIBLE)(
385 /*IN*/ PVOID TdiEventContext,
386 /*IN*/ PVOID ConnectionContext,
387 /*IN*/ ULONG BytesAvailable);
392 TdiDefaultSendPossibleHandler(
393 /*IN*/ PVOID TdiEventContext,
394 /*IN*/ PVOID ConnectionContext,
395 /*IN*/ ULONG BytesAvailable);
399 /* Macros and functions to build IRPs */
401 #define TdiBuildBaseIrp( \
402 bIrp, bDevObj, bFileObj, bCompRoutine, bContxt, bIrpSp, bMinor) \
404 bIrpSp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; \
405 bIrpSp->MinorFunction = (bMinor); \
406 bIrpSp->DeviceObject = (bDevObj); \
407 bIrpSp->FileObject = (bFileObj); \
409 IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE) \
411 IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE); \
418 * IN PDEVICE_OBJECT DevObj,
419 * IN PFILE_OBJECT FileObj,
420 * IN PVOID CompRoutine,
422 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
423 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
425 #define TdiBuildAccept( \
426 Irp, DevObj, FileObj, CompRoutine, Contxt, \
427 RequestConnectionInfo, ReturnConnectionInfo) \
429 PTDI_REQUEST_KERNEL_ACCEPT _Request; \
430 PIO_STACK_LOCATION _IrpSp; \
432 _IrpSp = IoGetNextIrpStackLocation(Irp); \
434 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
435 Contxt, _IrpSp, TDI_ACCEPT); \
437 _Request = (PTDI_REQUEST_KERNEL_ACCEPT)&_IrpSp->Parameters; \
438 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
439 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
446 * IN PDEVICE_OBJECT DevObj,
447 * IN PFILE_OBJECT FileObj,
448 * IN PVOID CompRoutine,
452 #define TdiBuildAction( \
453 Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr) \
455 PIO_STACK_LOCATION _IrpSp; \
457 _IrpSp = IoGetNextIrpStackLocation(Irp); \
459 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
460 Contxt, _IrpSp, TDI_ACTION); \
462 (Irp)->MdlAddress = (MdlAddr); \
467 * TdiBuildAssociateAddress(
469 * IN PDEVICE_OBJECT DevObj,
470 * IN PFILE_OBJECT FileObj,
471 * IN PVOID CompRoutine,
473 * IN HANDLE AddrHandle);
475 #define TdiBuildAssociateAddress( \
476 Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle) \
478 PTDI_REQUEST_KERNEL_ASSOCIATE _Request; \
479 PIO_STACK_LOCATION _IrpSp; \
481 _IrpSp = IoGetNextIrpStackLocation(Irp); \
483 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
484 Contxt, _IrpSp, TDI_ASSOCIATE_ADDRESS); \
486 _Request = (PTDI_REQUEST_KERNEL_ASSOCIATE)&_IrpSp->Parameters; \
487 _Request->AddressHandle = (HANDLE)(AddrHandle); \
494 * IN PDEVICE_OBJECT DevObj,
495 * IN PFILE_OBJECT FileObj,
496 * IN PVOID CompRoutine,
498 * IN PLARGE_INTEGER Time,
499 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
500 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
502 #define TdiBuildConnect( \
503 Irp, DevObj, FileObj, CompRoutine, Contxt, \
504 Time, RequestConnectionInfo, ReturnConnectionInfo) \
506 PTDI_REQUEST_KERNEL _Request; \
507 PIO_STACK_LOCATION _IrpSp; \
509 _IrpSp = IoGetNextIrpStackLocation(Irp); \
511 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
512 Contxt, _IrpSp, TDI_CONNECT); \
514 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
515 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
516 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
517 _Request->RequestSpecific = (PVOID)(Time); \
522 * TdiBuildDisassociateAddress(
524 * IN PDEVICE_OBJECT DevObj,
525 * IN PFILE_OBJECT FileObj,
526 * IN PVOID CompRoutine,
529 #define TdiBuildDisassociateAddress( \
530 Irp, DevObj, FileObj, CompRoutine, Contxt) \
532 PIO_STACK_LOCATION _IrpSp; \
534 _IrpSp = IoGetNextIrpStackLocation(Irp); \
536 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
537 Contxt, _IrpSp, TDI_DISASSOCIATE_ADDRESS); \
542 * TdiBuildDisconnect(
544 * IN PDEVICE_OBJECT DevObj,
545 * IN PFILE_OBJECT FileObj,
546 * IN PVOID CompRoutine,
548 * IN PLARGE_INTEGER Time,
550 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
551 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
553 #define TdiBuildDisconnect( \
554 Irp, DevObj, FileObj, CompRoutine, Contxt, Time, \
555 Flags, RequestConnectionInfo, ReturnConnectionInfo) \
557 PTDI_REQUEST_KERNEL _Request; \
558 PIO_STACK_LOCATION _IrpSp; \
560 _IrpSp = IoGetNextIrpStackLocation(Irp); \
562 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
563 Contxt, _IrpSp, TDI_DISCONNECT); \
565 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
566 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
567 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
568 _Request->RequestSpecific = (PVOID)(Time); \
569 _Request->RequestFlags = (Flags); \
574 * TdiBuildInternalDeviceControlIrp(
575 * IN CCHAR IrpSubFunction,
576 * IN PDEVICE_OBJECT DeviceObject,
577 * IN PFILE_OBJECT FileObject,
579 * IN PIO_STATUS_BLOCK IoStatusBlock);
581 #define TdiBuildInternalDeviceControlIrp( \
582 IrpSubFunction, DeviceObject, \
583 FileObject, Event, IoStatusBlock) \
584 IoBuildDeviceIoControlRequest( \
585 0x00000003, DeviceObject, \
587 TRUE, Event, IoStatusBlock)
593 * IN PDEVICE_OBJECT DevObj,
594 * IN PFILE_OBJECT FileObj,
595 * IN PVOID CompRoutine,
598 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
599 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
601 #define TdiBuildListen( \
602 Irp, DevObj, FileObj, CompRoutine, Contxt, \
603 Flags, RequestConnectionInfo, ReturnConnectionInfo) \
605 PTDI_REQUEST_KERNEL _Request; \
606 PIO_STACK_LOCATION _IrpSp; \
608 _IrpSp = IoGetNextIrpStackLocation(Irp); \
610 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
611 Contxt, _IrpSp, TDI_LISTEN); \
613 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
614 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
615 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
616 _Request->RequestFlags = (Flags); \
622 TdiBuildNetbiosAddress(
623 /*IN*/ PUCHAR NetbiosName,
624 /*IN*/ BOOLEAN IsGroupName,
625 /*IN OUT*/ PTA_NETBIOS_ADDRESS NetworkName);
630 TdiBuildNetbiosAddressEa(
631 /*IN*/ PUCHAR Buffer,
632 /*IN*/ BOOLEAN IsGroupName,
633 /*IN*/ PUCHAR NetbiosName);
637 * TdiBuildQueryInformation(
639 * IN PDEVICE_OBJECT DevObj,
640 * IN PFILE_OBJECT FileObj,
641 * IN PVOID CompRoutine,
646 #define TdiBuildQueryInformation( \
647 Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr) \
649 PTDI_REQUEST_KERNEL_QUERY_INFORMATION _Request; \
650 PIO_STACK_LOCATION _IrpSp; \
652 _IrpSp = IoGetNextIrpStackLocation(Irp); \
654 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
655 Contxt, _IrpSp, TDI_QUERY_INFORMATION); \
657 _Request = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&_IrpSp->Parameters; \
658 _Request->RequestConnectionInformation = NULL; \
659 _Request->QueryType = (ULONG)(QType); \
660 (Irp)->MdlAddress = (MdlAddr); \
667 * IN PDEVICE_OBJECT DevObj,
668 * IN PFILE_OBJECT FileObj,
669 * IN PVOID CompRoutine,
673 * IN ULONG ReceiveLen);
675 #define TdiBuildReceive( \
676 Irp, DevObj, FileObj, CompRoutine, Contxt, \
677 MdlAddr, InFlags, ReceiveLen) \
679 PTDI_REQUEST_KERNEL_RECEIVE _Request; \
680 PIO_STACK_LOCATION _IrpSp; \
682 _IrpSp = IoGetNextIrpStackLocation(Irp); \
684 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
685 Contxt, _IrpSp, TDI_RECEIVE); \
687 _Request = (PTDI_REQUEST_KERNEL_RECEIVE)&_IrpSp->Parameters; \
688 _Request->ReceiveFlags = (InFlags); \
689 _Request->ReceiveLength = (ReceiveLen); \
690 (Irp)->MdlAddress = (MdlAddr); \
695 * TdiBuildReceiveDatagram(
697 * IN PDEVICE_OBJECT DevObj,
698 * IN PFILE_OBJECT FileObj,
699 * IN PVOID CompRoutine,
702 * IN ULONG ReceiveLen,
703 * IN PTDI_CONNECTION_INFORMATION ReceiveDatagramInfo,
704 * OUT PTDI_CONNECTION_INFORMATION ReturnInfo,
707 #define TdiBuildReceiveDatagram( \
708 Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, \
709 ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags) \
711 PTDI_REQUEST_KERNEL_RECEIVEDG _Request; \
712 PIO_STACK_LOCATION _IrpSp; \
714 _IrpSp = IoGetNextIrpStackLocation(Irp); \
716 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
717 Contxt, _IrpSp, TDI_RECEIVE_DATAGRAM); \
719 _Request = (PTDI_REQUEST_KERNEL_RECEIVEDG)&_IrpSp->Parameters; \
720 _Request->ReceiveDatagramInformation = (ReceiveDatagramInfo); \
721 _Request->ReturnDatagramInformation = (ReturnInfo); \
722 _Request->ReceiveLength = (ReceiveLen); \
723 _Request->ReceiveFlags = (InFlags); \
724 (Irp)->MdlAddress = (MdlAddr); \
731 * IN PDEVICE_OBJECT DevObj,
732 * IN PFILE_OBJECT FileObj,
733 * IN PVOID CompRoutine,
739 #define TdiBuildSend( \
740 Irp, DevObj, FileObj, CompRoutine, Contxt, \
741 MdlAddr, InFlags, SendLen) \
743 PTDI_REQUEST_KERNEL_SEND _Request; \
744 PIO_STACK_LOCATION _IrpSp; \
746 _IrpSp = IoGetNextIrpStackLocation(Irp); \
748 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
749 Contxt, _IrpSp, TDI_SEND); \
751 _Request = (PTDI_REQUEST_KERNEL_SEND)&_IrpSp->Parameters; \
752 _Request->SendFlags = (InFlags); \
753 _Request->SendLength = (SendLen); \
754 (Irp)->MdlAddress = (MdlAddr); \
759 * TdiBuildSendDatagram(
761 * IN PDEVICE_OBJECT DevObj,
762 * IN PFILE_OBJECT FileObj,
763 * IN PVOID CompRoutine,
767 * IN PTDI_CONNECTION_INFORMATION SendDatagramInfo);
769 #define TdiBuildSendDatagram( \
770 Irp, DevObj, FileObj, CompRoutine, Contxt, \
771 MdlAddr, SendLen, SendDatagramInfo) \
773 PTDI_REQUEST_KERNEL_SENDDG _Request; \
774 PIO_STACK_LOCATION _IrpSp; \
776 _IrpSp = IoGetNextIrpStackLocation(Irp); \
778 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
779 Contxt, _IrpSp, TDI_SEND_DATAGRAM); \
781 _Request = (PTDI_REQUEST_KERNEL_SENDDG)&_IrpSp->Parameters; \
782 _Request->SendDatagramInformation = (SendDatagramInfo); \
783 _Request->SendLength = (SendLen); \
784 (Irp)->MdlAddress = (MdlAddr); \
789 * TdiBuildSetEventHandler(
791 * IN PDEVICE_OBJECT DevObj,
792 * IN PFILE_OBJECT FileObj,
793 * IN PVOID CompRoutine,
795 * IN INT InEventType,
796 * IN PVOID InEventHandler,
797 * IN PVOID InEventContext);
799 #define TdiBuildSetEventHandler( \
800 Irp, DevObj, FileObj, CompRoutine, Contxt, \
801 InEventType, InEventHandler, InEventContext) \
803 PTDI_REQUEST_KERNEL_SET_EVENT _Request; \
804 PIO_STACK_LOCATION _IrpSp; \
806 _IrpSp = IoGetNextIrpStackLocation(Irp); \
808 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
809 Contxt, _IrpSp, TDI_SET_EVENT_HANDLER); \
811 _Request = (PTDI_REQUEST_KERNEL_SET_EVENT)&_IrpSp->Parameters; \
812 _Request->EventType = (InEventType); \
813 _Request->EventHandler = (PVOID)(InEventHandler); \
814 _Request->EventContext = (PVOID)(InEventContext); \
819 * TdiBuildSetInformation(
821 * IN PDEVICE_OBJECT DevObj,
822 * IN PFILE_OBJECT FileObj,
823 * IN PVOID CompRoutine,
828 #define TdiBuildSetInformation( \
829 Irp, DevObj, FileObj, CompRoutine, Contxt, SType, MdlAddr) \
831 PTDI_REQUEST_KERNEL_SET_INFORMATION _Request; \
832 PIO_STACK_LOCATION _IrpSp; \
834 _IrpSp = IoGetNextIrpStackLocation(Irp); \
836 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
837 Contxt, _IrpSp, TDI_SET_INFORMATION); \
839 _Request = (PTDI_REQUEST_KERNEL_SET_INFORMATION)&_IrpSp->Parameters; \
840 _Request->RequestConnectionInformation = NULL; \
841 _Request->SetType = (ULONG)(SType); \
842 (Irp)->MdlAddress = (MdlAddr); \
845 /* TDI20_CLIENT_INTERFACE_INFO.TdiVersion constants */
846 #define TDI_CURRENT_MAJOR_VERSION 2
847 #define TDI_CURRENT_MINOR_VERSION 0
849 #define TDI_CURRENT_VERSION ((TDI_CURRENT_MINOR_VERSION) << 8 \
850 | (TDI_CURRENT_MAJOR_VERSION))
852 #define TDI_VERSION_ONE 0x0001
854 typedef enum _TDI_PNP_OPCODE {
859 TDI_PNP_OP_PROVIDERREADY,
861 TDI_PNP_OP_ADD_IGNORE_BINDING,
862 TDI_PNP_OP_DELETE_IGNORE_BINDING,
866 /* TDI_PNP_CONTEXT.ContextType */
867 #define TDI_PNP_CONTEXT_TYPE_IF_NAME 0x1
868 #define TDI_PNP_CONTEXT_TYPE_IF_ADDR 0x2
869 #define TDI_PNP_CONTEXT_TYPE_PDO 0x3
870 #define TDI_PNP_CONTEXT_TYPE_FIRST_OR_LAST_IF 0x4
872 typedef struct _TDI_PNP_CONTEXT {
875 UCHAR ContextData[1];
876 } TDI_PNP_CONTEXT, *PTDI_PNP_CONTEXT;
879 (*TDI_ADD_ADDRESS_HANDLER)(
880 /*IN*/ PTA_ADDRESS Address);
883 (*TDI_ADD_ADDRESS_HANDLER_V2)(
884 /*IN*/ PTA_ADDRESS Address,
885 /*IN*/ PUNICODE_STRING DeviceName,
886 /*IN*/ PTDI_PNP_CONTEXT Context);
889 (*TDI_BINDING_HANDLER)(
890 /*IN*/ TDI_PNP_OPCODE PnPOpcode,
891 /*IN*/ PUNICODE_STRING DeviceName,
892 /*IN*/ PWSTR MultiSZBindList);
896 /*IN*/ PUNICODE_STRING DeviceName);
899 (*TDI_DEL_ADDRESS_HANDLER)(
900 /*IN*/ PTA_ADDRESS Address);
903 (*TDI_DEL_ADDRESS_HANDLER_V2)(
904 /*IN*/ PTA_ADDRESS Address,
905 /*IN*/ PUNICODE_STRING DeviceName,
906 /*IN*/ PTDI_PNP_CONTEXT Context);
908 typedef NTSTATUS DDKAPI
909 (*TDI_PNP_POWER_HANDLER)(
910 /*IN*/ PUNICODE_STRING DeviceName,
911 /*IN*/ PNET_PNP_EVENT PowerEvent,
912 /*IN*/ PTDI_PNP_CONTEXT Context1,
913 /*IN*/ PTDI_PNP_CONTEXT Context2);
916 (*TDI_UNBIND_HANDLER)(
917 /*IN*/ PUNICODE_STRING DeviceName);
920 (*ProviderPnPPowerComplete)(
921 /*IN*/ PNET_PNP_EVENT NetEvent,
922 /*IN*/ NTSTATUS ProviderStatus);
924 typedef struct _TDI20_CLIENT_INTERFACE_INFO {
925 _ANONYMOUS_UNION union {
926 _ANONYMOUS_STRUCT struct {
927 UCHAR MajorTdiVersion;
928 UCHAR MinorTdiVersion;
933 PUNICODE_STRING ClientName;
934 TDI_PNP_POWER_HANDLER PnPPowerHandler;
935 _ANONYMOUS_UNION union {
936 TDI_BINDING_HANDLER BindingHandler;
937 _ANONYMOUS_STRUCT struct {
938 TDI_BIND_HANDLER BindHandler;
939 TDI_UNBIND_HANDLER UnBindHandler;
942 _ANONYMOUS_UNION union {
943 _ANONYMOUS_STRUCT struct {
944 TDI_ADD_ADDRESS_HANDLER_V2 AddAddressHandlerV2;
945 TDI_DEL_ADDRESS_HANDLER_V2 DelAddressHandlerV2;
947 _ANONYMOUS_STRUCT struct {
948 TDI_ADD_ADDRESS_HANDLER AddAddressHandler;
949 TDI_DEL_ADDRESS_HANDLER DelAddressHandler;
952 } TDI20_CLIENT_INTERFACE_INFO, *PTDI20_CLIENT_INTERFACE_INFO;
954 typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO;
955 typedef TDI_CLIENT_INTERFACE_INFO *PTDI_CLIENT_INTERFACE_INFO;
962 * TdiCompleteRequest(
964 * IN NTSTATUS Status);
966 #define TdiCompleteRequest(Irp, Status) \
968 (Irp)->IoStatus.Status = (Status); \
969 IoCompleteRequest((Irp), IO_NETWORK_INCREMENT); \
976 /*IN*/ PVOID SourceBuffer,
977 /*IN*/ ULONG SourceOffset,
978 /*IN*/ ULONG SourceBytesToCopy,
979 /*IN*/ PMDL DestinationMdlChain,
980 /*IN*/ ULONG DestinationOffset,
981 /*IN*/ PULONG BytesCopied);
985 * TdiCopyLookaheadData(
986 * IN PVOID Destination,
989 * IN ULONG ReceiveFlags);
991 #define TdiCopyLookaheadData(Destination, Source, Length, ReceiveFlags) \
992 RtlCopyMemory(Destination, Source, Length)
997 TdiCopyMdlChainToMdlChain (
998 /*IN*/ PMDL SourceMdlChain,
999 /*IN*/ ULONG SourceOffset,
1000 /*IN*/ PMDL DestinationMdlChain,
1001 /*IN*/ ULONG DestinationOffset,
1002 /*OUT*/ PULONG BytesCopied);
1008 /*IN*/ PMDL SourceMdlChain,
1009 /*IN*/ ULONG SourceOffset,
1010 /*IN*/ PVOID DestinationBuffer,
1011 /*IN*/ ULONG DestinationOffset,
1012 /*IN*/ ULONG DestinationBufferSize,
1013 /*OUT*/ PULONG BytesCopied);
1018 TdiDeregisterAddressChangeHandler(
1019 /*IN*/ HANDLE BindingHandle);
1024 TdiDeregisterDeviceObject(
1025 /*IN*/ HANDLE DevRegistrationHandle);
1030 TdiDeregisterNetAddress(
1031 /*IN*/ HANDLE AddrRegistrationHandle);
1036 TdiDeregisterPnPHandlers(
1037 /*IN*/ HANDLE BindingHandle);
1042 TdiDeregisterProvider(
1043 /*IN*/ HANDLE ProviderHandle);
1048 TdiEnumerateAddresses(
1049 /*IN*/ HANDLE BindingHandle);
1061 /*IN*/ PMDL MdlChain);
1067 /*IN*/ PDEVICE_OBJECT DeviceObject,
1069 /*IN*/ PIO_STACK_LOCATION IrpSp);
1074 TdiMatchPdoWithChainedReceiveContext(
1075 /*IN*/ PVOID TsduDescriptor,
1081 TdiPnPPowerComplete(
1082 /*IN*/ HANDLE BindingHandle,
1083 /*IN*/ PNET_PNP_EVENT PowerEvent,
1084 /*IN*/ NTSTATUS Status);
1090 /*IN*/ PUNICODE_STRING DeviceName,
1091 /*IN*/ PNET_PNP_EVENT PowerEvent,
1092 /*IN*/ PTDI_PNP_CONTEXT Context1,
1093 /*IN*/ PTDI_PNP_CONTEXT Context2,
1094 /*IN*/ ProviderPnPPowerComplete ProtocolCompletionHandler);
1100 /*IN*/ HANDLE ProviderHandle);
1105 TdiRegisterAddressChangeHandler(
1106 /*IN*/ TDI_ADD_ADDRESS_HANDLER AddHandler,
1107 /*IN*/ TDI_DEL_ADDRESS_HANDLER DeleteHandler,
1108 /*OUT*/ HANDLE *BindingHandle);
1113 TdiRegisterDeviceObject(
1114 /*IN*/ PUNICODE_STRING DeviceName,
1115 /*OUT*/ HANDLE *DevRegistrationHandle);
1120 TdiRegisterNetAddress(
1121 /*IN*/ PTA_ADDRESS Address,
1122 /*IN*/ PUNICODE_STRING DeviceName,
1123 /*IN*/ PTDI_PNP_CONTEXT Context,
1124 /*OUT*/ HANDLE *AddrRegistrationHandle);
1129 TdiRegisterNotificationHandler(
1130 /*IN*/ TDI_BIND_HANDLER BindHandler,
1131 /*IN*/ TDI_UNBIND_HANDLER UnbindHandler,
1132 /*OUT*/ HANDLE *BindingHandle);
1137 TdiRegisterPnPHandlers(
1138 /*IN*/ PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo,
1139 /*IN*/ ULONG InterfaceInfoSize,
1140 /*OUT*/ HANDLE *BindingHandle);
1145 TdiRegisterProvider(
1146 /*IN*/ PUNICODE_STRING ProviderName,
1147 /*OUT*/ HANDLE *ProviderHandle);
1152 TdiReturnChainedReceives(
1153 /*IN*/ PVOID *TsduDescriptors,
1154 /*IN*/ ULONG NumberOfTsdus);
1160 /*IN*/ PMDL MdlChain);
1166 #endif /* __TDIKRNL_H */