Naveen Neel / shedskin
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers tdikrnl.h Source File

tdikrnl.h

00001 /*
00002  * tdikrnl.h
00003  *
00004  * TDI kernel mode definitions
00005  *
00006  * This file is part of the w32api package.
00007  *
00008  * Contributors:
00009  *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
00010  *
00011  * THIS SOFTWARE IS NOT COPYRIGHTED
00012  *
00013  * This source code is offered for use in the public domain. You may
00014  * use, modify or distribute it freely.
00015  *
00016  * This code is distributed in the hope that it will be useful but
00017  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
00018  * DISCLAIMED. This includes but is not limited to warranties of
00019  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00020  *
00021  */
00022 
00023 #ifndef __TDIKRNL_H
00024 #define __TDIKRNL_H
00025 
00026 #if __GNUC__ >=3
00027 #pragma GCC system_header
00028 #endif
00029 
00030 #ifdef __cplusplus
00031 extern "C" {
00032 #endif
00033 
00034 #include "ntddk.h"
00035 #include "tdi.h"
00036 
00037 #if defined(_TDI_)
00038   #define TDIKRNLAPI DECLSPEC_EXPORT
00039 #else
00040   #define TDIKRNLAPI DECLSPEC_IMPORT
00041 #endif
00042 
00043 
00044 typedef struct _TDI_REQUEST_KERNEL {
00045   ULONG  RequestFlags;
00046   PTDI_CONNECTION_INFORMATION  RequestConnectionInformation;
00047   PTDI_CONNECTION_INFORMATION  ReturnConnectionInformation;
00048   PVOID  RequestSpecific;
00049 } TDI_REQUEST_KERNEL, *PTDI_REQUEST_KERNEL;
00050 
00051 /* Request codes */
00052 #define TDI_ASSOCIATE_ADDRESS             0x01
00053 #define TDI_DISASSOCIATE_ADDRESS          0x02
00054 #define TDI_CONNECT                       0x03
00055 #define TDI_LISTEN                        0x04
00056 #define TDI_ACCEPT                        0x05
00057 #define TDI_DISCONNECT                    0x06
00058 #define TDI_SEND                          0x07
00059 #define TDI_RECEIVE                       0x08
00060 #define TDI_SEND_DATAGRAM                 0x09
00061 #define TDI_RECEIVE_DATAGRAM              0x0A
00062 #define TDI_SET_EVENT_HANDLER             0x0B
00063 #define TDI_QUERY_INFORMATION             0x0C
00064 #define TDI_SET_INFORMATION               0x0D
00065 #define TDI_ACTION                        0x0E
00066 
00067 #define TDI_DIRECT_SEND                   0x27
00068 #define TDI_DIRECT_SEND_DATAGRAM          0x29
00069 
00070 #define TDI_TRANSPORT_ADDRESS_FILE        1
00071 #define TDI_CONNECTION_FILE               2
00072 #define TDI_CONTROL_CHANNEL_FILE          3
00073 
00074 /* Internal TDI IOCTLS */
00075 #define IOCTL_TDI_QUERY_DIRECT_SEND_HANDLER   _TDI_CONTROL_CODE(0x80, METHOD_NEITHER)
00076 #define IOCTL_TDI_QUERY_DIRECT_SENDDG_HANDLER _TDI_CONTROL_CODE(0x81, METHOD_NEITHER)
00077 
00078 /* TdiAssociateAddress */
00079 typedef struct _TDI_REQUEST_KERNEL_ASSOCIATE {
00080   HANDLE  AddressHandle;
00081 } TDI_REQUEST_KERNEL_ASSOCIATE, *PTDI_REQUEST_KERNEL_ASSOCIATE;
00082 
00083 /* TdiDisassociateAddress */
00084 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISASSOCIATE,
00085   *PTDI_REQUEST_KERNEL_DISASSOCIATE;
00086 
00087 /* TdiAccept */
00088 typedef struct _TDI_REQUEST_KERNEL_ACCEPT {
00089   PTDI_CONNECTION_INFORMATION  RequestConnectionInformation;
00090   PTDI_CONNECTION_INFORMATION  ReturnConnectionInformation;
00091 } TDI_REQUEST_KERNEL_ACCEPT, *PTDI_REQUEST_KERNEL_ACCEPT;
00092 
00093 /* TdiConnect */
00094 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_CONNECT,
00095   *PTDI_REQUEST_KERNEL_CONNECT;
00096 
00097 /* TdiDisconnect */
00098 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISCONNECT,
00099   *PTDI_REQUEST_KERNEL_DISCONNECT;
00100 
00101 /* TdiListen */
00102 typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_LISTEN,
00103   *PTDI_REQUEST_KERNEL_LISTEN;
00104 
00105 /* TdiReceive */
00106 typedef struct _TDI_REQUEST_KERNEL_RECEIVE {
00107   ULONG  ReceiveLength;
00108   ULONG  ReceiveFlags;
00109 } TDI_REQUEST_KERNEL_RECEIVE, *PTDI_REQUEST_KERNEL_RECEIVE;
00110 
00111 /* TdiReceiveDatagram */
00112 typedef struct _TDI_REQUEST_KERNEL_RECEIVEDG {
00113   ULONG  ReceiveLength;
00114   PTDI_CONNECTION_INFORMATION  ReceiveDatagramInformation;
00115   PTDI_CONNECTION_INFORMATION  ReturnDatagramInformation;
00116   ULONG  ReceiveFlags;
00117 } TDI_REQUEST_KERNEL_RECEIVEDG, *PTDI_REQUEST_KERNEL_RECEIVEDG;
00118 
00119 /* TdiSend */
00120 typedef struct _TDI_REQUEST_KERNEL_SEND {
00121   ULONG  SendLength;
00122   ULONG  SendFlags;
00123 } TDI_REQUEST_KERNEL_SEND, *PTDI_REQUEST_KERNEL_SEND;
00124 
00125 /* TdiSendDatagram */
00126 typedef struct _TDI_REQUEST_KERNEL_SENDDG {
00127   ULONG  SendLength;
00128   PTDI_CONNECTION_INFORMATION  SendDatagramInformation;
00129 } TDI_REQUEST_KERNEL_SENDDG, *PTDI_REQUEST_KERNEL_SENDDG;
00130 
00131 /* TdiSetEventHandler */
00132 typedef struct _TDI_REQUEST_KERNEL_SET_EVENT {
00133   LONG  EventType;
00134   PVOID  EventHandler;
00135   PVOID  EventContext;
00136 } TDI_REQUEST_KERNEL_SET_EVENT, *PTDI_REQUEST_KERNEL_SET_EVENT;
00137 
00138 /* TdiQueryInformation */
00139 typedef struct _TDI_REQUEST_KERNEL_QUERY_INFO {
00140   LONG  QueryType;
00141   PTDI_CONNECTION_INFORMATION  RequestConnectionInformation;
00142 } TDI_REQUEST_KERNEL_QUERY_INFORMATION, *PTDI_REQUEST_KERNEL_QUERY_INFORMATION;
00143 
00144 /* TdiSetInformation */
00145 typedef struct _TDI_REQUEST_KERNEL_SET_INFO {
00146   LONG  SetType;
00147   PTDI_CONNECTION_INFORMATION  RequestConnectionInformation;
00148 } TDI_REQUEST_KERNEL_SET_INFORMATION, *PTDI_REQUEST_KERNEL_SET_INFORMATION;
00149 
00150 
00151 /* Event types */
00152 #define TDI_EVENT_CONNECT                   0
00153 #define TDI_EVENT_DISCONNECT                1
00154 #define TDI_EVENT_ERROR                     2
00155 #define TDI_EVENT_RECEIVE                   3
00156 #define TDI_EVENT_RECEIVE_DATAGRAM          4
00157 #define TDI_EVENT_RECEIVE_EXPEDITED         5
00158 #define TDI_EVENT_SEND_POSSIBLE             6
00159 #define TDI_EVENT_CHAINED_RECEIVE           7
00160 #define TDI_EVENT_CHAINED_RECEIVE_DATAGRAM  8
00161 #define TDI_EVENT_CHAINED_RECEIVE_EXPEDITED 9
00162 #define TDI_EVENT_ERROR_EX                  10
00163 
00164 typedef NTSTATUS DDKAPI
00165 (*PTDI_IND_CONNECT)(
00166   /*IN*/ PVOID  TdiEventContext,
00167   /*IN*/ LONG  RemoteAddressLength,
00168   /*IN*/ PVOID  RemoteAddress,
00169   /*IN*/ LONG  UserDataLength,
00170   /*IN*/ PVOID  UserData,
00171   /*IN*/ LONG  OptionsLength,
00172   /*IN*/ PVOID  Options,
00173   /*OUT*/ CONNECTION_CONTEXT  *ConnectionContext,
00174   /*OUT*/ PIRP  *AcceptIrp);
00175 
00176 TDIKRNLAPI
00177 NTSTATUS
00178 DDKAPI
00179 TdiDefaultConnectHandler(
00180   /*IN*/ PVOID  TdiEventContext,
00181   /*IN*/ LONG  RemoteAddressLength,
00182   /*IN*/ PVOID  RemoteAddress,
00183   /*IN*/ LONG  UserDataLength,
00184   /*IN*/ PVOID  UserData,
00185   /*IN*/ LONG  OptionsLength,
00186   /*IN*/ PVOID  Options,
00187   /*OUT*/ CONNECTION_CONTEXT *ConnectionContext,
00188   /*OUT*/ PIRP  *AcceptIrp);
00189 
00190 typedef NTSTATUS DDKAPI
00191 (*PTDI_IND_DISCONNECT)(
00192   /*IN*/ PVOID  TdiEventContext,
00193   /*IN*/ CONNECTION_CONTEXT  ConnectionContext,
00194   /*IN*/ LONG  DisconnectDataLength,
00195   /*IN*/ PVOID  DisconnectData,
00196   /*IN*/ LONG  DisconnectInformationLength,
00197   /*IN*/ PVOID  DisconnectInformation,
00198   /*IN*/ ULONG  DisconnectFlags);
00199 
00200 TDIKRNLAPI
00201 NTSTATUS
00202 DDKAPI
00203 TdiDefaultDisconnectHandler(
00204   /*IN*/ PVOID  TdiEventContext,
00205   /*IN*/ CONNECTION_CONTEXT  ConnectionContext,
00206   /*IN*/ LONG  DisconnectDataLength,
00207   /*IN*/ PVOID  DisconnectData,
00208   /*IN*/ LONG  DisconnectInformationLength,
00209   /*IN*/ PVOID  DisconnectInformation,
00210   /*IN*/ ULONG  DisconnectFlags);
00211 
00212 typedef NTSTATUS DDKAPI
00213 (*PTDI_IND_ERROR)(
00214   /*IN*/ PVOID  TdiEventContext,
00215   /*IN*/ NTSTATUS  Status);
00216 
00217 typedef NTSTATUS DDKAPI
00218 (*PTDI_IND_ERROR_EX)(
00219   /*IN*/ PVOID  TdiEventContext,
00220   /*IN*/ NTSTATUS  Status,
00221   /*IN*/ PVOID  Buffer);
00222 
00223 TDIKRNLAPI
00224 NTSTATUS
00225 DDKAPI
00226 TdiDefaultErrorHandler(
00227   /*IN*/ PVOID  TdiEventContext,
00228   /*IN*/ NTSTATUS  Status);
00229 
00230 typedef NTSTATUS DDKAPI
00231 (*PTDI_IND_RECEIVE)(
00232   /*IN*/ PVOID  TdiEventContext,
00233   /*IN*/ CONNECTION_CONTEXT  ConnectionContext,
00234   /*IN*/ ULONG  ReceiveFlags,
00235   /*IN*/ ULONG  BytesIndicated,
00236   /*IN*/ ULONG  BytesAvailable,
00237   /*OUT*/ ULONG  *BytesTaken,
00238   /*IN*/ PVOID  Tsdu,
00239   /*OUT*/ PIRP  *IoRequestPacket);
00240 
00241 TDIKRNLAPI
00242 NTSTATUS
00243 DDKAPI
00244 TdiDefaultReceiveHandler(
00245   /*IN*/ PVOID  TdiEventContext,
00246   /*IN*/ CONNECTION_CONTEXT  ConnectionContext,
00247   /*IN*/ ULONG  ReceiveFlags,
00248   /*IN*/ ULONG  BytesIndicated,
00249   /*IN*/ ULONG  BytesAvailable,
00250   /*OUT*/ ULONG  *BytesTaken,
00251   /*IN*/ PVOID  Tsdu,
00252   /*OUT*/ PIRP  *IoRequestPacket);
00253 
00254 typedef NTSTATUS DDKAPI
00255 (*PTDI_IND_RECEIVE_DATAGRAM)(
00256   /*IN*/ PVOID  TdiEventContext,
00257   /*IN*/ LONG  SourceAddressLength,
00258   /*IN*/ PVOID  SourceAddress,
00259   /*IN*/ LONG  OptionsLength,
00260   /*IN*/ PVOID  Options,
00261   /*IN*/ ULONG  ReceiveDatagramFlags,
00262   /*IN*/ ULONG  BytesIndicated,
00263   /*IN*/ ULONG  BytesAvailable,
00264   /*OUT*/ ULONG  *BytesTaken,
00265   /*IN*/ PVOID  Tsdu,
00266   /*OUT*/ PIRP  *IoRequestPacket);
00267 
00268 TDIKRNLAPI
00269 NTSTATUS DDKAPI
00270 TdiDefaultRcvDatagramHandler(
00271   /*IN*/ PVOID  TdiEventContext,
00272   /*IN*/ LONG  SourceAddressLength,
00273   /*IN*/ PVOID  SourceAddress,
00274   /*IN*/ LONG  OptionsLength,
00275   /*IN*/ PVOID  Options,
00276   /*IN*/ ULONG  ReceiveDatagramFlags,
00277   /*IN*/ ULONG  BytesIndicated,
00278   /*IN*/ ULONG  BytesAvailable,
00279   /*OUT*/ ULONG  *BytesTaken,
00280   /*IN*/ PVOID  Tsdu,
00281   /*OUT*/ PIRP  *IoRequestPacket);
00282 
00283 typedef NTSTATUS DDKAPI
00284 (*PTDI_IND_RECEIVE_EXPEDITED)(
00285   /*IN*/ PVOID  TdiEventContext,
00286   /*IN*/ CONNECTION_CONTEXT  ConnectionContext,
00287   /*IN*/ ULONG  ReceiveFlags,
00288   /*IN*/ ULONG  BytesIndicated,
00289   /*IN*/ ULONG  BytesAvailable,
00290   /*OUT*/ ULONG  *BytesTaken,
00291   /*IN*/ PVOID  Tsdu,
00292   /*OUT*/ PIRP  *IoRequestPacket);
00293 
00294 TDIKRNLAPI
00295 NTSTATUS
00296 DDKAPI
00297 TdiDefaultRcvExpeditedHandler(
00298   /*IN*/ PVOID  TdiEventContext,
00299   /*IN*/ CONNECTION_CONTEXT  ConnectionContext,
00300   /*IN*/ ULONG  ReceiveFlags,
00301   /*IN*/ ULONG  BytesIndicated,
00302   /*IN*/ ULONG  BytesAvailable,
00303   /*OUT*/ ULONG  *BytesTaken,
00304   /*IN*/ PVOID  Tsdu,
00305   /*OUT*/ PIRP  *IoRequestPacket);
00306 
00307 typedef NTSTATUS DDKAPI
00308 (*PTDI_IND_CHAINED_RECEIVE)(
00309   /*IN*/ PVOID  TdiEventContext,
00310   /*IN*/ CONNECTION_CONTEXT  ConnectionContext,
00311   /*IN*/ ULONG  ReceiveFlags,
00312   /*IN*/ ULONG  ReceiveLength,
00313   /*IN*/ ULONG  StartingOffset,
00314   /*IN*/ PMDL  Tsdu,
00315   /*IN*/ PVOID  TsduDescriptor);
00316 
00317 TDIKRNLAPI
00318 NTSTATUS
00319 DDKAPI
00320 TdiDefaultChainedReceiveHandler(
00321   /*IN*/ PVOID  TdiEventContext,
00322   /*IN*/ CONNECTION_CONTEXT  ConnectionContext,
00323   /*IN*/ ULONG  ReceiveFlags,
00324   /*IN*/ ULONG  ReceiveLength,
00325   /*IN*/ ULONG  StartingOffset,
00326   /*IN*/ PMDL  Tsdu,
00327   /*IN*/ PVOID  TsduDescriptor);
00328 
00329 typedef NTSTATUS DDKAPI
00330 (*PTDI_IND_CHAINED_RECEIVE_DATAGRAM)(
00331   /*IN*/ PVOID  TdiEventContext,
00332   /*IN*/ LONG  SourceAddressLength,
00333   /*IN*/ PVOID  SourceAddress,
00334   /*IN*/ LONG  OptionsLength,
00335   /*IN*/ PVOID  Options,
00336   /*IN*/ ULONG  ReceiveDatagramFlags,
00337   /*IN*/ ULONG  ReceiveDatagramLength,
00338   /*IN*/ ULONG  StartingOffset,
00339   /*IN*/ PMDL  Tsdu,
00340   /*IN*/ PVOID  TsduDescriptor);
00341 
00342 TDIKRNLAPI
00343 NTSTATUS
00344 DDKAPI
00345 TdiDefaultChainedRcvDatagramHandler(
00346   /*IN*/ PVOID  TdiEventContext,
00347   /*IN*/ LONG  SourceAddressLength,
00348   /*IN*/ PVOID  SourceAddress,
00349   /*IN*/ LONG  OptionsLength,
00350   /*IN*/ PVOID  Options,
00351   /*IN*/ ULONG  ReceiveDatagramFlags,
00352   /*IN*/ ULONG  ReceiveDatagramLength,
00353   /*IN*/ ULONG  StartingOffset,
00354   /*IN*/ PMDL  Tsdu,
00355   /*IN*/ PVOID  TsduDescriptor);
00356 
00357 typedef NTSTATUS DDKAPI
00358 (*PTDI_IND_CHAINED_RECEIVE_EXPEDITED)(
00359   /*IN*/ PVOID  TdiEventContext,
00360   /*IN*/ CONNECTION_CONTEXT  ConnectionContext,
00361   /*IN*/ ULONG  ReceiveFlags,
00362   /*IN*/ ULONG  ReceiveLength,
00363   /*IN*/ ULONG  StartingOffset,
00364   /*IN*/ PMDL  Tsdu,
00365   /*IN*/ PVOID  TsduDescriptor);
00366 
00367 TDIKRNLAPI
00368 NTSTATUS
00369 DDKAPI
00370 TdiDefaultChainedRcvExpeditedHandler(
00371   /*IN*/ PVOID  TdiEventContext,
00372   /*IN*/ CONNECTION_CONTEXT  ConnectionContext,
00373   /*IN*/ ULONG  ReceiveFlags,
00374   /*IN*/ ULONG  ReceiveLength,
00375   /*IN*/ ULONG  StartingOffset,
00376   /*IN*/ PMDL  Tsdu,
00377   /*IN*/ PVOID  TsduDescriptor);
00378 
00379 typedef NTSTATUS DDKAPI
00380 (*PTDI_IND_SEND_POSSIBLE)(
00381   /*IN*/ PVOID  TdiEventContext,
00382   /*IN*/ PVOID  ConnectionContext,
00383   /*IN*/ ULONG  BytesAvailable);
00384 
00385 TDIKRNLAPI
00386 NTSTATUS
00387 DDKAPI
00388 TdiDefaultSendPossibleHandler(
00389   /*IN*/ PVOID  TdiEventContext,
00390   /*IN*/ PVOID  ConnectionContext,
00391   /*IN*/ ULONG  BytesAvailable);
00392 
00393 
00394 
00395   /* Macros and functions to build IRPs */
00396 
00397 #define TdiBuildBaseIrp(                                                  \
00398   bIrp, bDevObj, bFileObj, bCompRoutine, bContxt, bIrpSp, bMinor)         \
00399 {                                                                         \
00400   bIrpSp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;                 \
00401   bIrpSp->MinorFunction = (bMinor);                                       \
00402   bIrpSp->DeviceObject  = (bDevObj);                                      \
00403   bIrpSp->FileObject    = (bFileObj);                                     \
00404   if (bCompRoutine)                                                       \
00405     IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE) \
00406   else                                                                    \
00407     IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE);        \
00408 }
00409 
00410   /*
00411  * VOID
00412  * TdiBuildAccept(
00413  * IN PIRP  Irp,
00414  * IN PDEVICE_OBJECT  DevObj,
00415  * IN PFILE_OBJECT  FileObj,
00416  * IN PVOID  CompRoutine,
00417  * IN PVOID  Contxt,
00418  * IN PTDI_CONNECTION_INFORMATION  RequestConnectionInfo,
00419  * OUT PTDI_CONNECTION_INFORMATION  ReturnConnectionInfo);
00420  */
00421 #define TdiBuildAccept(                                             \
00422   Irp, DevObj, FileObj, CompRoutine, Contxt,                        \
00423   RequestConnectionInfo, ReturnConnectionInfo)                      \
00424 {                                                                   \
00425   PTDI_REQUEST_KERNEL_ACCEPT _Request;                              \
00426   PIO_STACK_LOCATION _IrpSp;                                        \
00427                                                                     \
00428   _IrpSp = IoGetNextIrpStackLocation(Irp);                          \
00429                                                                     \
00430   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                \
00431                   Contxt, _IrpSp, TDI_ACCEPT);                      \
00432                                                                     \
00433   _Request = (PTDI_REQUEST_KERNEL_ACCEPT)&_IrpSp->Parameters;       \
00434   _Request->RequestConnectionInformation = (RequestConnectionInfo); \
00435   _Request->ReturnConnectionInformation  = (ReturnConnectionInfo);  \
00436 }
00437 
00438   /*
00439  * VOID
00440  * TdiBuildAction(
00441  * IN PIRP  Irp,
00442  * IN PDEVICE_OBJECT  DevObj,
00443  * IN PFILE_OBJECT  FileObj,
00444  * IN PVOID  CompRoutine,
00445  * IN PVOID  Contxt,
00446  * IN PMDL  MdlAddr);
00447  */
00448 #define TdiBuildAction(                               \
00449   Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr) \
00450 {                                                     \
00451   PIO_STACK_LOCATION _IrpSp;                          \
00452                                                       \
00453   _IrpSp = IoGetNextIrpStackLocation(Irp);            \
00454                                                       \
00455   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,  \
00456                   Contxt, _IrpSp, TDI_ACTION);        \
00457                                                       \
00458   (Irp)->MdlAddress = (MdlAddr);                      \
00459 }
00460 
00461   /*
00462  * VOID
00463  * TdiBuildAssociateAddress(
00464  * IN PIRP  Irp,
00465  * IN PDEVICE_OBJECT  DevObj,
00466  * IN PFILE_OBJECT  FileObj,
00467  * IN PVOID  CompRoutine,
00468  * IN PVOID  Contxt,
00469  * IN HANDLE  AddrHandle);
00470  */
00471 #define TdiBuildAssociateAddress(                                \
00472   Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle)         \
00473 {                                                                \
00474   PTDI_REQUEST_KERNEL_ASSOCIATE _Request;                        \
00475   PIO_STACK_LOCATION _IrpSp;                                     \
00476                                                                  \
00477   _IrpSp = IoGetNextIrpStackLocation(Irp);                       \
00478                                                                  \
00479   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,             \
00480                   Contxt, _IrpSp, TDI_ASSOCIATE_ADDRESS);        \
00481                                                                  \
00482   _Request = (PTDI_REQUEST_KERNEL_ASSOCIATE)&_IrpSp->Parameters; \
00483   _Request->AddressHandle = (HANDLE)(AddrHandle);                \
00484 }
00485 
00486   /*
00487  * VOID
00488  * TdiBuildConnect(
00489  * IN PIRP  Irp,
00490  * IN PDEVICE_OBJECT  DevObj,
00491  * IN PFILE_OBJECT  FileObj,
00492  * IN PVOID  CompRoutine,
00493  * IN PVOID  Contxt,
00494  * IN PLARGE_INTEGER  Time,
00495  * IN PTDI_CONNECTION_INFORMATION  RequestConnectionInfo,
00496  * OUT PTDI_CONNECTION_INFORMATION  ReturnConnectionInfo); 
00497  */
00498 #define TdiBuildConnect(                                            \
00499   Irp, DevObj, FileObj, CompRoutine, Contxt,                        \
00500   Time, RequestConnectionInfo, ReturnConnectionInfo)                \
00501 {                                                                   \
00502   PTDI_REQUEST_KERNEL _Request;                                     \
00503   PIO_STACK_LOCATION _IrpSp;                                        \
00504                                                                     \
00505   _IrpSp = IoGetNextIrpStackLocation(Irp);                          \
00506                                                                     \
00507   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                \
00508                   Contxt, _IrpSp, TDI_CONNECT);                     \
00509                                                                     \
00510   _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters;              \
00511   _Request->RequestConnectionInformation = (RequestConnectionInfo); \
00512   _Request->ReturnConnectionInformation  = (ReturnConnectionInfo);  \
00513   _Request->RequestSpecific              = (PVOID)(Time);           \
00514 }
00515 
00516   /*
00517  * VOID
00518  * TdiBuildDisassociateAddress(
00519  * IN PIRP  Irp,
00520  * IN PDEVICE_OBJECT  DevObj,
00521  * IN PFILE_OBJECT  FileObj,
00522  * IN PVOID  CompRoutine,
00523  * IN PVOID  Contxt);
00524  */
00525 #define TdiBuildDisassociateAddress(                                \
00526   Irp, DevObj, FileObj, CompRoutine, Contxt)                        \
00527 {                                                                   \
00528   PIO_STACK_LOCATION _IrpSp;                                        \
00529                                                                     \
00530   _IrpSp = IoGetNextIrpStackLocation(Irp);                          \
00531                                                                     \
00532   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                \
00533                   Contxt, _IrpSp, TDI_DISASSOCIATE_ADDRESS);        \
00534 }
00535 
00536   /*
00537  * VOID
00538  * TdiBuildDisconnect(
00539  * IN PIRP  Irp,
00540  * IN PDEVICE_OBJECT  DevObj,
00541  * IN PFILE_OBJECT  FileObj,
00542  * IN PVOID  CompRoutine,
00543  * IN PVOID  Contxt,
00544  * IN PLARGE_INTEGER  Time,
00545  * IN PULONG  Flags,
00546  * IN PTDI_CONNECTION_INFORMATION  RequestConnectionInfo,
00547  * OUT PTDI_CONNECTION_INFORMATION  ReturnConnectionInfo); 
00548  */
00549 #define TdiBuildDisconnect(                                         \
00550   Irp, DevObj, FileObj, CompRoutine, Contxt, Time,                  \
00551   Flags, RequestConnectionInfo, ReturnConnectionInfo)               \
00552 {                                                                   \
00553   PTDI_REQUEST_KERNEL _Request;                                     \
00554   PIO_STACK_LOCATION _IrpSp;                                        \
00555                                                                     \
00556   _IrpSp = IoGetNextIrpStackLocation(Irp);                          \
00557                                                                     \
00558   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                \
00559                   Contxt, _IrpSp, TDI_DISCONNECT);                  \
00560                                                                     \
00561   _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters;              \
00562   _Request->RequestConnectionInformation = (RequestConnectionInfo); \
00563   _Request->ReturnConnectionInformation  = (ReturnConnectionInfo);  \
00564   _Request->RequestSpecific = (PVOID)(Time);                        \
00565   _Request->RequestFlags    = (Flags);                              \
00566 }
00567 
00568   /*
00569  * PIRP
00570  * TdiBuildInternalDeviceControlIrp(
00571  * IN CCHAR IrpSubFunction,
00572  * IN PDEVICE_OBJECT DeviceObject,
00573  * IN PFILE_OBJECT FileObject,
00574  * IN PKEVENT Event,
00575  * IN PIO_STATUS_BLOCK IoStatusBlock);
00576  */
00577 #define TdiBuildInternalDeviceControlIrp( \
00578   IrpSubFunction, DeviceObject,           \
00579   FileObject, Event, IoStatusBlock)       \
00580   IoBuildDeviceIoControlRequest(          \
00581         0x00000003, DeviceObject,             \
00582         NULL, 0, NULL, 0,                     \
00583         TRUE, Event, IoStatusBlock)
00584 
00585   /*
00586  * VOID
00587  * TdiBuildListen(
00588  * IN PIRP  Irp,
00589  * IN PDEVICE_OBJECT  DevObj,
00590  * IN PFILE_OBJECT  FileObj,
00591  * IN PVOID  CompRoutine,
00592  * IN PVOID  Contxt,
00593  * IN ULONG  Flags,
00594  * IN PTDI_CONNECTION_INFORMATION  RequestConnectionInfo,
00595  * OUT PTDI_CONNECTION_INFORMATION  ReturnConnectionInfo); 
00596  */
00597 #define TdiBuildListen(                                             \
00598   Irp, DevObj, FileObj, CompRoutine, Contxt,                        \
00599   Flags, RequestConnectionInfo, ReturnConnectionInfo)               \
00600 {                                                                   \
00601   PTDI_REQUEST_KERNEL _Request;                                     \
00602   PIO_STACK_LOCATION _IrpSp;                                        \
00603                                                                     \
00604   _IrpSp = IoGetNextIrpStackLocation(Irp);                          \
00605                                                                     \
00606   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                \
00607                   Contxt, _IrpSp, TDI_LISTEN);                      \
00608                                                                     \
00609   _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters;              \
00610   _Request->RequestConnectionInformation = (RequestConnectionInfo); \
00611   _Request->ReturnConnectionInformation  = (ReturnConnectionInfo);  \
00612   _Request->RequestFlags = (Flags);                                 \
00613 }
00614 
00615 TDIKRNLAPI
00616 VOID
00617 DDKAPI
00618 TdiBuildNetbiosAddress(
00619   /*IN*/ PUCHAR  NetbiosName,
00620   /*IN*/ BOOLEAN  IsGroupName,
00621   /*IN OUT*/ PTA_NETBIOS_ADDRESS  NetworkName);
00622 
00623 TDIKRNLAPI
00624 NTSTATUS
00625 DDKAPI
00626 TdiBuildNetbiosAddressEa(
00627   /*IN*/ PUCHAR  Buffer,
00628   /*IN*/ BOOLEAN  IsGroupName,
00629   /*IN*/ PUCHAR  NetbiosName);
00630 
00631   /*
00632  * VOID
00633  * TdiBuildQueryInformation(
00634  * IN PIRP  Irp,
00635  * IN PDEVICE_OBJECT  DevObj,
00636  * IN PFILE_OBJECT  FileObj,
00637  * IN PVOID  CompRoutine,
00638  * IN PVOID  Contxt,
00639  * IN UINT  QType,
00640  * IN PMDL  MdlAddr);
00641  */
00642 #define TdiBuildQueryInformation(                                        \
00643   Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr)             \
00644 {                                                                        \
00645   PTDI_REQUEST_KERNEL_QUERY_INFORMATION _Request;                        \
00646   PIO_STACK_LOCATION _IrpSp;                                             \
00647                                                                          \
00648   _IrpSp = IoGetNextIrpStackLocation(Irp);                               \
00649                                                                          \
00650   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                     \
00651                   Contxt, _IrpSp, TDI_QUERY_INFORMATION);                \
00652                                                                          \
00653   _Request = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&_IrpSp->Parameters; \
00654   _Request->RequestConnectionInformation = NULL;                         \
00655   _Request->QueryType = (ULONG)(QType);                                  \
00656   (Irp)->MdlAddress   = (MdlAddr);                                       \
00657 }
00658 
00659   /*
00660  * VOID
00661  * TdiBuildReceive(
00662  * IN PIRP  Irp,
00663  * IN PDEVICE_OBJECT  DevObj,
00664  * IN PFILE_OBJECT  FileObj,
00665  * IN PVOID  CompRoutine,
00666  * IN PVOID  Contxt,
00667  * IN PMDL  MdlAddr,
00668  * IN ULONG  InFlags, 
00669  * IN ULONG  ReceiveLen); 
00670  */
00671 #define TdiBuildReceive(                                       \
00672   Irp, DevObj, FileObj, CompRoutine, Contxt,                   \
00673   MdlAddr, InFlags, ReceiveLen)                                \
00674 {                                                              \
00675   PTDI_REQUEST_KERNEL_RECEIVE _Request;                        \
00676   PIO_STACK_LOCATION _IrpSp;                                   \
00677                                                                \
00678   _IrpSp = IoGetNextIrpStackLocation(Irp);                     \
00679                                                                \
00680   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,           \
00681                   Contxt, _IrpSp, TDI_RECEIVE);                \
00682                                                                \
00683   _Request = (PTDI_REQUEST_KERNEL_RECEIVE)&_IrpSp->Parameters; \
00684   _Request->ReceiveFlags  = (InFlags);                         \
00685   _Request->ReceiveLength = (ReceiveLen);                      \
00686   (Irp)->MdlAddress       = (MdlAddr);                         \
00687 }
00688 
00689   /*
00690  * VOID
00691  * TdiBuildReceiveDatagram(
00692  * IN PIRP  Irp,
00693  * IN PDEVICE_OBJECT  DevObj,
00694  * IN PFILE_OBJECT  FileObj,
00695  * IN PVOID  CompRoutine,
00696  * IN PVOID  Contxt,
00697  * IN PMDL  MdlAddr,
00698  * IN ULONG  ReceiveLen,
00699  * IN PTDI_CONNECTION_INFORMATION  ReceiveDatagramInfo,
00700  * OUT PTDI_CONNECTION_INFORMATION  ReturnInfo,
00701  *   ULONG InFlags); 
00702  */
00703 #define TdiBuildReceiveDatagram(                                 \
00704   Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr,            \
00705   ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags)          \
00706 {                                                                \
00707   PTDI_REQUEST_KERNEL_RECEIVEDG _Request;                        \
00708   PIO_STACK_LOCATION _IrpSp;                                     \
00709                                                                  \
00710   _IrpSp = IoGetNextIrpStackLocation(Irp);                       \
00711                                                                  \
00712   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,             \
00713                   Contxt, _IrpSp, TDI_RECEIVE_DATAGRAM);         \
00714                                                                  \
00715   _Request = (PTDI_REQUEST_KERNEL_RECEIVEDG)&_IrpSp->Parameters; \
00716   _Request->ReceiveDatagramInformation = (ReceiveDatagramInfo);  \
00717   _Request->ReturnDatagramInformation  = (ReturnInfo);           \
00718   _Request->ReceiveLength = (ReceiveLen);                        \
00719   _Request->ReceiveFlags  = (InFlags);                           \
00720   (Irp)->MdlAddress       = (MdlAddr);                           \
00721 }
00722 
00723   /*
00724  * VOID
00725  * TdiBuildSend(
00726  * IN PIRP  Irp,
00727  * IN PDEVICE_OBJECT  DevObj,
00728  * IN PFILE_OBJECT  FileObj,
00729  * IN PVOID  CompRoutine,
00730  * IN PVOID  Contxt,
00731  * IN PMDL  MdlAddr,
00732  * IN ULONG  InFlags,
00733  * IN ULONG  SendLen);
00734  */
00735 #define TdiBuildSend(                                       \
00736   Irp, DevObj, FileObj, CompRoutine, Contxt,                \
00737   MdlAddr, InFlags, SendLen)                                \
00738 {                                                           \
00739   PTDI_REQUEST_KERNEL_SEND _Request;                        \
00740   PIO_STACK_LOCATION _IrpSp;                                \
00741                                                             \
00742   _IrpSp = IoGetNextIrpStackLocation(Irp);                  \
00743                                                             \
00744   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,        \
00745                   Contxt, _IrpSp, TDI_SEND);                \
00746                                                             \
00747   _Request = (PTDI_REQUEST_KERNEL_SEND)&_IrpSp->Parameters; \
00748   _Request->SendFlags  = (InFlags);                         \
00749   _Request->SendLength = (SendLen);                         \
00750   (Irp)->MdlAddress    = (MdlAddr);                         \
00751 }
00752 
00753   /*
00754  * VOID
00755  * TdiBuildSendDatagram(
00756  * IN PIRP  Irp,
00757  * IN PDEVICE_OBJECT  DevObj,
00758  * IN PFILE_OBJECT  FileObj,
00759  * IN PVOID  CompRoutine,
00760  * IN PVOID  Contxt,
00761  * IN PMDL  MdlAddr,
00762  * IN ULONG  SendLen,
00763  * IN PTDI_CONNECTION_INFORMATION  SendDatagramInfo); 
00764  */
00765 #define TdiBuildSendDatagram(                                 \
00766   Irp, DevObj, FileObj, CompRoutine, Contxt,                  \
00767   MdlAddr, SendLen, SendDatagramInfo)                         \
00768 {                                                             \
00769   PTDI_REQUEST_KERNEL_SENDDG _Request;                        \
00770   PIO_STACK_LOCATION _IrpSp;                                  \
00771                                                               \
00772   _IrpSp = IoGetNextIrpStackLocation(Irp);                    \
00773                                                               \
00774   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,          \
00775                   Contxt, _IrpSp, TDI_SEND_DATAGRAM);         \
00776                                                               \
00777   _Request = (PTDI_REQUEST_KERNEL_SENDDG)&_IrpSp->Parameters; \
00778   _Request->SendDatagramInformation = (SendDatagramInfo);     \
00779   _Request->SendLength = (SendLen);                           \
00780   (Irp)->MdlAddress    = (MdlAddr);                           \
00781 }
00782 
00783   /*
00784  * VOID
00785  * TdiBuildSetEventHandler(
00786  * IN PIRP  Irp,
00787  * IN PDEVICE_OBJECT  DevObj,
00788  * IN PFILE_OBJECT  FileObj,
00789  * IN PVOID  CompRoutine,
00790  * IN PVOID  Contxt,
00791  * IN INT  InEventType,
00792  * IN PVOID  InEventHandler,
00793  * IN PVOID  InEventContext);
00794  */
00795 #define TdiBuildSetEventHandler(                                 \
00796   Irp, DevObj, FileObj, CompRoutine, Contxt,                     \
00797   InEventType, InEventHandler, InEventContext)                   \
00798 {                                                                \
00799   PTDI_REQUEST_KERNEL_SET_EVENT _Request;                        \
00800   PIO_STACK_LOCATION _IrpSp;                                     \
00801                                                                  \
00802   _IrpSp = IoGetNextIrpStackLocation(Irp);                       \
00803                                                                  \
00804   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,             \
00805                   Contxt, _IrpSp, TDI_SET_EVENT_HANDLER);        \
00806                                                                  \
00807   _Request = (PTDI_REQUEST_KERNEL_SET_EVENT)&_IrpSp->Parameters; \
00808   _Request->EventType    = (InEventType);                        \
00809   _Request->EventHandler = (PVOID)(InEventHandler);              \
00810   _Request->EventContext = (PVOID)(InEventContext);              \
00811 }
00812 
00813   /*
00814  * VOID
00815  * TdiBuildSetInformation(
00816  * IN PIRP  Irp,
00817  * IN PDEVICE_OBJECT  DevObj,
00818  * IN PFILE_OBJECT  FileObj,
00819  * IN PVOID  CompRoutine,
00820  * IN PVOID  Contxt,
00821  * IN UINT  SType,
00822  * IN PMDL  MdlAddr);
00823  */
00824 #define TdiBuildSetInformation(                                        \
00825   Irp, DevObj, FileObj, CompRoutine, Contxt, SType, MdlAddr)           \
00826 {                                                                      \
00827   PTDI_REQUEST_KERNEL_SET_INFORMATION _Request;                        \
00828   PIO_STACK_LOCATION _IrpSp;                                           \
00829                                                                        \
00830   _IrpSp = IoGetNextIrpStackLocation(Irp);                             \
00831                                                                        \
00832   TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine,                   \
00833                   Contxt, _IrpSp, TDI_SET_INFORMATION);                \
00834                                                                        \
00835   _Request = (PTDI_REQUEST_KERNEL_SET_INFORMATION)&_IrpSp->Parameters; \
00836   _Request->RequestConnectionInformation = NULL;                       \
00837   _Request->SetType = (ULONG)(SType);                                  \
00838   (Irp)->MdlAddress = (MdlAddr);                                       \
00839 }
00840 
00841   /* TDI20_CLIENT_INTERFACE_INFO.TdiVersion constants */
00842 #define TDI_CURRENT_MAJOR_VERSION         2
00843 #define TDI_CURRENT_MINOR_VERSION         0
00844 
00845 #define TDI_CURRENT_VERSION ((TDI_CURRENT_MINOR_VERSION) << 8 \
00846   | (TDI_CURRENT_MAJOR_VERSION))
00847 
00848 #define TDI_VERSION_ONE                   0x0001
00849 
00850 typedef enum _TDI_PNP_OPCODE {
00851   TDI_PNP_OP_MIN,
00852   TDI_PNP_OP_ADD,
00853   TDI_PNP_OP_DEL,
00854   TDI_PNP_OP_UPDATE,
00855   TDI_PNP_OP_PROVIDERREADY,
00856   TDI_PNP_OP_NETREADY,
00857   TDI_PNP_OP_ADD_IGNORE_BINDING,
00858   TDI_PNP_OP_DELETE_IGNORE_BINDING,
00859   TDI_PNP_OP_MAX
00860 } TDI_PNP_OPCODE;
00861 
00862   /* TDI_PNP_CONTEXT.ContextType */
00863 #define TDI_PNP_CONTEXT_TYPE_IF_NAME            0x1
00864 #define TDI_PNP_CONTEXT_TYPE_IF_ADDR            0x2
00865 #define TDI_PNP_CONTEXT_TYPE_PDO                0x3
00866 #define TDI_PNP_CONTEXT_TYPE_FIRST_OR_LAST_IF   0x4
00867 
00868 typedef struct _TDI_PNP_CONTEXT {
00869   USHORT  ContextSize;
00870   USHORT  ContextType;
00871   UCHAR  ContextData[1];
00872 } TDI_PNP_CONTEXT, *PTDI_PNP_CONTEXT;
00873 
00874 typedef VOID DDKAPI
00875 (*TDI_ADD_ADDRESS_HANDLER)(
00876   /*IN*/ PTA_ADDRESS  Address);
00877 
00878 typedef VOID DDKAPI
00879 (*TDI_ADD_ADDRESS_HANDLER_V2)(
00880   /*IN*/ PTA_ADDRESS  Address,
00881   /*IN*/ PUNICODE_STRING  DeviceName,
00882   /*IN*/ PTDI_PNP_CONTEXT  Context);
00883 
00884 typedef VOID DDKAPI
00885 (*TDI_BINDING_HANDLER)(
00886   /*IN*/ TDI_PNP_OPCODE  PnPOpcode,
00887   /*IN*/ PUNICODE_STRING  DeviceName,
00888   /*IN*/ PWSTR  MultiSZBindList);
00889 
00890 typedef VOID DDKAPI
00891 (*TDI_BIND_HANDLER)(
00892   /*IN*/ PUNICODE_STRING  DeviceName);
00893 
00894 typedef VOID DDKAPI
00895 (*TDI_DEL_ADDRESS_HANDLER)(
00896   /*IN*/ PTA_ADDRESS  Address);
00897 
00898 typedef VOID DDKAPI
00899 (*TDI_DEL_ADDRESS_HANDLER_V2)(
00900   /*IN*/ PTA_ADDRESS  Address,
00901   /*IN*/ PUNICODE_STRING  DeviceName,
00902   /*IN*/ PTDI_PNP_CONTEXT  Context);
00903 
00904 typedef NTSTATUS DDKAPI
00905 (*TDI_PNP_POWER_HANDLER)(
00906   /*IN*/ PUNICODE_STRING  DeviceName,
00907   /*IN*/ PNET_PNP_EVENT  PowerEvent,
00908   /*IN*/ PTDI_PNP_CONTEXT  Context1,
00909   /*IN*/ PTDI_PNP_CONTEXT  Context2);
00910 
00911 typedef VOID DDKAPI
00912 (*TDI_UNBIND_HANDLER)(
00913   /*IN*/ PUNICODE_STRING  DeviceName);
00914 
00915 typedef VOID DDKAPI
00916 (*ProviderPnPPowerComplete)(
00917   /*IN*/ PNET_PNP_EVENT  NetEvent,
00918   /*IN*/ NTSTATUS  ProviderStatus);
00919 
00920 typedef struct _TDI20_CLIENT_INTERFACE_INFO {
00921   _ANONYMOUS_UNION union {
00922     _ANONYMOUS_STRUCT struct {
00923       UCHAR  MajorTdiVersion;
00924       UCHAR  MinorTdiVersion;
00925     } DUMMYSTRUCTNAME;
00926     USHORT TdiVersion;
00927   } DUMMYUNIONNAME;
00928   USHORT  Unused;
00929   PUNICODE_STRING  ClientName;
00930   TDI_PNP_POWER_HANDLER  PnPPowerHandler;
00931   _ANONYMOUS_UNION union {
00932     TDI_BINDING_HANDLER  BindingHandler;
00933     _ANONYMOUS_STRUCT struct {
00934       TDI_BIND_HANDLER  BindHandler;
00935       TDI_UNBIND_HANDLER  UnBindHandler;
00936     } DUMMYSTRUCTNAME;
00937   }DUMMYUNIONNAME2;
00938   _ANONYMOUS_UNION union {
00939     _ANONYMOUS_STRUCT struct {
00940       TDI_ADD_ADDRESS_HANDLER_V2  AddAddressHandlerV2;
00941       TDI_DEL_ADDRESS_HANDLER_V2  DelAddressHandlerV2;
00942     } DUMMYSTRUCTNAME;
00943     _ANONYMOUS_STRUCT struct {
00944       TDI_ADD_ADDRESS_HANDLER  AddAddressHandler;
00945       TDI_DEL_ADDRESS_HANDLER  DelAddressHandler;
00946     } DUMMYSTRUCTNAME2;
00947   } DUMMYUNIONNAME3;
00948 } TDI20_CLIENT_INTERFACE_INFO, *PTDI20_CLIENT_INTERFACE_INFO;
00949 
00950 typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO;
00951 typedef TDI_CLIENT_INTERFACE_INFO *PTDI_CLIENT_INTERFACE_INFO;
00952 
00953 
00954   /* TDI functions */
00955 
00956   /*
00957  * VOID
00958  * TdiCompleteRequest(
00959  * IN PIRP Irp,
00960  * IN NTSTATUS Status);
00961  */
00962 #define TdiCompleteRequest(Irp, Status)           \
00963 {                                                 \
00964   (Irp)->IoStatus.Status = (Status);              \
00965   IoCompleteRequest((Irp), IO_NETWORK_INCREMENT); \
00966 }
00967 
00968 TDIKRNLAPI
00969 NTSTATUS
00970 DDKAPI
00971 TdiCopyBufferToMdl(
00972   /*IN*/ PVOID  SourceBuffer,
00973   /*IN*/ ULONG  SourceOffset,
00974   /*IN*/ ULONG  SourceBytesToCopy,
00975   /*IN*/ PMDL  DestinationMdlChain,
00976   /*IN*/ ULONG  DestinationOffset,
00977   /*IN*/ PULONG  BytesCopied);
00978 
00979   /*
00980  * VOID
00981  * TdiCopyLookaheadData(
00982  * IN PVOID  Destination,
00983  * IN PVOID  Source,
00984  * IN ULONG  Length,
00985  * IN ULONG  ReceiveFlags);
00986  */
00987 #define TdiCopyLookaheadData(Destination, Source, Length, ReceiveFlags) \
00988   RtlCopyMemory(Destination, Source, Length)
00989 
00990 TDIKRNLAPI
00991 NTSTATUS
00992 DDKAPI
00993 TdiCopyMdlChainToMdlChain (
00994   /*IN*/ PMDL  SourceMdlChain,
00995   /*IN*/ ULONG  SourceOffset,
00996   /*IN*/ PMDL  DestinationMdlChain,
00997   /*IN*/ ULONG  DestinationOffset,
00998   /*OUT*/ PULONG  BytesCopied);
00999 
01000 TDIKRNLAPI
01001 NTSTATUS
01002 DDKAPI
01003 TdiCopyMdlToBuffer(
01004   /*IN*/ PMDL  SourceMdlChain,
01005   /*IN*/ ULONG  SourceOffset,
01006   /*IN*/ PVOID  DestinationBuffer,
01007   /*IN*/ ULONG  DestinationOffset,
01008   /*IN*/ ULONG  DestinationBufferSize,
01009   /*OUT*/ PULONG  BytesCopied);
01010 
01011 TDIKRNLAPI
01012 NTSTATUS
01013 DDKAPI
01014 TdiDeregisterAddressChangeHandler(
01015   /*IN*/ HANDLE  BindingHandle);
01016 
01017 TDIKRNLAPI
01018 NTSTATUS
01019 DDKAPI
01020 TdiDeregisterDeviceObject(
01021   /*IN*/ HANDLE  DevRegistrationHandle);
01022 
01023 TDIKRNLAPI
01024 NTSTATUS
01025 DDKAPI
01026 TdiDeregisterNetAddress(
01027   /*IN*/ HANDLE  AddrRegistrationHandle);
01028 
01029 TDIKRNLAPI
01030 NTSTATUS
01031 DDKAPI
01032 TdiDeregisterPnPHandlers(
01033   /*IN*/ HANDLE  BindingHandle);
01034 
01035 TDIKRNLAPI
01036 NTSTATUS
01037 DDKAPI
01038 TdiDeregisterProvider(
01039   /*IN*/ HANDLE  ProviderHandle);
01040 
01041 TDIKRNLAPI
01042 NTSTATUS
01043 DDKAPI
01044 TdiEnumerateAddresses(
01045   /*IN*/ HANDLE  BindingHandle);
01046 
01047 TDIKRNLAPI
01048 VOID
01049 DDKAPI
01050 TdiInitialize(
01051   VOID);
01052 
01053 TDIKRNLAPI
01054 VOID
01055 DDKAPI
01056 TdiMapBuffer(
01057   /*IN*/ PMDL  MdlChain);
01058 
01059 TDIKRNLAPI
01060 NTSTATUS
01061 DDKAPI
01062 TdiMapUserRequest(
01063   /*IN*/ PDEVICE_OBJECT  DeviceObject,
01064   /*IN*/ PIRP  Irp,
01065   /*IN*/ PIO_STACK_LOCATION  IrpSp);
01066 
01067 TDIKRNLAPI
01068 BOOLEAN
01069 DDKAPI
01070 TdiMatchPdoWithChainedReceiveContext(
01071   /*IN*/ PVOID TsduDescriptor,
01072   /*IN*/ PVOID PDO);
01073 
01074 TDIKRNLAPI
01075 VOID
01076 DDKAPI
01077 TdiPnPPowerComplete(
01078   /*IN*/ HANDLE  BindingHandle,
01079   /*IN*/ PNET_PNP_EVENT  PowerEvent,
01080   /*IN*/ NTSTATUS  Status);
01081 
01082 TDIKRNLAPI
01083 NTSTATUS
01084 DDKAPI
01085 TdiPnPPowerRequest(
01086   /*IN*/ PUNICODE_STRING  DeviceName,
01087   /*IN*/ PNET_PNP_EVENT  PowerEvent,
01088   /*IN*/ PTDI_PNP_CONTEXT  Context1,
01089   /*IN*/ PTDI_PNP_CONTEXT  Context2,
01090   /*IN*/ ProviderPnPPowerComplete  ProtocolCompletionHandler);
01091 
01092 TDIKRNLAPI
01093 NTSTATUS
01094 DDKAPI
01095 TdiProviderReady(
01096   /*IN*/ HANDLE  ProviderHandle);
01097 
01098 TDIKRNLAPI
01099 NTSTATUS
01100 DDKAPI
01101 TdiRegisterAddressChangeHandler(
01102   /*IN*/ TDI_ADD_ADDRESS_HANDLER  AddHandler,
01103   /*IN*/ TDI_DEL_ADDRESS_HANDLER  DeleteHandler,
01104   /*OUT*/ HANDLE  *BindingHandle);
01105 
01106 TDIKRNLAPI
01107 NTSTATUS
01108 DDKAPI
01109 TdiRegisterDeviceObject(
01110   /*IN*/ PUNICODE_STRING  DeviceName,
01111   /*OUT*/ HANDLE  *DevRegistrationHandle);
01112 
01113 TDIKRNLAPI
01114 NTSTATUS
01115 DDKAPI
01116 TdiRegisterNetAddress(
01117   /*IN*/ PTA_ADDRESS  Address,
01118   /*IN*/ PUNICODE_STRING  DeviceName,
01119   /*IN*/ PTDI_PNP_CONTEXT  Context,
01120   /*OUT*/ HANDLE  *AddrRegistrationHandle);
01121 
01122 TDIKRNLAPI
01123 NTSTATUS
01124 DDKAPI
01125 TdiRegisterNotificationHandler(
01126   /*IN*/ TDI_BIND_HANDLER  BindHandler,
01127   /*IN*/ TDI_UNBIND_HANDLER  UnbindHandler,
01128   /*OUT*/ HANDLE  *BindingHandle);
01129 
01130 TDIKRNLAPI
01131 NTSTATUS
01132 DDKAPI
01133 TdiRegisterPnPHandlers(
01134   /*IN*/ PTDI_CLIENT_INTERFACE_INFO  ClientInterfaceInfo,
01135   /*IN*/ ULONG  InterfaceInfoSize,
01136   /*OUT*/ HANDLE  *BindingHandle);
01137 
01138 TDIKRNLAPI
01139 NTSTATUS
01140 DDKAPI
01141 TdiRegisterProvider(
01142   /*IN*/ PUNICODE_STRING  ProviderName,
01143   /*OUT*/ HANDLE  *ProviderHandle);
01144 
01145 TDIKRNLAPI
01146 VOID
01147 DDKAPI
01148 TdiReturnChainedReceives(
01149   /*IN*/ PVOID  *TsduDescriptors,
01150   /*IN*/ ULONG   NumberOfTsdus);
01151 
01152 TDIKRNLAPI
01153 VOID
01154 DDKAPI
01155 TdiUnmapBuffer(
01156   /*IN*/ PMDL  MdlChain);
01157 
01158 #ifdef __cplusplus
01159 }
01160 #endif
01161 
01162 #endif /* __TDIKRNL_H */