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