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