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
29extern "C" {
30#endif
31
32#if defined(_TDI_)
33#define TDIKRNLAPI
34#else
35#define TDIKRNLAPI DECLSPEC_IMPORT
36#endif
37
38
39typedef 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 */
74typedef struct _TDI_REQUEST_KERNEL_ASSOCIATE {
75  HANDLE  AddressHandle;
76} TDI_REQUEST_KERNEL_ASSOCIATE, *PTDI_REQUEST_KERNEL_ASSOCIATE;
77
78/* TdiDisassociateAddress */
79typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISASSOCIATE,
80  *PTDI_REQUEST_KERNEL_DISASSOCIATE;
81
82/* TdiAccept */
83typedef 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 */
89typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_CONNECT,
90  *PTDI_REQUEST_KERNEL_CONNECT;
91
92/* TdiDisconnect */
93typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISCONNECT,
94  *PTDI_REQUEST_KERNEL_DISCONNECT;
95
96/* TdiListen */
97typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_LISTEN,
98  *PTDI_REQUEST_KERNEL_LISTEN;
99
100/* TdiReceive */
101typedef struct _TDI_REQUEST_KERNEL_RECEIVE {
102  ULONG  ReceiveLength;
103  ULONG  ReceiveFlags;
104} TDI_REQUEST_KERNEL_RECEIVE, *PTDI_REQUEST_KERNEL_RECEIVE;
105
106/* TdiReceiveDatagram */
107typedef 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 */
115typedef struct _TDI_REQUEST_KERNEL_SEND {
116  ULONG  SendLength;
117  ULONG  SendFlags;
118} TDI_REQUEST_KERNEL_SEND, *PTDI_REQUEST_KERNEL_SEND;
119
120/* TdiSendDatagram */
121typedef 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 */
127typedef 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 */
134typedef 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 */
140typedef 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
159typedef 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
171TDIKRNLAPI
172NTSTATUS
173NTAPI
174TdiDefaultConnectHandler(
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
185typedef 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
195TDIKRNLAPI
196NTSTATUS
197NTAPI
198TdiDefaultDisconnectHandler(
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
207typedef NTSTATUS
208(NTAPI *PTDI_IND_ERROR)(
209  IN PVOID  TdiEventContext,
210  IN NTSTATUS  Status);
211
212typedef NTSTATUS
213(NTAPI *PTDI_IND_ERROR_EX)(
214  IN PVOID  TdiEventContext,
215  IN NTSTATUS  Status,
216  IN PVOID  Buffer);
217
218TDIKRNLAPI
219NTSTATUS
220NTAPI
221TdiDefaultErrorHandler(
222  IN PVOID  TdiEventContext,
223  IN NTSTATUS  Status);
224
225typedef 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
236TDIKRNLAPI
237NTSTATUS
238NTAPI
239TdiDefaultReceiveHandler(
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
249typedef 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
263TDIKRNLAPI
264NTSTATUS NTAPI
265TdiDefaultRcvDatagramHandler(
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
278typedef 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
289TDIKRNLAPI
290NTSTATUS
291NTAPI
292TdiDefaultRcvExpeditedHandler(
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
302typedef 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
312TDIKRNLAPI
313NTSTATUS
314NTAPI
315TdiDefaultChainedReceiveHandler(
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
324typedef 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
337TDIKRNLAPI
338NTSTATUS
339NTAPI
340TdiDefaultChainedRcvDatagramHandler(
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
352typedef 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
362TDIKRNLAPI
363NTSTATUS
364NTAPI
365TdiDefaultChainedRcvExpeditedHandler(
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
374typedef NTSTATUS
375(NTAPI *PTDI_IND_SEND_POSSIBLE)(
376  IN PVOID  TdiEventContext,
377  IN PVOID  ConnectionContext,
378  IN ULONG  BytesAvailable);
379
380TDIKRNLAPI
381NTSTATUS
382NTAPI
383TdiDefaultSendPossibleHandler(
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
612TDIKRNLAPI
613VOID
614NTAPI
615TdiBuildNetbiosAddress(
616	IN PUCHAR  NetbiosName,
617	IN BOOLEAN  IsGroupName,
618	IN OUT PTA_NETBIOS_ADDRESS  NetworkName);
619
620TDIKRNLAPI
621NTSTATUS
622NTAPI
623TdiBuildNetbiosAddressEa(
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
847typedef 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
865typedef struct _TDI_PNP_CONTEXT {
866  USHORT  ContextSize;
867  USHORT  ContextType;
868  UCHAR  ContextData[1];
869} TDI_PNP_CONTEXT, *PTDI_PNP_CONTEXT;
870
871typedef VOID
872(NTAPI *TDI_ADD_ADDRESS_HANDLER)(
873  IN PTA_ADDRESS  Address);
874
875typedef 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
881typedef VOID
882(NTAPI *TDI_BINDING_HANDLER)(
883  IN TDI_PNP_OPCODE  PnPOpcode,
884  IN PUNICODE_STRING  DeviceName,
885  IN PWSTR  MultiSZBindList);
886
887typedef VOID
888(NTAPI *TDI_BIND_HANDLER)(
889  IN PUNICODE_STRING  DeviceName);
890
891typedef VOID
892(NTAPI *TDI_DEL_ADDRESS_HANDLER)(
893  IN PTA_ADDRESS  Address);
894
895typedef 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
901typedef 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
908typedef VOID
909(NTAPI *TDI_UNBIND_HANDLER)(
910  IN PUNICODE_STRING  DeviceName);
911
912typedef VOID
913(NTAPI *ProviderPnPPowerComplete)(
914  IN PNET_PNP_EVENT  NetEvent,
915  IN NTSTATUS  ProviderStatus);
916
917typedef 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
947typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO;
948typedef 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
965TDIKRNLAPI
966NTSTATUS
967NTAPI
968TdiCopyBufferToMdl(
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
987TDIKRNLAPI
988NTSTATUS
989NTAPI
990TdiCopyMdlChainToMdlChain (
991  IN PMDL  SourceMdlChain,
992  IN ULONG  SourceOffset,
993  IN PMDL  DestinationMdlChain,
994  IN ULONG  DestinationOffset,
995  OUT PULONG  BytesCopied);
996
997TDIKRNLAPI
998NTSTATUS
999NTAPI
1000TdiCopyMdlToBuffer(
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
1008TDIKRNLAPI
1009NTSTATUS
1010NTAPI
1011TdiDeregisterAddressChangeHandler(
1012  IN HANDLE  BindingHandle);
1013
1014TDIKRNLAPI
1015NTSTATUS
1016NTAPI
1017TdiDeregisterDeviceObject(
1018  IN HANDLE  DevRegistrationHandle);
1019
1020TDIKRNLAPI
1021NTSTATUS
1022NTAPI
1023TdiDeregisterNetAddress(
1024  IN HANDLE  AddrRegistrationHandle);
1025
1026TDIKRNLAPI
1027NTSTATUS
1028NTAPI
1029TdiDeregisterPnPHandlers(
1030  IN HANDLE  BindingHandle);
1031
1032TDIKRNLAPI
1033NTSTATUS
1034NTAPI
1035TdiDeregisterProvider(
1036  IN HANDLE  ProviderHandle);
1037
1038TDIKRNLAPI
1039NTSTATUS
1040NTAPI
1041TdiEnumerateAddresses(
1042  IN HANDLE  BindingHandle);
1043
1044TDIKRNLAPI
1045VOID
1046NTAPI
1047TdiInitialize(
1048  VOID);
1049
1050TDIKRNLAPI
1051VOID
1052NTAPI
1053TdiMapBuffer(
1054  IN PMDL  MdlChain);
1055
1056TDIKRNLAPI
1057NTSTATUS
1058NTAPI
1059TdiMapUserRequest(
1060  IN PDEVICE_OBJECT  DeviceObject,
1061  IN PIRP  Irp,
1062  IN PIO_STACK_LOCATION  IrpSp);
1063
1064TDIKRNLAPI
1065BOOLEAN
1066NTAPI
1067TdiMatchPdoWithChainedReceiveContext(
1068  IN PVOID TsduDescriptor,
1069  IN PVOID PDO);
1070
1071TDIKRNLAPI
1072VOID
1073NTAPI
1074TdiPnPPowerComplete(
1075  IN HANDLE  BindingHandle,
1076  IN PNET_PNP_EVENT  PowerEvent,
1077  IN NTSTATUS  Status);
1078
1079TDIKRNLAPI
1080NTSTATUS
1081NTAPI
1082TdiPnPPowerRequest(
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
1089TDIKRNLAPI
1090NTSTATUS
1091NTAPI
1092TdiProviderReady(
1093  IN HANDLE  ProviderHandle);
1094
1095TDIKRNLAPI
1096NTSTATUS
1097NTAPI
1098TdiRegisterAddressChangeHandler(
1099  IN TDI_ADD_ADDRESS_HANDLER  AddHandler,
1100  IN TDI_DEL_ADDRESS_HANDLER  DeleteHandler,
1101  OUT HANDLE  *BindingHandle);
1102
1103TDIKRNLAPI
1104NTSTATUS
1105NTAPI
1106TdiRegisterDeviceObject(
1107  IN PUNICODE_STRING  DeviceName,
1108  OUT HANDLE  *DevRegistrationHandle);
1109
1110TDIKRNLAPI
1111NTSTATUS
1112NTAPI
1113TdiRegisterNetAddress(
1114  IN PTA_ADDRESS  Address,
1115  IN PUNICODE_STRING  DeviceName,
1116  IN PTDI_PNP_CONTEXT  Context,
1117  OUT HANDLE  *AddrRegistrationHandle);
1118
1119TDIKRNLAPI
1120NTSTATUS
1121NTAPI
1122TdiRegisterNotificationHandler(
1123  IN TDI_BIND_HANDLER  BindHandler,
1124  IN TDI_UNBIND_HANDLER  UnbindHandler,
1125  OUT HANDLE  *BindingHandle);
1126
1127TDIKRNLAPI
1128NTSTATUS
1129NTAPI
1130TdiRegisterPnPHandlers(
1131  IN PTDI_CLIENT_INTERFACE_INFO  ClientInterfaceInfo,
1132  IN ULONG  InterfaceInfoSize,
1133  OUT HANDLE  *BindingHandle);
1134
1135TDIKRNLAPI
1136NTSTATUS
1137NTAPI
1138TdiRegisterProvider(
1139  IN PUNICODE_STRING  ProviderName,
1140  OUT HANDLE  *ProviderHandle);
1141
1142TDIKRNLAPI
1143VOID
1144NTAPI
1145TdiReturnChainedReceives(
1146  IN PVOID  *TsduDescriptors,
1147  IN ULONG   NumberOfTsdus);
1148
1149TDIKRNLAPI
1150VOID
1151NTAPI
1152TdiUnmapBuffer(
1153  IN PMDL  MdlChain);
1154
1155#ifdef __cplusplus
1156}
1157#endif
1158
1159#endif /* __TDIKRNL_H */
1160