ReactOS 0.4.16-dev-2206-gc56950d
tdi.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Ancillary Function Driver
4 * FILE: tdihelpers/tdi.c
5 * PURPOSE: Transport Driver Interface functions
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * REVISIONS:
8 * CSH 01/09-2000 Created
9 * 20251021 Moved to tdihelpers since it is used by 2 drivers (AFD, NETIO) now
10 */
11
12#include <afd.h>
13
14#ifdef UNIMPLEMENTED
15#undef UNIMPLEMENTED
16#endif
17
18#include <tdikrnl.h>
19#include <tdiinfo.h>
20
21/* If you want to see the DPRINT() output in your debugger,
22 * remove the following line (or comment it out): */
23#define NDEBUG
24#include <reactos/debug.h>
25
27 PIRP Irp,
42{
44
45 DPRINT("Called\n");
46
47 DPRINT("Irp->UserEvent = %p\n", Irp->UserEvent);
48
50 DPRINT("IoCallDriver: %08x\n", Status);
51
52 if ((Status == STATUS_PENDING) && (Event != NULL)) {
53 DPRINT("Waiting on transport.\n");
57 FALSE,
58 NULL);
59 Status = Iosb->Status;
60 }
61
62 DPRINT("Status (0x%X).\n", Status);
63
64 return Status;
65}
66
67
72 ULONG ShareType,
86{
91
92 DPRINT("Called. DeviceName (%wZ, %u)\n", DeviceName, ShareType);
93
94 /* Determine the share access */
95 if (ShareType != AFD_SHARE_REUSE)
96 {
97 /* Exclusive access */
98 ShareAccess = 0;
99 }
100 else
101 {
102 /* Shared access */
104 }
105
106 InitializeObjectAttributes(&Attr, /* Attribute buffer */
107 DeviceName, /* Device name */
108 OBJ_CASE_INSENSITIVE | /* Attributes */
110 NULL, /* Root directory */
111 NULL); /* Security descriptor */
112 Status = ZwCreateFile(Handle, /* Return file handle */
113 GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, /* Desired access */
114 &Attr, /* Object attributes */
115 &Iosb, /* IO status */
116 0, /* Initial allocation size */
117 FILE_ATTRIBUTE_NORMAL, /* File attributes */
118 ShareAccess, /* Share access */
119 FILE_OPEN_IF, /* Create disposition */
120 0, /* Create options */
121 EaInfo, /* EA buffer */
122 EaLength); /* EA length */
123 if (NT_SUCCESS(Status)) {
124 Status = ObReferenceObjectByHandle(*Handle, /* Handle to open file */
125 GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, /* Access mode */
126 *IoFileObjectType, /* Object type */
127 KernelMode, /* Access mode */
128 (PVOID*)Object, /* Pointer to object */
129 NULL); /* Handle information */
130 if (!NT_SUCCESS(Status)) {
131 DPRINT("ObReferenceObjectByHandle() failed with status (0x%X).\n", Status);
132 ZwClose(*Handle);
133 } else {
134 DPRINT("Got handle (%p) Object (%p)\n", *Handle, *Object);
135 }
136 } else {
137 DPRINT("ZwCreateFile() failed with status (0x%X)\n", Status);
138 }
139
140 if (!NT_SUCCESS(Status)) {
142 *Object = NULL;
143 }
144
145 return Status;
146}
147
151 ULONG ShareType,
152 PHANDLE AddressHandle,
153 PFILE_OBJECT *AddressObject)
164{
169
170 DPRINT("Called. DeviceName (%wZ) Name (%p)\n", DeviceName, Name);
171
172 /* EaName must be 0-terminated, even though TDI_TRANSPORT_ADDRESS_LENGTH does *not* include the 0 */
177 EaLength,
179 if (!EaInfo)
181
182 RtlZeroMemory(EaInfo, EaLength);
184 /* Don't copy the terminating 0; we have already zeroed it */
185 RtlCopyMemory(EaInfo->EaName,
188 EaInfo->EaValueLength = sizeof(TA_IP_ADDRESS);
189 Address =
190 (PTRANSPORT_ADDRESS)(EaInfo->EaName + TDI_TRANSPORT_ADDRESS_LENGTH + 1); /* 0-terminated */
192
194 EaLength,
195 EaInfo,
196 ShareType,
197 AddressHandle,
198 AddressObject);
200 return Status;
201}
202
205 PUINT MaxDatagramLength)
206{
207 PMDL Mdl;
210
212 sizeof(TDI_MAX_DATAGRAM_INFO),
214
215 if (!Buffer) return STATUS_NO_MEMORY;
216
218 if (!Mdl)
219 {
221 return STATUS_NO_MEMORY;
222 }
223
225 {
227 }
229 {
231 }
232 _SEH2_END;
233
234 if (!NT_SUCCESS(Status))
235 {
236 DPRINT("Failed to lock pages\n");
237 IoFreeMdl(Mdl);
239 return Status;
240 }
241
244 Mdl);
245 if (!NT_SUCCESS(Status))
246 {
248 return Status;
249 }
250
251 *MaxDatagramLength = Buffer->MaxDatagramSize;
252
254
255 return STATUS_SUCCESS;
256}
257
261 PFILE_OBJECT *ConnectionObject)
271{
273 PVOID *ContextArea;
276
277 DPRINT("Called. DeviceName (%wZ)\n", DeviceName);
278
279 /* EaName must be 0-terminated, even though TDI_TRANSPORT_ADDRESS_LENGTH does *not* include the 0 */
282 sizeof(PVOID) + 1;
283
285 EaLength,
287 if (!EaInfo)
289
290 RtlZeroMemory(EaInfo, EaLength);
292 /* Don't copy the terminating 0; we have already zeroed it */
293 RtlCopyMemory(EaInfo->EaName,
296 EaInfo->EaValueLength = sizeof(PVOID);
297 ContextArea = (PVOID*)(EaInfo->EaName + TDI_CONNECTION_CONTEXT_LENGTH + 1); /* 0-terminated */
298 /* FIXME: Allocate context area */
299 *ContextArea = NULL;
301 EaLength,
302 EaInfo,
305 ConnectionObject);
307 return Status;
308}
309
310
312 PIRP *Irp,
313 PFILE_OBJECT ConnectionObject,
314 PTDI_CONNECTION_INFORMATION ConnectionCallInfo,
315 PTDI_CONNECTION_INFORMATION ConnectionReturnInfo,
326{
328
329 DPRINT("Called\n");
330
331 if (!ConnectionObject) {
332 DPRINT("Bad connection object.\n");
334 }
335
336 DeviceObject = IoGetRelatedDeviceObject(ConnectionObject);
337 if (!DeviceObject) {
338 DPRINT("Bad device object.\n");
340 }
341
344 ConnectionObject,
345 NULL,
346 NULL);
347 if (!*Irp) {
349 }
350
353 ConnectionObject,
356 NULL,
357 ConnectionCallInfo,
358 ConnectionReturnInfo);
359
361
362 return STATUS_PENDING;
363}
364
365
367 HANDLE AddressHandle,
368 PFILE_OBJECT ConnectionObject)
377{
381 PIRP Irp;
382
383 DPRINT("Called. AddressHandle (%p) ConnectionObject (%p)\n", AddressHandle, ConnectionObject);
384
385 if (!ConnectionObject) {
386 DPRINT("Bad connection object.\n");
388 }
389
390 DeviceObject = IoGetRelatedDeviceObject(ConnectionObject);
391 if (!DeviceObject) {
392 DPRINT("Bad device object.\n");
394 }
395
397
400 ConnectionObject,
401 &Event,
402 &Iosb);
403 if (!Irp)
405
408 ConnectionObject,
409 NULL,
410 NULL,
411 AddressHandle);
412
413 return TdiCall(Irp, DeviceObject, &Event, &Iosb);
414}
415
417 PFILE_OBJECT ConnectionObject)
425{
429 PIRP Irp;
430
431 DPRINT("Called. ConnectionObject (%p)\n", ConnectionObject);
432
433 if (!ConnectionObject) {
434 DPRINT("Bad connection object.\n");
436 }
437
438 DeviceObject = IoGetRelatedDeviceObject(ConnectionObject);
439 if (!DeviceObject) {
440 DPRINT("Bad device object.\n");
442 }
443
445
448 ConnectionObject,
449 &Event,
450 &Iosb);
451 if (!Irp)
453
456 ConnectionObject,
457 NULL,
458 NULL);
459
460 return TdiCall(Irp, DeviceObject, &Event, &Iosb);
461}
462
464 PIRP *Irp,
465 PFILE_OBJECT ConnectionObject,
466 PTDI_CONNECTION_INFORMATION *RequestConnectionInfo,
467 PTDI_CONNECTION_INFORMATION *ReturnConnectionInfo,
479{
481
482 DPRINT("Called\n");
483
484 if (!ConnectionObject) {
485 DPRINT("Bad connection object.\n");
487 }
488
489 DeviceObject = IoGetRelatedDeviceObject(ConnectionObject);
490 if (!DeviceObject) {
491 DPRINT("Bad device object.\n");
493 }
494
497 ConnectionObject,
498 NULL,
499 NULL);
500 if (*Irp == NULL)
502
505 ConnectionObject,
508 0,
509 *RequestConnectionInfo,
510 *ReturnConnectionInfo);
511
512 TdiCall(*Irp, DeviceObject, NULL /* Don't wait for completion */, NULL);
513
514 return STATUS_PENDING;
515}
516
518 PIRP *Irp,
519 PFILE_OBJECT AcceptConnectionObject,
520 PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
521 PTDI_CONNECTION_INFORMATION ReturnConnectionInfo,
533{
535
536 DPRINT("Called\n");
537
538 if (!AcceptConnectionObject) {
539 DPRINT("Bad connection object.\n");
541 }
542
543 DeviceObject = IoGetRelatedDeviceObject(AcceptConnectionObject);
544 if (!DeviceObject) {
545 DPRINT("Bad device object.\n");
547 }
548
551 AcceptConnectionObject,
552 NULL,
553 NULL);
554 if (*Irp == NULL)
556
559 AcceptConnectionObject,
562 RequestConnectionInfo,
563 ReturnConnectionInfo);
564
565 TdiCall(*Irp, DeviceObject, NULL /* Don't wait for completion */, NULL);
566
567 return STATUS_PENDING;
568}
569
570
588{
592 PIRP Irp;
593
594 DPRINT("Called\n");
595
596 if (!FileObject) {
597 DPRINT("Bad file object.\n");
599 }
600
602 if (!DeviceObject) {
603 DPRINT("Bad device object.\n");
605 }
606
608
612 &Event,
613 &Iosb);
614 if (!Irp)
616
617
618
622 NULL,
623 NULL,
624 EventType,
625 Handler,
626 Context);
627
628 return TdiCall(Irp, DeviceObject, &Event, &Iosb);
629}
630
631
639 PULONG Return)
652{
657 PIRP Irp;
658
659 if (!FileObject) {
660 DPRINT("Bad file object.\n");
662 }
663
665 if (!DeviceObject) {
666 DPRINT("Bad device object.\n");
668 }
669
671
678 FALSE,
679 &Event,
680 &Iosb);
681 if (!Irp)
683
685
686 if (Return)
687 *Return = Iosb.Information;
688
689 return Status;
690}
691
692
696 PMDL MdlBuffer)
706{
710 PIRP Irp;
711
712 if (!FileObject) {
713 DPRINT("Bad file object.\n");
715 }
716
718 if (!DeviceObject) {
719 DPRINT("Bad device object.\n");
721 }
722
724
727 ConnectionObject,
728 &Event,
729 &Iosb);
730 if (!Irp) {
732 }
733
737 NULL,
738 NULL,
739 QueryType,
740 MdlBuffer);
741
742 return TdiCall(Irp, DeviceObject, &Event, &Iosb);
743}
744
747 ULONG Entity,
749 ULONG Class,
750 ULONG Type,
751 ULONG Id,
753 PULONG OutputLength)
768{
770
772 QueryInfo.ID.toi_entity.tei_entity = Entity;
774 QueryInfo.ID.toi_class = Class;
775 QueryInfo.ID.toi_type = Type;
776 QueryInfo.ID.toi_id = Id;
777
778 return TdiQueryDeviceControl(FileObject, /* Transport/connection object */
779 IOCTL_TCP_QUERY_INFORMATION_EX, /* Control code */
780 &QueryInfo, /* Input buffer */
781 sizeof(TCP_REQUEST_QUERY_INFORMATION_EX), /* Input buffer length */
782 OutputBuffer, /* Output buffer */
783 *OutputLength, /* Output buffer length */
784 OutputLength); /* Return information */
785}
786
798{
799 UINT i;
800 TDIEntityID *Entities;
802 ULONG EntityType;
803 IPSNMPInfo SnmpInfo;
804 PIPADDR_ENTRY IpAddress;
807
808 DPRINT("Called\n");
809
810 BufferSize = sizeof(TDIEntityID) * 20;
814 if (!Entities) {
815 DPRINT("Insufficient resources.\n");
817 }
818
819 /* Query device for supported entities */
820
821 Status = TdiQueryInformationEx(FileObject, /* File object */
822 GENERIC_ENTITY, /* Entity */
823 TL_INSTANCE, /* Instance */
824 INFO_CLASS_GENERIC, /* Entity class */
825 INFO_TYPE_PROVIDER, /* Entity type */
826 ENTITY_LIST_ID, /* Entity id */
827 Entities, /* Output buffer */
828 &BufferSize); /* Output buffer size */
829 if (!NT_SUCCESS(Status)) {
830 DPRINT("Unable to get list of supported entities (Status = 0x%X).\n", Status);
832 return Status;
833 }
834
835 /* Locate an IP entity */
837
838 DPRINT("EntityCount = %u\n", EntityCount);
839
840 for (i = 0; i < EntityCount; i++) {
841 if (Entities[i].tei_entity == CL_NL_ENTITY) {
842 /* Query device for entity type */
843
844 BufferSize = sizeof(EntityType);
845 Status = TdiQueryInformationEx(FileObject, /* File object */
846 CL_NL_ENTITY, /* Entity */
847 Entities[i].tei_instance, /* Instance */
848 INFO_CLASS_GENERIC, /* Entity class */
849 INFO_TYPE_PROVIDER, /* Entity type */
850 ENTITY_TYPE_ID, /* Entity id */
851 &EntityType, /* Output buffer */
852 &BufferSize); /* Output buffer size */
853 if (!NT_SUCCESS(Status) || (EntityType != CL_NL_IP)) {
854 DPRINT("Unable to get entity of type IP (Status = 0x%X).\n", Status);
855 break;
856 }
857
858 /* Query device for SNMP information */
859
860 BufferSize = sizeof(SnmpInfo);
861 Status = TdiQueryInformationEx(FileObject, /* File object */
862 CL_NL_ENTITY, /* Entity */
863 Entities[i].tei_instance, /* Instance */
864 INFO_CLASS_PROTOCOL, /* Entity class */
865 INFO_TYPE_PROVIDER, /* Entity type */
866 IP_MIB_STATS_ID, /* Entity id */
867 &SnmpInfo, /* Output buffer */
868 &BufferSize); /* Output buffer size */
869 if (!NT_SUCCESS(Status) || (SnmpInfo.ipsi_numaddr == 0)) {
870 DPRINT("Unable to get SNMP information or no IP addresses available (Status = 0x%X).\n", Status);
871 break;
872 }
873
874 /* Query device for all IP addresses */
875
876 if (SnmpInfo.ipsi_numaddr != 0) {
877 BufferSize = SnmpInfo.ipsi_numaddr * sizeof(IPADDR_ENTRY);
881 if (!IpAddress) {
882 DPRINT("Insufficient resources.\n");
883 break;
884 }
885
886 Status = TdiQueryInformationEx(FileObject, /* File object */
887 CL_NL_ENTITY, /* Entity */
888 Entities[i].tei_instance, /* Instance */
889 INFO_CLASS_PROTOCOL, /* Entity class */
890 INFO_TYPE_PROVIDER, /* Entity type */
891 IP_MIB_ADDRTABLE_ENTRY_ID, /* Entity id */
892 IpAddress, /* Output buffer */
893 &BufferSize); /* Output buffer size */
894 if (!NT_SUCCESS(Status)) {
895 DPRINT("Unable to get IP address (Status = 0x%X).\n", Status);
897 break;
898 }
899
900 if (SnmpInfo.ipsi_numaddr != 1) {
901 /* Skip loopback address */
902 *Address = DN2H(IpAddress[1].Addr);
903 } else {
904 /* Select the first address returned */
905 *Address = DN2H(IpAddress->Addr);
906 }
907
909 } else {
911 break;
912 }
913 }
914 }
915
917
918 DPRINT("Leaving\n");
919
920 return Status;
921}
922
924 PIRP *Irp,
925 PFILE_OBJECT TransportObject,
931{
933 PMDL Mdl;
934
935 if (!TransportObject) {
936 DPRINT("Bad transport object.\n");
938 }
939
940 DeviceObject = IoGetRelatedDeviceObject(TransportObject);
941 if (!DeviceObject) {
942 DPRINT("Bad device object.\n");
944 }
945
948 TransportObject,
949 NULL,
950 NULL);
951
952 if (!*Irp) {
953 DPRINT("Insufficient resources.\n");
955 }
956
957 DPRINT("Allocating irp for %p:%u\n", Buffer,BufferLength);
958
959 Mdl = IoAllocateMdl(Buffer, /* Virtual address */
960 BufferLength, /* Length of buffer */
961 FALSE, /* Not secondary */
962 FALSE, /* Don't charge quota */
963 NULL); /* Don't use IRP */
964 if (!Mdl) {
965 DPRINT("Insufficient resources.\n");
967 *Irp = NULL;
969 }
970
971 _SEH2_TRY {
972 MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoReadAccess);
974 DPRINT("MmProbeAndLockPages() failed.\n");
975 IoFreeMdl(Mdl);
977 *Irp = NULL;
979 } _SEH2_END;
980
981 DPRINT("AFD>>> Got an MDL: %p\n", Mdl);
982
985 TransportObject,
988 Mdl,
989 Flags,
991
992 /* Does not block... The MDL is deleted in the receive completion
993 routine. */
994 return TdiCall(*Irp, DeviceObject, NULL, NULL);
995}
996
998 PIRP *Irp,
999 PFILE_OBJECT TransportObject,
1000 USHORT Flags,
1001 PCHAR Buffer,
1005{
1007 PMDL Mdl;
1008
1009 if (!TransportObject) {
1010 DPRINT("Bad transport object.\n");
1012 }
1013
1014 DeviceObject = IoGetRelatedDeviceObject(TransportObject);
1015 if (!DeviceObject) {
1016 DPRINT("Bad device object.\n");
1018 }
1019
1022 TransportObject,
1023 NULL,
1024 NULL);
1025
1026 if (!*Irp) {
1027 DPRINT("Insufficient resources.\n");
1029 }
1030
1031 DPRINT("Allocating irp for %p:%u\n", Buffer,BufferLength);
1032
1033 Mdl = IoAllocateMdl(Buffer, /* Virtual address */
1034 BufferLength, /* Length of buffer */
1035 FALSE, /* Not secondary */
1036 FALSE, /* Don't charge quota */
1037 NULL); /* Don't use IRP */
1038 if (!Mdl) {
1039 DPRINT("Insufficient resources.\n");
1041 *Irp = NULL;
1043 }
1044
1045 _SEH2_TRY {
1046 DPRINT("probe and lock\n");
1047 MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess);
1048 DPRINT("probe and lock done\n");
1050 DPRINT("MmProbeAndLockPages() failed.\n");
1051 IoFreeMdl(Mdl);
1053 *Irp = NULL;
1055 } _SEH2_END;
1056
1057 DPRINT("AFD>>> Got an MDL: %p\n", Mdl);
1058
1061 TransportObject,
1064 Mdl,
1065 Flags,
1066 BufferLength);
1067
1068
1070 /* Does not block... The MDL is deleted in the receive completion
1071 routine. */
1072
1073 return STATUS_PENDING;
1074}
1075
1076
1078 PIRP *Irp,
1079 PFILE_OBJECT TransportObject,
1080 USHORT Flags,
1081 PCHAR Buffer,
1097{
1099 PMDL Mdl;
1100
1101 if (!TransportObject) {
1102 DPRINT("Bad tranport object.\n");
1104 }
1105
1106 DeviceObject = IoGetRelatedDeviceObject(TransportObject);
1107 if (!DeviceObject) {
1108 DPRINT("Bad device object.\n");
1110 }
1111
1114 TransportObject,
1115 NULL,
1116 NULL);
1117
1118 if (!*Irp) {
1119 DPRINT("Insufficient resources.\n");
1121 }
1122
1123 DPRINT("Allocating irp for %p:%u\n", Buffer,BufferLength);
1124
1125 Mdl = IoAllocateMdl(Buffer, /* Virtual address */
1126 BufferLength, /* Length of buffer */
1127 FALSE, /* Not secondary */
1128 FALSE, /* Don't charge quota */
1129 NULL); /* Don't use IRP */
1130 if (!Mdl) {
1131 DPRINT("Insufficient resources.\n");
1133 *Irp = NULL;
1135 }
1136
1137 _SEH2_TRY {
1138 MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess);
1140 DPRINT("MmProbeAndLockPages() failed.\n");
1141 IoFreeMdl(Mdl);
1143 *Irp = NULL;
1145 } _SEH2_END;
1146
1147 DPRINT("AFD>>> Got an MDL: %p\n", Mdl);
1148
1151 TransportObject,
1154 Mdl,
1156 Addr,
1157 Addr,
1158 Flags);
1159
1161 /* Does not block... The MDL is deleted in the receive completion
1162 routine. */
1163
1164 return STATUS_PENDING;
1165}
1166
1167
1169 PIRP *Irp,
1170 PFILE_OBJECT TransportObject,
1171 PCHAR Buffer,
1187{
1189 PMDL Mdl;
1190
1191 if (!TransportObject) {
1192 DPRINT("Bad transport object.\n");
1194 }
1195
1196 DPRINT("Called(TransportObject %p)\n", TransportObject);
1197
1198 DeviceObject = IoGetRelatedDeviceObject(TransportObject);
1199 if (!DeviceObject) {
1200 DPRINT("Bad device object.\n");
1202 }
1203
1204 if (BufferLength == 0)
1205 {
1206 DPRINT("Succeeding send with length 0.\n");
1207 return STATUS_SUCCESS;
1208 }
1209
1212 TransportObject,
1213 NULL,
1214 NULL);
1215
1216 if (!*Irp) {
1217 DPRINT("Insufficient resources.\n");
1219 }
1220
1221 DPRINT("Allocating irp for %p:%u\n", Buffer,BufferLength);
1222
1223 Mdl = IoAllocateMdl(Buffer, /* Virtual address */
1224 BufferLength, /* Length of buffer */
1225 FALSE, /* Not secondary */
1226 FALSE, /* Don't charge quota */
1227 NULL); /* Don't use IRP */
1228
1229 if (!Mdl) {
1230 DPRINT("Insufficient resources.\n");
1232 *Irp = NULL;
1234 }
1235
1236 _SEH2_TRY {
1237 MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoReadAccess);
1239 DPRINT("MmProbeAndLockPages() failed.\n");
1240 IoFreeMdl(Mdl);
1242 *Irp = NULL;
1244 } _SEH2_END;
1245
1246 DPRINT("AFD>>> Got an MDL: %p\n", Mdl);
1247
1250 TransportObject,
1253 Mdl,
1255 Addr);
1256
1257 /* Does not block... The MDL is deleted in the send completion
1258 routine. */
1259 return TdiCall(*Irp, DeviceObject, NULL, NULL);
1260}
1261
1263 PIRP *Irp,
1264 PFILE_OBJECT TransportObject,
1266 USHORT Flags,
1269 PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
1270 PTDI_CONNECTION_INFORMATION ReturnConnectionInfo) {
1272
1273 if (!TransportObject) {
1274 DPRINT("Bad transport object.\n");
1276 }
1277
1278 DPRINT("Called(TransportObject %p)\n", TransportObject);
1279
1280 DeviceObject = IoGetRelatedDeviceObject(TransportObject);
1281 if (!DeviceObject) {
1282 DPRINT("Bad device object.\n");
1284 }
1285
1288 TransportObject,
1289 NULL,
1290 NULL);
1291
1292 if (!*Irp) {
1293 DPRINT("Insufficient resources.\n");
1295 }
1296
1299 TransportObject,
1302 Time,
1303 Flags,
1304 RequestConnectionInfo,
1305 ReturnConnectionInfo);
1306
1308
1309 return STATUS_PENDING;
1310}
1311
1312/* EOF */
DWORD Id
Type
Definition: Type.h:7
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER Handler
Definition: acpixf.h:672
#define DN2H(dw)
Definition: addrconv.c:21
struct IPADDR_ENTRY * PIPADDR_ENTRY
#define TAG_AFD_EA_INFO
Definition: afd.h:50
#define IP_MIB_STATS_ID
Definition: afd.h:35
#define IP_MIB_ADDRTABLE_ENTRY_ID
Definition: afd.h:36
#define TAG_AFD_SNMP_ADDRESS_INFO
Definition: afd.h:52
#define TL_INSTANCE
Definition: afd.h:34
#define TAG_AFD_DATA_BUFFER
Definition: afd.h:38
#define TAG_AFD_TRANSPORT_ADDRESS
Definition: afd.h:39
LONG NTSTATUS
Definition: precomp.h:26
Definition: bufpool.h:45
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define BufferSize
Definition: mmc.h:75
LPWSTR Name
Definition: desk.c:124
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define GENERIC_READ
Definition: compat.h:135
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define FILE_SHARE_READ
Definition: compat.h:136
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT _Inout_ PVCB _Outptr_result_maybenull_ PDCB _In_ PDCB _In_ PDIRENT _In_ ULONG _In_ ULONG _In_ PUNICODE_STRING _In_ PACCESS_MASK _In_ USHORT ShareAccess
Definition: create.c:4148
return Iosb
Definition: create.c:4403
ULONG EntityCount
Definition: main.c:28
NTSTATUS TdiQueryInformationEx(PFILE_OBJECT FileObject, ULONG Entity, ULONG Instance, ULONG Class, ULONG Type, ULONG Id, PVOID OutputBuffer, PULONG OutputLength)
Extended query for information.
Definition: tdi.c:745
NTSTATUS TdiListen(PIRP *Irp, PFILE_OBJECT ConnectionObject, PTDI_CONNECTION_INFORMATION *RequestConnectionInfo, PTDI_CONNECTION_INFORMATION *ReturnConnectionInfo, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Listen on a connection endpoint for a connection request from a remote peer.
Definition: tdi.c:463
NTSTATUS TdiAssociateAddressFile(HANDLE AddressHandle, PFILE_OBJECT ConnectionObject)
Associates a connection endpoint to an address file object.
Definition: tdi.c:366
NTSTATUS TdiSendDatagram(PIRP *Irp, PFILE_OBJECT TransportObject, PCHAR Buffer, UINT BufferLength, PTDI_CONNECTION_INFORMATION Addr, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Sends a datagram.
Definition: tdi.c:1168
NTSTATUS TdiOpenConnectionEndpointFile(PUNICODE_STRING DeviceName, PHANDLE ConnectionHandle, PFILE_OBJECT *ConnectionObject)
Opens a connection endpoint file object.
Definition: tdi.c:258
NTSTATUS TdiQueryMaxDatagramLength(PFILE_OBJECT FileObject, PUINT MaxDatagramLength)
Definition: tdi.c:203
NTSTATUS TdiDisassociateAddressFile(PFILE_OBJECT ConnectionObject)
Disassociates a connection endpoint from an address file object.
Definition: tdi.c:416
NTSTATUS TdiSend(PIRP *Irp, PFILE_OBJECT TransportObject, USHORT Flags, PCHAR Buffer, UINT BufferLength, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:923
NTSTATUS TdiQueryInformation(PFILE_OBJECT FileObject, LONG QueryType, PMDL MdlBuffer)
Query for information.
Definition: tdi.c:693
static NTSTATUS TdiCall(PIRP Irp, PDEVICE_OBJECT DeviceObject, PKEVENT Event, PIO_STATUS_BLOCK Iosb)
Calls a transport driver device.
Definition: tdi.c:26
NTSTATUS TdiAccept(PIRP *Irp, PFILE_OBJECT AcceptConnectionObject, PTDI_CONNECTION_INFORMATION RequestConnectionInfo, PTDI_CONNECTION_INFORMATION ReturnConnectionInfo, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Listen on a connection endpoint for a connection request from a remote peer.
Definition: tdi.c:517
NTSTATUS TdiSetEventHandler(PFILE_OBJECT FileObject, LONG EventType, PVOID Handler, PVOID Context)
Sets or resets an event handler.
Definition: tdi.c:571
NTSTATUS TdiQueryDeviceControl(PFILE_OBJECT FileObject, ULONG IoControlCode, PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength, PULONG Return)
Queries a device for information.
Definition: tdi.c:632
static NTSTATUS TdiOpenDevice(PUNICODE_STRING DeviceName, ULONG EaLength, PFILE_FULL_EA_INFORMATION EaInfo, ULONG ShareType, PHANDLE Handle, PFILE_OBJECT *Object)
Opens a device.
Definition: tdi.c:68
NTSTATUS TdiReceiveDatagram(PIRP *Irp, PFILE_OBJECT TransportObject, USHORT Flags, PCHAR Buffer, UINT BufferLength, PTDI_CONNECTION_INFORMATION Addr, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Receives a datagram.
Definition: tdi.c:1077
NTSTATUS TdiConnect(PIRP *Irp, PFILE_OBJECT ConnectionObject, PTDI_CONNECTION_INFORMATION ConnectionCallInfo, PTDI_CONNECTION_INFORMATION ConnectionReturnInfo, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Connect a connection endpoint to a remote peer.
Definition: tdi.c:311
NTSTATUS TdiDisconnect(PIRP *Irp, PFILE_OBJECT TransportObject, PLARGE_INTEGER Time, USHORT Flags, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext, PTDI_CONNECTION_INFORMATION RequestConnectionInfo, PTDI_CONNECTION_INFORMATION ReturnConnectionInfo)
Definition: tdi.c:1262
NTSTATUS TdiReceive(PIRP *Irp, PFILE_OBJECT TransportObject, USHORT Flags, PCHAR Buffer, UINT BufferLength, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:997
NTSTATUS TdiOpenAddressFile(PUNICODE_STRING DeviceName, PTRANSPORT_ADDRESS Name, ULONG ShareType, PHANDLE AddressHandle, PFILE_OBJECT *AddressObject)
Opens an IPv4 address file object.
Definition: tdi.c:148
NTSTATUS TdiQueryAddress(PFILE_OBJECT FileObject, PULONG Address)
Queries for a local IP address.
Definition: tdi.c:787
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define NonPagedPool
Definition: env_spec_w32.h:307
IN PVCB IN PDIRENT OUT PULONG EaLength
Definition: fatprocs.h:879
struct _FILE_FULL_EA_INFORMATION * PFILE_FULL_EA_INFORMATION
#define FILE_OPEN_IF
Definition: from_kernel.h:56
struct _FILE_FULL_EA_INFORMATION FILE_FULL_EA_INFORMATION
#define IoFreeMdl
Definition: fxmdl.h:89
#define IoAllocateMdl
Definition: fxmdl.h:88
ULONG Handle
Definition: gdb_input.c:15
Status
Definition: gdiplustypes.h:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
POBJECT_TYPE IoFileObjectType
Definition: iomgr.c:36
_In_ PKSPIN_CONNECT _In_ ACCESS_MASK _Out_ PHANDLE ConnectionHandle
Definition: ks.h:4538
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
Definition: mdlsup.c:931
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
static PLARGE_INTEGER Time
Definition: time.c:105
unsigned int * PUINT
Definition: ndis.h:50
unsigned int UINT
Definition: ndis.h:50
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_ EVENT_TYPE EventType
Definition: exfuncs.h:167
#define KernelMode
Definition: asm.h:38
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define AFD_SHARE_UNIQUE
Definition: netio.c:67
#define AFD_SHARE_REUSE
Definition: netio.c:68
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define SYNCHRONIZE
Definition: nt_native.h:61
#define GENERIC_WRITE
Definition: nt_native.h:90
@ NotificationEvent
PDEVICE_OBJECT NTAPI IoGetRelatedDeviceObject(IN PFILE_OBJECT FileObject)
Definition: device.c:1539
#define IoCompleteRequest
Definition: irp.c:1240
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
Definition: irp.c:881
#define IoCallDriver
Definition: irp.c:1225
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
_Must_inspect_result_ _In_ KTMOBJECT_TYPE QueryType
Definition: nttmapi.h:404
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:494
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
static WCHAR Address[46]
Definition: ping.c:68
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:181
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:82
#define _SEH2_END
Definition: pseh2_64.h:171
#define _SEH2_TRY
Definition: pseh2_64.h:71
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:184
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
Definition: afd.h:56
ULONG Addr
Definition: afd.h:57
ULONG ipsi_numaddr
Definition: tcpioctl.h:159
ULONG tei_entity
Definition: tdiinfo.h:31
ULONG tei_instance
Definition: tdiinfo.h:32
ULONG toi_id
Definition: tdiinfo.h:77
ULONG toi_type
Definition: tdiinfo.h:76
ULONG toi_class
Definition: tdiinfo.h:75
TDIEntityID toi_entity
Definition: tdiinfo.h:74
#define TDI_QUERY_MAX_DATAGRAM_INFO
Definition: tdi.h:187
struct _TA_ADDRESS_IP TA_IP_ADDRESS
struct _TRANSPORT_ADDRESS * PTRANSPORT_ADDRESS
#define TDI_CONNECTION_CONTEXT_LENGTH
Definition: tdi.h:373
#define TDI_TRANSPORT_ADDRESS_LENGTH
Definition: tdi.h:372
#define TdiConnectionContext
Definition: tdi.h:371
#define TdiTransportAddress
Definition: tdi.h:370
UINT TaLengthOfTransportAddress(PTRANSPORT_ADDRESS Addr)
Definition: tdiconn.c:56
VOID TaCopyTransportAddressInPlace(PTRANSPORT_ADDRESS Target, PTRANSPORT_ADDRESS Source)
Definition: tdiconn.c:84
#define CL_NL_IP
Definition: tdiinfo.h:54
#define ENTITY_LIST_ID
Definition: tdiinfo.h:38
struct _TDIEntityID TDIEntityID
#define INFO_CLASS_PROTOCOL
Definition: tdiinfo.h:65
#define ENTITY_TYPE_ID
Definition: tdiinfo.h:39
#define INFO_CLASS_GENERIC
Definition: tdiinfo.h:64
#define INFO_TYPE_PROVIDER
Definition: tdiinfo.h:69
#define GENERIC_ENTITY
Definition: tdiinfo.h:37
#define CL_NL_ENTITY
Definition: tdiinfo.h:42
#define TdiBuildReceive( Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, InFlags, ReceiveLen)
Definition: tdikrnl.h:667
#define TDI_SEND_DATAGRAM
Definition: tdikrnl.h:55
#define TdiBuildAssociateAddress( Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle)
Definition: tdikrnl.h:467
#define TDI_RECEIVE_DATAGRAM
Definition: tdikrnl.h:56
#define TDI_SEND
Definition: tdikrnl.h:53
#define TdiBuildListen( Irp, DevObj, FileObj, CompRoutine, Contxt, Flags, RequestConnectionInfo, ReturnConnectionInfo)
Definition: tdikrnl.h:593
#define TdiBuildDisconnect( Irp, DevObj, FileObj, CompRoutine, Contxt, Time, Flags, RequestConnectionInfo, ReturnConnectionInfo)
Definition: tdikrnl.h:545
#define TDI_LISTEN
Definition: tdikrnl.h:50
#define TdiBuildSend( Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, InFlags, SendLen)
Definition: tdikrnl.h:731
#define TdiBuildInternalDeviceControlIrp(IrpSubFunction, DeviceObject, FileObject, Event, IoStatusBlock)
Definition: tdikrnl.h:573
#define TDI_CONNECT
Definition: tdikrnl.h:49
#define TDI_QUERY_INFORMATION
Definition: tdikrnl.h:58
#define TdiBuildReceiveDatagram( Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags)
Definition: tdikrnl.h:699
#define TdiBuildDisassociateAddress( Irp, DevObj, FileObj, CompRoutine, Contxt)
Definition: tdikrnl.h:521
#define TdiBuildSendDatagram( Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, SendLen, SendDatagramInfo)
Definition: tdikrnl.h:761
#define TdiBuildQueryInformation( Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr)
Definition: tdikrnl.h:638
#define TdiBuildAccept( Irp, DevObj, FileObj, CompRoutine, Contxt, RequestConnectionInfo, ReturnConnectionInfo)
Definition: tdikrnl.h:417
#define TdiBuildConnect( Irp, DevObj, FileObj, CompRoutine, Contxt, Time, RequestConnectionInfo, ReturnConnectionInfo)
Definition: tdikrnl.h:494
#define TdiBuildSetEventHandler( Irp, DevObj, FileObj, CompRoutine, Contxt, InEventType, InEventHandler, InEventContext)
Definition: tdikrnl.h:791
#define TDI_DISASSOCIATE_ADDRESS
Definition: tdikrnl.h:48
#define TDI_SET_EVENT_HANDLER
Definition: tdikrnl.h:57
#define TDI_RECEIVE
Definition: tdikrnl.h:54
#define TDI_ASSOCIATE_ADDRESS
Definition: tdikrnl.h:47
#define TDI_DISCONNECT
Definition: tdikrnl.h:52
#define IOCTL_TCP_QUERY_INFORMATION_EX
Definition: tditest.h:110
#define STATUS_PENDING
Definition: telnetd.h:14
uint32_t * PULONG
Definition: typedefs.h:59
void * PVOID
Definition: typedefs.h:50
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3777
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
_In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
Definition: wdfio.h:325
_In_ WDFREQUEST _In_ size_t OutputBufferLength
Definition: wdfio.h:320
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
Definition: wdfio.h:322
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
Definition: wdfiotarget.h:953
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
_In_ WDFREQUEST _In_opt_ PFN_WDF_REQUEST_COMPLETION_ROUTINE _In_opt_ __drv_aliasesMem WDFCONTEXT CompletionContext
Definition: wdfrequest.h:898
_In_ WDFREQUEST _In_opt_ PFN_WDF_REQUEST_COMPLETION_ROUTINE CompletionRoutine
Definition: wdfrequest.h:895
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_WMI_INSTANCE_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_opt_ WDFWMIINSTANCE * Instance
Definition: wdfwmi.h:481
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define IO_NO_INCREMENT
Definition: iotypes.h:598
IO_COMPLETION_ROUTINE * PIO_COMPLETION_ROUTINE
Definition: iotypes.h:2837
* PFILE_OBJECT
Definition: iotypes.h:1998
@ Executive
Definition: ketypes.h:467
@ IoReadAccess
Definition: ketypes.h:915
@ IoModifyAccess
Definition: ketypes.h:917