source: Daodan/MSYS2/mingw32/i686-w64-mingw32/include/ddk/tdikrnl.h@ 1180

Last change on this file since 1180 was 1166, checked in by rossy, 3 years ago

Daodan: Replace MinGW build env with an up-to-date MSYS2 env

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