Home | History | Annotate | Download | only in ddk
      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 (at) 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