ReactOS 0.4.16-dev-197-g92996da
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: afd/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 */
10
11#include <afd.h>
12
13#include <tdikrnl.h>
14#include <tdiinfo.h>
15
16#if DBG
17#if 0
18static VOID DisplayBuffer(
20 ULONG Size)
21{
22 ULONG i;
23 PCHAR p;
24
25 if ((DebugTraceLevel & MAX_TRACE) == 0)
26 return;
27
28 if (!Buffer) {
29 AFD_DbgPrint(MIN_TRACE, ("Cannot display null buffer.\n"));
30 return;
31 }
32
33 AFD_DbgPrint(MID_TRACE, ("Displaying buffer at (0x%X) Size (%d).\n", Buffer, Size));
34
35 p = (PCHAR)Buffer;
36 for (i = 0; i < Size; i++) {
37 if (i % 16 == 0)
38 DbgPrint("\n");
39 DbgPrint("%02X ", (p[i]) & 0xFF);
40 }
41 DbgPrint("\n");
42}
43#endif
44#endif /* DBG */
45
47 PIRP Irp,
51/*
52 * FUNCTION: Calls a transport driver device
53 * ARGUMENTS:
54 * Irp = Pointer to I/O Request Packet
55 * DeviceObject = Pointer to device object to call
56 * Event = An optional pointer to an event handle that will be
57 * waited upon
58 * Iosb = Pointer to an IO status block
59 * RETURNS:
60 * Status of operation
61 */
62{
64
65 AFD_DbgPrint(MID_TRACE, ("Called\n"));
66
67 AFD_DbgPrint(MID_TRACE, ("Irp->UserEvent = %p\n", Irp->UserEvent));
68
70 AFD_DbgPrint(MID_TRACE, ("IoCallDriver: %08x\n", Status));
71
72 if ((Status == STATUS_PENDING) && (Event != NULL)) {
73 AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n"));
77 FALSE,
78 NULL);
79 Status = Iosb->Status;
80 }
81
82 AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status));
83
84 return Status;
85}
86
87
92 ULONG ShareType,
95/*
96 * FUNCTION: Opens a device
97 * ARGUMENTS:
98 * DeviceName = Pointer to counted string with name of device
99 * EaLength = Length of EA information
100 * EaInfo = Pointer to buffer with EA information
101 * Handle = Address of buffer to place device handle
102 * Object = Address of buffer to place device object
103 * RETURNS:
104 * Status of operation
105 */
106{
111
112 AFD_DbgPrint(MAX_TRACE, ("Called. DeviceName (%wZ, %u)\n", DeviceName, ShareType));
113
114 /* Determine the share access */
115 if (ShareType != AFD_SHARE_REUSE)
116 {
117 /* Exclusive access */
118 ShareAccess = 0;
119 }
120 else
121 {
122 /* Shared access */
124 }
125
126 InitializeObjectAttributes(&Attr, /* Attribute buffer */
127 DeviceName, /* Device name */
128 OBJ_CASE_INSENSITIVE | /* Attributes */
130 NULL, /* Root directory */
131 NULL); /* Security descriptor */
132
133 Status = ZwCreateFile(Handle, /* Return file handle */
134 GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, /* Desired access */
135 &Attr, /* Object attributes */
136 &Iosb, /* IO status */
137 0, /* Initial allocation size */
138 FILE_ATTRIBUTE_NORMAL, /* File attributes */
139 ShareAccess, /* Share access */
140 FILE_OPEN_IF, /* Create disposition */
141 0, /* Create options */
142 EaInfo, /* EA buffer */
143 EaLength); /* EA length */
144 if (NT_SUCCESS(Status)) {
145 Status = ObReferenceObjectByHandle(*Handle, /* Handle to open file */
146 GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, /* Access mode */
147 *IoFileObjectType, /* Object type */
148 KernelMode, /* Access mode */
149 (PVOID*)Object, /* Pointer to object */
150 NULL); /* Handle information */
151 if (!NT_SUCCESS(Status)) {
152 AFD_DbgPrint(MIN_TRACE, ("ObReferenceObjectByHandle() failed with status (0x%X).\n", Status));
153 ZwClose(*Handle);
154 } else {
155 AFD_DbgPrint(MAX_TRACE, ("Got handle (%p) Object (%p)\n",
156 *Handle, *Object));
157 }
158 } else {
159 AFD_DbgPrint(MIN_TRACE, ("ZwCreateFile() failed with status (0x%X)\n", Status));
160 }
161
162 if (!NT_SUCCESS(Status)) {
164 *Object = NULL;
165 }
166
167 return Status;
168}
169
173 ULONG ShareType,
174 PHANDLE AddressHandle,
175 PFILE_OBJECT *AddressObject)
176/*
177 * FUNCTION: Opens an IPv4 address file object
178 * ARGUMENTS:
179 * DeviceName = Pointer to counted string with name of device
180 * Name = Pointer to socket name (IPv4 address family)
181 * AddressHandle = Address of buffer to place address file handle
182 * AddressObject = Address of buffer to place address file object
183 * RETURNS:
184 * Status of operation
185 */
186{
191
192 AFD_DbgPrint(MAX_TRACE, ("Called. DeviceName (%wZ) Name (%p)\n",
193 DeviceName, Name));
194
195 /* EaName must be 0-terminated, even though TDI_TRANSPORT_ADDRESS_LENGTH does *not* include the 0 */
200 EaLength,
202 if (!EaInfo)
204
205 RtlZeroMemory(EaInfo, EaLength);
207 /* Don't copy the terminating 0; we have already zeroed it */
208 RtlCopyMemory(EaInfo->EaName,
211 EaInfo->EaValueLength = sizeof(TA_IP_ADDRESS);
212 Address =
213 (PTRANSPORT_ADDRESS)(EaInfo->EaName + TDI_TRANSPORT_ADDRESS_LENGTH + 1); /* 0-terminated */
215
217 EaLength,
218 EaInfo,
219 ShareType,
220 AddressHandle,
221 AddressObject);
223 return Status;
224}
225
228 PUINT MaxDatagramLength)
229{
230 PMDL Mdl;
233
235 sizeof(TDI_MAX_DATAGRAM_INFO),
237
238 if (!Buffer) return STATUS_NO_MEMORY;
239
241 if (!Mdl)
242 {
244 return STATUS_NO_MEMORY;
245 }
246
248 {
250 }
252 {
254 }
255 _SEH2_END;
256
257 if (!NT_SUCCESS(Status))
258 {
259 AFD_DbgPrint(MIN_TRACE,("Failed to lock pages\n"));
260 IoFreeMdl(Mdl);
262 return Status;
263 }
264
267 Mdl);
268 if (!NT_SUCCESS(Status))
269 {
271 return Status;
272 }
273
274 *MaxDatagramLength = Buffer->MaxDatagramSize;
275
277
278 return STATUS_SUCCESS;
279}
280
284 PFILE_OBJECT *ConnectionObject)
285/*
286 * FUNCTION: Opens a connection endpoint file object
287 * ARGUMENTS:
288 * DeviceName = Pointer to counted string with name of device
289 * ConnectionHandle = Address of buffer to place connection endpoint file handle
290 * ConnectionObject = Address of buffer to place connection endpoint file object
291 * RETURNS:
292 * Status of operation
293 */
294{
296 PVOID *ContextArea;
299
300 AFD_DbgPrint(MAX_TRACE, ("Called. DeviceName (%wZ)\n", DeviceName));
301
302 /* EaName must be 0-terminated, even though TDI_TRANSPORT_ADDRESS_LENGTH does *not* include the 0 */
305 sizeof(PVOID) + 1;
306
308 EaLength,
310 if (!EaInfo)
312
313 RtlZeroMemory(EaInfo, EaLength);
315 /* Don't copy the terminating 0; we have already zeroed it */
316 RtlCopyMemory(EaInfo->EaName,
319 EaInfo->EaValueLength = sizeof(PVOID);
320 ContextArea = (PVOID*)(EaInfo->EaName + TDI_CONNECTION_CONTEXT_LENGTH + 1); /* 0-terminated */
321 /* FIXME: Allocate context area */
322 *ContextArea = NULL;
324 EaLength,
325 EaInfo,
328 ConnectionObject);
330 return Status;
331}
332
333
335 PIRP *Irp,
336 PFILE_OBJECT ConnectionObject,
337 PTDI_CONNECTION_INFORMATION ConnectionCallInfo,
338 PTDI_CONNECTION_INFORMATION ConnectionReturnInfo,
341/*
342 * FUNCTION: Connect a connection endpoint to a remote peer
343 * ARGUMENTS:
344 * ConnectionObject = Pointer to connection endpoint file object
345 * RemoteAddress = Pointer to remote address
346 * RETURNS:
347 * Status of operation
348 */
349{
351
352 AFD_DbgPrint(MAX_TRACE, ("Called\n"));
353
354 ASSERT(*Irp == NULL);
355
356 if (!ConnectionObject) {
357 AFD_DbgPrint(MIN_TRACE, ("Bad connection object.\n"));
359 }
360
361 DeviceObject = IoGetRelatedDeviceObject(ConnectionObject);
362 if (!DeviceObject) {
363 AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
365 }
366
368 DeviceObject, /* Device object */
369 ConnectionObject, /* File object */
370 NULL, /* Event */
371 NULL); /* Status */
372 if (!*Irp) {
374 }
375
376 TdiBuildConnect(*Irp, /* IRP */
377 DeviceObject, /* Device object */
378 ConnectionObject, /* File object */
379 CompletionRoutine, /* Completion routine */
380 CompletionContext, /* Completion routine context */
381 NULL, /* Time */
382 ConnectionCallInfo, /* Request connection information */
383 ConnectionReturnInfo); /* Return connection information */
384
386
387 return STATUS_PENDING;
388}
389
390
392 HANDLE AddressHandle,
393 PFILE_OBJECT ConnectionObject)
394/*
395 * FUNCTION: Associates a connection endpoint to an address file object
396 * ARGUMENTS:
397 * AddressHandle = Handle to address file object
398 * ConnectionObject = Connection endpoint file object
399 * RETURNS:
400 * Status of operation
401 */
402{
406 PIRP Irp;
407
408 AFD_DbgPrint(MAX_TRACE, ("Called. AddressHandle (%p) ConnectionObject (%p)\n",
409 AddressHandle, ConnectionObject));
410
411 if (!ConnectionObject) {
412 AFD_DbgPrint(MIN_TRACE, ("Bad connection object.\n"));
414 }
415
416 DeviceObject = IoGetRelatedDeviceObject(ConnectionObject);
417 if (!DeviceObject) {
418 AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
420 }
421
423
425 DeviceObject, /* Device object */
426 ConnectionObject, /* File object */
427 &Event, /* Event */
428 &Iosb); /* Status */
429 if (!Irp)
431
434 ConnectionObject,
435 NULL,
436 NULL,
437 AddressHandle);
438
439 return TdiCall(Irp, DeviceObject, &Event, &Iosb);
440}
441
443 PFILE_OBJECT ConnectionObject)
444/*
445 * FUNCTION: Disassociates a connection endpoint from an address file object
446 * ARGUMENTS:
447 * ConnectionObject = Connection endpoint file object
448 * RETURNS:
449 * Status of operation
450 */
451{
455 PIRP Irp;
456
457 AFD_DbgPrint(MAX_TRACE, ("Called. ConnectionObject (%p)\n", ConnectionObject));
458
459 if (!ConnectionObject) {
460 AFD_DbgPrint(MIN_TRACE, ("Bad connection object.\n"));
462 }
463
464 DeviceObject = IoGetRelatedDeviceObject(ConnectionObject);
465 if (!DeviceObject) {
466 AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
468 }
469
471
473 DeviceObject, /* Device object */
474 ConnectionObject, /* File object */
475 &Event, /* Event */
476 &Iosb); /* Status */
477 if (!Irp)
479
482 ConnectionObject,
483 NULL,
484 NULL);
485
486 return TdiCall(Irp, DeviceObject, &Event, &Iosb);
487}
488
490 PIRP *Irp,
491 PFILE_OBJECT ConnectionObject,
492 PTDI_CONNECTION_INFORMATION *RequestConnectionInfo,
493 PTDI_CONNECTION_INFORMATION *ReturnConnectionInfo,
496/*
497 * FUNCTION: Listen on a connection endpoint for a connection request from a remote peer
498 * ARGUMENTS:
499 * CompletionRoutine = Routine to be called when IRP is completed
500 * CompletionContext = Context for CompletionRoutine
501 * RETURNS:
502 * Status of operation
503 * May return STATUS_PENDING
504 */
505{
507
508 AFD_DbgPrint(MAX_TRACE, ("Called\n"));
509
510 ASSERT(*Irp == NULL);
511
512 if (!ConnectionObject) {
513 AFD_DbgPrint(MIN_TRACE, ("Bad connection object.\n"));
515 }
516
517 DeviceObject = IoGetRelatedDeviceObject(ConnectionObject);
518 if (!DeviceObject) {
519 AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
521 }
522
523 *Irp = TdiBuildInternalDeviceControlIrp(TDI_LISTEN, /* Sub function */
524 DeviceObject, /* Device object */
525 ConnectionObject, /* File object */
526 NULL, /* Event */
527 NULL); /* Status */
528 if (*Irp == NULL)
530
531 TdiBuildListen(*Irp, /* IRP */
532 DeviceObject, /* Device object */
533 ConnectionObject, /* File object */
534 CompletionRoutine, /* Completion routine */
535 CompletionContext, /* Completion routine context */
536 0, /* Flags */
537 *RequestConnectionInfo, /* Request connection information */
538 *ReturnConnectionInfo); /* Return connection information */
539
540 TdiCall(*Irp, DeviceObject, NULL /* Don't wait for completion */, NULL);
541
542 return STATUS_PENDING;
543}
544
545
551/*
552 * FUNCTION: Sets or resets an event handler
553 * ARGUMENTS:
554 * FileObject = Pointer to file object
555 * EventType = Event code
556 * Handler = Event handler to be called when the event occurs
557 * Context = Context input to handler when the event occurs
558 * RETURNS:
559 * Status of operation
560 * NOTES:
561 * Specify NULL for Handler to stop calling event handler
562 */
563{
567 PIRP Irp;
568
569 AFD_DbgPrint(MAX_TRACE, ("Called\n"));
570
571 if (!FileObject) {
572 AFD_DbgPrint(MIN_TRACE, ("Bad file object.\n"));
574 }
575
577 if (!DeviceObject) {
578 AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
580 }
581
583
585 DeviceObject, /* Device object */
586 FileObject, /* File object */
587 &Event, /* Event */
588 &Iosb); /* Status */
589 if (!Irp)
591
592
593
597 NULL,
598 NULL,
599 EventType,
600 Handler,
601 Context);
602
603 return TdiCall(Irp, DeviceObject, &Event, &Iosb);
604}
605
606
614 PULONG Return)
615/*
616 * FUNCTION: Queries a device for information
617 * ARGUMENTS:
618 * FileObject = Pointer to file object
619 * IoControlCode = I/O control code
620 * InputBuffer = Pointer to buffer with input data
621 * InputBufferLength = Length of InputBuffer
622 * OutputBuffer = Address of buffer to place output data
623 * OutputBufferLength = Length of OutputBuffer
624 * RETURNS:
625 * Status of operation
626 */
627{
632 PIRP Irp;
633
634 if (!FileObject) {
635 AFD_DbgPrint(MIN_TRACE, ("Bad file object.\n"));
637 }
638
640 if (!DeviceObject) {
641 AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
643 }
644
646
653 FALSE,
654 &Event,
655 &Iosb);
656 if (!Irp)
658
660
661 if (Return)
662 *Return = Iosb.Information;
663
664 return Status;
665}
666
667
671 PMDL MdlBuffer)
672/*
673 * FUNCTION: Query for information
674 * ARGUMENTS:
675 * FileObject = Pointer to file object
676 * QueryType = Query type
677 * MdlBuffer = Pointer to MDL buffer specific for query type
678 * RETURNS:
679 * Status of operation
680 */
681{
685 PIRP Irp;
686
687 if (!FileObject) {
688 AFD_DbgPrint(MIN_TRACE, ("Bad file object.\n"));
690 }
691
693 if (!DeviceObject) {
694 AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
696 }
697
699
701 DeviceObject, /* Device object */
702 ConnectionObject, /* File object */
703 &Event, /* Event */
704 &Iosb); /* Status */
705 if (!Irp) {
707 }
708
712 NULL,
713 NULL,
714 QueryType,
715 MdlBuffer);
716
717 return TdiCall(Irp, DeviceObject, &Event, &Iosb);
718}
719
722 ULONG Entity,
724 ULONG Class,
725 ULONG Type,
726 ULONG Id,
728 PULONG OutputLength)
729/*
730 * FUNCTION: Extended query for information
731 * ARGUMENTS:
732 * FileObject = Pointer to file object
733 * Entity = Entity
734 * Instance = Instance
735 * Class = Entity class
736 * Type = Entity type
737 * Id = Entity id
738 * OutputBuffer = Address of buffer to place data
739 * OutputLength = Address of buffer with length of OutputBuffer (updated)
740 * RETURNS:
741 * Status of operation
742 */
743{
745
747 QueryInfo.ID.toi_entity.tei_entity = Entity;
749 QueryInfo.ID.toi_class = Class;
750 QueryInfo.ID.toi_type = Type;
751 QueryInfo.ID.toi_id = Id;
752
753 return TdiQueryDeviceControl(FileObject, /* Transport/connection object */
754 IOCTL_TCP_QUERY_INFORMATION_EX, /* Control code */
755 &QueryInfo, /* Input buffer */
756 sizeof(TCP_REQUEST_QUERY_INFORMATION_EX), /* Input buffer length */
757 OutputBuffer, /* Output buffer */
758 *OutputLength, /* Output buffer length */
759 OutputLength); /* Return information */
760}
761
765/*
766 * FUNCTION: Queries for a local IP address
767 * ARGUMENTS:
768 * FileObject = Pointer to file object
769 * Address = Address of buffer to place local address
770 * RETURNS:
771 * Status of operation
772 */
773{
774 UINT i;
775 TDIEntityID *Entities;
777 ULONG EntityType;
778 IPSNMPInfo SnmpInfo;
779 PIPADDR_ENTRY IpAddress;
782
783 AFD_DbgPrint(MAX_TRACE, ("Called\n"));
784
785 BufferSize = sizeof(TDIEntityID) * 20;
789 if (!Entities) {
790 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
792 }
793
794 /* Query device for supported entities */
795
796 Status = TdiQueryInformationEx(FileObject, /* File object */
797 GENERIC_ENTITY, /* Entity */
798 TL_INSTANCE, /* Instance */
799 INFO_CLASS_GENERIC, /* Entity class */
800 INFO_TYPE_PROVIDER, /* Entity type */
801 ENTITY_LIST_ID, /* Entity id */
802 Entities, /* Output buffer */
803 &BufferSize); /* Output buffer size */
804 if (!NT_SUCCESS(Status)) {
805 AFD_DbgPrint(MIN_TRACE, ("Unable to get list of supported entities (Status = 0x%X).\n", Status));
807 return Status;
808 }
809
810 /* Locate an IP entity */
812
813 AFD_DbgPrint(MAX_TRACE, ("EntityCount = %u\n", EntityCount));
814
815 for (i = 0; i < EntityCount; i++) {
816 if (Entities[i].tei_entity == CL_NL_ENTITY) {
817 /* Query device for entity type */
818
819 BufferSize = sizeof(EntityType);
820 Status = TdiQueryInformationEx(FileObject, /* File object */
821 CL_NL_ENTITY, /* Entity */
822 Entities[i].tei_instance, /* Instance */
823 INFO_CLASS_GENERIC, /* Entity class */
824 INFO_TYPE_PROVIDER, /* Entity type */
825 ENTITY_TYPE_ID, /* Entity id */
826 &EntityType, /* Output buffer */
827 &BufferSize); /* Output buffer size */
828 if (!NT_SUCCESS(Status) || (EntityType != CL_NL_IP)) {
829 AFD_DbgPrint(MIN_TRACE, ("Unable to get entity of type IP (Status = 0x%X).\n", Status));
830 break;
831 }
832
833 /* Query device for SNMP information */
834
835 BufferSize = sizeof(SnmpInfo);
836 Status = TdiQueryInformationEx(FileObject, /* File object */
837 CL_NL_ENTITY, /* Entity */
838 Entities[i].tei_instance, /* Instance */
839 INFO_CLASS_PROTOCOL, /* Entity class */
840 INFO_TYPE_PROVIDER, /* Entity type */
841 IP_MIB_STATS_ID, /* Entity id */
842 &SnmpInfo, /* Output buffer */
843 &BufferSize); /* Output buffer size */
844 if (!NT_SUCCESS(Status) || (SnmpInfo.ipsi_numaddr == 0)) {
845 AFD_DbgPrint(MIN_TRACE, ("Unable to get SNMP information or no IP addresses available (Status = 0x%X).\n", Status));
846 break;
847 }
848
849 /* Query device for all IP addresses */
850
851 if (SnmpInfo.ipsi_numaddr != 0) {
852 BufferSize = SnmpInfo.ipsi_numaddr * sizeof(IPADDR_ENTRY);
856 if (!IpAddress) {
857 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
858 break;
859 }
860
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_ADDRTABLE_ENTRY_ID, /* Entity id */
867 IpAddress, /* Output buffer */
868 &BufferSize); /* Output buffer size */
869 if (!NT_SUCCESS(Status)) {
870 AFD_DbgPrint(MIN_TRACE, ("Unable to get IP address (Status = 0x%X).\n", Status));
872 break;
873 }
874
875 if (SnmpInfo.ipsi_numaddr != 1) {
876 /* Skip loopback address */
877 *Address = DN2H(IpAddress[1].Addr);
878 } else {
879 /* Select the first address returned */
880 *Address = DN2H(IpAddress->Addr);
881 }
882
884 } else {
886 break;
887 }
888 }
889 }
890
892
893 AFD_DbgPrint(MAX_TRACE, ("Leaving\n"));
894
895 return Status;
896}
897
899 PIRP *Irp,
900 PFILE_OBJECT TransportObject,
906{
908 PMDL Mdl;
909
910 ASSERT(*Irp == NULL);
911
912 if (!TransportObject) {
913 AFD_DbgPrint(MIN_TRACE, ("Bad transport object.\n"));
915 }
916
917 DeviceObject = IoGetRelatedDeviceObject(TransportObject);
918 if (!DeviceObject) {
919 AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
921 }
922
923 *Irp = TdiBuildInternalDeviceControlIrp(TDI_SEND, /* Sub function */
924 DeviceObject, /* Device object */
925 TransportObject, /* File object */
926 NULL, /* Event */
927 NULL); /* Status */
928
929 if (!*Irp) {
930 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
932 }
933
934 AFD_DbgPrint(MID_TRACE, ("Allocating irp for %p:%u\n", Buffer,BufferLength));
935
936 Mdl = IoAllocateMdl(Buffer, /* Virtual address */
937 BufferLength, /* Length of buffer */
938 FALSE, /* Not secondary */
939 FALSE, /* Don't charge quota */
940 NULL); /* Don't use IRP */
941 if (!Mdl) {
942 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
944 *Irp = NULL;
946 }
947
948 _SEH2_TRY {
949 MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoReadAccess);
951 AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
952 IoFreeMdl(Mdl);
954 *Irp = NULL;
956 } _SEH2_END;
957
958 AFD_DbgPrint(MID_TRACE,("AFD>>> Got an MDL: %p\n", Mdl));
959
960 TdiBuildSend(*Irp, /* I/O Request Packet */
961 DeviceObject, /* Device object */
962 TransportObject, /* File object */
963 CompletionRoutine, /* Completion routine */
964 CompletionContext, /* Completion context */
965 Mdl, /* Data buffer */
966 Flags, /* Flags */
967 BufferLength); /* Length of data */
968
970 /* Does not block... The MDL is deleted in the receive completion
971 routine. */
972
973 return STATUS_PENDING;
974}
975
977 PIRP *Irp,
978 PFILE_OBJECT TransportObject,
984{
986 PMDL Mdl;
987
988 ASSERT(*Irp == NULL);
989
990 if (!TransportObject) {
991 AFD_DbgPrint(MIN_TRACE, ("Bad transport object.\n"));
993 }
994
995 DeviceObject = IoGetRelatedDeviceObject(TransportObject);
996 if (!DeviceObject) {
997 AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
999 }
1000
1001 *Irp = TdiBuildInternalDeviceControlIrp(TDI_RECEIVE, /* Sub function */
1002 DeviceObject, /* Device object */
1003 TransportObject, /* File object */
1004 NULL, /* Event */
1005 NULL); /* Status */
1006
1007 if (!*Irp) {
1008 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1010 }
1011
1012 AFD_DbgPrint(MID_TRACE, ("Allocating irp for %p:%u\n", Buffer,BufferLength));
1013
1014 Mdl = IoAllocateMdl(Buffer, /* Virtual address */
1015 BufferLength, /* Length of buffer */
1016 FALSE, /* Not secondary */
1017 FALSE, /* Don't charge quota */
1018 NULL); /* Don't use IRP */
1019 if (!Mdl) {
1020 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1022 *Irp = NULL;
1024 }
1025
1026 _SEH2_TRY {
1027 AFD_DbgPrint(MID_TRACE, ("probe and lock\n"));
1028 MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess);
1029 AFD_DbgPrint(MID_TRACE, ("probe and lock done\n"));
1031 AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
1032 IoFreeMdl(Mdl);
1034 *Irp = NULL;
1036 } _SEH2_END;
1037
1038 AFD_DbgPrint(MID_TRACE,("AFD>>> Got an MDL: %p\n", Mdl));
1039
1040 TdiBuildReceive(*Irp, /* I/O Request Packet */
1041 DeviceObject, /* Device object */
1042 TransportObject, /* File object */
1043 CompletionRoutine, /* Completion routine */
1044 CompletionContext, /* Completion context */
1045 Mdl, /* Data buffer */
1046 Flags, /* Flags */
1047 BufferLength); /* Length of data */
1048
1049
1051 /* Does not block... The MDL is deleted in the receive completion
1052 routine. */
1053
1054 return STATUS_PENDING;
1055}
1056
1057
1059 PIRP *Irp,
1060 PFILE_OBJECT TransportObject,
1061 USHORT Flags,
1062 PCHAR Buffer,
1067/*
1068 * FUNCTION: Receives a datagram
1069 * ARGUMENTS:
1070 * TransportObject = Pointer to transport object
1071 * From = Receive filter (NULL if none)
1072 * Address = Address of buffer to place remote address
1073 * Buffer = Address of buffer to place received data
1074 * BufferSize = Address of buffer with length of Buffer (updated)
1075 * RETURNS:
1076 * Status of operation
1077 */
1078{
1080 PMDL Mdl;
1081
1082 ASSERT(*Irp == NULL);
1083
1084 if (!TransportObject) {
1085 AFD_DbgPrint(MIN_TRACE, ("Bad tranport object.\n"));
1087 }
1088
1089 DeviceObject = IoGetRelatedDeviceObject(TransportObject);
1090 if (!DeviceObject) {
1091 AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
1093 }
1094
1096 DeviceObject, /* Device object */
1097 TransportObject, /* File object */
1098 NULL, /* Event */
1099 NULL); /* Status */
1100
1101 if (!*Irp) {
1102 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1104 }
1105
1106 AFD_DbgPrint(MID_TRACE, ("Allocating irp for %p:%u\n", Buffer,BufferLength));
1107
1108 Mdl = IoAllocateMdl(Buffer, /* Virtual address */
1109 BufferLength, /* Length of buffer */
1110 FALSE, /* Not secondary */
1111 FALSE, /* Don't charge quota */
1112 NULL); /* Don't use IRP */
1113 if (!Mdl) {
1114 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1116 *Irp = NULL;
1118 }
1119
1120 _SEH2_TRY {
1121 MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess);
1123 AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
1124 IoFreeMdl(Mdl);
1126 *Irp = NULL;
1128 } _SEH2_END;
1129
1130 AFD_DbgPrint(MID_TRACE,("AFD>>> Got an MDL: %p\n", Mdl));
1131
1132 TdiBuildReceiveDatagram(*Irp, /* I/O Request Packet */
1133 DeviceObject, /* Device object */
1134 TransportObject, /* File object */
1135 CompletionRoutine, /* Completion routine */
1136 CompletionContext, /* Completion context */
1137 Mdl, /* Data buffer */
1139 Addr,
1140 Addr,
1141 Flags); /* Length of data */
1142
1144 /* Does not block... The MDL is deleted in the receive completion
1145 routine. */
1146
1147 return STATUS_PENDING;
1148}
1149
1150
1152 PIRP *Irp,
1153 PFILE_OBJECT TransportObject,
1154 PCHAR Buffer,
1159/*
1160 * FUNCTION: Sends a datagram
1161 * ARGUMENTS:
1162 * TransportObject = Pointer to transport object
1163 * From = Send filter (NULL if none)
1164 * Address = Address of buffer to place remote address
1165 * Buffer = Address of buffer to place send data
1166 * BufferSize = Address of buffer with length of Buffer (updated)
1167 * RETURNS:
1168 * Status of operation
1169 */
1170{
1172 PMDL Mdl;
1173
1174 ASSERT(*Irp == NULL);
1175
1176 if (!TransportObject) {
1177 AFD_DbgPrint(MIN_TRACE, ("Bad transport object.\n"));
1179 }
1180
1181 AFD_DbgPrint(MID_TRACE,("Called(TransportObject %p)\n", TransportObject));
1182
1183 DeviceObject = IoGetRelatedDeviceObject(TransportObject);
1184 if (!DeviceObject) {
1185 AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
1187 }
1188
1189 if (BufferLength == 0)
1190 {
1191 AFD_DbgPrint(MID_TRACE, ("Succeeding send with length 0.\n"));
1192 return STATUS_SUCCESS;
1193 }
1194
1196 DeviceObject, /* Device object */
1197 TransportObject, /* File object */
1198 NULL, /* Event */
1199 NULL); /* Status */
1200
1201 if (!*Irp) {
1202 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1204 }
1205
1206 AFD_DbgPrint(MID_TRACE, ("Allocating irp for %p:%u\n", Buffer,BufferLength));
1207
1208 Mdl = IoAllocateMdl(Buffer, /* Virtual address */
1209 BufferLength, /* Length of buffer */
1210 FALSE, /* Not secondary */
1211 FALSE, /* Don't charge quota */
1212 NULL); /* Don't use IRP */
1213
1214 if (!Mdl) {
1215 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1217 *Irp = NULL;
1219 }
1220
1221 _SEH2_TRY {
1222 MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoReadAccess);
1224 AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
1225 IoFreeMdl(Mdl);
1227 *Irp = NULL;
1229 } _SEH2_END;
1230
1231 AFD_DbgPrint(MID_TRACE,("AFD>>> Got an MDL: %p\n", Mdl));
1232
1233 TdiBuildSendDatagram(*Irp, /* I/O Request Packet */
1234 DeviceObject, /* Device object */
1235 TransportObject, /* File object */
1236 CompletionRoutine, /* Completion routine */
1237 CompletionContext, /* Completion context */
1238 Mdl, /* Data buffer */
1239 BufferLength, /* Bytes to send */
1240 Addr); /* Address */
1241
1243 /* Does not block... The MDL is deleted in the send completion
1244 routine. */
1245
1246 return STATUS_PENDING;
1247}
1248
1250 PIRP *Irp,
1251 PFILE_OBJECT TransportObject,
1253 USHORT Flags,
1256 PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
1257 PTDI_CONNECTION_INFORMATION ReturnConnectionInfo) {
1259
1260 if (!TransportObject) {
1261 AFD_DbgPrint(MIN_TRACE, ("Bad transport object.\n"));
1263 }
1264
1265 AFD_DbgPrint(MID_TRACE,("Called(TransportObject %p)\n", TransportObject));
1266
1267 DeviceObject = IoGetRelatedDeviceObject(TransportObject);
1268 if (!DeviceObject) {
1269 AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
1271 }
1272
1274 DeviceObject, /* Device object */
1275 TransportObject, /* File object */
1276 NULL, /* Event */
1277 NULL); /* Status */
1278
1279 if (!*Irp) {
1280 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1282 }
1283
1284 TdiBuildDisconnect(*Irp, /* I/O Request Packet */
1285 DeviceObject, /* Device object */
1286 TransportObject, /* File object */
1287 CompletionRoutine, /* Completion routine */
1288 CompletionContext, /* Completion context */
1289 Time, /* Time */
1290 Flags, /* Disconnect flags */
1291 RequestConnectionInfo, /* Indication of who to disconnect */
1292 ReturnConnectionInfo); /* Indication of who disconnected */
1293
1295
1296 return STATUS_PENDING;
1297}
1298
1299/* 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
#define MIN_TRACE
Definition: debug.h:14
#define MID_TRACE
Definition: debug.h:15
#define MAX_TRACE
Definition: debug.h:16
Definition: bufpool.h:45
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_PENDING
Definition: d3dkmdt.h:43
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define BufferSize
Definition: mmc.h:75
#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:4147
return Iosb
Definition: create.c:4402
NTSTATUS TdiQueryInformationEx(PFILE_OBJECT FileObject, ULONG Entity, ULONG Instance, ULONG Class, ULONG Type, ULONG Id, PVOID OutputBuffer, PULONG OutputLength)
Definition: tdi.c:720
NTSTATUS TdiListen(PIRP *Irp, PFILE_OBJECT ConnectionObject, PTDI_CONNECTION_INFORMATION *RequestConnectionInfo, PTDI_CONNECTION_INFORMATION *ReturnConnectionInfo, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:489
NTSTATUS TdiAssociateAddressFile(HANDLE AddressHandle, PFILE_OBJECT ConnectionObject)
Definition: tdi.c:391
NTSTATUS TdiSendDatagram(PIRP *Irp, PFILE_OBJECT TransportObject, PCHAR Buffer, UINT BufferLength, PTDI_CONNECTION_INFORMATION Addr, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:1151
NTSTATUS TdiOpenConnectionEndpointFile(PUNICODE_STRING DeviceName, PHANDLE ConnectionHandle, PFILE_OBJECT *ConnectionObject)
Definition: tdi.c:281
NTSTATUS TdiQueryMaxDatagramLength(PFILE_OBJECT FileObject, PUINT MaxDatagramLength)
Definition: tdi.c:226
NTSTATUS TdiDisassociateAddressFile(PFILE_OBJECT ConnectionObject)
Definition: tdi.c:442
NTSTATUS TdiSend(PIRP *Irp, PFILE_OBJECT TransportObject, USHORT Flags, PCHAR Buffer, UINT BufferLength, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:898
NTSTATUS TdiQueryInformation(PFILE_OBJECT FileObject, LONG QueryType, PMDL MdlBuffer)
Definition: tdi.c:668
static NTSTATUS TdiCall(PIRP Irp, PDEVICE_OBJECT DeviceObject, PKEVENT Event, PIO_STATUS_BLOCK Iosb)
Definition: tdi.c:46
NTSTATUS TdiSetEventHandler(PFILE_OBJECT FileObject, LONG EventType, PVOID Handler, PVOID Context)
Definition: tdi.c:546
NTSTATUS TdiQueryDeviceControl(PFILE_OBJECT FileObject, ULONG IoControlCode, PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength, PULONG Return)
Definition: tdi.c:607
static NTSTATUS TdiOpenDevice(PUNICODE_STRING DeviceName, ULONG EaLength, PFILE_FULL_EA_INFORMATION EaInfo, ULONG ShareType, PHANDLE Handle, PFILE_OBJECT *Object)
Definition: tdi.c:88
NTSTATUS TdiReceiveDatagram(PIRP *Irp, PFILE_OBJECT TransportObject, USHORT Flags, PCHAR Buffer, UINT BufferLength, PTDI_CONNECTION_INFORMATION Addr, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:1058
NTSTATUS TdiConnect(PIRP *Irp, PFILE_OBJECT ConnectionObject, PTDI_CONNECTION_INFORMATION ConnectionCallInfo, PTDI_CONNECTION_INFORMATION ConnectionReturnInfo, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:334
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:1249
NTSTATUS TdiReceive(PIRP *Irp, PFILE_OBJECT TransportObject, USHORT Flags, PCHAR Buffer, UINT BufferLength, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:976
NTSTATUS TdiOpenAddressFile(PUNICODE_STRING DeviceName, PTRANSPORT_ADDRESS Name, ULONG ShareType, PHANDLE AddressHandle, PFILE_OBJECT *AddressObject)
Definition: tdi.c:170
NTSTATUS TdiQueryAddress(PFILE_OBJECT FileObject, PULONG Address)
Definition: tdi.c:762
#define AFD_DbgPrint(_t_, _x_)
Definition: debug.h:60
ULONG EntityCount
Definition: main.c:28
ULONG DebugTraceLevel
Definition: ndis.c:13
#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
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
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
GLfloat GLfloat p
Definition: glext.h:8902
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 DbgPrint
Definition: hal.h:12
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
POBJECT_TYPE IoFileObjectType
Definition: iomgr.c:36
_In_ PKSPIN_CONNECT _In_ ACCESS_MASK _Out_ PHANDLE ConnectionHandle
Definition: ks.h:4538
#define PCHAR
Definition: match.c:90
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
Definition: mdlsup.c:931
#define ASSERT(a)
Definition: mode.c:44
#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
#define KernelMode
Definition: asm.h:34
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_ EVENT_TYPE EventType
Definition: exfuncs.h:167
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#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:165
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:66
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:168
#define AFD_SHARE_UNIQUE
Definition: shared.h:191
#define AFD_SHARE_REUSE
Definition: shared.h:192
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: afd.h:56
ULONG Addr
Definition: afd.h:57
ULONG ipsi_numaddr
Definition: tcpioctl.h:156
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:46
VOID TaCopyTransportAddressInPlace(PTRANSPORT_ADDRESS Target, PTRANSPORT_ADDRESS Source)
Definition: tdiconn.c:74
#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 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
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:2055
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3771
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3275
_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:2835
* PFILE_OBJECT
Definition: iotypes.h:1998
@ Executive
Definition: ketypes.h:415
@ IoReadAccess
Definition: ketypes.h:863
@ IoModifyAccess
Definition: ketypes.h:865