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