- Move more stuff to wdm.h
[reactos.git] / 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 IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE) \
401 else \
402 IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE); \
403 }
404
405 /*
406 * VOID
407 * TdiBuildAccept(
408 * IN PIRP Irp,
409 * IN PDEVICE_OBJECT DevObj,
410 * IN PFILE_OBJECT FileObj,
411 * IN PVOID CompRoutine,
412 * IN PVOID Contxt,
413 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
414 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
415 */
416 #define TdiBuildAccept( \
417 Irp, DevObj, FileObj, CompRoutine, Contxt, \
418 RequestConnectionInfo, ReturnConnectionInfo) \
419 { \
420 PTDI_REQUEST_KERNEL_ACCEPT _Request; \
421 PIO_STACK_LOCATION _IrpSp; \
422 \
423 _IrpSp = IoGetNextIrpStackLocation(Irp); \
424 \
425 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
426 Contxt, _IrpSp, TDI_ACCEPT); \
427 \
428 _Request = (PTDI_REQUEST_KERNEL_ACCEPT)&_IrpSp->Parameters; \
429 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
430 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
431 }
432
433 /*
434 * VOID
435 * TdiBuildAction(
436 * IN PIRP Irp,
437 * IN PDEVICE_OBJECT DevObj,
438 * IN PFILE_OBJECT FileObj,
439 * IN PVOID CompRoutine,
440 * IN PVOID Contxt,
441 * IN PMDL MdlAddr);
442 */
443 #define TdiBuildAction( \
444 Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr) \
445 { \
446 PIO_STACK_LOCATION _IrpSp; \
447 \
448 _IrpSp = IoGetNextIrpStackLocation(Irp); \
449 \
450 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
451 Contxt, _IrpSp, TDI_ACTION); \
452 \
453 (Irp)->MdlAddress = (MdlAddr); \
454 }
455
456 /*
457 * VOID
458 * TdiBuildAssociateAddress(
459 * IN PIRP Irp,
460 * IN PDEVICE_OBJECT DevObj,
461 * IN PFILE_OBJECT FileObj,
462 * IN PVOID CompRoutine,
463 * IN PVOID Contxt,
464 * IN HANDLE AddrHandle);
465 */
466 #define TdiBuildAssociateAddress( \
467 Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle) \
468 { \
469 PTDI_REQUEST_KERNEL_ASSOCIATE _Request; \
470 PIO_STACK_LOCATION _IrpSp; \
471 \
472 _IrpSp = IoGetNextIrpStackLocation(Irp); \
473 \
474 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
475 Contxt, _IrpSp, TDI_ASSOCIATE_ADDRESS); \
476 \
477 _Request = (PTDI_REQUEST_KERNEL_ASSOCIATE)&_IrpSp->Parameters; \
478 _Request->AddressHandle = (HANDLE)(AddrHandle); \
479 }
480
481 /*
482 * VOID
483 * TdiBuildConnect(
484 * IN PIRP Irp,
485 * IN PDEVICE_OBJECT DevObj,
486 * IN PFILE_OBJECT FileObj,
487 * IN PVOID CompRoutine,
488 * IN PVOID Contxt,
489 * IN PLARGE_INTEGER Time,
490 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
491 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
492 */
493 #define TdiBuildConnect( \
494 Irp, DevObj, FileObj, CompRoutine, Contxt, \
495 Time, RequestConnectionInfo, ReturnConnectionInfo) \
496 { \
497 PTDI_REQUEST_KERNEL _Request; \
498 PIO_STACK_LOCATION _IrpSp; \
499 \
500 _IrpSp = IoGetNextIrpStackLocation(Irp); \
501 \
502 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
503 Contxt, _IrpSp, TDI_CONNECT); \
504 \
505 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
506 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
507 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
508 _Request->RequestSpecific = (PVOID)(Time); \
509 }
510
511 /*
512 * VOID
513 * TdiBuildDisassociateAddress(
514 * IN PIRP Irp,
515 * IN PDEVICE_OBJECT DevObj,
516 * IN PFILE_OBJECT FileObj,
517 * IN PVOID CompRoutine,
518 * IN PVOID Contxt);
519 */
520 #define TdiBuildDisassociateAddress( \
521 Irp, DevObj, FileObj, CompRoutine, Contxt) \
522 { \
523 PIO_STACK_LOCATION _IrpSp; \
524 \
525 _IrpSp = IoGetNextIrpStackLocation(Irp); \
526 \
527 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
528 Contxt, _IrpSp, TDI_DISASSOCIATE_ADDRESS); \
529 }
530
531 /*
532 * VOID
533 * TdiBuildDisconnect(
534 * IN PIRP Irp,
535 * IN PDEVICE_OBJECT DevObj,
536 * IN PFILE_OBJECT FileObj,
537 * IN PVOID CompRoutine,
538 * IN PVOID Contxt,
539 * IN PLARGE_INTEGER Time,
540 * IN PULONG Flags,
541 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
542 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
543 */
544 #define TdiBuildDisconnect( \
545 Irp, DevObj, FileObj, CompRoutine, Contxt, Time, \
546 Flags, RequestConnectionInfo, ReturnConnectionInfo) \
547 { \
548 PTDI_REQUEST_KERNEL _Request; \
549 PIO_STACK_LOCATION _IrpSp; \
550 \
551 _IrpSp = IoGetNextIrpStackLocation(Irp); \
552 \
553 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
554 Contxt, _IrpSp, TDI_DISCONNECT); \
555 \
556 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
557 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
558 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
559 _Request->RequestSpecific = (PVOID)(Time); \
560 _Request->RequestFlags = (Flags); \
561 }
562
563 /*
564 * PIRP
565 * TdiBuildInternalDeviceControlIrp(
566 * IN CCHAR IrpSubFunction,
567 * IN PDEVICE_OBJECT DeviceObject,
568 * IN PFILE_OBJECT FileObject,
569 * IN PKEVENT Event,
570 * IN PIO_STATUS_BLOCK IoStatusBlock);
571 */
572 #define TdiBuildInternalDeviceControlIrp( \
573 IrpSubFunction, DeviceObject, \
574 FileObject, Event, IoStatusBlock) \
575 IoBuildDeviceIoControlRequest( \
576 IrpSubFunction, DeviceObject, \
577 NULL, 0, NULL, 0, \
578 TRUE, Event, IoStatusBlock)
579
580 /*
581 * VOID
582 * TdiBuildListen(
583 * IN PIRP Irp,
584 * IN PDEVICE_OBJECT DevObj,
585 * IN PFILE_OBJECT FileObj,
586 * IN PVOID CompRoutine,
587 * IN PVOID Contxt,
588 * IN ULONG Flags,
589 * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
590 * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo);
591 */
592 #define TdiBuildListen( \
593 Irp, DevObj, FileObj, CompRoutine, Contxt, \
594 Flags, RequestConnectionInfo, ReturnConnectionInfo) \
595 { \
596 PTDI_REQUEST_KERNEL _Request; \
597 PIO_STACK_LOCATION _IrpSp; \
598 \
599 _IrpSp = IoGetNextIrpStackLocation(Irp); \
600 \
601 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
602 Contxt, _IrpSp, TDI_LISTEN); \
603 \
604 _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \
605 _Request->RequestConnectionInformation = (RequestConnectionInfo); \
606 _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \
607 _Request->RequestFlags = (Flags); \
608 }
609
610 TDIKRNLAPI
611 VOID
612 DDKAPI
613 TdiBuildNetbiosAddress(
614 IN PUCHAR NetbiosName,
615 IN BOOLEAN IsGroupName,
616 IN OUT PTA_NETBIOS_ADDRESS NetworkName);
617
618 TDIKRNLAPI
619 NTSTATUS
620 DDKAPI
621 TdiBuildNetbiosAddressEa(
622 IN PUCHAR Buffer,
623 IN BOOLEAN IsGroupName,
624 IN PUCHAR NetbiosName);
625
626 /*
627 * VOID
628 * TdiBuildQueryInformation(
629 * IN PIRP Irp,
630 * IN PDEVICE_OBJECT DevObj,
631 * IN PFILE_OBJECT FileObj,
632 * IN PVOID CompRoutine,
633 * IN PVOID Contxt,
634 * IN UINT QType,
635 * IN PMDL MdlAddr);
636 */
637 #define TdiBuildQueryInformation( \
638 Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr) \
639 { \
640 PTDI_REQUEST_KERNEL_QUERY_INFORMATION _Request; \
641 PIO_STACK_LOCATION _IrpSp; \
642 \
643 _IrpSp = IoGetNextIrpStackLocation(Irp); \
644 \
645 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
646 Contxt, _IrpSp, TDI_QUERY_INFORMATION); \
647 \
648 _Request = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&_IrpSp->Parameters; \
649 _Request->RequestConnectionInformation = NULL; \
650 _Request->QueryType = (ULONG)(QType); \
651 (Irp)->MdlAddress = (MdlAddr); \
652 }
653
654 /*
655 * VOID
656 * TdiBuildReceive(
657 * IN PIRP Irp,
658 * IN PDEVICE_OBJECT DevObj,
659 * IN PFILE_OBJECT FileObj,
660 * IN PVOID CompRoutine,
661 * IN PVOID Contxt,
662 * IN PMDL MdlAddr,
663 * IN ULONG InFlags,
664 * IN ULONG ReceiveLen);
665 */
666 #define TdiBuildReceive( \
667 Irp, DevObj, FileObj, CompRoutine, Contxt, \
668 MdlAddr, InFlags, ReceiveLen) \
669 { \
670 PTDI_REQUEST_KERNEL_RECEIVE _Request; \
671 PIO_STACK_LOCATION _IrpSp; \
672 \
673 _IrpSp = IoGetNextIrpStackLocation(Irp); \
674 \
675 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
676 Contxt, _IrpSp, TDI_RECEIVE); \
677 \
678 _Request = (PTDI_REQUEST_KERNEL_RECEIVE)&_IrpSp->Parameters; \
679 _Request->ReceiveFlags = (InFlags); \
680 _Request->ReceiveLength = (ReceiveLen); \
681 (Irp)->MdlAddress = (MdlAddr); \
682 }
683
684 /*
685 * VOID
686 * TdiBuildReceiveDatagram(
687 * IN PIRP Irp,
688 * IN PDEVICE_OBJECT DevObj,
689 * IN PFILE_OBJECT FileObj,
690 * IN PVOID CompRoutine,
691 * IN PVOID Contxt,
692 * IN PMDL MdlAddr,
693 * IN ULONG ReceiveLen,
694 * IN PTDI_CONNECTION_INFORMATION ReceiveDatagramInfo,
695 * OUT PTDI_CONNECTION_INFORMATION ReturnInfo,
696 * ULONG InFlags);
697 */
698 #define TdiBuildReceiveDatagram( \
699 Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, \
700 ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags) \
701 { \
702 PTDI_REQUEST_KERNEL_RECEIVEDG _Request; \
703 PIO_STACK_LOCATION _IrpSp; \
704 \
705 _IrpSp = IoGetNextIrpStackLocation(Irp); \
706 \
707 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
708 Contxt, _IrpSp, TDI_RECEIVE_DATAGRAM); \
709 \
710 _Request = (PTDI_REQUEST_KERNEL_RECEIVEDG)&_IrpSp->Parameters; \
711 _Request->ReceiveDatagramInformation = (ReceiveDatagramInfo); \
712 _Request->ReturnDatagramInformation = (ReturnInfo); \
713 _Request->ReceiveLength = (ReceiveLen); \
714 _Request->ReceiveFlags = (InFlags); \
715 (Irp)->MdlAddress = (MdlAddr); \
716 }
717
718 /*
719 * VOID
720 * TdiBuildSend(
721 * IN PIRP Irp,
722 * IN PDEVICE_OBJECT DevObj,
723 * IN PFILE_OBJECT FileObj,
724 * IN PVOID CompRoutine,
725 * IN PVOID Contxt,
726 * IN PMDL MdlAddr,
727 * IN ULONG InFlags,
728 * IN ULONG SendLen);
729 */
730 #define TdiBuildSend( \
731 Irp, DevObj, FileObj, CompRoutine, Contxt, \
732 MdlAddr, InFlags, SendLen) \
733 { \
734 PTDI_REQUEST_KERNEL_SEND _Request; \
735 PIO_STACK_LOCATION _IrpSp; \
736 \
737 _IrpSp = IoGetNextIrpStackLocation(Irp); \
738 \
739 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
740 Contxt, _IrpSp, TDI_SEND); \
741 \
742 _Request = (PTDI_REQUEST_KERNEL_SEND)&_IrpSp->Parameters; \
743 _Request->SendFlags = (InFlags); \
744 _Request->SendLength = (SendLen); \
745 (Irp)->MdlAddress = (MdlAddr); \
746 }
747
748 /*
749 * VOID
750 * TdiBuildSendDatagram(
751 * IN PIRP Irp,
752 * IN PDEVICE_OBJECT DevObj,
753 * IN PFILE_OBJECT FileObj,
754 * IN PVOID CompRoutine,
755 * IN PVOID Contxt,
756 * IN PMDL MdlAddr,
757 * IN ULONG SendLen,
758 * IN PTDI_CONNECTION_INFORMATION SendDatagramInfo);
759 */
760 #define TdiBuildSendDatagram( \
761 Irp, DevObj, FileObj, CompRoutine, Contxt, \
762 MdlAddr, SendLen, SendDatagramInfo) \
763 { \
764 PTDI_REQUEST_KERNEL_SENDDG _Request; \
765 PIO_STACK_LOCATION _IrpSp; \
766 \
767 _IrpSp = IoGetNextIrpStackLocation(Irp); \
768 \
769 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
770 Contxt, _IrpSp, TDI_SEND_DATAGRAM); \
771 \
772 _Request = (PTDI_REQUEST_KERNEL_SENDDG)&_IrpSp->Parameters; \
773 _Request->SendDatagramInformation = (SendDatagramInfo); \
774 _Request->SendLength = (SendLen); \
775 (Irp)->MdlAddress = (MdlAddr); \
776 }
777
778 /*
779 * VOID
780 * TdiBuildSetEventHandler(
781 * IN PIRP Irp,
782 * IN PDEVICE_OBJECT DevObj,
783 * IN PFILE_OBJECT FileObj,
784 * IN PVOID CompRoutine,
785 * IN PVOID Contxt,
786 * IN INT InEventType,
787 * IN PVOID InEventHandler,
788 * IN PVOID InEventContext);
789 */
790 #define TdiBuildSetEventHandler( \
791 Irp, DevObj, FileObj, CompRoutine, Contxt, \
792 InEventType, InEventHandler, InEventContext) \
793 { \
794 PTDI_REQUEST_KERNEL_SET_EVENT _Request; \
795 PIO_STACK_LOCATION _IrpSp; \
796 \
797 _IrpSp = IoGetNextIrpStackLocation(Irp); \
798 \
799 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
800 Contxt, _IrpSp, TDI_SET_EVENT_HANDLER); \
801 \
802 _Request = (PTDI_REQUEST_KERNEL_SET_EVENT)&_IrpSp->Parameters; \
803 _Request->EventType = (InEventType); \
804 _Request->EventHandler = (PVOID)(InEventHandler); \
805 _Request->EventContext = (PVOID)(InEventContext); \
806 }
807
808 /*
809 * VOID
810 * TdiBuildSetInformation(
811 * IN PIRP Irp,
812 * IN PDEVICE_OBJECT DevObj,
813 * IN PFILE_OBJECT FileObj,
814 * IN PVOID CompRoutine,
815 * IN PVOID Contxt,
816 * IN UINT SType,
817 * IN PMDL MdlAddr);
818 */
819 #define TdiBuildSetInformation( \
820 Irp, DevObj, FileObj, CompRoutine, Contxt, SType, MdlAddr) \
821 { \
822 PTDI_REQUEST_KERNEL_SET_INFORMATION _Request; \
823 PIO_STACK_LOCATION _IrpSp; \
824 \
825 _IrpSp = IoGetNextIrpStackLocation(Irp); \
826 \
827 TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \
828 Contxt, _IrpSp, TDI_SET_INFORMATION); \
829 \
830 _Request = (PTDI_REQUEST_KERNEL_SET_INFORMATION)&_IrpSp->Parameters; \
831 _Request->RequestConnectionInformation = NULL; \
832 _Request->SetType = (ULONG)(SType); \
833 (Irp)->MdlAddress = (MdlAddr); \
834 }
835
836 /* TDI20_CLIENT_INTERFACE_INFO.TdiVersion constants */
837 #define TDI_CURRENT_MAJOR_VERSION 2
838 #define TDI_CURRENT_MINOR_VERSION 0
839
840 #define TDI_CURRENT_VERSION ((TDI_CURRENT_MINOR_VERSION) << 8 \
841 | (TDI_CURRENT_MAJOR_VERSION))
842
843 #define TDI_VERSION_ONE 0x0001
844
845 typedef enum _TDI_PNP_OPCODE {
846 TDI_PNP_OP_MIN,
847 TDI_PNP_OP_ADD,
848 TDI_PNP_OP_DEL,
849 TDI_PNP_OP_UPDATE,
850 TDI_PNP_OP_PROVIDERREADY,
851 TDI_PNP_OP_NETREADY,
852 TDI_PNP_OP_ADD_IGNORE_BINDING,
853 TDI_PNP_OP_DELETE_IGNORE_BINDING,
854 TDI_PNP_OP_MAX
855 } TDI_PNP_OPCODE;
856
857 /* TDI_PNP_CONTEXT.ContextType */
858 #define TDI_PNP_CONTEXT_TYPE_IF_NAME 0x1
859 #define TDI_PNP_CONTEXT_TYPE_IF_ADDR 0x2
860 #define TDI_PNP_CONTEXT_TYPE_PDO 0x3
861 #define TDI_PNP_CONTEXT_TYPE_FIRST_OR_LAST_IF 0x4
862
863 typedef struct _TDI_PNP_CONTEXT {
864 USHORT ContextSize;
865 USHORT ContextType;
866 UCHAR ContextData[1];
867 } TDI_PNP_CONTEXT, *PTDI_PNP_CONTEXT;
868
869 typedef VOID
870 (DDKAPI *TDI_ADD_ADDRESS_HANDLER)(
871 IN PTA_ADDRESS Address);
872
873 typedef VOID
874 (DDKAPI *TDI_ADD_ADDRESS_HANDLER_V2)(
875 IN PTA_ADDRESS Address,
876 IN PUNICODE_STRING DeviceName,
877 IN PTDI_PNP_CONTEXT Context);
878
879 typedef VOID
880 (DDKAPI *TDI_BINDING_HANDLER)(
881 IN TDI_PNP_OPCODE PnPOpcode,
882 IN PUNICODE_STRING DeviceName,
883 IN PWSTR MultiSZBindList);
884
885 typedef VOID
886 (DDKAPI *TDI_BIND_HANDLER)(
887 IN PUNICODE_STRING DeviceName);
888
889 typedef VOID
890 (DDKAPI *TDI_DEL_ADDRESS_HANDLER)(
891 IN PTA_ADDRESS Address);
892
893 typedef VOID
894 (DDKAPI *TDI_DEL_ADDRESS_HANDLER_V2)(
895 IN PTA_ADDRESS Address,
896 IN PUNICODE_STRING DeviceName,
897 IN PTDI_PNP_CONTEXT Context);
898
899 typedef NTSTATUS
900 (DDKAPI *TDI_PNP_POWER_HANDLER)(
901 IN PUNICODE_STRING DeviceName,
902 IN PNET_PNP_EVENT PowerEvent,
903 IN PTDI_PNP_CONTEXT Context1,
904 IN PTDI_PNP_CONTEXT Context2);
905
906 typedef VOID
907 (DDKAPI *TDI_UNBIND_HANDLER)(
908 IN PUNICODE_STRING DeviceName);
909
910 typedef VOID
911 (DDKAPI *ProviderPnPPowerComplete)(
912 IN PNET_PNP_EVENT NetEvent,
913 IN NTSTATUS ProviderStatus);
914
915 typedef struct _TDI20_CLIENT_INTERFACE_INFO {
916 _ANONYMOUS_UNION union {
917 _ANONYMOUS_STRUCT struct {
918 UCHAR MajorTdiVersion;
919 UCHAR MinorTdiVersion;
920 } DUMMYSTRUCTNAME;
921 USHORT TdiVersion;
922 } DUMMYUNIONNAME;
923 USHORT Unused;
924 PUNICODE_STRING ClientName;
925 TDI_PNP_POWER_HANDLER PnPPowerHandler;
926 _ANONYMOUS_UNION union {
927 TDI_BINDING_HANDLER BindingHandler;
928 _ANONYMOUS_STRUCT struct {
929 TDI_BIND_HANDLER BindHandler;
930 TDI_UNBIND_HANDLER UnBindHandler;
931 } DUMMYSTRUCTNAME;
932 }DUMMYUNIONNAME2;
933 _ANONYMOUS_UNION union {
934 _ANONYMOUS_STRUCT struct {
935 TDI_ADD_ADDRESS_HANDLER_V2 AddAddressHandlerV2;
936 TDI_DEL_ADDRESS_HANDLER_V2 DelAddressHandlerV2;
937 } DUMMYSTRUCTNAME;
938 _ANONYMOUS_STRUCT struct {
939 TDI_ADD_ADDRESS_HANDLER AddAddressHandler;
940 TDI_DEL_ADDRESS_HANDLER DelAddressHandler;
941 } DUMMYSTRUCTNAME2;
942 } DUMMYUNIONNAME3;
943 } TDI20_CLIENT_INTERFACE_INFO, *PTDI20_CLIENT_INTERFACE_INFO;
944
945 typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO;
946 typedef TDI_CLIENT_INTERFACE_INFO *PTDI_CLIENT_INTERFACE_INFO;
947
948
949 /* TDI functions */
950
951 /*
952 * VOID
953 * TdiCompleteRequest(
954 * IN PIRP Irp,
955 * IN NTSTATUS Status);
956 */
957 #define TdiCompleteRequest(Irp, Status) \
958 { \
959 (Irp)->IoStatus.Status = (Status); \
960 IoCompleteRequest((Irp), IO_NETWORK_INCREMENT); \
961 }
962
963 TDIKRNLAPI
964 NTSTATUS
965 DDKAPI
966 TdiCopyBufferToMdl(
967 IN PVOID SourceBuffer,
968 IN ULONG SourceOffset,
969 IN ULONG SourceBytesToCopy,
970 IN PMDL DestinationMdlChain,
971 IN ULONG DestinationOffset,
972 IN PULONG BytesCopied);
973
974 /*
975 * VOID
976 * TdiCopyLookaheadData(
977 * IN PVOID Destination,
978 * IN PVOID Source,
979 * IN ULONG Length,
980 * IN ULONG ReceiveFlags);
981 */
982 #define TdiCopyLookaheadData(Destination, Source, Length, ReceiveFlags) \
983 RtlCopyMemory(Destination, Source, Length)
984
985 TDIKRNLAPI
986 NTSTATUS
987 DDKAPI
988 TdiCopyMdlChainToMdlChain (
989 IN PMDL SourceMdlChain,
990 IN ULONG SourceOffset,
991 IN PMDL DestinationMdlChain,
992 IN ULONG DestinationOffset,
993 OUT PULONG BytesCopied);
994
995 TDIKRNLAPI
996 NTSTATUS
997 DDKAPI
998 TdiCopyMdlToBuffer(
999 IN PMDL SourceMdlChain,
1000 IN ULONG SourceOffset,
1001 IN PVOID DestinationBuffer,
1002 IN ULONG DestinationOffset,
1003 IN ULONG DestinationBufferSize,
1004 OUT PULONG BytesCopied);
1005
1006 TDIKRNLAPI
1007 NTSTATUS
1008 DDKAPI
1009 TdiDeregisterAddressChangeHandler(
1010 IN HANDLE BindingHandle);
1011
1012 TDIKRNLAPI
1013 NTSTATUS
1014 DDKAPI
1015 TdiDeregisterDeviceObject(
1016 IN HANDLE DevRegistrationHandle);
1017
1018 TDIKRNLAPI
1019 NTSTATUS
1020 DDKAPI
1021 TdiDeregisterNetAddress(
1022 IN HANDLE AddrRegistrationHandle);
1023
1024 TDIKRNLAPI
1025 NTSTATUS
1026 DDKAPI
1027 TdiDeregisterPnPHandlers(
1028 IN HANDLE BindingHandle);
1029
1030 TDIKRNLAPI
1031 NTSTATUS
1032 DDKAPI
1033 TdiDeregisterProvider(
1034 IN HANDLE ProviderHandle);
1035
1036 TDIKRNLAPI
1037 NTSTATUS
1038 DDKAPI
1039 TdiEnumerateAddresses(
1040 IN HANDLE BindingHandle);
1041
1042 TDIKRNLAPI
1043 VOID
1044 DDKAPI
1045 TdiInitialize(
1046 VOID);
1047
1048 TDIKRNLAPI
1049 VOID
1050 DDKAPI
1051 TdiMapBuffer(
1052 IN PMDL MdlChain);
1053
1054 TDIKRNLAPI
1055 NTSTATUS
1056 DDKAPI
1057 TdiMapUserRequest(
1058 IN PDEVICE_OBJECT DeviceObject,
1059 IN PIRP Irp,
1060 IN PIO_STACK_LOCATION IrpSp);
1061
1062 TDIKRNLAPI
1063 BOOLEAN
1064 DDKAPI
1065 TdiMatchPdoWithChainedReceiveContext(
1066 IN PVOID TsduDescriptor,
1067 IN PVOID PDO);
1068
1069 TDIKRNLAPI
1070 VOID
1071 DDKAPI
1072 TdiPnPPowerComplete(
1073 IN HANDLE BindingHandle,
1074 IN PNET_PNP_EVENT PowerEvent,
1075 IN NTSTATUS Status);
1076
1077 TDIKRNLAPI
1078 NTSTATUS
1079 DDKAPI
1080 TdiPnPPowerRequest(
1081 IN PUNICODE_STRING DeviceName,
1082 IN PNET_PNP_EVENT PowerEvent,
1083 IN PTDI_PNP_CONTEXT Context1,
1084 IN PTDI_PNP_CONTEXT Context2,
1085 IN ProviderPnPPowerComplete ProtocolCompletionHandler);
1086
1087 TDIKRNLAPI
1088 NTSTATUS
1089 DDKAPI
1090 TdiProviderReady(
1091 IN HANDLE ProviderHandle);
1092
1093 TDIKRNLAPI
1094 NTSTATUS
1095 DDKAPI
1096 TdiRegisterAddressChangeHandler(
1097 IN TDI_ADD_ADDRESS_HANDLER AddHandler,
1098 IN TDI_DEL_ADDRESS_HANDLER DeleteHandler,
1099 OUT HANDLE *BindingHandle);
1100
1101 TDIKRNLAPI
1102 NTSTATUS
1103 DDKAPI
1104 TdiRegisterDeviceObject(
1105 IN PUNICODE_STRING DeviceName,
1106 OUT HANDLE *DevRegistrationHandle);
1107
1108 TDIKRNLAPI
1109 NTSTATUS
1110 DDKAPI
1111 TdiRegisterNetAddress(
1112 IN PTA_ADDRESS Address,
1113 IN PUNICODE_STRING DeviceName,
1114 IN PTDI_PNP_CONTEXT Context,
1115 OUT HANDLE *AddrRegistrationHandle);
1116
1117 TDIKRNLAPI
1118 NTSTATUS
1119 DDKAPI
1120 TdiRegisterNotificationHandler(
1121 IN TDI_BIND_HANDLER BindHandler,
1122 IN TDI_UNBIND_HANDLER UnbindHandler,
1123 OUT HANDLE *BindingHandle);
1124
1125 TDIKRNLAPI
1126 NTSTATUS
1127 DDKAPI
1128 TdiRegisterPnPHandlers(
1129 IN PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo,
1130 IN ULONG InterfaceInfoSize,
1131 OUT HANDLE *BindingHandle);
1132
1133 TDIKRNLAPI
1134 NTSTATUS
1135 DDKAPI
1136 TdiRegisterProvider(
1137 IN PUNICODE_STRING ProviderName,
1138 OUT HANDLE *ProviderHandle);
1139
1140 TDIKRNLAPI
1141 VOID
1142 DDKAPI
1143 TdiReturnChainedReceives(
1144 IN PVOID *TsduDescriptors,
1145 IN ULONG NumberOfTsdus);
1146
1147 TDIKRNLAPI
1148 VOID
1149 DDKAPI
1150 TdiUnmapBuffer(
1151 IN PMDL MdlChain);
1152
1153 #ifdef __cplusplus
1154 }
1155 #endif
1156
1157 #endif /* __TDIKRNL_H */