OSDN Git Service

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