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