xref: /reactos/sdk/include/ddk/tdikrnl.h (revision c2c66aff)
1 /*
2  * tdikrnl.h
3  *
4  * TDI kernel mode definitions
5  *
6  * This file is part of the w32api package.
7  *
8  * Contributors:
9  *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10  *
11  * THIS SOFTWARE IS NOT COPYRIGHTED
12  *
13  * This source code is offered for use in the public domain. You may
14  * use, modify or distribute it freely.
15  *
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.
20  *
21  */
22 
23 #ifndef __TDIKRNL_H
24 #define __TDIKRNL_H
25 
26 #include "tdi.h"
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 #if defined(_TDI_)
33 #define TDIKRNLAPI
34 #else
35 #define TDIKRNLAPI DECLSPEC_IMPORT
36 #endif
37 
38 
39 typedef struct _TDI_REQUEST_KERNEL {
40   ULONG RequestFlags;
41   PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
42   PTDI_CONNECTION_INFORMATION ReturnConnectionInformation;
43   PVOID RequestSpecific;
44 } TDI_REQUEST_KERNEL, *PTDI_REQUEST_KERNEL;
45 
46 /* Request codes */
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
53 #define TDI_SEND                          0x07
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
61 
62 #define TDI_DIRECT_SEND                   0x27
63 #define TDI_DIRECT_SEND_DATAGRAM          0x29
64 
65 #define TDI_TRANSPORT_ADDRESS_FILE        1
66 #define TDI_CONNECTION_FILE               2
67 #define TDI_CONTROL_CHANNEL_FILE          3
68 
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)
72 
73 /* TdiAssociateAddress */
74 typedef struct _TDI_REQUEST_KERNEL_ASSOCIATE {
75   HANDLE AddressHandle;
76 } TDI_REQUEST_KERNEL_ASSOCIATE, *PTDI_REQUEST_KERNEL_ASSOCIATE;
77 
78 /* TdiDisassociateAddress */
79 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISASSOCIATE,
80   *PTDI_REQUEST_KERNEL_DISASSOCIATE;
81 
82 /* TdiAccept */
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;
87 
88 /* TdiConnect */
89 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_CONNECT,
90   *PTDI_REQUEST_KERNEL_CONNECT;
91 
92 /* TdiDisconnect */
93 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISCONNECT,
94   *PTDI_REQUEST_KERNEL_DISCONNECT;
95 
96 /* TdiListen */
97 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_LISTEN,
98   *PTDI_REQUEST_KERNEL_LISTEN;
99 
100 /* TdiReceive */
101 typedef struct _TDI_REQUEST_KERNEL_RECEIVE {
102   ULONG ReceiveLength;
103   ULONG ReceiveFlags;
104 } TDI_REQUEST_KERNEL_RECEIVE, *PTDI_REQUEST_KERNEL_RECEIVE;
105 
106 /* TdiReceiveDatagram */
107 typedef struct _TDI_REQUEST_KERNEL_RECEIVEDG {
108   ULONG ReceiveLength;
109   PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation;
110   PTDI_CONNECTION_INFORMATION ReturnDatagramInformation;
111   ULONG ReceiveFlags;
112 } TDI_REQUEST_KERNEL_RECEIVEDG, *PTDI_REQUEST_KERNEL_RECEIVEDG;
113 
114 /* TdiSend */
115 typedef struct _TDI_REQUEST_KERNEL_SEND {
116   ULONG SendLength;
117   ULONG SendFlags;
118 } TDI_REQUEST_KERNEL_SEND, *PTDI_REQUEST_KERNEL_SEND;
119 
120 /* TdiSendDatagram */
121 typedef struct _TDI_REQUEST_KERNEL_SENDDG {
122   ULONG SendLength;
123   _Field_size_bytes_(SendLength) PTDI_CONNECTION_INFORMATION SendDatagramInformation;
124 } TDI_REQUEST_KERNEL_SENDDG, *PTDI_REQUEST_KERNEL_SENDDG;
125 
126 /* TdiSetEventHandler */
127 typedef struct _TDI_REQUEST_KERNEL_SET_EVENT {
128   LONG EventType;
129   PVOID EventHandler;
130   PVOID EventContext;
131 } TDI_REQUEST_KERNEL_SET_EVENT, *PTDI_REQUEST_KERNEL_SET_EVENT;
132 
133 /* TdiQueryInformation */
134 typedef struct _TDI_REQUEST_KERNEL_QUERY_INFO {
135   LONG QueryType;
136   PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
137 } TDI_REQUEST_KERNEL_QUERY_INFORMATION, *PTDI_REQUEST_KERNEL_QUERY_INFORMATION;
138 
139 /* TdiSetInformation */
140 typedef struct _TDI_REQUEST_KERNEL_SET_INFO {
141   LONG SetType;
142   PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
143 } TDI_REQUEST_KERNEL_SET_INFORMATION, *PTDI_REQUEST_KERNEL_SET_INFORMATION;
144 
145 /* Event types */
146 #define TDI_EVENT_CONNECT                   0
147 #define TDI_EVENT_DISCONNECT                1
148 #define TDI_EVENT_ERROR                     2
149 #define TDI_EVENT_RECEIVE                   3
150 #define TDI_EVENT_RECEIVE_DATAGRAM          4
151 #define TDI_EVENT_RECEIVE_EXPEDITED         5
152 #define TDI_EVENT_SEND_POSSIBLE             6
153 #define TDI_EVENT_CHAINED_RECEIVE           7
154 #define TDI_EVENT_CHAINED_RECEIVE_DATAGRAM  8
155 #define TDI_EVENT_CHAINED_RECEIVE_EXPEDITED 9
156 #define TDI_EVENT_ERROR_EX                  10
157 
158 typedef NTSTATUS
159 (NTAPI *PTDI_IND_CONNECT)(
160   _In_opt_ PVOID TdiEventContext,
161   _In_ LONG RemoteAddressLength,
162   _In_reads_bytes_(RemoteAddressLength) PVOID RemoteAddress,
163   _In_ LONG UserDataLength,
164   _In_reads_bytes_opt_(UserDataLength) PVOID UserData,
165   _In_ LONG OptionsLength,
166   _In_reads_bytes_opt_(OptionsLength) PVOID Options,
167   _Out_ CONNECTION_CONTEXT *ConnectionContext,
168   _Out_ PIRP *AcceptIrp);
169 
170 TDIKRNLAPI
171 NTSTATUS
172 NTAPI
173 TdiDefaultConnectHandler(
174   _In_opt_ PVOID TdiEventContext,
175   _In_ LONG RemoteAddressLength,
176   _In_reads_bytes_(RemoteAddressLength) PVOID RemoteAddress,
177   _In_ LONG UserDataLength,
178   _In_reads_bytes_opt_(UserDataLength) PVOID UserData,
179   _In_ LONG OptionsLength,
180   _In_reads_bytes_opt_(OptionsLength) PVOID Options,
181   _Out_ CONNECTION_CONTEXT *ConnectionContext,
182   _Out_ PIRP *AcceptIrp);
183 
184 typedef NTSTATUS
185 (NTAPI *PTDI_IND_DISCONNECT)(
186   _In_opt_ PVOID TdiEventContext,
187   _In_opt_ CONNECTION_CONTEXT ConnectionContext,
188   _In_ LONG DisconnectDataLength,
189   _In_reads_bytes_opt_(DisconnectDataLength) PVOID DisconnectData,
190   _In_ LONG DisconnectInformationLength,
191   _In_reads_bytes_opt_(DisconnectInformationLength) PVOID DisconnectInformation,
192   _In_ ULONG DisconnectFlags);
193 
194 TDIKRNLAPI
195 NTSTATUS
196 NTAPI
197 TdiDefaultDisconnectHandler(
198   _In_opt_ PVOID TdiEventContext,
199   _In_opt_ CONNECTION_CONTEXT ConnectionContext,
200   _In_ LONG DisconnectDataLength,
201   _In_reads_bytes_opt_(DisconnectDataLength) PVOID DisconnectData,
202   _In_ LONG DisconnectInformationLength,
203   _In_reads_bytes_opt_(DisconnectInformationLength) PVOID DisconnectInformation,
204   _In_ ULONG DisconnectFlags);
205 
206 typedef NTSTATUS
207 (NTAPI *PTDI_IND_ERROR)(
208   _In_opt_ PVOID TdiEventContext,
209   _In_ NTSTATUS Status);
210 
211 typedef NTSTATUS
212 (NTAPI *PTDI_IND_ERROR_EX)(
213   _In_opt_ PVOID TdiEventContext,
214   _In_ NTSTATUS Status,
215   _In_ PVOID Buffer);
216 
217 TDIKRNLAPI
218 NTSTATUS
219 NTAPI
220 TdiDefaultErrorHandler(
221   _In_opt_ PVOID TdiEventContext,
222   _In_ NTSTATUS Status);
223 
224 typedef NTSTATUS
225 (NTAPI *PTDI_IND_RECEIVE)(
226   _In_opt_ PVOID TdiEventContext,
227   _In_opt_ CONNECTION_CONTEXT ConnectionContext,
228   _In_ ULONG ReceiveFlags,
229   _In_ ULONG BytesIndicated,
230   _In_ ULONG BytesAvailable,
231   _Out_ ULONG *BytesTaken,
232   _In_ PVOID Tsdu,
233   _Out_opt_ PIRP *IoRequestPacket);
234 
235 TDIKRNLAPI
236 NTSTATUS
237 NTAPI
238 TdiDefaultReceiveHandler(
239   _In_opt_ PVOID TdiEventContext,
240   _In_opt_ CONNECTION_CONTEXT ConnectionContext,
241   _In_ ULONG ReceiveFlags,
242   _In_ ULONG BytesIndicated,
243   _In_ ULONG BytesAvailable,
244   _Out_ ULONG *BytesTaken,
245   _In_ PVOID Tsdu,
246   _Out_opt_ PIRP *IoRequestPacket);
247 
248 typedef NTSTATUS
249 (NTAPI *PTDI_IND_RECEIVE_DATAGRAM)(
250   _In_opt_ PVOID TdiEventContext,
251   _In_ LONG SourceAddressLength,
252   _In_reads_bytes_(SourceAddressLength) PVOID SourceAddress,
253   _In_ LONG OptionsLength,
254   _In_reads_bytes_opt_(OptionsLength) PVOID Options,
255   _In_ ULONG ReceiveDatagramFlags,
256   _In_ ULONG BytesIndicated,
257   _In_ ULONG BytesAvailable,
258   _Out_ ULONG *BytesTaken,
259   _In_ PVOID Tsdu,
260   _Out_opt_ PIRP *IoRequestPacket);
261 
262 TDIKRNLAPI
263 NTSTATUS NTAPI
264 TdiDefaultRcvDatagramHandler(
265   _In_opt_ PVOID TdiEventContext,
266   _In_ LONG SourceAddressLength,
267   _In_reads_bytes_(SourceAddressLength) PVOID SourceAddress,
268   _In_ LONG OptionsLength,
269   _In_reads_bytes_opt_(OptionsLength) PVOID Options,
270   _In_ ULONG ReceiveDatagramFlags,
271   _In_ ULONG BytesIndicated,
272   _In_ ULONG BytesAvailable,
273   _Out_ ULONG *BytesTaken,
274   _In_ PVOID Tsdu,
275   _Out_opt_ PIRP *IoRequestPacket);
276 
277 typedef NTSTATUS
278 (NTAPI *PTDI_IND_RECEIVE_EXPEDITED)(
279   _In_opt_ PVOID TdiEventContext,
280   _In_opt_ CONNECTION_CONTEXT ConnectionContext,
281   _In_ ULONG ReceiveFlags,
282   _In_ ULONG BytesIndicated,
283   _In_ ULONG BytesAvailable,
284   _Out_ ULONG *BytesTaken,
285   _In_ PVOID Tsdu,
286   _Out_opt_ PIRP *IoRequestPacket);
287 
288 TDIKRNLAPI
289 NTSTATUS
290 NTAPI
291 TdiDefaultRcvExpeditedHandler(
292   _In_opt_ PVOID TdiEventContext,
293   _In_opt_ CONNECTION_CONTEXT ConnectionContext,
294   _In_ ULONG ReceiveFlags,
295   _In_ ULONG BytesIndicated,
296   _In_ ULONG BytesAvailable,
297   _Out_ ULONG *BytesTaken,
298   _In_ PVOID Tsdu,
299   _Out_opt_ PIRP *IoRequestPacket);
300 
301 typedef NTSTATUS
302 (NTAPI *PTDI_IND_CHAINED_RECEIVE)(
303   _In_opt_ PVOID TdiEventContext,
304   _In_opt_ CONNECTION_CONTEXT ConnectionContext,
305   _In_ ULONG ReceiveFlags,
306   _In_ ULONG ReceiveLength,
307   _In_ ULONG StartingOffset,
308   _In_ PMDL Tsdu,
309   _In_ PVOID TsduDescriptor);
310 
311 TDIKRNLAPI
312 NTSTATUS
313 NTAPI
314 TdiDefaultChainedReceiveHandler(
315   _In_opt_ PVOID TdiEventContext,
316   _In_opt_ CONNECTION_CONTEXT ConnectionContext,
317   _In_ ULONG ReceiveFlags,
318   _In_ ULONG ReceiveLength,
319   _In_ ULONG StartingOffset,
320   _In_ PMDL Tsdu,
321   _In_ PVOID TsduDescriptor);
322 
323 typedef NTSTATUS
324 (NTAPI *PTDI_IND_CHAINED_RECEIVE_DATAGRAM)(
325   _In_opt_ PVOID TdiEventContext,
326   _In_ LONG SourceAddressLength,
327   _In_reads_bytes_(SourceAddressLength) PVOID SourceAddress,
328   _In_ LONG OptionsLength,
329   _In_reads_bytes_opt_(OptionsLength) PVOID Options,
330   _In_ ULONG ReceiveDatagramFlags,
331   _In_ ULONG ReceiveDatagramLength,
332   _In_ ULONG StartingOffset,
333   _In_ PMDL Tsdu,
334   _In_ PVOID TsduDescriptor);
335 
336 TDIKRNLAPI
337 NTSTATUS
338 NTAPI
339 TdiDefaultChainedRcvDatagramHandler(
340   _In_opt_ PVOID TdiEventContext,
341   _In_ LONG SourceAddressLength,
342   _In_reads_bytes_(SourceAddressLength) PVOID SourceAddress,
343   _In_ LONG OptionsLength,
344   _In_reads_bytes_opt_(OptionsLength) PVOID Options,
345   _In_ ULONG ReceiveDatagramFlags,
346   _In_ ULONG ReceiveDatagramLength,
347   _In_ ULONG StartingOffset,
348   _In_ PMDL Tsdu,
349   _In_ PVOID TsduDescriptor);
350 
351 typedef NTSTATUS
352 (NTAPI *PTDI_IND_CHAINED_RECEIVE_EXPEDITED)(
353   _In_opt_ PVOID TdiEventContext,
354   _In_opt_ CONNECTION_CONTEXT ConnectionContext,
355   _In_ ULONG ReceiveFlags,
356   _In_ ULONG ReceiveLength,
357   _In_ ULONG StartingOffset,
358   _In_ PMDL Tsdu,
359   _In_ PVOID TsduDescriptor);
360 
361 TDIKRNLAPI
362 NTSTATUS
363 NTAPI
364 TdiDefaultChainedRcvExpeditedHandler(
365   _In_opt_ PVOID TdiEventContext,
366   _In_opt_ CONNECTION_CONTEXT ConnectionContext,
367   _In_ ULONG ReceiveFlags,
368   _In_ ULONG ReceiveLength,
369   _In_ ULONG StartingOffset,
370   _In_ PMDL Tsdu,
371   _In_ PVOID TsduDescriptor);
372 
373 typedef NTSTATUS
374 (NTAPI *PTDI_IND_SEND_POSSIBLE)(
375   _In_opt_ PVOID TdiEventContext,
376   _In_opt_ PVOID ConnectionContext,
377   _In_ ULONG BytesAvailable);
378 
379 TDIKRNLAPI
380 NTSTATUS
381 NTAPI
382 TdiDefaultSendPossibleHandler(
383   _In_opt_ PVOID TdiEventContext,
384   _In_opt_ PVOID ConnectionContext,
385   _In_ ULONG BytesAvailable);
386 
387 
388 
389 /* Macros and functions to build IRPs */
390 
391 #define TdiBuildBaseIrp(                                                  \
392   bIrp, bDevObj, bFileObj, bCompRoutine, bContxt, bIrpSp, bMinor)         \
393 {                                                                         \
394   bIrpSp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;                 \
395   bIrpSp->MinorFunction = (bMinor);                                       \
396   bIrpSp->DeviceObject  = (bDevObj);                                      \
397   bIrpSp->FileObject    = (bFileObj);                                     \
398   if (bCompRoutine)                                                       \
399   {                                                                       \
400     IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE);\
401   }                                                                       \
402   else                                                                    \
403     IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE);        \
404 }
405 
406 /*
407  * VOID
408  * TdiBuildAccept(
409  *   IN PIRP  Irp,
410  *   IN PDEVICE_OBJECT  DevObj,
411  *   IN PFILE_OBJECT  FileObj,
412  *   IN PVOID  CompRoutine,
413  *   IN PVOID  Contxt,
414  *   IN PTDI_CONNECTION_INFORMATION  RequestConnectionInfo,
415  *   OUT PTDI_CONNECTION_INFORMATION  ReturnConnectionInfo);
416  */
417 #define TdiBuildAccept(                                             \
418   Irp, DevObj, FileObj, CompRoutine, Contxt,                        \
419   RequestConnectionInfo, ReturnConnectionInfo)                      \
420 {                                                                   \
421   PTDI_REQUEST_KERNEL_ACCEPT _Request;                              \
422   PIO_STACK_LOCATION _IrpSp;                                        \
423                                                                     \
424   _IrpSp = IoGetNextIrpStackLocation(Irp);                          \
425                                                                     \
426   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                \
427                   Contxt, _IrpSp, TDI_ACCEPT);                      \
428                                                                     \
429   _Request = (PTDI_REQUEST_KERNEL_ACCEPT)&_IrpSp->Parameters;       \
430   _Request->RequestConnectionInformation = (RequestConnectionInfo); \
431   _Request->ReturnConnectionInformation  = (ReturnConnectionInfo);  \
432 }
433 
434 /*
435  * VOID
436  * TdiBuildAction(
437  *   IN PIRP  Irp,
438  *   IN PDEVICE_OBJECT  DevObj,
439  *   IN PFILE_OBJECT  FileObj,
440  *   IN PVOID  CompRoutine,
441  *   IN PVOID  Contxt,
442  *   IN PMDL  MdlAddr);
443  */
444 #define TdiBuildAction(                               \
445   Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr) \
446 {                                                     \
447   PIO_STACK_LOCATION _IrpSp;                          \
448                                                       \
449   _IrpSp = IoGetNextIrpStackLocation(Irp);            \
450                                                       \
451   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,  \
452                   Contxt, _IrpSp, TDI_ACTION);        \
453                                                       \
454   (Irp)->MdlAddress = (MdlAddr);                      \
455 }
456 
457 /*
458  * VOID
459  * TdiBuildAssociateAddress(
460  *   IN PIRP  Irp,
461  *   IN PDEVICE_OBJECT  DevObj,
462  *   IN PFILE_OBJECT  FileObj,
463  *   IN PVOID  CompRoutine,
464  *   IN PVOID  Contxt,
465  *   IN HANDLE  AddrHandle);
466  */
467 #define TdiBuildAssociateAddress(                                \
468   Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle)         \
469 {                                                                \
470   PTDI_REQUEST_KERNEL_ASSOCIATE _Request;                        \
471   PIO_STACK_LOCATION _IrpSp;                                     \
472                                                                  \
473   _IrpSp = IoGetNextIrpStackLocation(Irp);                       \
474                                                                  \
475   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,             \
476                   Contxt, _IrpSp, TDI_ASSOCIATE_ADDRESS);        \
477                                                                  \
478   _Request = (PTDI_REQUEST_KERNEL_ASSOCIATE)&_IrpSp->Parameters; \
479   _Request->AddressHandle = (HANDLE)(AddrHandle);                \
480 }
481 
482 /*
483  * VOID
484  * TdiBuildConnect(
485  *   IN PIRP  Irp,
486  *   IN PDEVICE_OBJECT  DevObj,
487  *   IN PFILE_OBJECT  FileObj,
488  *   IN PVOID  CompRoutine,
489  *   IN PVOID  Contxt,
490  *   IN PLARGE_INTEGER  Time,
491  *   IN PTDI_CONNECTION_INFORMATION  RequestConnectionInfo,
492  *   OUT PTDI_CONNECTION_INFORMATION  ReturnConnectionInfo);
493  */
494 #define TdiBuildConnect(                                            \
495   Irp, DevObj, FileObj, CompRoutine, Contxt,                        \
496   Time, RequestConnectionInfo, ReturnConnectionInfo)                \
497 {                                                                   \
498   PTDI_REQUEST_KERNEL _Request;                                     \
499   PIO_STACK_LOCATION _IrpSp;                                        \
500                                                                     \
501   _IrpSp = IoGetNextIrpStackLocation(Irp);                          \
502                                                                     \
503   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                \
504                   Contxt, _IrpSp, TDI_CONNECT);                     \
505                                                                     \
506   _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters;              \
507   _Request->RequestConnectionInformation = (RequestConnectionInfo); \
508   _Request->ReturnConnectionInformation  = (ReturnConnectionInfo);  \
509   _Request->RequestSpecific              = (PVOID)(Time);           \
510 }
511 
512 /*
513  * VOID
514  * TdiBuildDisassociateAddress(
515  *   IN PIRP  Irp,
516  *   IN PDEVICE_OBJECT  DevObj,
517  *   IN PFILE_OBJECT  FileObj,
518  *   IN PVOID  CompRoutine,
519  *   IN PVOID  Contxt);
520  */
521 #define TdiBuildDisassociateAddress(                                \
522   Irp, DevObj, FileObj, CompRoutine, Contxt)                        \
523 {                                                                   \
524   PIO_STACK_LOCATION _IrpSp;                                        \
525                                                                     \
526   _IrpSp = IoGetNextIrpStackLocation(Irp);                          \
527                                                                     \
528   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                \
529                   Contxt, _IrpSp, TDI_DISASSOCIATE_ADDRESS);        \
530 }
531 
532 /*
533  * VOID
534  * TdiBuildDisconnect(
535  *   IN PIRP  Irp,
536  *   IN PDEVICE_OBJECT  DevObj,
537  *   IN PFILE_OBJECT  FileObj,
538  *   IN PVOID  CompRoutine,
539  *   IN PVOID  Contxt,
540  *   IN PLARGE_INTEGER  Time,
541  *   IN PULONG  Flags,
542  *   IN PTDI_CONNECTION_INFORMATION  RequestConnectionInfo,
543  *   OUT PTDI_CONNECTION_INFORMATION  ReturnConnectionInfo);
544  */
545 #define TdiBuildDisconnect(                                         \
546   Irp, DevObj, FileObj, CompRoutine, Contxt, Time,                  \
547   Flags, RequestConnectionInfo, ReturnConnectionInfo)               \
548 {                                                                   \
549   PTDI_REQUEST_KERNEL _Request;                                     \
550   PIO_STACK_LOCATION _IrpSp;                                        \
551                                                                     \
552   _IrpSp = IoGetNextIrpStackLocation(Irp);                          \
553                                                                     \
554   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                \
555                   Contxt, _IrpSp, TDI_DISCONNECT);                  \
556                                                                     \
557   _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters;              \
558   _Request->RequestConnectionInformation = (RequestConnectionInfo); \
559   _Request->ReturnConnectionInformation  = (ReturnConnectionInfo);  \
560   _Request->RequestSpecific = (PVOID)(Time);                        \
561   _Request->RequestFlags    = (Flags);                              \
562 }
563 
564 /*
565  * PIRP
566  * TdiBuildInternalDeviceControlIrp(
567  *   IN CCHAR IrpSubFunction,
568  *   IN PDEVICE_OBJECT DeviceObject,
569  *   IN PFILE_OBJECT FileObject,
570  *   IN PKEVENT Event,
571  *   IN PIO_STATUS_BLOCK IoStatusBlock);
572  */
573 #define TdiBuildInternalDeviceControlIrp( \
574   IrpSubFunction, DeviceObject,           \
575   FileObject, Event, IoStatusBlock)       \
576   IoBuildDeviceIoControlRequest(          \
577 		IrpSubFunction, DeviceObject,             \
578 		NULL, 0, NULL, 0,                     \
579 		TRUE, Event, IoStatusBlock)
580 
581 /*
582  * VOID
583  * TdiBuildListen(
584  *   IN PIRP  Irp,
585  *   IN PDEVICE_OBJECT  DevObj,
586  *   IN PFILE_OBJECT  FileObj,
587  *   IN PVOID  CompRoutine,
588  *   IN PVOID  Contxt,
589  *   IN ULONG  Flags,
590  *   IN PTDI_CONNECTION_INFORMATION  RequestConnectionInfo,
591  *   OUT PTDI_CONNECTION_INFORMATION  ReturnConnectionInfo);
592  */
593 #define TdiBuildListen(                                             \
594   Irp, DevObj, FileObj, CompRoutine, Contxt,                        \
595   Flags, RequestConnectionInfo, ReturnConnectionInfo)               \
596 {                                                                   \
597   PTDI_REQUEST_KERNEL _Request;                                     \
598   PIO_STACK_LOCATION _IrpSp;                                        \
599                                                                     \
600   _IrpSp = IoGetNextIrpStackLocation(Irp);                          \
601                                                                     \
602   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                \
603                   Contxt, _IrpSp, TDI_LISTEN);                      \
604                                                                     \
605   _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters;              \
606   _Request->RequestConnectionInformation = (RequestConnectionInfo); \
607   _Request->ReturnConnectionInformation  = (ReturnConnectionInfo);  \
608   _Request->RequestFlags = (Flags);                                 \
609 }
610 
611 TDIKRNLAPI
612 VOID
613 NTAPI
614 TdiBuildNetbiosAddress(
615   _In_ PUCHAR NetbiosName,
616   _In_ BOOLEAN IsGroupName,
617   _Inout_ PTA_NETBIOS_ADDRESS NetworkName);
618 
619 TDIKRNLAPI
620 NTSTATUS
621 NTAPI
622 TdiBuildNetbiosAddressEa(
623   _Out_ PUCHAR Buffer,
624   _In_ BOOLEAN IsGroupName,
625   _In_ PUCHAR NetbiosName);
626 
627 /*
628  * VOID
629  * TdiBuildQueryInformation(
630  *   IN PIRP  Irp,
631  *   IN PDEVICE_OBJECT  DevObj,
632  *   IN PFILE_OBJECT  FileObj,
633  *   IN PVOID  CompRoutine,
634  *   IN PVOID  Contxt,
635  *   IN UINT  QType,
636  *   IN PMDL  MdlAddr);
637  */
638 #define TdiBuildQueryInformation(                                        \
639   Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr)             \
640 {                                                                        \
641   PTDI_REQUEST_KERNEL_QUERY_INFORMATION _Request;                        \
642   PIO_STACK_LOCATION _IrpSp;                                             \
643                                                                          \
644   _IrpSp = IoGetNextIrpStackLocation(Irp);                               \
645                                                                          \
646   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                     \
647                   Contxt, _IrpSp, TDI_QUERY_INFORMATION);                \
648                                                                          \
649   _Request = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&_IrpSp->Parameters; \
650   _Request->RequestConnectionInformation = NULL;                         \
651   _Request->QueryType = (ULONG)(QType);                                  \
652   (Irp)->MdlAddress   = (MdlAddr);                                       \
653 }
654 
655 /*
656  * VOID
657  * TdiBuildReceive(
658  *   IN PIRP  Irp,
659  *   IN PDEVICE_OBJECT  DevObj,
660  *   IN PFILE_OBJECT  FileObj,
661  *   IN PVOID  CompRoutine,
662  *   IN PVOID  Contxt,
663  *   IN PMDL  MdlAddr,
664  *   IN ULONG  InFlags,
665  *   IN ULONG  ReceiveLen);
666  */
667 #define TdiBuildReceive(                                       \
668   Irp, DevObj, FileObj, CompRoutine, Contxt,                   \
669   MdlAddr, InFlags, ReceiveLen)                                \
670 {                                                              \
671   PTDI_REQUEST_KERNEL_RECEIVE _Request;                        \
672   PIO_STACK_LOCATION _IrpSp;                                   \
673                                                                \
674   _IrpSp = IoGetNextIrpStackLocation(Irp);                     \
675                                                                \
676   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,           \
677                   Contxt, _IrpSp, TDI_RECEIVE);                \
678                                                                \
679   _Request = (PTDI_REQUEST_KERNEL_RECEIVE)&_IrpSp->Parameters; \
680   _Request->ReceiveFlags  = (InFlags);                         \
681   _Request->ReceiveLength = (ReceiveLen);                      \
682   (Irp)->MdlAddress       = (MdlAddr);                         \
683 }
684 
685 /*
686  * VOID
687  * TdiBuildReceiveDatagram(
688  *   IN PIRP  Irp,
689  *   IN PDEVICE_OBJECT  DevObj,
690  *   IN PFILE_OBJECT  FileObj,
691  *   IN PVOID  CompRoutine,
692  *   IN PVOID  Contxt,
693  *   IN PMDL  MdlAddr,
694  *   IN ULONG  ReceiveLen,
695  *   IN PTDI_CONNECTION_INFORMATION  ReceiveDatagramInfo,
696  *   OUT PTDI_CONNECTION_INFORMATION  ReturnInfo,
697  *   ULONG InFlags);
698  */
699 #define TdiBuildReceiveDatagram(                                 \
700   Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr,            \
701   ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags)          \
702 {                                                                \
703   PTDI_REQUEST_KERNEL_RECEIVEDG _Request;                        \
704   PIO_STACK_LOCATION _IrpSp;                                     \
705                                                                  \
706   _IrpSp = IoGetNextIrpStackLocation(Irp);                       \
707                                                                  \
708   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,             \
709                   Contxt, _IrpSp, TDI_RECEIVE_DATAGRAM);         \
710                                                                  \
711   _Request = (PTDI_REQUEST_KERNEL_RECEIVEDG)&_IrpSp->Parameters; \
712   _Request->ReceiveDatagramInformation = (ReceiveDatagramInfo);  \
713   _Request->ReturnDatagramInformation  = (ReturnInfo);           \
714   _Request->ReceiveLength = (ReceiveLen);                        \
715   _Request->ReceiveFlags  = (InFlags);                           \
716   (Irp)->MdlAddress       = (MdlAddr);                           \
717 }
718 
719 /*
720  * VOID
721  * TdiBuildSend(
722  *   IN PIRP  Irp,
723  *   IN PDEVICE_OBJECT  DevObj,
724  *   IN PFILE_OBJECT  FileObj,
725  *   IN PVOID  CompRoutine,
726  *   IN PVOID  Contxt,
727  *   IN PMDL  MdlAddr,
728  *   IN ULONG  InFlags,
729  *   IN ULONG  SendLen);
730  */
731 #define TdiBuildSend(                                       \
732   Irp, DevObj, FileObj, CompRoutine, Contxt,                \
733   MdlAddr, InFlags, SendLen)                                \
734 {                                                           \
735   PTDI_REQUEST_KERNEL_SEND _Request;                        \
736   PIO_STACK_LOCATION _IrpSp;                                \
737                                                             \
738   _IrpSp = IoGetNextIrpStackLocation(Irp);                  \
739                                                             \
740   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,        \
741                   Contxt, _IrpSp, TDI_SEND);                \
742                                                             \
743   _Request = (PTDI_REQUEST_KERNEL_SEND)&_IrpSp->Parameters; \
744   _Request->SendFlags  = (InFlags);                         \
745   _Request->SendLength = (SendLen);                         \
746   (Irp)->MdlAddress    = (MdlAddr);                         \
747 }
748 
749 /*
750  * VOID
751  * TdiBuildSendDatagram(
752  *   IN PIRP  Irp,
753  *   IN PDEVICE_OBJECT  DevObj,
754  *   IN PFILE_OBJECT  FileObj,
755  *   IN PVOID  CompRoutine,
756  *   IN PVOID  Contxt,
757  *   IN PMDL  MdlAddr,
758  *   IN ULONG  SendLen,
759  *   IN PTDI_CONNECTION_INFORMATION  SendDatagramInfo);
760  */
761 #define TdiBuildSendDatagram(                                 \
762   Irp, DevObj, FileObj, CompRoutine, Contxt,                  \
763   MdlAddr, SendLen, SendDatagramInfo)                         \
764 {                                                             \
765   PTDI_REQUEST_KERNEL_SENDDG _Request;                        \
766   PIO_STACK_LOCATION _IrpSp;                                  \
767                                                               \
768   _IrpSp = IoGetNextIrpStackLocation(Irp);                    \
769                                                               \
770   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,          \
771                   Contxt, _IrpSp, TDI_SEND_DATAGRAM);         \
772                                                               \
773   _Request = (PTDI_REQUEST_KERNEL_SENDDG)&_IrpSp->Parameters; \
774   _Request->SendDatagramInformation = (SendDatagramInfo);     \
775   _Request->SendLength = (SendLen);                           \
776   (Irp)->MdlAddress    = (MdlAddr);                           \
777 }
778 
779 /*
780  * VOID
781  * TdiBuildSetEventHandler(
782  *   IN PIRP  Irp,
783  *   IN PDEVICE_OBJECT  DevObj,
784  *   IN PFILE_OBJECT  FileObj,
785  *   IN PVOID  CompRoutine,
786  *   IN PVOID  Contxt,
787  *   IN INT  InEventType,
788  *   IN PVOID  InEventHandler,
789  *   IN PVOID  InEventContext);
790  */
791 #define TdiBuildSetEventHandler(                                 \
792   Irp, DevObj, FileObj, CompRoutine, Contxt,                     \
793   InEventType, InEventHandler, InEventContext)                   \
794 {                                                                \
795   PTDI_REQUEST_KERNEL_SET_EVENT _Request;                        \
796   PIO_STACK_LOCATION _IrpSp;                                     \
797                                                                  \
798   _IrpSp = IoGetNextIrpStackLocation(Irp);                       \
799                                                                  \
800   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,             \
801                   Contxt, _IrpSp, TDI_SET_EVENT_HANDLER);        \
802                                                                  \
803   _Request = (PTDI_REQUEST_KERNEL_SET_EVENT)&_IrpSp->Parameters; \
804   _Request->EventType    = (InEventType);                        \
805   _Request->EventHandler = (PVOID)(InEventHandler);              \
806   _Request->EventContext = (PVOID)(InEventContext);              \
807 }
808 
809 /*
810  * VOID
811  * TdiBuildSetInformation(
812  *   IN PIRP  Irp,
813  *   IN PDEVICE_OBJECT  DevObj,
814  *   IN PFILE_OBJECT  FileObj,
815  *   IN PVOID  CompRoutine,
816  *   IN PVOID  Contxt,
817  *   IN UINT  SType,
818  *   IN PMDL  MdlAddr);
819  */
820 #define TdiBuildSetInformation(                                        \
821   Irp, DevObj, FileObj, CompRoutine, Contxt, SType, MdlAddr)           \
822 {                                                                      \
823   PTDI_REQUEST_KERNEL_SET_INFORMATION _Request;                        \
824   PIO_STACK_LOCATION _IrpSp;                                           \
825                                                                        \
826   _IrpSp = IoGetNextIrpStackLocation(Irp);                             \
827                                                                        \
828   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                   \
829                   Contxt, _IrpSp, TDI_SET_INFORMATION);                \
830                                                                        \
831   _Request = (PTDI_REQUEST_KERNEL_SET_INFORMATION)&_IrpSp->Parameters; \
832   _Request->RequestConnectionInformation = NULL;                       \
833   _Request->SetType = (ULONG)(SType);                                  \
834   (Irp)->MdlAddress = (MdlAddr);                                       \
835 }
836 
837 /* TDI20_CLIENT_INTERFACE_INFO.TdiVersion constants */
838 #define TDI_CURRENT_MAJOR_VERSION         2
839 #define TDI_CURRENT_MINOR_VERSION         0
840 
841 #define TDI_CURRENT_VERSION ((TDI_CURRENT_MINOR_VERSION) << 8 \
842   | (TDI_CURRENT_MAJOR_VERSION))
843 
844 #define TDI_VERSION_ONE                   0x0001
845 
846 typedef enum _TDI_PNP_OPCODE {
847   TDI_PNP_OP_MIN,
848   TDI_PNP_OP_ADD,
849   TDI_PNP_OP_DEL,
850   TDI_PNP_OP_UPDATE,
851   TDI_PNP_OP_PROVIDERREADY,
852   TDI_PNP_OP_NETREADY,
853   TDI_PNP_OP_ADD_IGNORE_BINDING,
854   TDI_PNP_OP_DELETE_IGNORE_BINDING,
855   TDI_PNP_OP_MAX
856 } TDI_PNP_OPCODE;
857 
858 /* TDI_PNP_CONTEXT.ContextType */
859 #define TDI_PNP_CONTEXT_TYPE_IF_NAME            0x1
860 #define TDI_PNP_CONTEXT_TYPE_IF_ADDR            0x2
861 #define TDI_PNP_CONTEXT_TYPE_PDO                0x3
862 #define TDI_PNP_CONTEXT_TYPE_FIRST_OR_LAST_IF   0x4
863 
864 typedef struct _TDI_PNP_CONTEXT {
865   USHORT  ContextSize;
866   USHORT  ContextType;
867   UCHAR  ContextData[1];
868 } TDI_PNP_CONTEXT, *PTDI_PNP_CONTEXT;
869 
870 typedef VOID
871 (NTAPI *TDI_ADD_ADDRESS_HANDLER)(
872   _In_ PTA_ADDRESS Address);
873 
874 typedef VOID
875 (NTAPI *TDI_ADD_ADDRESS_HANDLER_V2)(
876   _In_ PTA_ADDRESS Address,
877   _In_ PUNICODE_STRING DeviceName,
878   _In_ PTDI_PNP_CONTEXT Context);
879 
880 typedef VOID
881 (NTAPI *TDI_BINDING_HANDLER)(
882   _In_ TDI_PNP_OPCODE PnPOpcode,
883   _In_ PUNICODE_STRING DeviceName,
884   _In_ PWSTR MultiSZBindList);
885 
886 typedef VOID
887 (NTAPI *TDI_BIND_HANDLER)(
888   _In_ PUNICODE_STRING DeviceName);
889 
890 typedef VOID
891 (NTAPI *TDI_DEL_ADDRESS_HANDLER)(
892   _In_ PTA_ADDRESS Address);
893 
894 typedef VOID
895 (NTAPI *TDI_DEL_ADDRESS_HANDLER_V2)(
896   _In_ PTA_ADDRESS Address,
897   _In_ PUNICODE_STRING DeviceName,
898   _In_ PTDI_PNP_CONTEXT Context);
899 
900 typedef NTSTATUS
901 (NTAPI *TDI_PNP_POWER_HANDLER)(
902   _In_ PUNICODE_STRING DeviceName,
903   _In_ PNET_PNP_EVENT PowerEvent,
904   _In_ PTDI_PNP_CONTEXT Context1,
905   _In_ PTDI_PNP_CONTEXT Context2);
906 
907 typedef VOID
908 (NTAPI *TDI_UNBIND_HANDLER)(
909   _In_ PUNICODE_STRING DeviceName);
910 
911 typedef VOID
912 (NTAPI *ProviderPnPPowerComplete)(
913   _In_ PNET_PNP_EVENT NetEvent,
914   _In_ NTSTATUS ProviderStatus);
915 
916 typedef struct _TDI20_CLIENT_INTERFACE_INFO {
917   _ANONYMOUS_UNION union {
918     _ANONYMOUS_STRUCT struct {
919       UCHAR  MajorTdiVersion;
920       UCHAR  MinorTdiVersion;
921     } DUMMYSTRUCTNAME;
922     USHORT TdiVersion;
923   } DUMMYUNIONNAME;
924   USHORT  Unused;
925   PUNICODE_STRING  ClientName;
926   TDI_PNP_POWER_HANDLER  PnPPowerHandler;
927   _ANONYMOUS_UNION union {
928     TDI_BINDING_HANDLER  BindingHandler;
929     _ANONYMOUS_STRUCT struct {
930       TDI_BIND_HANDLER  BindHandler;
931       TDI_UNBIND_HANDLER  UnBindHandler;
932     } DUMMYSTRUCTNAME;
933   }DUMMYUNIONNAME2;
934   _ANONYMOUS_UNION union {
935     _ANONYMOUS_STRUCT struct {
936       TDI_ADD_ADDRESS_HANDLER_V2  AddAddressHandlerV2;
937       TDI_DEL_ADDRESS_HANDLER_V2  DelAddressHandlerV2;
938     } DUMMYSTRUCTNAME;
939     _ANONYMOUS_STRUCT struct {
940       TDI_ADD_ADDRESS_HANDLER  AddAddressHandler;
941       TDI_DEL_ADDRESS_HANDLER  DelAddressHandler;
942     } DUMMYSTRUCTNAME2;
943   } DUMMYUNIONNAME3;
944 } TDI20_CLIENT_INTERFACE_INFO, *PTDI20_CLIENT_INTERFACE_INFO;
945 
946 typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO;
947 typedef TDI_CLIENT_INTERFACE_INFO *PTDI_CLIENT_INTERFACE_INFO;
948 
949 
950 /* TDI functions */
951 
952 /*
953  * VOID
954  * TdiCompleteRequest(
955  *   IN PIRP Irp,
956  *   IN NTSTATUS Status);
957  */
958 #define TdiCompleteRequest(Irp, Status)           \
959 {                                                 \
960   (Irp)->IoStatus.Status = (Status);              \
961   IoCompleteRequest((Irp), IO_NETWORK_INCREMENT); \
962 }
963 
964 _IRQL_requires_max_(DISPATCH_LEVEL)
965 TDIKRNLAPI
966 NTSTATUS
967 NTAPI
968 TdiCopyBufferToMdl(
969   _In_ PVOID SourceBuffer,
970   _In_ ULONG SourceOffset,
971   _In_ ULONG SourceBytesToCopy,
972   _In_ PMDL DestinationMdlChain,
973   _In_ ULONG DestinationOffset,
974   _Out_ PULONG BytesCopied);
975 
976 /*
977  * VOID
978  * TdiCopyLookaheadData(
979  *   IN PVOID  Destination,
980  *   IN PVOID  Source,
981  *   IN ULONG  Length,
982  *   IN ULONG  ReceiveFlags);
983  */
984 #define TdiCopyLookaheadData(Destination, Source, Length, ReceiveFlags) \
985   RtlCopyMemory(Destination, Source, Length)
986 
987 _IRQL_requires_max_(DISPATCH_LEVEL)
988 TDIKRNLAPI
989 NTSTATUS
990 NTAPI
991 TdiCopyMdlChainToMdlChain(
992   _In_ PMDL SourceMdlChain,
993   _In_ ULONG SourceOffset,
994   _In_ PMDL DestinationMdlChain,
995   _In_ ULONG DestinationOffset,
996   _Out_ PULONG BytesCopied);
997 
998 _IRQL_requires_max_(DISPATCH_LEVEL)
999 TDIKRNLAPI
1000 NTSTATUS
1001 NTAPI
1002 TdiCopyMdlToBuffer(
1003   _In_ PMDL SourceMdlChain,
1004   _In_ ULONG SourceOffset,
1005   _Out_writes_bytes_(DestinationBufferSize) PVOID DestinationBuffer,
1006   _In_ ULONG DestinationOffset,
1007   _In_ ULONG DestinationBufferSize,
1008   _Out_ PULONG BytesCopied);
1009 
1010 TDIKRNLAPI
1011 NTSTATUS
1012 NTAPI
1013 TdiDeregisterAddressChangeHandler(
1014   _In_ HANDLE BindingHandle);
1015 
1016 _IRQL_requires_max_(APC_LEVEL)
1017 TDIKRNLAPI
1018 NTSTATUS
1019 NTAPI
1020 TdiDeregisterDeviceObject(
1021   _In_ HANDLE DevRegistrationHandle);
1022 
1023 _IRQL_requires_max_(APC_LEVEL)
1024 TDIKRNLAPI
1025 NTSTATUS
1026 NTAPI
1027 TdiDeregisterNetAddress(
1028   _In_ HANDLE AddrRegistrationHandle);
1029 
1030 _IRQL_requires_max_(APC_LEVEL)
1031 TDIKRNLAPI
1032 NTSTATUS
1033 NTAPI
1034 TdiDeregisterPnPHandlers(
1035   _In_ HANDLE BindingHandle);
1036 
1037 _IRQL_requires_max_(APC_LEVEL)
1038 TDIKRNLAPI
1039 NTSTATUS
1040 NTAPI
1041 TdiDeregisterProvider(
1042   _In_ HANDLE ProviderHandle);
1043 
1044 _IRQL_requires_max_(APC_LEVEL)
1045 TDIKRNLAPI
1046 NTSTATUS
1047 NTAPI
1048 TdiEnumerateAddresses(
1049   _In_ HANDLE BindingHandle);
1050 
1051 _IRQL_requires_max_(PASSIVE_LEVEL)
1052 TDIKRNLAPI
1053 VOID
1054 NTAPI
1055 TdiInitialize(VOID);
1056 
1057 TDIKRNLAPI
1058 VOID
1059 NTAPI
1060 TdiMapBuffer(
1061   _In_ PMDL MdlChain);
1062 
1063 _IRQL_requires_max_(PASSIVE_LEVEL)
1064 TDIKRNLAPI
1065 NTSTATUS
1066 NTAPI
1067 TdiMapUserRequest(
1068   _In_ PDEVICE_OBJECT DeviceObject,
1069   _In_ PIRP Irp,
1070   _In_ PIO_STACK_LOCATION IrpSp);
1071 
1072 TDIKRNLAPI
1073 BOOLEAN
1074 NTAPI
1075 TdiMatchPdoWithChainedReceiveContext(
1076   _In_ PVOID TsduDescriptor,
1077   _In_ PVOID PDO);
1078 
1079 _IRQL_requires_max_(APC_LEVEL)
1080 TDIKRNLAPI
1081 VOID
1082 NTAPI
1083 TdiPnPPowerComplete(
1084   _In_ HANDLE BindingHandle,
1085   _In_ PNET_PNP_EVENT PowerEvent,
1086   _In_ NTSTATUS Status);
1087 
1088 _IRQL_requires_max_(APC_LEVEL)
1089 TDIKRNLAPI
1090 NTSTATUS
1091 NTAPI
1092 TdiPnPPowerRequest(
1093   _In_ PUNICODE_STRING DeviceName,
1094   _In_ PNET_PNP_EVENT PowerEvent,
1095   _In_ PTDI_PNP_CONTEXT Context1,
1096   _In_ PTDI_PNP_CONTEXT Context2,
1097   _In_ ProviderPnPPowerComplete ProtocolCompletionHandler);
1098 
1099 _IRQL_requires_max_(APC_LEVEL)
1100 TDIKRNLAPI
1101 NTSTATUS
1102 NTAPI
1103 TdiProviderReady(
1104   _In_ HANDLE ProviderHandle);
1105 
1106 TDIKRNLAPI
1107 NTSTATUS
1108 NTAPI
1109 TdiRegisterAddressChangeHandler(
1110   _In_ TDI_ADD_ADDRESS_HANDLER AddHandler,
1111   _In_ TDI_DEL_ADDRESS_HANDLER DeleteHandler,
1112   _Out_ HANDLE *BindingHandle);
1113 
1114 _IRQL_requires_max_(APC_LEVEL)
1115 TDIKRNLAPI
1116 NTSTATUS
1117 NTAPI
1118 TdiRegisterDeviceObject(
1119   _In_ PUNICODE_STRING DeviceName,
1120   _Out_ HANDLE *DevRegistrationHandle);
1121 
1122 _IRQL_requires_max_(APC_LEVEL)
1123 TDIKRNLAPI
1124 NTSTATUS
1125 NTAPI
1126 TdiRegisterNetAddress(
1127   _In_ PTA_ADDRESS Address,
1128   _In_ PUNICODE_STRING DeviceName,
1129   _In_ PTDI_PNP_CONTEXT Context,
1130   _Out_ HANDLE *AddrRegistrationHandle);
1131 
1132 TDIKRNLAPI
1133 NTSTATUS
1134 NTAPI
1135 TdiRegisterNotificationHandler(
1136   _In_ TDI_BIND_HANDLER BindHandler,
1137   _In_ TDI_UNBIND_HANDLER UnbindHandler,
1138   _Out_ HANDLE *BindingHandle);
1139 
1140 _IRQL_requires_max_(APC_LEVEL)
1141 TDIKRNLAPI
1142 NTSTATUS
1143 NTAPI
1144 TdiRegisterPnPHandlers(
1145   _In_reads_bytes_(InterfaceInfoSize) PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo,
1146   _In_ ULONG InterfaceInfoSize,
1147   _Out_ HANDLE *BindingHandle);
1148 
1149 _IRQL_requires_max_(APC_LEVEL)
1150 TDIKRNLAPI
1151 NTSTATUS
1152 NTAPI
1153 TdiRegisterProvider(
1154   _In_ PUNICODE_STRING ProviderName,
1155   _Out_ HANDLE *ProviderHandle);
1156 
1157 _IRQL_requires_max_(DISPATCH_LEVEL)
1158 TDIKRNLAPI
1159 VOID
1160 NTAPI
1161 TdiReturnChainedReceives(
1162   _In_ PVOID *TsduDescriptors,
1163   _In_ ULONG NumberOfTsdus);
1164 
1165 TDIKRNLAPI
1166 VOID
1167 NTAPI
1168 TdiUnmapBuffer(
1169   _In_ PMDL MdlChain);
1170 
1171 #ifdef __cplusplus
1172 }
1173 #endif
1174 
1175 #endif /* __TDIKRNL_H */
1176