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