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.
27 #pragma GCC system_header
38 #define TDIKRNLAPI DECLSPEC_EXPORT
40 #define TDIKRNLAPI DECLSPEC_IMPORT
44 typedef struct _TDI_REQUEST_KERNEL
{
46 PTDI_CONNECTION_INFORMATION RequestConnectionInformation
;
47 PTDI_CONNECTION_INFORMATION ReturnConnectionInformation
;
48 PVOID RequestSpecific
;
49 } TDI_REQUEST_KERNEL
, *PTDI_REQUEST_KERNEL
;
52 #define TDI_ASSOCIATE_ADDRESS 0x01
53 #define TDI_DISASSOCIATE_ADDRESS 0x02
54 #define TDI_CONNECT 0x03
55 #define TDI_LISTEN 0x04
56 #define TDI_ACCEPT 0x05
57 #define TDI_DISCONNECT 0x06
59 #define TDI_RECEIVE 0x08
60 #define TDI_SEND_DATAGRAM 0x09
61 #define TDI_RECEIVE_DATAGRAM 0x0A
62 #define TDI_SET_EVENT_HANDLER 0x0B
63 #define TDI_QUERY_INFORMATION 0x0C
64 #define TDI_SET_INFORMATION 0x0D
65 #define TDI_ACTION 0x0E
67 #define TDI_DIRECT_SEND 0x27
68 #define TDI_DIRECT_SEND_DATAGRAM 0x29
70 #define TDI_TRANSPORT_ADDRESS_FILE 1
71 #define TDI_CONNECTION_FILE 2
72 #define TDI_CONTROL_CHANNEL_FILE 3
74 /* Internal TDI IOCTLS */
75 #define IOCTL_TDI_QUERY_DIRECT_SEND_HANDLER _TDI_CONTROL_CODE(0x80, METHOD_NEITHER)
76 #define IOCTL_TDI_QUERY_DIRECT_SENDDG_HANDLER _TDI_CONTROL_CODE(0x81, METHOD_NEITHER)
78 /* TdiAssociateAddress */
79 typedef struct _TDI_REQUEST_KERNEL_ASSOCIATE
{
81 } TDI_REQUEST_KERNEL_ASSOCIATE
, *PTDI_REQUEST_KERNEL_ASSOCIATE
;
83 /* TdiDisassociateAddress */
84 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISASSOCIATE
,
85 *PTDI_REQUEST_KERNEL_DISASSOCIATE
;
88 typedef struct _TDI_REQUEST_KERNEL_ACCEPT
{
89 PTDI_CONNECTION_INFORMATION RequestConnectionInformation
;
90 PTDI_CONNECTION_INFORMATION ReturnConnectionInformation
;
91 } TDI_REQUEST_KERNEL_ACCEPT
, *PTDI_REQUEST_KERNEL_ACCEPT
;
94 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_CONNECT
,
95 *PTDI_REQUEST_KERNEL_CONNECT
;
98 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISCONNECT
,
99 *PTDI_REQUEST_KERNEL_DISCONNECT
;
102 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_LISTEN
,
103 *PTDI_REQUEST_KERNEL_LISTEN
;
106 typedef struct _TDI_REQUEST_KERNEL_RECEIVE
{
109 } TDI_REQUEST_KERNEL_RECEIVE
, *PTDI_REQUEST_KERNEL_RECEIVE
;
111 /* TdiReceiveDatagram */
112 typedef struct _TDI_REQUEST_KERNEL_RECEIVEDG
{
114 PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation
;
115 PTDI_CONNECTION_INFORMATION ReturnDatagramInformation
;
117 } TDI_REQUEST_KERNEL_RECEIVEDG
, *PTDI_REQUEST_KERNEL_RECEIVEDG
;
120 typedef struct _TDI_REQUEST_KERNEL_SEND
{
123 } TDI_REQUEST_KERNEL_SEND
, *PTDI_REQUEST_KERNEL_SEND
;
125 /* TdiSendDatagram */
126 typedef struct _TDI_REQUEST_KERNEL_SENDDG
{
128 PTDI_CONNECTION_INFORMATION SendDatagramInformation
;
129 } TDI_REQUEST_KERNEL_SENDDG
, *PTDI_REQUEST_KERNEL_SENDDG
;
131 /* TdiSetEventHandler */
132 typedef struct _TDI_REQUEST_KERNEL_SET_EVENT
{
136 } TDI_REQUEST_KERNEL_SET_EVENT
, *PTDI_REQUEST_KERNEL_SET_EVENT
;
138 /* TdiQueryInformation */
139 typedef struct _TDI_REQUEST_KERNEL_QUERY_INFO
{
141 PTDI_CONNECTION_INFORMATION RequestConnectionInformation
;
142 } TDI_REQUEST_KERNEL_QUERY_INFORMATION
, *PTDI_REQUEST_KERNEL_QUERY_INFORMATION
;
144 /* TdiSetInformation */
145 typedef struct _TDI_REQUEST_KERNEL_SET_INFO
{
147 PTDI_CONNECTION_INFORMATION RequestConnectionInformation
;
148 } TDI_REQUEST_KERNEL_SET_INFORMATION
, *PTDI_REQUEST_KERNEL_SET_INFORMATION
;
152 #define TDI_EVENT_CONNECT 0
153 #define TDI_EVENT_DISCONNECT 1
154 #define TDI_EVENT_ERROR 2
155 #define TDI_EVENT_RECEIVE 3
156 #define TDI_EVENT_RECEIVE_DATAGRAM 4
157 #define TDI_EVENT_RECEIVE_EXPEDITED 5
158 #define TDI_EVENT_SEND_POSSIBLE 6
159 #define TDI_EVENT_CHAINED_RECEIVE 7
160 #define TDI_EVENT_CHAINED_RECEIVE_DATAGRAM 8
161 #define TDI_EVENT_CHAINED_RECEIVE_EXPEDITED 9
162 #define TDI_EVENT_ERROR_EX 10
164 typedef NTSTATUS DDKAPI
166 /*IN*/ PVOID TdiEventContext
,
167 /*IN*/ LONG RemoteAddressLength
,
168 /*IN*/ PVOID RemoteAddress
,
169 /*IN*/ LONG UserDataLength
,
170 /*IN*/ PVOID UserData
,
171 /*IN*/ LONG OptionsLength
,
172 /*IN*/ PVOID Options
,
173 /*OUT*/ CONNECTION_CONTEXT
*ConnectionContext
,
174 /*OUT*/ PIRP
*AcceptIrp
);
179 TdiDefaultConnectHandler(
180 /*IN*/ PVOID TdiEventContext
,
181 /*IN*/ LONG RemoteAddressLength
,
182 /*IN*/ PVOID RemoteAddress
,
183 /*IN*/ LONG UserDataLength
,
184 /*IN*/ PVOID UserData
,
185 /*IN*/ LONG OptionsLength
,
186 /*IN*/ PVOID Options
,
187 /*OUT*/ CONNECTION_CONTEXT
*ConnectionContext
,
188 /*OUT*/ PIRP
*AcceptIrp
);
190 typedef NTSTATUS DDKAPI
191 (*PTDI_IND_DISCONNECT
)(
192 /*IN*/ PVOID TdiEventContext
,
193 /*IN*/ CONNECTION_CONTEXT ConnectionContext
,
194 /*IN*/ LONG DisconnectDataLength
,
195 /*IN*/ PVOID DisconnectData
,
196 /*IN*/ LONG DisconnectInformationLength
,
197 /*IN*/ PVOID DisconnectInformation
,
198 /*IN*/ ULONG DisconnectFlags
);
203 TdiDefaultDisconnectHandler(
204 /*IN*/ PVOID TdiEventContext
,
205 /*IN*/ CONNECTION_CONTEXT ConnectionContext
,
206 /*IN*/ LONG DisconnectDataLength
,
207 /*IN*/ PVOID DisconnectData
,
208 /*IN*/ LONG DisconnectInformationLength
,
209 /*IN*/ PVOID DisconnectInformation
,
210 /*IN*/ ULONG DisconnectFlags
);
212 typedef NTSTATUS DDKAPI
214 /*IN*/ PVOID TdiEventContext
,
215 /*IN*/ NTSTATUS Status
);
217 typedef NTSTATUS DDKAPI
218 (*PTDI_IND_ERROR_EX
)(
219 /*IN*/ PVOID TdiEventContext
,
220 /*IN*/ NTSTATUS Status
,
221 /*IN*/ PVOID Buffer
);
226 TdiDefaultErrorHandler(
227 /*IN*/ PVOID TdiEventContext
,
228 /*IN*/ NTSTATUS Status
);
230 typedef NTSTATUS DDKAPI
232 /*IN*/ PVOID TdiEventContext
,
233 /*IN*/ CONNECTION_CONTEXT ConnectionContext
,
234 /*IN*/ ULONG ReceiveFlags
,
235 /*IN*/ ULONG BytesIndicated
,
236 /*IN*/ ULONG BytesAvailable
,
237 /*OUT*/ ULONG
*BytesTaken
,
239 /*OUT*/ PIRP
*IoRequestPacket
);
244 TdiDefaultReceiveHandler(
245 /*IN*/ PVOID TdiEventContext
,
246 /*IN*/ CONNECTION_CONTEXT ConnectionContext
,
247 /*IN*/ ULONG ReceiveFlags
,
248 /*IN*/ ULONG BytesIndicated
,
249 /*IN*/ ULONG BytesAvailable
,
250 /*OUT*/ ULONG
*BytesTaken
,
252 /*OUT*/ PIRP
*IoRequestPacket
);
254 typedef NTSTATUS DDKAPI
255 (*PTDI_IND_RECEIVE_DATAGRAM
)(
256 /*IN*/ PVOID TdiEventContext
,
257 /*IN*/ LONG SourceAddressLength
,
258 /*IN*/ PVOID SourceAddress
,
259 /*IN*/ LONG OptionsLength
,
260 /*IN*/ PVOID Options
,
261 /*IN*/ ULONG ReceiveDatagramFlags
,
262 /*IN*/ ULONG BytesIndicated
,
263 /*IN*/ ULONG BytesAvailable
,
264 /*OUT*/ ULONG
*BytesTaken
,
266 /*OUT*/ PIRP
*IoRequestPacket
);
270 TdiDefaultRcvDatagramHandler(
271 /*IN*/ PVOID TdiEventContext
,
272 /*IN*/ LONG SourceAddressLength
,
273 /*IN*/ PVOID SourceAddress
,
274 /*IN*/ LONG OptionsLength
,
275 /*IN*/ PVOID Options
,
276 /*IN*/ ULONG ReceiveDatagramFlags
,
277 /*IN*/ ULONG BytesIndicated
,
278 /*IN*/ ULONG BytesAvailable
,
279 /*OUT*/ ULONG
*BytesTaken
,
281 /*OUT*/ PIRP
*IoRequestPacket
);
283 typedef NTSTATUS DDKAPI
284 (*PTDI_IND_RECEIVE_EXPEDITED
)(
285 /*IN*/ PVOID TdiEventContext
,
286 /*IN*/ CONNECTION_CONTEXT ConnectionContext
,
287 /*IN*/ ULONG ReceiveFlags
,
288 /*IN*/ ULONG BytesIndicated
,
289 /*IN*/ ULONG BytesAvailable
,
290 /*OUT*/ ULONG
*BytesTaken
,
292 /*OUT*/ PIRP
*IoRequestPacket
);
297 TdiDefaultRcvExpeditedHandler(
298 /*IN*/ PVOID TdiEventContext
,
299 /*IN*/ CONNECTION_CONTEXT ConnectionContext
,
300 /*IN*/ ULONG ReceiveFlags
,
301 /*IN*/ ULONG BytesIndicated
,
302 /*IN*/ ULONG BytesAvailable
,
303 /*OUT*/ ULONG
*BytesTaken
,
305 /*OUT*/ PIRP
*IoRequestPacket
);
307 typedef NTSTATUS DDKAPI
308 (*PTDI_IND_CHAINED_RECEIVE
)(
309 /*IN*/ PVOID TdiEventContext
,
310 /*IN*/ CONNECTION_CONTEXT ConnectionContext
,
311 /*IN*/ ULONG ReceiveFlags
,
312 /*IN*/ ULONG ReceiveLength
,
313 /*IN*/ ULONG StartingOffset
,
315 /*IN*/ PVOID TsduDescriptor
);
320 TdiDefaultChainedReceiveHandler(
321 /*IN*/ PVOID TdiEventContext
,
322 /*IN*/ CONNECTION_CONTEXT ConnectionContext
,
323 /*IN*/ ULONG ReceiveFlags
,
324 /*IN*/ ULONG ReceiveLength
,
325 /*IN*/ ULONG StartingOffset
,
327 /*IN*/ PVOID TsduDescriptor
);
329 typedef NTSTATUS DDKAPI
330 (*PTDI_IND_CHAINED_RECEIVE_DATAGRAM
)(
331 /*IN*/ PVOID TdiEventContext
,
332 /*IN*/ LONG SourceAddressLength
,
333 /*IN*/ PVOID SourceAddress
,
334 /*IN*/ LONG OptionsLength
,
335 /*IN*/ PVOID Options
,
336 /*IN*/ ULONG ReceiveDatagramFlags
,
337 /*IN*/ ULONG ReceiveDatagramLength
,
338 /*IN*/ ULONG StartingOffset
,
340 /*IN*/ PVOID TsduDescriptor
);
345 TdiDefaultChainedRcvDatagramHandler(
346 /*IN*/ PVOID TdiEventContext
,
347 /*IN*/ LONG SourceAddressLength
,
348 /*IN*/ PVOID SourceAddress
,
349 /*IN*/ LONG OptionsLength
,
350 /*IN*/ PVOID Options
,
351 /*IN*/ ULONG ReceiveDatagramFlags
,
352 /*IN*/ ULONG ReceiveDatagramLength
,
353 /*IN*/ ULONG StartingOffset
,
355 /*IN*/ PVOID TsduDescriptor
);
357 typedef NTSTATUS DDKAPI
358 (*PTDI_IND_CHAINED_RECEIVE_EXPEDITED
)(
359 /*IN*/ PVOID TdiEventContext
,
360 /*IN*/ CONNECTION_CONTEXT ConnectionContext
,
361 /*IN*/ ULONG ReceiveFlags
,
362 /*IN*/ ULONG ReceiveLength
,
363 /*IN*/ ULONG StartingOffset
,
365 /*IN*/ PVOID TsduDescriptor
);
370 TdiDefaultChainedRcvExpeditedHandler(
371 /*IN*/ PVOID TdiEventContext
,
372 /*IN*/ CONNECTION_CONTEXT ConnectionContext
,
373 /*IN*/ ULONG ReceiveFlags
,
374 /*IN*/ ULONG ReceiveLength
,
375 /*IN*/ ULONG StartingOffset
,
377 /*IN*/ PVOID TsduDescriptor
);
379 typedef NTSTATUS DDKAPI
380 (*PTDI_IND_SEND_POSSIBLE
)(
381 /*IN*/ PVOID TdiEventContext
,
382 /*IN*/ PVOID ConnectionContext
,
383 /*IN*/ ULONG BytesAvailable
);
388 TdiDefaultSendPossibleHandler(
389 /*IN*/ PVOID TdiEventContext
,
390 /*IN*/ PVOID ConnectionContext
,
391 /*IN*/ ULONG BytesAvailable
);
395 /* Macros and functions to build IRPs */
397 #define TdiBuildBaseIrp( \
398 bIrp, bDevObj, bFileObj, bCompRoutine, bContxt, bIrpSp, bMinor) \
400 bIrpSp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; \
401 bIrpSp->MinorFunction = (bMinor); \
402 bIrpSp->DeviceObject = (bDevObj); \
403 bIrpSp->FileObject = (bFileObj); \
405 IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE) \
407 IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE); \
414 * IN PDEVICE_OBJECT DevObj,
415 * IN PFILE_OBJECT FileObj,
416 * IN PVOID CompRoutine,
418 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
419 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
421 #define TdiBuildAccept( \
422 Irp, DevObj, FileObj, CompRoutine, Contxt, \
423 RequestConnectionInfo, ReturnConnectionInfo) \
425 PTDI_REQUEST_KERNEL_ACCEPT _Request; \
426 PIO_STACK_LOCATION _IrpSp; \
428 _IrpSp = IoGetNextIrpStackLocation(Irp); \
430 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
431 Contxt, _IrpSp, TDI_ACCEPT); \
433 _Request = (PTDI_REQUEST_KERNEL_ACCEPT)&_IrpSp->Parameters; \
434 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
435 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
442 * IN PDEVICE_OBJECT DevObj,
443 * IN PFILE_OBJECT FileObj,
444 * IN PVOID CompRoutine,
448 #define TdiBuildAction( \
449 Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr) \
451 PIO_STACK_LOCATION _IrpSp; \
453 _IrpSp = IoGetNextIrpStackLocation(Irp); \
455 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
456 Contxt, _IrpSp, TDI_ACTION); \
458 (Irp)->MdlAddress = (MdlAddr); \
463 * TdiBuildAssociateAddress(
465 * IN PDEVICE_OBJECT DevObj,
466 * IN PFILE_OBJECT FileObj,
467 * IN PVOID CompRoutine,
469 * IN HANDLE AddrHandle);
471 #define TdiBuildAssociateAddress( \
472 Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle) \
474 PTDI_REQUEST_KERNEL_ASSOCIATE _Request; \
475 PIO_STACK_LOCATION _IrpSp; \
477 _IrpSp = IoGetNextIrpStackLocation(Irp); \
479 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
480 Contxt, _IrpSp, TDI_ASSOCIATE_ADDRESS); \
482 _Request = (PTDI_REQUEST_KERNEL_ASSOCIATE)&_IrpSp->Parameters; \
483 _Request->AddressHandle = (HANDLE)(AddrHandle); \
490 * IN PDEVICE_OBJECT DevObj,
491 * IN PFILE_OBJECT FileObj,
492 * IN PVOID CompRoutine,
494 * IN PLARGE_INTEGER Time,
495 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
496 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
498 #define TdiBuildConnect( \
499 Irp, DevObj, FileObj, CompRoutine, Contxt, \
500 Time, RequestConnectionInfo, ReturnConnectionInfo) \
502 PTDI_REQUEST_KERNEL _Request; \
503 PIO_STACK_LOCATION _IrpSp; \
505 _IrpSp = IoGetNextIrpStackLocation(Irp); \
507 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
508 Contxt, _IrpSp, TDI_CONNECT); \
510 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
511 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
512 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
513 _Request->RequestSpecific = (PVOID)(Time); \
518 * TdiBuildDisassociateAddress(
520 * IN PDEVICE_OBJECT DevObj,
521 * IN PFILE_OBJECT FileObj,
522 * IN PVOID CompRoutine,
525 #define TdiBuildDisassociateAddress( \
526 Irp, DevObj, FileObj, CompRoutine, Contxt) \
528 PIO_STACK_LOCATION _IrpSp; \
530 _IrpSp = IoGetNextIrpStackLocation(Irp); \
532 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
533 Contxt, _IrpSp, TDI_DISASSOCIATE_ADDRESS); \
538 * TdiBuildDisconnect(
540 * IN PDEVICE_OBJECT DevObj,
541 * IN PFILE_OBJECT FileObj,
542 * IN PVOID CompRoutine,
544 * IN PLARGE_INTEGER Time,
546 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
547 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
549 #define TdiBuildDisconnect( \
550 Irp, DevObj, FileObj, CompRoutine, Contxt, Time, \
551 Flags, RequestConnectionInfo, ReturnConnectionInfo) \
553 PTDI_REQUEST_KERNEL _Request; \
554 PIO_STACK_LOCATION _IrpSp; \
556 _IrpSp = IoGetNextIrpStackLocation(Irp); \
558 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
559 Contxt, _IrpSp, TDI_DISCONNECT); \
561 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
562 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
563 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
564 _Request->RequestSpecific = (PVOID)(Time); \
565 _Request->RequestFlags = (Flags); \
570 * TdiBuildInternalDeviceControlIrp(
571 * IN CCHAR IrpSubFunction,
572 * IN PDEVICE_OBJECT DeviceObject,
573 * IN PFILE_OBJECT FileObject,
575 * IN PIO_STATUS_BLOCK IoStatusBlock);
577 #define TdiBuildInternalDeviceControlIrp( \
578 IrpSubFunction, DeviceObject, \
579 FileObject, Event, IoStatusBlock) \
580 IoBuildDeviceIoControlRequest( \
581 0x00000003, DeviceObject, \
583 TRUE, Event, IoStatusBlock)
589 * IN PDEVICE_OBJECT DevObj,
590 * IN PFILE_OBJECT FileObj,
591 * IN PVOID CompRoutine,
594 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
595 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
597 #define TdiBuildListen( \
598 Irp, DevObj, FileObj, CompRoutine, Contxt, \
599 Flags, RequestConnectionInfo, ReturnConnectionInfo) \
601 PTDI_REQUEST_KERNEL _Request; \
602 PIO_STACK_LOCATION _IrpSp; \
604 _IrpSp = IoGetNextIrpStackLocation(Irp); \
606 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
607 Contxt, _IrpSp, TDI_LISTEN); \
609 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
610 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
611 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
612 _Request->RequestFlags = (Flags); \
618 TdiBuildNetbiosAddress(
619 /*IN*/ PUCHAR NetbiosName
,
620 /*IN*/ BOOLEAN IsGroupName
,
621 /*IN OUT*/ PTA_NETBIOS_ADDRESS NetworkName
);
626 TdiBuildNetbiosAddressEa(
627 /*IN*/ PUCHAR Buffer
,
628 /*IN*/ BOOLEAN IsGroupName
,
629 /*IN*/ PUCHAR NetbiosName
);
633 * TdiBuildQueryInformation(
635 * IN PDEVICE_OBJECT DevObj,
636 * IN PFILE_OBJECT FileObj,
637 * IN PVOID CompRoutine,
642 #define TdiBuildQueryInformation( \
643 Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr) \
645 PTDI_REQUEST_KERNEL_QUERY_INFORMATION _Request; \
646 PIO_STACK_LOCATION _IrpSp; \
648 _IrpSp = IoGetNextIrpStackLocation(Irp); \
650 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
651 Contxt, _IrpSp, TDI_QUERY_INFORMATION); \
653 _Request = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&_IrpSp->Parameters; \
654 _Request->RequestConnectionInformation = NULL; \
655 _Request->QueryType = (ULONG)(QType); \
656 (Irp)->MdlAddress = (MdlAddr); \
663 * IN PDEVICE_OBJECT DevObj,
664 * IN PFILE_OBJECT FileObj,
665 * IN PVOID CompRoutine,
669 * IN ULONG ReceiveLen);
671 #define TdiBuildReceive( \
672 Irp, DevObj, FileObj, CompRoutine, Contxt, \
673 MdlAddr, InFlags, ReceiveLen) \
675 PTDI_REQUEST_KERNEL_RECEIVE _Request; \
676 PIO_STACK_LOCATION _IrpSp; \
678 _IrpSp = IoGetNextIrpStackLocation(Irp); \
680 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
681 Contxt, _IrpSp, TDI_RECEIVE); \
683 _Request = (PTDI_REQUEST_KERNEL_RECEIVE)&_IrpSp->Parameters; \
684 _Request->ReceiveFlags = (InFlags); \
685 _Request->ReceiveLength = (ReceiveLen); \
686 (Irp)->MdlAddress = (MdlAddr); \
691 * TdiBuildReceiveDatagram(
693 * IN PDEVICE_OBJECT DevObj,
694 * IN PFILE_OBJECT FileObj,
695 * IN PVOID CompRoutine,
698 * IN ULONG ReceiveLen,
699 * IN PTDI_CONNECTION_INFORMATION ReceiveDatagramInfo,
700 * OUT PTDI_CONNECTION_INFORMATION ReturnInfo,
703 #define TdiBuildReceiveDatagram( \
704 Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, \
705 ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags) \
707 PTDI_REQUEST_KERNEL_RECEIVEDG _Request; \
708 PIO_STACK_LOCATION _IrpSp; \
710 _IrpSp = IoGetNextIrpStackLocation(Irp); \
712 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
713 Contxt, _IrpSp, TDI_RECEIVE_DATAGRAM); \
715 _Request = (PTDI_REQUEST_KERNEL_RECEIVEDG)&_IrpSp->Parameters; \
716 _Request->ReceiveDatagramInformation = (ReceiveDatagramInfo); \
717 _Request->ReturnDatagramInformation = (ReturnInfo); \
718 _Request->ReceiveLength = (ReceiveLen); \
719 _Request->ReceiveFlags = (InFlags); \
720 (Irp)->MdlAddress = (MdlAddr); \
727 * IN PDEVICE_OBJECT DevObj,
728 * IN PFILE_OBJECT FileObj,
729 * IN PVOID CompRoutine,
735 #define TdiBuildSend( \
736 Irp, DevObj, FileObj, CompRoutine, Contxt, \
737 MdlAddr, InFlags, SendLen) \
739 PTDI_REQUEST_KERNEL_SEND _Request; \
740 PIO_STACK_LOCATION _IrpSp; \
742 _IrpSp = IoGetNextIrpStackLocation(Irp); \
744 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
745 Contxt, _IrpSp, TDI_SEND); \
747 _Request = (PTDI_REQUEST_KERNEL_SEND)&_IrpSp->Parameters; \
748 _Request->SendFlags = (InFlags); \
749 _Request->SendLength = (SendLen); \
750 (Irp)->MdlAddress = (MdlAddr); \
755 * TdiBuildSendDatagram(
757 * IN PDEVICE_OBJECT DevObj,
758 * IN PFILE_OBJECT FileObj,
759 * IN PVOID CompRoutine,
763 * IN PTDI_CONNECTION_INFORMATION SendDatagramInfo);
765 #define TdiBuildSendDatagram( \
766 Irp, DevObj, FileObj, CompRoutine, Contxt, \
767 MdlAddr, SendLen, SendDatagramInfo) \
769 PTDI_REQUEST_KERNEL_SENDDG _Request; \
770 PIO_STACK_LOCATION _IrpSp; \
772 _IrpSp = IoGetNextIrpStackLocation(Irp); \
774 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
775 Contxt, _IrpSp, TDI_SEND_DATAGRAM); \
777 _Request = (PTDI_REQUEST_KERNEL_SENDDG)&_IrpSp->Parameters; \
778 _Request->SendDatagramInformation = (SendDatagramInfo); \
779 _Request->SendLength = (SendLen); \
780 (Irp)->MdlAddress = (MdlAddr); \
785 * TdiBuildSetEventHandler(
787 * IN PDEVICE_OBJECT DevObj,
788 * IN PFILE_OBJECT FileObj,
789 * IN PVOID CompRoutine,
791 * IN INT InEventType,
792 * IN PVOID InEventHandler,
793 * IN PVOID InEventContext);
795 #define TdiBuildSetEventHandler( \
796 Irp, DevObj, FileObj, CompRoutine, Contxt, \
797 InEventType, InEventHandler, InEventContext) \
799 PTDI_REQUEST_KERNEL_SET_EVENT _Request; \
800 PIO_STACK_LOCATION _IrpSp; \
802 _IrpSp = IoGetNextIrpStackLocation(Irp); \
804 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
805 Contxt, _IrpSp, TDI_SET_EVENT_HANDLER); \
807 _Request = (PTDI_REQUEST_KERNEL_SET_EVENT)&_IrpSp->Parameters; \
808 _Request->EventType = (InEventType); \
809 _Request->EventHandler = (PVOID)(InEventHandler); \
810 _Request->EventContext = (PVOID)(InEventContext); \
815 * TdiBuildSetInformation(
817 * IN PDEVICE_OBJECT DevObj,
818 * IN PFILE_OBJECT FileObj,
819 * IN PVOID CompRoutine,
824 #define TdiBuildSetInformation( \
825 Irp, DevObj, FileObj, CompRoutine, Contxt, SType, MdlAddr) \
827 PTDI_REQUEST_KERNEL_SET_INFORMATION _Request; \
828 PIO_STACK_LOCATION _IrpSp; \
830 _IrpSp = IoGetNextIrpStackLocation(Irp); \
832 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
833 Contxt, _IrpSp, TDI_SET_INFORMATION); \
835 _Request = (PTDI_REQUEST_KERNEL_SET_INFORMATION)&_IrpSp->Parameters; \
836 _Request->RequestConnectionInformation = NULL; \
837 _Request->SetType = (ULONG)(SType); \
838 (Irp)->MdlAddress = (MdlAddr); \
841 /* TDI20_CLIENT_INTERFACE_INFO.TdiVersion constants */
842 #define TDI_CURRENT_MAJOR_VERSION 2
843 #define TDI_CURRENT_MINOR_VERSION 0
845 #define TDI_CURRENT_VERSION ((TDI_CURRENT_MINOR_VERSION) << 8 \
846 | (TDI_CURRENT_MAJOR_VERSION))
848 #define TDI_VERSION_ONE 0x0001
850 typedef enum _TDI_PNP_OPCODE
{
855 TDI_PNP_OP_PROVIDERREADY
,
857 TDI_PNP_OP_ADD_IGNORE_BINDING
,
858 TDI_PNP_OP_DELETE_IGNORE_BINDING
,
862 /* TDI_PNP_CONTEXT.ContextType */
863 #define TDI_PNP_CONTEXT_TYPE_IF_NAME 0x1
864 #define TDI_PNP_CONTEXT_TYPE_IF_ADDR 0x2
865 #define TDI_PNP_CONTEXT_TYPE_PDO 0x3
866 #define TDI_PNP_CONTEXT_TYPE_FIRST_OR_LAST_IF 0x4
868 typedef struct _TDI_PNP_CONTEXT
{
871 UCHAR ContextData
[1];
872 } TDI_PNP_CONTEXT
, *PTDI_PNP_CONTEXT
;
875 (*TDI_ADD_ADDRESS_HANDLER
)(
876 /*IN*/ PTA_ADDRESS Address
);
879 (*TDI_ADD_ADDRESS_HANDLER_V2
)(
880 /*IN*/ PTA_ADDRESS Address
,
881 /*IN*/ PUNICODE_STRING DeviceName
,
882 /*IN*/ PTDI_PNP_CONTEXT Context
);
885 (*TDI_BINDING_HANDLER
)(
886 /*IN*/ TDI_PNP_OPCODE PnPOpcode
,
887 /*IN*/ PUNICODE_STRING DeviceName
,
888 /*IN*/ PWSTR MultiSZBindList
);
892 /*IN*/ PUNICODE_STRING DeviceName
);
895 (*TDI_DEL_ADDRESS_HANDLER
)(
896 /*IN*/ PTA_ADDRESS Address
);
899 (*TDI_DEL_ADDRESS_HANDLER_V2
)(
900 /*IN*/ PTA_ADDRESS Address
,
901 /*IN*/ PUNICODE_STRING DeviceName
,
902 /*IN*/ PTDI_PNP_CONTEXT Context
);
904 typedef NTSTATUS DDKAPI
905 (*TDI_PNP_POWER_HANDLER
)(
906 /*IN*/ PUNICODE_STRING DeviceName
,
907 /*IN*/ PNET_PNP_EVENT PowerEvent
,
908 /*IN*/ PTDI_PNP_CONTEXT Context1
,
909 /*IN*/ PTDI_PNP_CONTEXT Context2
);
912 (*TDI_UNBIND_HANDLER
)(
913 /*IN*/ PUNICODE_STRING DeviceName
);
916 (*ProviderPnPPowerComplete
)(
917 /*IN*/ PNET_PNP_EVENT NetEvent
,
918 /*IN*/ NTSTATUS ProviderStatus
);
920 typedef struct _TDI20_CLIENT_INTERFACE_INFO
{
921 _ANONYMOUS_UNION
union {
922 _ANONYMOUS_STRUCT
struct {
923 UCHAR MajorTdiVersion
;
924 UCHAR MinorTdiVersion
;
929 PUNICODE_STRING ClientName
;
930 TDI_PNP_POWER_HANDLER PnPPowerHandler
;
931 _ANONYMOUS_UNION
union {
932 TDI_BINDING_HANDLER BindingHandler
;
933 _ANONYMOUS_STRUCT
struct {
934 TDI_BIND_HANDLER BindHandler
;
935 TDI_UNBIND_HANDLER UnBindHandler
;
938 _ANONYMOUS_UNION
union {
939 _ANONYMOUS_STRUCT
struct {
940 TDI_ADD_ADDRESS_HANDLER_V2 AddAddressHandlerV2
;
941 TDI_DEL_ADDRESS_HANDLER_V2 DelAddressHandlerV2
;
943 _ANONYMOUS_STRUCT
struct {
944 TDI_ADD_ADDRESS_HANDLER AddAddressHandler
;
945 TDI_DEL_ADDRESS_HANDLER DelAddressHandler
;
948 } TDI20_CLIENT_INTERFACE_INFO
, *PTDI20_CLIENT_INTERFACE_INFO
;
950 typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO
;
951 typedef TDI_CLIENT_INTERFACE_INFO
*PTDI_CLIENT_INTERFACE_INFO
;
958 * TdiCompleteRequest(
960 * IN NTSTATUS Status);
962 #define TdiCompleteRequest(Irp, Status) \
964 (Irp)->IoStatus.Status = (Status); \
965 IoCompleteRequest((Irp), IO_NETWORK_INCREMENT); \
972 /*IN*/ PVOID SourceBuffer
,
973 /*IN*/ ULONG SourceOffset
,
974 /*IN*/ ULONG SourceBytesToCopy
,
975 /*IN*/ PMDL DestinationMdlChain
,
976 /*IN*/ ULONG DestinationOffset
,
977 /*IN*/ PULONG BytesCopied
);
981 * TdiCopyLookaheadData(
982 * IN PVOID Destination,
985 * IN ULONG ReceiveFlags);
987 #define TdiCopyLookaheadData(Destination, Source, Length, ReceiveFlags) \
988 RtlCopyMemory(Destination, Source, Length)
993 TdiCopyMdlChainToMdlChain (
994 /*IN*/ PMDL SourceMdlChain
,
995 /*IN*/ ULONG SourceOffset
,
996 /*IN*/ PMDL DestinationMdlChain
,
997 /*IN*/ ULONG DestinationOffset
,
998 /*OUT*/ PULONG BytesCopied
);
1004 /*IN*/ PMDL SourceMdlChain
,
1005 /*IN*/ ULONG SourceOffset
,
1006 /*IN*/ PVOID DestinationBuffer
,
1007 /*IN*/ ULONG DestinationOffset
,
1008 /*IN*/ ULONG DestinationBufferSize
,
1009 /*OUT*/ PULONG BytesCopied
);
1014 TdiDeregisterAddressChangeHandler(
1015 /*IN*/ HANDLE BindingHandle
);
1020 TdiDeregisterDeviceObject(
1021 /*IN*/ HANDLE DevRegistrationHandle
);
1026 TdiDeregisterNetAddress(
1027 /*IN*/ HANDLE AddrRegistrationHandle
);
1032 TdiDeregisterPnPHandlers(
1033 /*IN*/ HANDLE BindingHandle
);
1038 TdiDeregisterProvider(
1039 /*IN*/ HANDLE ProviderHandle
);
1044 TdiEnumerateAddresses(
1045 /*IN*/ HANDLE BindingHandle
);
1057 /*IN*/ PMDL MdlChain
);
1063 /*IN*/ PDEVICE_OBJECT DeviceObject
,
1065 /*IN*/ PIO_STACK_LOCATION IrpSp
);
1070 TdiMatchPdoWithChainedReceiveContext(
1071 /*IN*/ PVOID TsduDescriptor
,
1077 TdiPnPPowerComplete(
1078 /*IN*/ HANDLE BindingHandle
,
1079 /*IN*/ PNET_PNP_EVENT PowerEvent
,
1080 /*IN*/ NTSTATUS Status
);
1086 /*IN*/ PUNICODE_STRING DeviceName
,
1087 /*IN*/ PNET_PNP_EVENT PowerEvent
,
1088 /*IN*/ PTDI_PNP_CONTEXT Context1
,
1089 /*IN*/ PTDI_PNP_CONTEXT Context2
,
1090 /*IN*/ ProviderPnPPowerComplete ProtocolCompletionHandler
);
1096 /*IN*/ HANDLE ProviderHandle
);
1101 TdiRegisterAddressChangeHandler(
1102 /*IN*/ TDI_ADD_ADDRESS_HANDLER AddHandler
,
1103 /*IN*/ TDI_DEL_ADDRESS_HANDLER DeleteHandler
,
1104 /*OUT*/ HANDLE
*BindingHandle
);
1109 TdiRegisterDeviceObject(
1110 /*IN*/ PUNICODE_STRING DeviceName
,
1111 /*OUT*/ HANDLE
*DevRegistrationHandle
);
1116 TdiRegisterNetAddress(
1117 /*IN*/ PTA_ADDRESS Address
,
1118 /*IN*/ PUNICODE_STRING DeviceName
,
1119 /*IN*/ PTDI_PNP_CONTEXT Context
,
1120 /*OUT*/ HANDLE
*AddrRegistrationHandle
);
1125 TdiRegisterNotificationHandler(
1126 /*IN*/ TDI_BIND_HANDLER BindHandler
,
1127 /*IN*/ TDI_UNBIND_HANDLER UnbindHandler
,
1128 /*OUT*/ HANDLE
*BindingHandle
);
1133 TdiRegisterPnPHandlers(
1134 /*IN*/ PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo
,
1135 /*IN*/ ULONG InterfaceInfoSize
,
1136 /*OUT*/ HANDLE
*BindingHandle
);
1141 TdiRegisterProvider(
1142 /*IN*/ PUNICODE_STRING ProviderName
,
1143 /*OUT*/ HANDLE
*ProviderHandle
);
1148 TdiReturnChainedReceives(
1149 /*IN*/ PVOID
*TsduDescriptors
,
1150 /*IN*/ ULONG NumberOfTsdus
);
1156 /*IN*/ PMDL MdlChain
);
1162 #endif /* __TDIKRNL_H */