-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathntafd.h
1126 lines (1026 loc) · 43.4 KB
/
ntafd.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* Ancillary Function Driver definitions
*
* This file is part of System Informer.
*/
#ifndef _NTAFD_H
#define _NTAFD_H
#include <WinSock2.h>
#include <MSWSock.h>
#include <tdi.h>
// private
#define AFD_DEVICE_NAME L"\\Device\\Afd"
// private // Extended Attributes
#define AfdOpenPacket "AfdOpenPacketXX" // AFD_OPEN_PACKET
#define AfdSwOpenPacket "AfdSwOpenPacket" // AFD_SWITCH_OPEN_PACKET // rev
#define AfdRioRDOpenPacket "AfdRioRDOpenPacket" // void // rev
// private
typedef struct _AFD_ENDPOINT_FLAGS
{
union
{
struct
{
UCHAR ConnectionLess : 1;
UCHAR : 3;
UCHAR MessageMode : 1;
UCHAR Raw : 1;
UCHAR : 3;
UCHAR Multipoint : 1;
UCHAR C_Root : 1;
UCHAR : 3;
UCHAR D_Root : 1;
UCHAR IgnoreTDI : 1;
UCHAR : 3;
UCHAR RioSocket : 1;
};
ULONG EndpointFlags;
};
} AFD_ENDPOINT_FLAGS, *PAFD_ENDPOINT_FLAGS;
// private // Transport device names
#define DD_TCP_DEVICE_NAME L"\\Device\\Tcp"
#define DD_TCPV6_DEVICE_NAME L"\\Device\\Tcp6"
#define DD_UDP_DEVICE_NAME L"\\Device\\Udp"
#define DD_UDPV6_DEVICE_NAME L"\\Device\\Udp6"
#define DD_RAW_IP_DEVICE_NAME L"\\Device\\RawIp"
#define DD_RAW_IPV6_DEVICE_NAME L"\\Device\\RawIp6"
// private
typedef struct _AFD_OPEN_PACKET
{
_In_ AFD_ENDPOINT_FLAGS __f;
_In_opt_ GROUP GroupID;
_In_ LONG AddressFamily; // AF_*
_In_ LONG SocketType; // SOCK_*
_In_ LONG Protocol; // IPPROTO_*, BTHPROTO_*, HV_PROTOCOL_*, etc.
_In_opt_ ULONG TransportDeviceNameLength; // Note: specifying a device changes the transport mode
_Field_size_bytes_opt_(TransportDeviceNameLength) WCHAR TransportDeviceName[ANYSIZE_ARRAY];
} AFD_OPEN_PACKET, *PAFD_OPEN_PACKET;
// rev (FILE_FULL_EA_INFORMATION + AfdOpenPacket + AFD_OPEN_PACKET)
typedef struct _AFD_OPEN_PACKET_FULL_EA
{
ULONG NextEntryOffset;
UCHAR Flags;
UCHAR EaNameLength; // sizeof(AfdOpenPacket) - sizeof(ANSI_NULL);
USHORT EaValueLength; // sizeof(AFD_OPEN_PACKET)
CHAR EaName[sizeof(AfdOpenPacket)];
AFD_OPEN_PACKET OpenPacket;
} AFD_OPEN_PACKET_FULL_EA, *PAFD_OPEN_PACKET_FULL_EA;
// private
typedef struct _AFD_SWITCH_OPEN_PACKET
{
HANDLE CompletionPort;
HANDLE CompletionEvent;
} AFD_SWITCH_OPEN_PACKET, *PAFD_SWITCH_OPEN_PACKET;
//
// Since Vista, sockets can use different modes of transport: TLI, TDI, and hybrid. The mode is selected
// based on whether the caller specifies the transport device at socket creation and whether this device
// is suitable for hybrid operation. No device means TLI, which is the most common choice.
//
// The transport mode affects which structures AFD uses for IOCTLs on the socket:
// - TLI sockets use *_TL structures (where applicable) and SOCKADDR for addresses.
// - TDI and hybrid sockets use non-TL structures and TDI_ADDRESS_INFO for addresses.
//
// private // IOCTL function numbers
#define AFD_BIND 0 // in: AFD_BIND_INFO_TL; out: SOCKADDR /or/ in: AFD_BIND_INFO; out: TDI_ADDRESS_INFO (depending on transport mode)
#define AFD_CONNECT 1 // in: AFD_CONNECT_JOIN_INFO_TL or AFD_CONNECT_JOIN_INFO (depending on transport mode); out (opt): IO_STATUS_BLOCK
#define AFD_START_LISTEN 2 // in: AFD_LISTEN_INFO
#define AFD_WAIT_FOR_LISTEN 3 // out: AFD_LISTEN_RESPONSE_INFO_TL or AFD_LISTEN_RESPONSE_INFO (depending on transport mode)
#define AFD_ACCEPT 4 // in: AFD_ACCEPT_INFO
#define AFD_RECEIVE 5 // in: AFD_RECV_INFO
#define AFD_RECEIVE_DATAGRAM 6 // in: AFD_DATAGRAM_INFO
#define AFD_SEND 7 // in: AFD_SEND_INFO
#define AFD_SEND_DATAGRAM 8 // in: AFD_SEND_DATAGRAM_INFO
#define AFD_POLL 9 // in, out: AFD_POLL_INFO
#define AFD_PARTIAL_DISCONNECT 10 // in: AFD_PARTIAL_DISCONNECT_INFO
#define AFD_GET_ADDRESS 11 // out: AFD_ADDRESS (SOCKADDR or TDI_ADDRESS_INFO, depending on transport mode)
#define AFD_QUERY_RECEIVE_INFO 12 // out: AFD_RECEIVE_INFORMATION
#define AFD_QUERY_HANDLES 13 // in: ULONG (AFD_QUERY_*); out: AFD_HANDLE_INFO
#define AFD_SET_INFORMATION 14 // in: AFD_INFORMATION
#define AFD_GET_REMOTE_ADDRESS 15 // out: AFD_ADDRESS (SOCKADDR or TDI_ADDRESS_INFO, depending on transport mode)
#define AFD_GET_CONTEXT 16 // out: SOCK_SHARED_INFO (on Win32 level) or custom data
#define AFD_SET_CONTEXT 17 // in: SOCK_SHARED_INFO (on Win32 level) or custom data; out: AFD_ADDRESS (SOCKADDR or TDI_ADDRESS_INFO, depending on transport mode; output buffer must be inside the input buffer)
#define AFD_SET_CONNECT_DATA 18 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload
#define AFD_SET_CONNECT_OPTIONS 19 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload
#define AFD_SET_DISCONNECT_DATA 20 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload
#define AFD_SET_DISCONNECT_OPTIONS 21 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload
#define AFD_GET_CONNECT_DATA 22 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload
#define AFD_GET_CONNECT_OPTIONS 23 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload
#define AFD_GET_DISCONNECT_DATA 24 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload
#define AFD_GET_DISCONNECT_OPTIONS 25 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload
#define AFD_SIZE_CONNECT_DATA 26 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload
#define AFD_SIZE_CONNECT_OPTIONS 27 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload
#define AFD_SIZE_DISCONNECT_DATA 28 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload
#define AFD_SIZE_DISCONNECT_OPTIONS 29 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: payload
#define AFD_GET_INFORMATION 30 // in, out: AFD_INFORMATION
#define AFD_TRANSMIT_FILE 31 // in: AFD_TRANSMIT_FILE_INFO; out (opt): BOOLEAN
#define AFD_SUPER_ACCEPT 32 // in: AFD_SUPER_ACCEPT_INFO; out: received data + local address + remote address (at offsets according to the input)
#define AFD_EVENT_SELECT 33 // in: AFD_EVENT_SELECT_INFO
#define AFD_ENUM_NETWORK_EVENTS 34 // in (opt): HANDLE; out: AFD_ENUM_NETWORK_EVENTS_INFO
#define AFD_DEFER_ACCEPT 35 // in: AFD_DEFER_ACCEPT_INFO
#define AFD_WAIT_FOR_LISTEN_LIFO 36 // out: AFD_LISTEN_RESPONSE_INFO_TL or AFD_LISTEN_RESPONSE_INFO (depending on transport mode)
#define AFD_SET_QOS 37 // in: AFD_QOS_INFO
#define AFD_GET_QOS 38 // out: AFD_QOS_INFO
#define AFD_NO_OPERATION 39 // in (opt): IO_STATUS_BLOCK
#define AFD_VALIDATE_GROUP 40 // in: AFD_VALIDATE_GROUP_INFO
#define AFD_GET_UNACCEPTED_CONNECT_DATA 41 // in: AFD_UNACCEPTED_CONNECT_DATA_INFO; out: AFD_UNACCEPTED_CONNECT_DATA_INFO (when LengthOnly is set) or received data
#define AFD_ROUTING_INTERFACE_QUERY 42 // in: TRANSPORT_ADDRESS; out: SOCKADDR
#define AFD_ROUTING_INTERFACE_CHANGE 43 // in: AFD_TRANSPORT_IOCTL_INFO
#define AFD_ADDRESS_LIST_QUERY 44 // in: USHORT (TDI_ADDRESS_TYPE_*/AF_*); out: TRANSPORT_ADDRESS
#define AFD_ADDRESS_LIST_CHANGE 45 // in: AFD_TRANSPORT_IOCTL_INFO
#define AFD_JOIN_LEAF 46 // in: AFD_CONNECT_JOIN_INFO_TL or AFD_CONNECT_JOIN_INFO (depending on transport mode); out (opt): IO_STATUS_BLOCK
#define AFD_TRANSPORT_IOCTL 47 // in: AFD_TL_IO_CONTROL_INFO; out: variable
#define AFD_TRANSMIT_PACKETS 48 // in: AFD_TPACKETS_INFO; out (opt): BOOLEAN
#define AFD_SUPER_CONNECT 49 // in: AFD_SUPER_CONNECT_INFO_TL or AFD_SUPER_CONNECT_INFO (depending on transport mode); out: payload
#define AFD_SUPER_DISCONNECT 50 // in: AFD_SUPER_DISCONNECT_INFO
#define AFD_RECEIVE_MESSAGE 51 // in: AFD_MESSAGE_INFO
#define AFD_SEND_MESSAGE 52 // in: AFD_MESSAGE_INFO // rev // since VISTA // breaks layout; values below are different on XP
#define AFD_SWITCH_CEMENT_SAN 53 // in: AFD_SWITCH_CONTEXT_INFO
#define AFD_SWITCH_SET_EVENTS 54 // in: AFD_SWITCH_EVENT_INFO
#define AFD_SWITCH_RESET_EVENTS 55 // in: AFD_SWITCH_EVENT_INFO
#define AFD_SWITCH_CONNECT_IND 56 // in: AFD_SWITCH_CONNECT_INFO; out: AFD_SWITCH_ACCEPT_INFO
#define AFD_SWITCH_CMPL_ACCEPT 57 // in: AFD_SWITCH_CONTEXT_INFO; out: payload
#define AFD_SWITCH_CMPL_REQUEST 58 // in: AFD_SWITCH_REQUEST_INFO; out: payload
#define AFD_SWITCH_CMPL_IO 59 // in: IO_STATUS_BLOCK
#define AFD_SWITCH_REFRESH_ENDP 60 // in: AFD_SWITCH_CONTEXT_INFO
#define AFD_SWITCH_GET_PHYSICAL_ADDR 61 // deprecated
#define AFD_SWITCH_ACQUIRE_CTX 62 // in: AFD_SWITCH_ACQUIRE_CTX_INFO; out: payload
#define AFD_SWITCH_TRANSFER_CTX 63 // in: AFD_SWITCH_TRANSFER_CTX_INFO
#define AFD_SWITCH_GET_SERVICE_PID 64 // in/out: void; returns PID in IO_STATUS_BLOCK.Information
#define AFD_SWITCH_SET_SERVICE_PROCESS 65 // in/out: void
#define AFD_SWITCH_PROVIDER_CHANGE 66 // in/out: void
#define AFD_SWITCH_ADDRLIST_CHANGE 67 // in: AFD_TRANSPORT_IOCTL_INFO
#define AFD_UNBIND 68 // in: AFD_UNBIND_INFO // rev // since VISTA
#define AFD_SQM 69 // in: AFD_SQM_INFO // rev // since WIN7
#define AFD_RIO 70 // in/out: AFD_RIO_COMMAND_HEADER // rev // since WIN8
#define AFD_TRANSFER_BEGIN 71 // in/out: void // rev // since TH1
#define AFD_TRANSFER_END 72 // in/out: void // rev // since TH1
#define AFD_NOTIFY 73 // rev // since 22H2
// private // Note: different bit layout from CTL_CODE
#define FSCTL_AFD_BASE FILE_DEVICE_NETWORK
#define _AFD_CONTROL_CODE(Request, Method) (FSCTL_AFD_BASE << 12 | (Request) << 2 | (Method))
// private // IOCTLs
#define IOCTL_AFD_BIND _AFD_CONTROL_CODE(AFD_BIND, METHOD_NEITHER) // 0x12003
#define IOCTL_AFD_CONNECT _AFD_CONTROL_CODE(AFD_CONNECT, METHOD_NEITHER) // 0x12007
#define IOCTL_AFD_START_LISTEN _AFD_CONTROL_CODE(AFD_START_LISTEN, METHOD_NEITHER) // 0x1200B
#define IOCTL_AFD_WAIT_FOR_LISTEN _AFD_CONTROL_CODE(AFD_WAIT_FOR_LISTEN, METHOD_BUFFERED) // 0x1200C
#define IOCTL_AFD_ACCEPT _AFD_CONTROL_CODE(AFD_ACCEPT, METHOD_BUFFERED) // 0x12010
#define IOCTL_AFD_RECEIVE _AFD_CONTROL_CODE(AFD_RECEIVE, METHOD_NEITHER) // 0x12017
#define IOCTL_AFD_RECEIVE_DATAGRAM _AFD_CONTROL_CODE(AFD_RECEIVE_DATAGRAM, METHOD_NEITHER) // 0x1201B
#define IOCTL_AFD_SEND _AFD_CONTROL_CODE(AFD_SEND, METHOD_NEITHER) // 0x1201F
#define IOCTL_AFD_SEND_DATAGRAM _AFD_CONTROL_CODE(AFD_SEND_DATAGRAM, METHOD_NEITHER) // 0x12023
#define IOCTL_AFD_POLL _AFD_CONTROL_CODE(AFD_POLL, METHOD_BUFFERED) // 0x12024
#define IOCTL_AFD_PARTIAL_DISCONNECT _AFD_CONTROL_CODE(AFD_PARTIAL_DISCONNECT, METHOD_NEITHER) // 0x1202B
#define IOCTL_AFD_GET_ADDRESS _AFD_CONTROL_CODE(AFD_GET_ADDRESS, METHOD_NEITHER) // 0x1202F
#define IOCTL_AFD_QUERY_RECEIVE_INFO _AFD_CONTROL_CODE(AFD_QUERY_RECEIVE_INFO, METHOD_NEITHER) // 0x12033
#define IOCTL_AFD_QUERY_HANDLES _AFD_CONTROL_CODE(AFD_QUERY_HANDLES, METHOD_NEITHER) // 0x12037
#define IOCTL_AFD_SET_INFORMATION _AFD_CONTROL_CODE(AFD_SET_INFORMATION, METHOD_NEITHER) // 0x1203B
#define IOCTL_AFD_GET_REMOTE_ADDRESS _AFD_CONTROL_CODE(AFD_GET_REMOTE_ADDRESS, METHOD_NEITHER) // 0x1203F
#define IOCTL_AFD_GET_CONTEXT _AFD_CONTROL_CODE(AFD_GET_CONTEXT, METHOD_NEITHER) // 0x12043
#define IOCTL_AFD_SET_CONTEXT _AFD_CONTROL_CODE(AFD_SET_CONTEXT, METHOD_NEITHER) // 0x12047
#define IOCTL_AFD_SET_CONNECT_DATA _AFD_CONTROL_CODE(AFD_SET_CONNECT_DATA, METHOD_NEITHER) // 0x1204B
#define IOCTL_AFD_SET_CONNECT_OPTIONS _AFD_CONTROL_CODE(AFD_SET_CONNECT_OPTIONS, METHOD_NEITHER) // 0x1204F
#define IOCTL_AFD_SET_DISCONNECT_DATA _AFD_CONTROL_CODE(AFD_SET_DISCONNECT_DATA, METHOD_NEITHER) // 0x12053
#define IOCTL_AFD_SET_DISCONNECT_OPTIONS _AFD_CONTROL_CODE(AFD_SET_DISCONNECT_OPTIONS, METHOD_NEITHER) // 0x12057
#define IOCTL_AFD_GET_CONNECT_DATA _AFD_CONTROL_CODE(AFD_GET_CONNECT_DATA, METHOD_NEITHER) // 0x1205B
#define IOCTL_AFD_GET_CONNECT_OPTIONS _AFD_CONTROL_CODE(AFD_GET_CONNECT_OPTIONS, METHOD_NEITHER) // 0x1205F
#define IOCTL_AFD_GET_DISCONNECT_DATA _AFD_CONTROL_CODE(AFD_GET_DISCONNECT_DATA, METHOD_NEITHER) // 0x12063
#define IOCTL_AFD_GET_DISCONNECT_OPTIONS _AFD_CONTROL_CODE(AFD_GET_DISCONNECT_OPTIONS, METHOD_NEITHER) // 0x12067
#define IOCTL_AFD_SIZE_CONNECT_DATA _AFD_CONTROL_CODE(AFD_SIZE_CONNECT_DATA, METHOD_NEITHER) // 0x1206B
#define IOCTL_AFD_SIZE_CONNECT_OPTIONS _AFD_CONTROL_CODE(AFD_SIZE_CONNECT_OPTIONS, METHOD_NEITHER) // 0x1206F
#define IOCTL_AFD_SIZE_DISCONNECT_DATA _AFD_CONTROL_CODE(AFD_SIZE_DISCONNECT_DATA, METHOD_NEITHER) // 0x12073
#define IOCTL_AFD_SIZE_DISCONNECT_OPTIONS _AFD_CONTROL_CODE(AFD_SIZE_DISCONNECT_OPTIONS, METHOD_NEITHER) // 0x12077
#define IOCTL_AFD_GET_INFORMATION _AFD_CONTROL_CODE(AFD_GET_INFORMATION, METHOD_NEITHER) // 0x1207B
#define IOCTL_AFD_TRANSMIT_FILE _AFD_CONTROL_CODE(AFD_TRANSMIT_FILE, METHOD_NEITHER) // 0x1207F
#define IOCTL_AFD_SUPER_ACCEPT _AFD_CONTROL_CODE(AFD_SUPER_ACCEPT, METHOD_NEITHER) // 0x12083
#define IOCTL_AFD_EVENT_SELECT _AFD_CONTROL_CODE(AFD_EVENT_SELECT, METHOD_NEITHER) // 0x12087
#define IOCTL_AFD_ENUM_NETWORK_EVENTS _AFD_CONTROL_CODE(AFD_ENUM_NETWORK_EVENTS, METHOD_NEITHER) // 0x1208B
#define IOCTL_AFD_DEFER_ACCEPT _AFD_CONTROL_CODE(AFD_DEFER_ACCEPT, METHOD_BUFFERED) // 0x1208C
#define IOCTL_AFD_WAIT_FOR_LISTEN_LIFO _AFD_CONTROL_CODE(AFD_WAIT_FOR_LISTEN_LIFO, METHOD_BUFFERED) // 0x12090
#define IOCTL_AFD_SET_QOS _AFD_CONTROL_CODE(AFD_SET_QOS, METHOD_BUFFERED) // 0x12094
#define IOCTL_AFD_GET_QOS _AFD_CONTROL_CODE(AFD_GET_QOS, METHOD_BUFFERED) // 0x12098
#define IOCTL_AFD_NO_OPERATION _AFD_CONTROL_CODE(AFD_NO_OPERATION, METHOD_NEITHER) // 0x1209F
#define IOCTL_AFD_VALIDATE_GROUP _AFD_CONTROL_CODE(AFD_VALIDATE_GROUP, METHOD_BUFFERED) // 0x120A0
#define IOCTL_AFD_GET_UNACCEPTED_CONNECT_DATA _AFD_CONTROL_CODE(AFD_GET_UNACCEPTED_CONNECT_DATA, METHOD_NEITHER) // 0x120A7
#define IOCTL_AFD_ROUTING_INTERFACE_QUERY _AFD_CONTROL_CODE(AFD_ROUTING_INTERFACE_QUERY, METHOD_NEITHER) // 0x120AB
#define IOCTL_AFD_ROUTING_INTERFACE_CHANGE _AFD_CONTROL_CODE(AFD_ROUTING_INTERFACE_CHANGE, METHOD_BUFFERED) // 0x120AC
#define IOCTL_AFD_ADDRESS_LIST_QUERY _AFD_CONTROL_CODE(AFD_ADDRESS_LIST_QUERY, METHOD_NEITHER) // 0x120B3
#define IOCTL_AFD_ADDRESS_LIST_CHANGE _AFD_CONTROL_CODE(AFD_ADDRESS_LIST_CHANGE, METHOD_BUFFERED) // 0x120B4
#define IOCTL_AFD_JOIN_LEAF _AFD_CONTROL_CODE(AFD_JOIN_LEAF, METHOD_NEITHER) // 0x120BB
#define IOCTL_AFD_TRANSPORT_IOCTL _AFD_CONTROL_CODE(AFD_TRANSPORT_IOCTL, METHOD_NEITHER) // 0x120BF
#define IOCTL_AFD_TRANSMIT_PACKETS _AFD_CONTROL_CODE(AFD_TRANSMIT_PACKETS, METHOD_NEITHER) // 0x120C3
#define IOCTL_AFD_SUPER_CONNECT _AFD_CONTROL_CODE(AFD_SUPER_CONNECT, METHOD_NEITHER) // 0x120C7
#define IOCTL_AFD_SUPER_DISCONNECT _AFD_CONTROL_CODE(AFD_SUPER_DISCONNECT, METHOD_NEITHER) // 0x120CB
#define IOCTL_AFD_RECEIVE_MESSAGE _AFD_CONTROL_CODE(AFD_RECEIVE_MESSAGE, METHOD_NEITHER) // 0x120CF
#define IOCTL_AFD_SEND_MESSAGE _AFD_CONTROL_CODE(AFD_SEND_MESSAGE, METHOD_NEITHER) // 0x120D3 // rev // since VISTA
#define IOCTL_AFD_SWITCH_CEMENT_SAN _AFD_CONTROL_CODE(AFD_SWITCH_CEMENT_SAN, METHOD_NEITHER) // 0x120D7
#define IOCTL_AFD_SWITCH_SET_EVENTS _AFD_CONTROL_CODE(AFD_SWITCH_SET_EVENTS, METHOD_NEITHER) // 0x120DB
#define IOCTL_AFD_SWITCH_RESET_EVENTS _AFD_CONTROL_CODE(AFD_SWITCH_RESET_EVENTS, METHOD_NEITHER) // 0x120DF
#define IOCTL_AFD_SWITCH_CONNECT_IND _AFD_CONTROL_CODE(AFD_SWITCH_CONNECT_IND, METHOD_OUT_DIRECT) // 0x120E2
#define IOCTL_AFD_SWITCH_CMPL_ACCEPT _AFD_CONTROL_CODE(AFD_SWITCH_CMPL_ACCEPT, METHOD_NEITHER) // 0x120E7
#define IOCTL_AFD_SWITCH_CMPL_REQUEST _AFD_CONTROL_CODE(AFD_SWITCH_CMPL_REQUEST, METHOD_NEITHER) // 0x120EB
#define IOCTL_AFD_SWITCH_CMPL_IO _AFD_CONTROL_CODE(AFD_SWITCH_CMPL_IO, METHOD_NEITHER) // 0x120EF
#define IOCTL_AFD_SWITCH_REFRESH_ENDP _AFD_CONTROL_CODE(AFD_SWITCH_REFRESH_ENDP, METHOD_NEITHER) // 0x120F3
#define IOCTL_AFD_SWITCH_GET_PHYSICAL_ADDR _AFD_CONTROL_CODE(AFD_SWITCH_GET_PHYSICAL_ADDR, METHOD_NEITHER) // 0x120F7
#define IOCTL_AFD_SWITCH_ACQUIRE_CTX _AFD_CONTROL_CODE(AFD_SWITCH_ACQUIRE_CTX, METHOD_NEITHER) // 0x120FB
#define IOCTL_AFD_SWITCH_TRANSFER_CTX _AFD_CONTROL_CODE(AFD_SWITCH_TRANSFER_CTX, METHOD_NEITHER) // 0x120FF
#define IOCTL_AFD_SWITCH_GET_SERVICE_PID _AFD_CONTROL_CODE(AFD_SWITCH_GET_SERVICE_PID, METHOD_NEITHER) // 0x12103
#define IOCTL_AFD_SWITCH_SET_SERVICE_PROCESS _AFD_CONTROL_CODE(AFD_SWITCH_SET_SERVICE_PROCESS, METHOD_NEITHER) // 0x12107
#define IOCTL_AFD_SWITCH_PROVIDER_CHANGE _AFD_CONTROL_CODE(AFD_SWITCH_PROVIDER_CHANGE, METHOD_NEITHER) // 0x1210B
#define IOCTL_AFD_SWITCH_ADDRLIST_CHANGE _AFD_CONTROL_CODE(AFD_SWITCH_ADDRLIST_CHANGE, METHOD_BUFFERED) // 0x1210C
#define IOCTL_AFD_UNBIND _AFD_CONTROL_CODE(AFD_UNBIND, METHOD_NEITHER) // 0x12113 // rev
#define IOCTL_AFD_SQM _AFD_CONTROL_CODE(AFD_SQM, METHOD_NEITHER) // 0x12117 // rev // since WIN7
#define IOCTL_AFD_RIO _AFD_CONTROL_CODE(AFD_RIO, METHOD_NEITHER) // 0x1211B // rev // since WIN8
#define IOCTL_AFD_TRANSFER_BEGIN _AFD_CONTROL_CODE(AFD_TRANSFER_BEGIN, METHOD_NEITHER) // 0x1211F // rev // since TH1
#define IOCTL_AFD_TRANSFER_END _AFD_CONTROL_CODE(AFD_TRANSFER_END, METHOD_NEITHER) // 0x12123 // rev
#define IOCTL_AFD_NOTIFY _AFD_CONTROL_CODE(AFD_NOTIFY, METHOD_NEITHER) // 0x12127 // rev // since 22H2
#include <pshpack1.h>
// rev - a union for TLI/TDI socket addresses
typedef union _AFD_ADDRESS
{
SOCKADDR_STORAGE TliAddress;
TDI_ADDRESS_INFO TdiAddress;
struct
{
//
// TDI_ADDRESS_INFO includes an embedded socket address that starts at AddressType (which corresponds to sa_family).
//
// ---------------- | ------------------------- |
// | ULONG ActivityCount |
// | ------------------------- | --------------------- |
// | | ULONG TAAddressCount |
// | | --------------------- | ---------------------------- |
// | | | USHORT AddressLength |
// TDI_ADDRESS_INFO | TRANSPORT_ADDRESS Address | | ---------------------------- | ---------- | ---------------- |
// | | TA_ADDRESS Address[1] | USHORT AddressType | | USHORT sa_family |
// | | | ---------------------------- | SOCKADDR | ---------------- |
// | | | UCHAR Address[AddressLength] | (embedded) | ... |
// | | | ... | | |
// ---------------- | ------------------------- | --------------------- | ---------------------------- | ---------- | ---------------- |
//
UCHAR Padding[10]; // RTL_SIZEOF_THROUGH_FIELD(TDI_ADDRESS_INFO, Address.Address[0].AddressLength)
SOCKADDR_STORAGE EmbeddedAddress;
} TdiAddressUnpacked;
} AFD_ADDRESS, *PAFD_ADDRESS;
#include <poppack.h>
// private // Bind share access
#define AFD_NORMALADDRUSE 0
#define AFD_REUSEADDRESS 1
#define AFD_WILDCARDADDRESS 2
#define AFD_EXCLUSIVEADDRUSE 3
// private
typedef struct _AFD_BIND_INFO
{
ULONG ShareAccess;
TRANSPORT_ADDRESS Address;
} AFD_BIND_INFO, *PAFD_BIND_INFO;
// private
typedef struct _AFD_BIND_INFO_TL
{
ULONG ShareAccess;
SOCKADDR Address;
} AFD_BIND_INFO_TL, *PAFD_BIND_INFO_TL;
// private
typedef struct _AFD_CONNECT_JOIN_INFO
{
BOOLEAN SanActive;
HANDLE RootEndpoint;
HANDLE ConnectEndpoint;
TRANSPORT_ADDRESS RemoteAddress;
} AFD_CONNECT_JOIN_INFO, *PAFD_CONNECT_JOIN_INFO;
// private
typedef struct _AFD_CONNECT_JOIN_INFO_TL
{
BOOLEAN SanActive;
HANDLE RootEndpoint;
HANDLE ConnectEndpoint;
SOCKADDR RemoteAddress;
} AFD_CONNECT_JOIN_INFO_TL, *PAFD_CONNECT_JOIN_INFO_TL;
// private
typedef struct _AFD_LISTEN_INFO
{
BOOLEAN SanActive;
ULONG MaximumConnectionQueue;
BOOLEAN UseDelayedAcceptance;
} AFD_LISTEN_INFO, *PAFD_LISTEN_INFO;
// private
typedef struct _AFD_LISTEN_RESPONSE_INFO
{
LONG Sequence;
TRANSPORT_ADDRESS RemoteAddress;
} AFD_LISTEN_RESPONSE_INFO, *PAFD_LISTEN_RESPONSE_INFO;
// private
typedef struct _AFD_LISTEN_RESPONSE_INFO_TL
{
LONG Sequence;
SOCKADDR RemoteAddress;
} AFD_LISTEN_RESPONSE_INFO_TL, *PAFD_LISTEN_RESPONSE_INFO_TL;
// private
typedef struct _AFD_ACCEPT_INFO
{
BOOLEAN SanActive;
LONG Sequence;
HANDLE AcceptHandle;
} AFD_ACCEPT_INFO, *PAFD_ACCEPT_INFO;
// private // AfdFlags
#define AFD_NO_FAST_IO 0x0001
#define AFD_OVERLAPPED 0x0002
// private
typedef struct _AFD_RECV_INFO
{
_Field_size_(BufferCount) LPWSABUF BufferArray;
ULONG BufferCount;
ULONG AfdFlags;
ULONG TdiFlags; // TDI_RECEIVE_*
} AFD_RECV_INFO, *PAFD_RECV_INFO;
// private
typedef struct _AFD_DATAGRAM_INFO
{
_Field_size_(BufferCount) LPWSABUF BufferArray;
ULONG BufferCount;
ULONG AfdFlags;
ULONG TdiFlags; // TDI_RECEIVE_*
PVOID Address;
PULONG AddressLength;
} AFD_DATAGRAM_INFO, *PAFD_DATAGRAM_INFO;
// private
typedef struct _AFD_SEND_INFO
{
_Field_size_(BufferCount) LPWSABUF BufferArray;
ULONG BufferCount;
ULONG AfdFlags;
ULONG TdiFlags; // TDI_RECEIVE_*
} AFD_SEND_INFO, *PAFD_SEND_INFO;
// private
typedef struct _AFD_SEND_DATAGRAM_INFO
{
_Field_size_(BufferCount) LPWSABUF BufferArray;
ULONG BufferCount;
ULONG AfdFlags;
TDI_REQUEST_SEND_DATAGRAM TdiRequest;
TDI_CONNECTION_INFORMATION TdiConnInfo;
} AFD_SEND_DATAGRAM_INFO, *PAFD_SEND_DATAGRAM_INFO;
// private // Poll event bit numbers
#define AFD_POLL_RECEIVE_BIT 0
#define AFD_POLL_RECEIVE_EXPEDITED_BIT 1
#define AFD_POLL_SEND_BIT 2
#define AFD_POLL_DISCONNECT_BIT 3
#define AFD_POLL_ABORT_BIT 4
#define AFD_POLL_LOCAL_CLOSE_BIT 5
#define AFD_POLL_CONNECT_BIT 6
#define AFD_POLL_ACCEPT_BIT 7
#define AFD_POLL_CONNECT_FAIL_BIT 8
#define AFD_POLL_QOS_BIT 9
#define AFD_POLL_GROUP_QOS_BIT 10
#define AFD_POLL_ROUTING_IF_CHANGE_BIT 11
#define AFD_POLL_ADDRESS_LIST_CHANGE_BIT 12
#define AFD_NUM_POLL_EVENTS 13
// private // Poll event flags
#define AFD_POLL_RECEIVE (1 << AFD_POLL_RECEIVE_BIT) // 0x0001
#define AFD_POLL_RECEIVE_EXPEDITED (1 << AFD_POLL_RECEIVE_EXPEDITED_BIT) // 0x0002
#define AFD_POLL_SEND (1 << AFD_POLL_SEND_BIT) // 0x0004
#define AFD_POLL_DISCONNECT (1 << AFD_POLL_DISCONNECT_BIT) // 0x0008
#define AFD_POLL_ABORT (1 << AFD_POLL_ABORT_BIT) // 0x0010
#define AFD_POLL_LOCAL_CLOSE (1 << AFD_POLL_LOCAL_CLOSE_BIT) // 0x0020
#define AFD_POLL_CONNECT (1 << AFD_POLL_CONNECT_BIT) // 0x0040
#define AFD_POLL_ACCEPT (1 << AFD_POLL_ACCEPT_BIT) // 0x0080
#define AFD_POLL_CONNECT_FAIL (1 << AFD_POLL_CONNECT_FAIL_BIT) // 0x0100
#define AFD_POLL_QOS (1 << AFD_POLL_QOS_BIT) // 0x0200
#define AFD_POLL_GROUP_QOS (1 << AFD_POLL_GROUP_QOS_BIT) // 0x0400
#define AFD_POLL_ROUTING_IF_CHANGE (1 << AFD_POLL_ROUTING_IF_CHANGE_BIT) // 0x0800
#define AFD_POLL_ADDRESS_LIST_CHANGE (1 << AFD_POLL_ADDRESS_LIST_CHANGE_BIT) // 0x1000
#define AFD_POLL_ALL ((1 << AFD_NUM_POLL_EVENTS) - 1) // 0x1FFF
#define AFD_POLL_SANCOUNTS_UPDATED 0x80000000
// private
typedef struct _AFD_POLL_HANDLE_INFO
{
HANDLE Handle;
ULONG PollEvents; // AFD_POLL_*
NTSTATUS Status;
} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO;
// private
typedef struct _AFD_POLL_INFO
{
LARGE_INTEGER Timeout;
ULONG NumberOfHandles;
BOOLEAN Unique;
_Field_size_(NumberOfHandles) AFD_POLL_HANDLE_INFO Handles[ANYSIZE_ARRAY];
} AFD_POLL_INFO, *PAFD_POLL_INFO;
// private // Disconnect flags
#define AFD_PARTIAL_DISCONNECT_SEND 0x01
#define AFD_PARTIAL_DISCONNECT_RECEIVE 0x02
#define AFD_ABORTIVE_DISCONNECT 0x04
#define AFD_UNCONNECT_DATAGRAM 0x08
// private
typedef struct _AFD_PARTIAL_DISCONNECT_INFO
{
ULONG DisconnectMode;
LARGE_INTEGER Timeout;
} AFD_PARTIAL_DISCONNECT_INFO, *PAFD_PARTIAL_DISCONNECT_INFO;
// private
typedef struct _AFD_RECEIVE_INFORMATION
{
ULONG BytesAvailable;
ULONG ExpeditedBytesAvailable;
} AFD_RECEIVE_INFORMATION, *PAFD_RECEIVE_INFORMATION;
// private // Handle query flags
#define AFD_QUERY_ADDRESS_HANDLE 0x01
#define AFD_QUERY_CONNECTION_HANDLE 0x02
// private
typedef struct _AFD_HANDLE_INFO
{
HANDLE TdiAddressHandle;
HANDLE TdiConnectionHandle;
} AFD_HANDLE_INFO, *PAFD_HANDLE_INFO;
// private // InformationType
#define AFD_INLINE_MODE 1 // s: BOOLEAN
#define AFD_NONBLOCKING_MODE 2 // s: BOOLEAN
#define AFD_MAX_SEND_SIZE 3 // q: ULONG
#define AFD_SENDS_PENDING 4 // q: ULONG
#define AFD_MAX_PATH_SEND_SIZE 5 // q: ULONG
#define AFD_RECEIVE_WINDOW_SIZE 6 // q; s: ULONG
#define AFD_SEND_WINDOW_SIZE 7 // q; s: ULONG
#define AFD_CONNECT_TIME 8 // q: ULONG (in seconds)
#define AFD_CIRCULAR_QUEUEING 9 // s: BOOLEAN
#define AFD_GROUP_ID_AND_TYPE 10 // q: AFD_GROUP_INFO
#define AFD_REPORT_PORT_UNREACHABLE 11 // s: BOOLEAN
#define AFD_REPORT_NETWORK_UNREACHABLE 12 // s: BOOLEAN // rev
#define AFD_DELIVERY_STATUS 14 // q: SIO_DELIVERY_STATUS // rev
#define AFD_CANCEL_TL 15 // s: void // rev
// private
typedef enum _AFD_GROUP_TYPE
{
GroupTypeNeither = 0,
GroupTypeUnconstrained = SG_UNCONSTRAINED_GROUP,
GroupTypeConstrained = SG_CONSTRAINED_GROUP,
} AFD_GROUP_TYPE, *PAFD_GROUP_TYPE;
// private
typedef struct _AFD_GROUP_INFO
{
GROUP GroupID;
AFD_GROUP_TYPE GroupType;
} AFD_GROUP_INFO, *PAFD_GROUP_INFO;
// private
typedef struct _SIO_DELIVERY_STATUS
{
BOOLEAN DeliveryAvailable;
ULONG PendedReceiveRequests;
} SIO_DELIVERY_STATUS, *PSIO_DELIVERY_STATUS;
// private
typedef struct _AFD_INFORMATION
{
ULONG InformationType;
union
{
BOOLEAN Boolean;
ULONG Ulong;
LARGE_INTEGER LargeInteger;
AFD_GROUP_INFO GroupInfo; // rev
SIO_DELIVERY_STATUS DeliveryStatus; // rev
} Information;
} AFD_INFORMATION, *PAFD_INFORMATION;
// private
typedef enum _SOCKET_STATE
{
SocketStateInitializing = -1,
SocketStateOpen = 0,
SocketStateBound = 1,
SocketStateBoundSpecific = 2,
SocketStateConnected = 3,
SocketStateClosing = 4,
} SOCKET_STATE, *PSOCKET_STATE;
// private
typedef struct _SOCK_SHARED_INFO
{
SOCKET_STATE State;
LONG AddressFamily; // AF_*
LONG SocketType; // SOCK_*
LONG Protocol; // IPPROTO_*, BTHPROTO_*, HV_PROTOCOL_*, etc.
LONG LocalAddressLength;
LONG RemoteAddressLength;
LINGER LingerInfo;
ULONG SendTimeout; // in milliseconds
ULONG ReceiveTimeout; // in milliseconds
ULONG ReceiveBufferSize;
ULONG SendBufferSize;
union
{
USHORT Flags;
struct
{
USHORT Listening : 1;
USHORT Broadcast : 1;
USHORT Debug : 1;
USHORT OobInline : 1;
USHORT ReuseAddresses : 1;
USHORT ExclusiveAddressUse : 1;
USHORT NonBlocking : 1;
USHORT DontUseWildcard : 1;
USHORT ReceiveShutdown : 1;
USHORT SendShutdown : 1;
USHORT ConditionalAccept : 1;
USHORT IsSANSocket : 1;
USHORT fIsTLI : 1;
USHORT Rio : 1;
USHORT ReceiveBufferSizeSet : 1;
USHORT SendBufferSizeSet : 1;
};
};
ULONG CreationFlags; // WSA_FLAG_*
ULONG CatalogEntryId;
ULONG ServiceFlags1; // XP1_*
ULONG ProviderFlags; // PFL_*
GROUP GroupID;
AFD_GROUP_TYPE GroupType;
LONG GroupPriority;
LONG LastError;
union
{
HWND AsyncSelecthWnd;
ULONGLONG AsyncSelectWnd64;
};
ULONG AsyncSelectSerialNumber;
ULONG AsyncSelectwMsg;
LONG AsyncSelectlEvent;
LONG DisabledAsyncSelectEvents;
GUID ProviderId;
} SOCK_SHARED_INFO, *PSOCK_SHARED_INFO;
// private
typedef struct _AFD_UNACCEPTED_CONNECT_DATA_INFO
{
LONG Sequence;
ULONG ConnectDataLength;
BOOLEAN LengthOnly;
} AFD_UNACCEPTED_CONNECT_DATA_INFO, *PAFD_UNACCEPTED_CONNECT_DATA_INFO;
// private // Transmit flags
#define AFD_TF_DISCONNECT 0x01
#define AFD_TF_REUSE_SOCKET 0x02
#define AFD_TF_WRITE_BEHIND 0x04
#define AFD_TF_USE_DEFAULT_WORKER 0x00
#define AFD_TF_USE_SYSTEM_THREAD 0x10
#define AFD_TF_USE_KERNEL_APC 0x20
#define AFD_TF_WORKER_KIND_MASK 0x30
// private
typedef struct _AFD_TRANSMIT_FILE_INFO
{
LARGE_INTEGER Offset;
LARGE_INTEGER WriteLength;
ULONG SendPacketLength;
HANDLE FileHandle;
PVOID Head;
ULONG HeadLength;
PVOID Tail;
ULONG TailLength;
ULONG Flags; // AFD_TF_*
} AFD_TRANSMIT_FILE_INFO, *PAFD_TRANSMIT_FILE_INFO;
// private
typedef struct _AFD_SUPER_ACCEPT_INFO
{
BOOLEAN SanActive;
BOOLEAN FixAddressAlignment;
HANDLE AcceptHandle;
ULONG ReceiveDataLength;
ULONG LocalAddressLength;
ULONG RemoteAddressLength;
} AFD_SUPER_ACCEPT_INFO, *PAFD_SUPER_ACCEPT_INFO;
// private
typedef struct _AFD_EVENT_SELECT_INFO
{
HANDLE Event;
ULONG PollEvents; // AFD_POLL_*
} AFD_EVENT_SELECT_INFO, *PAFD_EVENT_SELECT_INFO;
// private
typedef struct _AFD_ENUM_NETWORK_EVENTS_INFO
{
ULONG PollEvents; // AFD_POLL_*
NTSTATUS EventStatus[AFD_NUM_POLL_EVENTS];
} AFD_ENUM_NETWORK_EVENTS_INFO, *PAFD_ENUM_NETWORK_EVENTS_INFO;
// private
typedef struct _AFD_DEFER_ACCEPT_INFO
{
LONG Sequence;
BOOLEAN Reject;
} AFD_DEFER_ACCEPT_INFO, *PAFD_DEFER_ACCEPT_INFO;
// private
typedef struct _AFD_QOS_INFO
{
QOS Qos;
BOOLEAN GroupQos;
} AFD_QOS_INFO, *PAFD_QOS_INFO;
// private
typedef struct _AFD_VALIDATE_GROUP_INFO
{
GROUP GroupID;
TRANSPORT_ADDRESS RemoteAddress;
} AFD_VALIDATE_GROUP_INFO, *PAFD_VALIDATE_GROUP_INFO;
// private
typedef struct _AFD_TRANSPORT_IOCTL_INFO
{
HANDLE Handle;
_Field_size_bytes_(InputBufferLength) PVOID InputBuffer;
ULONG InputBufferLength;
ULONG IoControlCode;
ULONG AfdFlags;
ULONG PollEvent;
} AFD_TRANSPORT_IOCTL_INFO, *PAFD_TRANSPORT_IOCTL_INFO;
// rev - HV_PROTOCOL_RAW-level option in addition to ones in hvsocket.h
#define HVSOCKET_CONTAINER_PASSTHRU 0x02 // q: ULONG
// private
typedef enum TL_IO_CONTROL_TYPE
{
TlEndpointIoControlType = 0, // not supported
TlSetSockOptIoControlType = 1, // setsockopt
TlGetSockOptIoControlType = 2, // getsockopt
TlSocketIoControlType = 3, // ioctlsocket // Level must be 0
} TL_IO_CONTROL_TYPE, *PTL_IO_CONTROL_TYPE;
// private
typedef struct _AFD_TL_IO_CONTROL_INFO
{
TL_IO_CONTROL_TYPE Type;
ULONG Level; // SOL_* or IPPROTO_* or HV_PROTOCOL_RAW
ULONG IoControlCode; // SIO_*, SO_*, IP_*, IPV6_*, TCP_*, UDP_*, HVSOCKET_*, etc. (depending on type and level)
BOOLEAN EndpointIoctl; // must be TRUE
_Field_size_bytes_(InputBufferLength) PVOID InputBuffer;
SIZE_T InputBufferLength;
} AFD_TL_IO_CONTROL_INFO, *PAFD_TL_IO_CONTROL_INFO;
// private
typedef struct _AFD_TPACKETS_INFO
{
_Field_size_(ElementCount) PTRANSMIT_PACKETS_ELEMENT ElementArray;
ULONG ElementCount;
ULONG SendSize;
ULONG Flags;
} AFD_TPACKETS_INFO, *PAFD_TPACKETS_INFO;
// private
typedef struct _AFD_SUPER_CONNECT_INFO
{
BOOLEAN SanActive;
TRANSPORT_ADDRESS RemoteAddress;
} AFD_SUPER_CONNECT_INFO, *PAFD_SUPER_CONNECT_INFO;
// rev
typedef struct _AFD_SUPER_CONNECT_INFO_TL
{
BOOLEAN SanActive;
SOCKADDR RemoteAddress;
} AFD_SUPER_CONNECT_INFO_TL, *PAFD_SUPER_CONNECT_INFO_TL;
// private
typedef struct _AFD_SUPER_DISCONNECT_INFO
{
ULONG Flags; // same as partial disconnect
} AFD_SUPER_DISCONNECT_INFO, *PAFD_SUPER_DISCONNECT_INFO;
// private
typedef struct _AFD_MESSAGE_INFO
{
AFD_DATAGRAM_INFO dgi;
_Field_size_bytes_(ControlLength) PVOID ControlBuffer;
PULONG ControlLength;
PULONG MsgFlags;
} AFD_MESSAGE_INFO, *PAFD_MESSAGE_INFO;
// private
typedef struct _AFD_SWITCH_CONTEXT
{
LONG EventsActive;
LONG RcvCount;
LONG ExpCount;
LONG SndCount;
BOOLEAN SelectFlag;
} AFD_SWITCH_CONTEXT, *PAFD_SWITCH_CONTEXT;
// private
typedef struct _AFD_SWITCH_CONTEXT_INFO
{
HANDLE SocketHandle;
PAFD_SWITCH_CONTEXT SwitchContext;
} AFD_SWITCH_CONTEXT_INFO, *PAFD_SWITCH_CONTEXT_INFO;
// private
typedef struct _AFD_SWITCH_EVENT_INFO
{
HANDLE SocketHandle;
PAFD_SWITCH_CONTEXT SwitchContext;
ULONG EventBit; // AFD_POLL_*_BIT
NTSTATUS Status;
} AFD_SWITCH_EVENT_INFO, *PAFD_SWITCH_EVENT_INFO;
// private
typedef struct _AFD_SWITCH_CONNECT_INFO
{
HANDLE ListenHandle;
PAFD_SWITCH_CONTEXT SwitchContext;
TRANSPORT_ADDRESS RemoteAddress;
} AFD_SWITCH_CONNECT_INFO, *PAFD_SWITCH_CONNECT_INFO;
// private
typedef struct _AFD_SWITCH_ACCEPT_INFO
{
HANDLE AcceptHandle;
ULONG ReceiveLength;
} AFD_SWITCH_ACCEPT_INFO, *PAFD_SWITCH_ACCEPT_INFO;
// private
typedef struct _AFD_SWITCH_REQUEST_INFO
{
HANDLE SocketHandle;
PAFD_SWITCH_CONTEXT SwitchContext;
PVOID RequestContext;
NTSTATUS RequestStatus;
ULONG DataOffset;
} AFD_SWITCH_REQUEST_INFO, *PAFD_SWITCH_REQUEST_INFO;
// private
typedef struct _AFD_SWITCH_ACQUIRE_CTX_INFO
{
HANDLE SocketHandle;
PAFD_SWITCH_CONTEXT SwitchContext;
PVOID SocketCtxBuf;
ULONG SocketCtxBufSize;
} AFD_SWITCH_ACQUIRE_CTX_INFO, *PAFD_SWITCH_ACQUIRE_CTX_INFO;
// private
typedef struct _AFD_SWITCH_TRANSFER_CTX_INFO
{
HANDLE SocketHandle;
PAFD_SWITCH_CONTEXT SwitchContext;
PVOID RequestContext;
PVOID SocketCtxBuf;
ULONG SocketCtxBufSize;
_Field_size_(RcvBufferCount) LPWSABUF RcvBufferArray;
ULONG RcvBufferCount;
NTSTATUS Status;
} AFD_SWITCH_TRANSFER_CTX_INFO, *PAFD_SWITCH_TRANSFER_CTX_INFO;
// private
typedef struct _AFD_UNBIND_INFO
{
LONG AddressFamily; // AF_*
LONG Protocol; // IPPROTO_*, BTHPROTO_*, HV_PROTOCOL_*, etc.
} AFD_UNBIND_INFO, *PAFD_UNBIND_INFO;
// rev // SQM Control Codes
#define AFD_SQM_CONTROL_CODE_STORE 1
#define AFD_SQM_CONTROL_CODE_SWEEP -1
// private
typedef struct _AFD_SQM_CONTROL
{
ULONG Code; // AFD_SQM_CONTROL_CODE_*
} AFD_SQM_CONTROL, *PAFD_SQM_CONTROL;
// private
typedef struct _WINSOCK_SQM_SOCKTYPE_DESC
{
ULONG StreamTCP : 1;
ULONG StreamOther : 1;
ULONG DatagramUDP : 1;
ULONG DatagramUDPMulticast : 1;
ULONG DatagramOther : 1;
ULONG RawTCP : 1;
ULONG RawUDP : 1;
ULONG RawOther : 1;
ULONG OtherSocketTypes : 1;
ULONG IPv6Socket : 1;
ULONG ProviderLoadedWSD : 1;
ULONG ProviderLoadedLSP : 1;
ULONG ProviderLoadedMultiLSP : 1;
ULONG NonMswsockBSP : 1;
} WINSOCK_SQM_SOCKTYPE_DESC, *PWINSOCK_SQM_SOCKTYPE_DESC;
// private
typedef struct _WINSOCK_SQM_SOCKTYPE_COUNTS
{
ULONG MaxStreamSocketsConn;
ULONG MaxStreamSocketsListen;
ULONG MaxDatagramSockets;
ULONG MaxRawSockets;
ULONG MaxOtherSockets;
} WINSOCK_SQM_SOCKTYPE_COUNTS, *PWINSOCK_SQM_SOCKTYPE_COUNTS;
// private
typedef struct _WINSOCK_SQM_NONCORE_FUNC
{
ULONG Select : 1;
ULONG WSAPoll : 1;
ULONG StreamWSAEventSelect : 1;
ULONG StreamWSAAsyncSelect : 1;
ULONG TransmitFile : 1;
ULONG StreamTransmitPackets : 1;
ULONG DisconnectEx : 1;
ULONG SocketReuse : 1;
ULONG StreamDuplicateSocket : 1;
ULONG ReadWriteFile : 1;
ULONG OOBSendRecv : 1;
ULONG StreamSoSndTimeO : 1;
ULONG StreamSoRcvTimeO : 1;
ULONG MsgWaitAll : 1;
ULONG StreamNonCoreSOLOptions : 1;
ULONG StreamNonCoreTCPOptions : 1;
ULONG StreamNonCoreIPOptions : 1;
ULONG StreamNonCoreOtherOptions : 1;
ULONG StreamNonCoreIOCTLs : 1;
ULONG StreamNonCoreWSASocket : 1;
ULONG NonCoreRecv : 1;
ULONG NonCoreSend : 1;
ULONG StreamNonCoreWSAIoctl : 1;
ULONG NonCoreWSAAccept : 1;
ULONG StreamNonCoreWSAConnect : 1;
ULONG StreamWSAJoinLeaf : 1;
ULONG StreamWSAGetQoSByName : 1;
ULONG WSASendDisconnect : 1;
ULONG WSARecvDisconnect : 1;
} WINSOCK_SQM_NONCORE_FUNC, *PWINSOCK_SQM_NONCORE_FUNC;
// private
typedef struct _WINSOCK_SQM_DEPRECATION_LIST
{
ULONG bEnumProtocols : 1;
ULONG bGetNameByType : 1;
ULONG bGetService : 1;
ULONG bGetTypeByName : 1;
ULONG bSetService : 1;
ULONG bWSACancelBlockingCall : 1;
ULONG bWSAIsBlocking : 1;
ULONG bWSASetBlockingHook : 1;
ULONG bWSAUnhookBlockingHook : 1;
ULONG bGetAddressByName : 1;
ULONG bGetHostByAddr : 1;
ULONG bGetHostByName : 1;
ULONG bGetHostName : 1;
ULONG bGetProtoByName : 1;
ULONG bGetProtoByNumber : 1;
ULONG bGetServByName : 1;
ULONG bGetServByPort : 1;
ULONG bInetAddr : 1;
ULONG bInetNtoa : 1;
ULONG bWSAAsyncGetHostByAddr : 1;
ULONG bWSAAsyncGetHostByName : 1;
ULONG bWSAAsyncGetProtoByName : 1;
ULONG bWSAAsyncGetProtoByNumber : 1;
ULONG bWSAAsyncGetServByName : 1;
ULONG bWSAAsyncGetServByPort : 1;
ULONG bWSACancelAsyncRequest : 1;
ULONG bWSARecvEx : 1;
} WINSOCK_SQM_DEPRECATION_LIST, *PWINSOCK_SQM_DEPRECATION_LIST;
// private
typedef struct _WINSOCK_SQM_SOCK_OPTIONS
{
ULONG SoSndBuf : 1;
ULONG SoRcvBuf : 1;
ULONG SoSndBuf0 : 1;
ULONG SoRcvBuf0 : 1;
ULONG SoKeepAliveOn : 1;
ULONG SoReuseAddrOn : 1;
ULONG SoExclusiveAddrUseOn : 1;
ULONG SoLingerOn : 1;
ULONG SoLingerOn0 : 1;
ULONG SoRandomizePortOn : 1;
ULONG SoPortScaleOn : 1;
ULONG SoCondAcceptOn : 1;
ULONG SoOobInlineOn : 1;
ULONG SoOther : 1;
ULONG TCPNoDelayOn : 1;
ULONG TCPOther : 1;
ULONG IPV6V6OnlyOff : 1;
ULONG IPV6ProtectLevel : 1;
ULONG IPOther : 1;
ULONG LevelOther : 1;
ULONG ISBQuery : 1;
ULONG ISBNotify : 1;
ULONG AddressQuery : 1;
ULONG AddressNotify : 1;
ULONG RouteQuery : 1;
ULONG RouteNotify : 1;
ULONG FionbioOn : 1;
ULONG Fionread : 1;
ULONG Siocatmark : 1;
ULONG Siokeepalivevals : 1;
ULONG Siosetcompatmode : 1;
ULONG Sioportreserve : 1;
} WINSOCK_SQM_SOCK_OPTIONS, *PWINSOCK_SQM_SOCK_OPTIONS;
// private
typedef struct _WINSOCK_SQM_MISC_BEHAVIOR
{
ULONG SendEverPended : 1;
ULONG RecvEverPended : 1;
ULONG ShutdownSend : 1;
ULONG ShutdownRecv : 1;
ULONG WSASocketProtocol : 1;
} WINSOCK_SQM_MISC_BEHAVIOR, *PWINSOCK_SQM_MISC_BEHAVIOR;
// private
typedef struct _AFD_SQM_INFO
{
AFD_SQM_CONTROL Control;
WCHAR AppName[16];
WCHAR LSPName[16];
ULONG AppVersion;
WINSOCK_SQM_SOCKTYPE_DESC SocketTypeDescriptor;
WINSOCK_SQM_SOCKTYPE_COUNTS SocketTypeCounts;
WINSOCK_SQM_NONCORE_FUNC NonCoreFunctions;
WINSOCK_SQM_DEPRECATION_LIST DeprecationList;
WINSOCK_SQM_SOCK_OPTIONS SocketOptions;
WINSOCK_SQM_MISC_BEHAVIOR MiscBehavior;
} AFD_SQM_INFO, *PAFD_SQM_INFO;
// private
typedef enum _AFD_RIO_COMMAND
{
AfdRioCommandIdCreateCq = 0, // in: AFD_RIO_COMMAND_CREATE_CQ; out: AFD_RIO_COMMAND_CREATE_CQ_RESULT
AfdRioCommandIdDestroyCq = 1, // in: AFD_RIO_COMMAND_DESTROY_CQ
AfdRioCommandIdNotifyCq = 2, // in: AFD_RIO_COMMAND_NOTIFY_CQ
AfdRioCommandIdCreateRqPair = 3, // in: AFD_RIO_COMMAND_CREATE_RQ_PAIR
AfdRioCommandIdRegisterBuffer = 4, // in: AFD_RIO_COMMAND_REGISTER_BUFFER; out: AFD_RIO_COMMAND_REGISTER_BUFFER_RESULT
AfdRioCommandIdDeregisterBuffer = 5, // in: AFD_RIO_COMMAND_DEREGISTER_BUFFER