ReactOS 0.4.15-dev-7958-gcd0bb1a
pdo.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS ISA PnP Bus driver
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: PDO-specific code
5 * COPYRIGHT: Copyright 2010 Cameron Gutman <cameron.gutman@reactos.org>
6 * Copyright 2020 Hervé Poussineau <hpoussin@reactos.org>
7 * Copyright 2021 Dmitry Borisov <di.sean@protonmail.com>
8 */
9
10#include "isapnp.h"
11
12#define NDEBUG
13#include <debug.h>
14
15static
16CODE_SEG("PAGE")
22{
23 PDEVICE_RELATIONS DeviceRelations;
24
25 PAGED_CODE();
26
28 PdoExt->Common.Signature == IsaPnpReadDataPort)
29 {
30 return IsaPnpFillDeviceRelations(PdoExt->FdoExt, Irp, FALSE);
31 }
32
34 return Irp->IoStatus.Status;
35
36 DeviceRelations = ExAllocatePoolWithTag(PagedPool, sizeof(*DeviceRelations), TAG_ISAPNP);
37 if (!DeviceRelations)
38 return STATUS_NO_MEMORY;
39
40 DeviceRelations->Count = 1;
41 DeviceRelations->Objects[0] = PdoExt->Common.Self;
43
44 Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations;
45 return STATUS_SUCCESS;
46}
47
48static
49CODE_SEG("PAGE")
55{
57 ULONG i;
58
60
61 PAGED_CODE();
62
64 if (DeviceCapabilities->Version != 1)
66
67 DeviceCapabilities->LockSupported =
68 DeviceCapabilities->EjectSupported =
69 DeviceCapabilities->Removable =
70 DeviceCapabilities->DockDevice = FALSE;
71
72 DeviceCapabilities->UniqueID = TRUE;
73
74 if (PdoExt->Common.Signature == IsaPnpReadDataPort)
75 {
76 DeviceCapabilities->RawDeviceOK = TRUE;
77 DeviceCapabilities->SilentInstall = TRUE;
78 }
79
80 for (i = 0; i < POWER_SYSTEM_MAXIMUM; i++)
81 DeviceCapabilities->DeviceState[i] = PowerDeviceD3;
83
84 return STATUS_SUCCESS;
85}
86
87static
88CODE_SEG("PAGE")
93{
94 PAGED_CODE();
95
97 {
98 Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE |
101 return STATUS_SUCCESS;
102 }
103 else if (PdoExt->SpecialFiles > 0)
104 {
105 Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE;
106 return STATUS_SUCCESS;
107 }
108
109 return Irp->IoStatus.Status;
110}
111
112static
113CODE_SEG("PAGE")
119{
120 PISAPNP_LOGICAL_DEVICE LogDev = PdoExt->IsaPnpDevice;
122 PWCHAR Buffer, End, IdStart;
123 size_t CharCount, Remaining;
124
125 PAGED_CODE();
126
127 switch (IrpSp->Parameters.QueryId.IdType)
128 {
129 case BusQueryDeviceID:
130 {
131 CharCount = sizeof("ISAPNP\\XXXFFFF");
132
134 {
135 CharCount += sizeof("_DEV1234") - sizeof(ANSI_NULL);
136 }
137
139 CharCount * sizeof(WCHAR),
140 TAG_ISAPNP);
141 if (!Buffer)
143
145 CharCount,
146 &End,
147 &Remaining,
148 0,
149 L"ISAPNP\\%.3S%04X",
150 LogDev->VendorId,
151 LogDev->ProdId);
153 goto Failure;
154
156 {
158 Remaining,
159 NULL,
160 NULL,
161 0,
162 L"_DEV%04X",
163 LogDev->LDN);
165 goto Failure;
166 }
167
168 DPRINT("Device ID: '%S'\n", Buffer);
169 break;
170 }
171
173 {
174 CharCount = sizeof("ISAPNP\\XXXFFFF") +
175 sizeof("*PNPxxxx") +
176 sizeof(ANSI_NULL); /* multi-string */
177
179 {
180 CharCount += sizeof("_DEV1234") - sizeof(ANSI_NULL);
181 }
182
184 CharCount * sizeof(WCHAR),
185 TAG_ISAPNP);
186 if (!Buffer)
188
189 DPRINT("Hardware IDs:\n");
190
191 /* 1 */
193 CharCount,
194 &End,
195 &Remaining,
196 0,
197 L"ISAPNP\\%.3S%04X",
198 LogDev->VendorId,
199 LogDev->ProdId);
201 goto Failure;
202
204 {
206 Remaining,
207 &End,
208 &Remaining,
209 0,
210 L"_DEV%04X",
211 LogDev->LDN);
213 goto Failure;
214 }
215
216 DPRINT(" '%S'\n", Buffer);
217
218 ++End;
219 --Remaining;
220
221 /* 2 */
222 IdStart = End;
224 Remaining,
225 &End,
226 &Remaining,
227 0,
228 L"*%.3S%04X",
229 LogDev->LogVendorId,
230 LogDev->LogProdId);
232 goto Failure;
233
234 DPRINT(" '%S'\n", IdStart);
235
236 *++End = UNICODE_NULL;
237 --Remaining;
238
239 break;
240 }
241
243 {
245
246 for (Entry = LogDev->CompatibleIdList.Flink, CharCount = 0;
247 Entry != &LogDev->CompatibleIdList;
248 Entry = Entry->Flink)
249 {
250 CharCount += sizeof("*PNPxxxx");
251 }
252 CharCount += sizeof(ANSI_NULL); /* multi-string */
253
254 if (CharCount == sizeof(ANSI_NULL))
255 return Irp->IoStatus.Status;
256
258 CharCount * sizeof(WCHAR),
259 TAG_ISAPNP);
260 if (!Buffer)
262
263 DPRINT("Compatible IDs:\n");
264
265 for (Entry = LogDev->CompatibleIdList.Flink, End = Buffer, Remaining = CharCount;
266 Entry != &LogDev->CompatibleIdList;
267 Entry = Entry->Flink)
268 {
269 PISAPNP_COMPATIBLE_ID_ENTRY CompatibleId =
271
272 IdStart = End;
274 Remaining,
275 &End,
276 &Remaining,
277 0,
278 L"*%.3S%04X",
279 CompatibleId->VendorId,
280 CompatibleId->ProdId);
282 goto Failure;
283
284 DPRINT(" '%S'\n", IdStart);
285
286 ++End;
287 --Remaining;
288 }
289
290 *End = UNICODE_NULL;
291
292 break;
293 }
294
296 {
297 CharCount = sizeof(LogDev->SerialNumber) * 2 + sizeof(ANSI_NULL);
298
300 CharCount * sizeof(WCHAR),
301 TAG_ISAPNP);
302 if (!Buffer)
304
306 CharCount,
307 NULL,
308 NULL,
309 0,
310 L"%X",
311 LogDev->SerialNumber);
313 goto Failure;
314
315 DPRINT("Instance ID: '%S'\n", Buffer);
316 break;
317 }
318
319 default:
320 return Irp->IoStatus.Status;
321 }
322
323 Irp->IoStatus.Information = (ULONG_PTR)Buffer;
324 return STATUS_SUCCESS;
325
326Failure:
328
329 return Status;
330}
331
332static
333CODE_SEG("PAGE")
338{
340 static const WCHAR ReadPortId[] = L"ISAPNP\\ReadDataPort";
341
342 PAGED_CODE();
343
344 switch (IrpSp->Parameters.QueryId.IdType)
345 {
346 case BusQueryDeviceID:
347 {
348 Buffer = ExAllocatePoolWithTag(PagedPool, sizeof(ReadPortId), TAG_ISAPNP);
349 if (!Buffer)
351
352 RtlCopyMemory(Buffer, ReadPortId, sizeof(ReadPortId));
353
354 DPRINT("Device ID: '%S'\n", Buffer);
355 break;
356 }
357
359 {
361 sizeof(ReadPortId) + sizeof(UNICODE_NULL),
362 TAG_ISAPNP);
363 if (!Buffer)
365
366 RtlCopyMemory(Buffer, ReadPortId, sizeof(ReadPortId));
367
368 Buffer[sizeof(ReadPortId) / sizeof(WCHAR)] = UNICODE_NULL; /* multi-string */
369
370 DPRINT("Hardware ID: '%S'\n", Buffer);
371 break;
372 }
373
375 {
376 /* Empty multi-string */
377 Buffer = ExAllocatePoolZero(PagedPool, sizeof(UNICODE_NULL) * 2, TAG_ISAPNP);
378 if (!Buffer)
380
381 DPRINT("Compatible ID: '%S'\n", Buffer);
382 break;
383 }
384
386 {
387 /* Even if there are multiple ISA buses, the driver has only one Read Port */
388 static const WCHAR InstanceId[] = L"0";
389
391 if (!Buffer)
393
395
396 DPRINT("Instance ID: '%S'\n", Buffer);
397 break;
398 }
399
400 default:
401 return Irp->IoStatus.Status;
402 }
403
404 Irp->IoStatus.Information = (ULONG_PTR)Buffer;
405 return STATUS_SUCCESS;
406}
407
408static
409CODE_SEG("PAGE")
415{
418 size_t CharCount;
419
420 PAGED_CODE();
421
422 switch (IrpSp->Parameters.QueryDeviceText.DeviceTextType)
423 {
425 {
426 if (!PdoExt->IsaPnpDevice->FriendlyName)
427 return Irp->IoStatus.Status;
428
429 CharCount = strlen(PdoExt->IsaPnpDevice->FriendlyName) +
430 sizeof(ANSI_NULL);
431
432 if (CharCount == sizeof(ANSI_NULL))
433 return Irp->IoStatus.Status;
434
436 CharCount * sizeof(WCHAR),
437 TAG_ISAPNP);
438 if (!Buffer)
440
442 CharCount,
443 NULL,
444 NULL,
445 0,
446 L"%hs",
447 PdoExt->IsaPnpDevice->FriendlyName);
449 {
451 return Status;
452 }
453
454 DPRINT("TextDescription: '%S'\n", Buffer);
455 break;
456 }
457
458 default:
459 return Irp->IoStatus.Status;
460 }
461
462 Irp->IoStatus.Information = (ULONG_PTR)Buffer;
463 return STATUS_SUCCESS;
464}
465
466static
467CODE_SEG("PAGE")
473{
474 ULONG ListSize;
476
478
479 PAGED_CODE();
480
481 if (PdoExt->Common.Signature == IsaPnpLogicalDevice &&
482 !(PdoExt->IsaPnpDevice->Flags & ISAPNP_HAS_RESOURCES))
483 {
484 Irp->IoStatus.Information = 0;
485 return STATUS_SUCCESS;
486 }
487
488 if (!PdoExt->ResourceList)
489 return Irp->IoStatus.Status;
490
491 ListSize = PdoExt->ResourceListSize;
493 if (!ResourceList)
494 return STATUS_NO_MEMORY;
495
496 RtlCopyMemory(ResourceList, PdoExt->ResourceList, ListSize);
497 Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
498 return STATUS_SUCCESS;
499}
500
501static
502CODE_SEG("PAGE")
508{
509 ULONG ListSize;
511
513
514 PAGED_CODE();
515
516 if (!PdoExt->RequirementsList)
517 return Irp->IoStatus.Status;
518
519 ListSize = PdoExt->RequirementsList->ListSize;
521 if (!RequirementsList)
522 return STATUS_NO_MEMORY;
523
524 RtlCopyMemory(RequirementsList, PdoExt->RequirementsList, ListSize);
525 Irp->IoStatus.Information = (ULONG_PTR)RequirementsList;
526 return STATUS_SUCCESS;
527}
528
529#define IS_READ_PORT(_d) ((_d)->Type == CmResourceTypePort && (_d)->u.Port.Length > 1)
530
531static
532CODE_SEG("PAGE")
537{
538 PISAPNP_FDO_EXTENSION FdoExt = PdoExt->FdoExt;
540 ULONG i;
541
542 PAGED_CODE();
543
544 if (!ResourceList)
545 {
546 DPRINT1("No resource list\n");
548 }
549
550 if (ResourceList->List[0].PartialResourceList.Version != 1 ||
551 ResourceList->List[0].PartialResourceList.Revision != 1)
552 {
553 DPRINT1("Bad resource list version (%u.%u)\n",
554 ResourceList->List[0].PartialResourceList.Version,
555 ResourceList->List[0].PartialResourceList.Revision);
557 }
558
559#if 0
560 /* Try various Read Ports from the list */
561 if (ResourceList->List[0].PartialResourceList.Count > 3)
562 {
563 ULONG SelectedPort = 0;
564
565 for (i = 0; i < ResourceList->List[0].PartialResourceList.Count; i++)
566 {
567 PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor =
568 &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
569
570 if (IS_READ_PORT(PartialDescriptor))
571 {
572 PUCHAR ReadDataPort = ULongToPtr(PartialDescriptor->u.Port.Start.u.LowPart + 3);
573 ULONG Cards;
574
575 /*
576 * Remember the first Read Port in the resource list.
577 * It will be selected by default even if no card has been detected.
578 */
579 if (!SelectedPort)
580 SelectedPort = PartialDescriptor->u.Port.Start.u.LowPart;
581
582 Cards = IsaHwTryReadDataPort(ReadDataPort);
583 IsaHwWaitForKey();
584
585 /* We detected some ISAPNP cards */
586 if (Cards > 0)
587 {
588 SelectedPort = PartialDescriptor->u.Port.Start.u.LowPart;
589 break;
590 }
591 }
592 }
593
594 ASSERT(SelectedPort != 0);
595
596 if (PdoExt->RequirementsList)
597 {
598 ExFreePoolWithTag(PdoExt->RequirementsList, TAG_ISAPNP);
599 PdoExt->RequirementsList = NULL;
600 }
601
602 /* Discard the Read Ports at conflicting locations */
604 if (!NT_SUCCESS(Status))
605 return Status;
606
608
610
611 return STATUS_SUCCESS;
612 }
613 /* Set the Read Port */
614 else if (ResourceList->List[0].PartialResourceList.Count == 3)
615#else
616 if (ResourceList->List[0].PartialResourceList.Count > 3) /* Temporary HACK */
617#endif
618 {
619 PdoExt->Flags &= ~ISAPNP_READ_PORT_NEED_REBALANCE;
620
621 for (i = 0; i < ResourceList->List[0].PartialResourceList.Count; i++)
622 {
623 PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor =
624 &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
625
626 if (IS_READ_PORT(PartialDescriptor))
627 {
628 PUCHAR ReadDataPort = ULongToPtr(PartialDescriptor->u.Port.Start.u.LowPart + 3);
629
630 /* Run the isolation protocol */
631 FdoExt->Cards = IsaHwTryReadDataPort(ReadDataPort);
632
633 if (FdoExt->Cards > 0)
634 {
635 FdoExt->ReadDataPort = ReadDataPort;
636
637 IsaPnpAcquireDeviceDataLock(FdoExt);
638
639 /* Card identification */
640 Status = IsaHwFillDeviceList(FdoExt);
641 IsaHwWaitForKey();
642
643 IsaPnpReleaseDeviceDataLock(FdoExt);
644
647
650
651 return Status;
652 }
653 else
654 {
655 IsaHwWaitForKey();
656#if 0 /* See the 'if 0' above */
657 break;
658#endif
659 }
660 }
661 }
662 }
663 else
664 {
666 }
667
668 /* Mark Read Port as started, even if no card has been detected */
669 return STATUS_SUCCESS;
670}
671
672static
673CODE_SEG("PAGE")
679{
680 PAGED_CODE();
681
682 /* TODO: Handle */
685 return Irp->IoStatus.Status;
686}
687
688static
689CODE_SEG("PAGE")
694{
696
697 PAGED_CODE();
698
700 sizeof(PNP_BUS_INFORMATION),
701 TAG_ISAPNP);
702 if (!BusInformation)
704
705 BusInformation->BusTypeGuid = GUID_BUS_TYPE_ISAPNP;
706 BusInformation->LegacyBusType = Isa;
707 BusInformation->BusNumber = PdoExt->FdoExt->BusNumber;
708
709 Irp->IoStatus.Information = (ULONG_PTR)BusInformation;
710 return STATUS_SUCCESS;
711}
712
713static
714CODE_SEG("PAGE")
720{
721 BOOLEAN InPath = IrpSp->Parameters.UsageNotification.InPath;
722
723 PAGED_CODE();
724
725 switch (IrpSp->Parameters.UsageNotification.Type)
726 {
730 IoAdjustPagingPathCount(&PdoExt->SpecialFiles, InPath);
732 break;
733
734 default:
735 return Irp->IoStatus.Status;
736 }
737
738 /* Do not send it to FDO for compatibility */
739 return STATUS_SUCCESS;
740}
741
742static
743CODE_SEG("PAGE")
747 _In_ BOOLEAN FinalRemove)
748{
749 PISAPNP_FDO_EXTENSION FdoExt = PdoExt->FdoExt;
750
751 PAGED_CODE();
752
753 /* Deactivate the device if previously activated */
754 if (PdoExt->Common.State == dsStarted)
755 {
756 IsaHwWakeDevice(PdoExt->IsaPnpDevice);
757 IsaHwDeactivateDevice(PdoExt->IsaPnpDevice);
758
759 IsaHwWaitForKey();
760
761 PdoExt->Common.State = dsStopped;
762 }
763
764 if (FinalRemove && !(PdoExt->Flags & ISAPNP_ENUMERATED))
765 {
766 IsaPnpAcquireDeviceDataLock(FdoExt);
767
768 RemoveEntryList(&PdoExt->IsaPnpDevice->DeviceLink);
769 --FdoExt->DeviceCount;
770
771 IsaPnpReleaseDeviceDataLock(FdoExt);
772
774 }
775
776 return STATUS_SUCCESS;
777}
778
779static
780CODE_SEG("PAGE")
784 _In_ BOOLEAN FinalRemove)
785{
786 PISAPNP_FDO_EXTENSION FdoExt = PdoExt->FdoExt;
788
789 PAGED_CODE();
790
791 IsaPnpAcquireDeviceDataLock(FdoExt);
792
793 /* Logical devices will receive a remove request afterwards */
794 for (Entry = FdoExt->DeviceListHead.Flink;
795 Entry != &FdoExt->DeviceListHead;
796 Entry = Entry->Flink)
797 {
800 DeviceLink);
801
802 LogDevice->Flags &= ~ISAPNP_PRESENT;
803 }
804
805 IsaPnpReleaseDeviceDataLock(FdoExt);
806
807 PdoExt->Flags &= ~ISAPNP_READ_PORT_ALLOW_FDO_SCAN;
809
810 if (FinalRemove && !(PdoExt->Flags & ISAPNP_ENUMERATED))
811 {
813 }
814
815 return STATUS_SUCCESS;
816}
817
818CODE_SEG("PAGE")
819VOID
822{
823 PISAPNP_PDO_EXTENSION PdoExt = Pdo->DeviceExtension;
824 PISAPNP_LOGICAL_DEVICE LogDev = PdoExt->IsaPnpDevice;
826
827 PAGED_CODE();
828 ASSERT(LogDev);
829
830 DPRINT("Removing CSN %u, LDN %u\n", LogDev->CSN, LogDev->LDN);
831
832 if (PdoExt->RequirementsList)
833 ExFreePoolWithTag(PdoExt->RequirementsList, TAG_ISAPNP);
834
835 if (PdoExt->ResourceList)
836 ExFreePoolWithTag(PdoExt->ResourceList, TAG_ISAPNP);
837
838 if (LogDev->FriendlyName)
840
841 if (LogDev->Alternatives)
843
844 Entry = LogDev->CompatibleIdList.Flink;
845 while (Entry != &LogDev->CompatibleIdList)
846 {
847 PISAPNP_COMPATIBLE_ID_ENTRY CompatibleId =
849
850 RemoveEntryList(&CompatibleId->IdLink);
851
852 Entry = Entry->Flink;
853
854 ExFreePoolWithTag(CompatibleId, TAG_ISAPNP);
855 }
856
858
860}
861
862CODE_SEG("PAGE")
868{
869 NTSTATUS Status = Irp->IoStatus.Status;
870
871 PAGED_CODE();
872
873 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
874 {
875 DPRINT("%s(%p, %p) CSN %u, LDN %u, Minor - %X\n",
877 PdoExt,
878 Irp,
879 PdoExt->IsaPnpDevice->CSN,
880 PdoExt->IsaPnpDevice->LDN,
882 }
883 else
884 {
885 DPRINT("%s(%p, %p) ReadPort, Minor - %X\n",
887 PdoExt,
888 Irp,
890 }
891
892 switch (IrpSp->MinorFunction)
893 {
895 {
896 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
897 {
898 IsaHwWakeDevice(PdoExt->IsaPnpDevice);
899
901 PdoExt->IsaPnpDevice,
902 IrpSp->Parameters.StartDevice.AllocatedResources);
903 if (NT_SUCCESS(Status))
904 {
905 IsaHwActivateDevice(PdoExt->FdoExt, PdoExt->IsaPnpDevice);
906 }
907 else
908 {
909 DPRINT1("Failed to configure CSN %u, LDN %u with status 0x%08lx\n",
910 PdoExt->IsaPnpDevice->CSN, PdoExt->IsaPnpDevice->LDN, Status);
911 }
912
913 IsaHwWaitForKey();
914 }
915 else
916 {
918 IrpSp->Parameters.StartDevice.AllocatedResources);
919 }
920
921 if (NT_SUCCESS(Status))
922 PdoExt->Common.State = dsStarted;
923 break;
924 }
925
927 {
928 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
929 {
930 IsaHwWakeDevice(PdoExt->IsaPnpDevice);
931 IsaHwDeactivateDevice(PdoExt->IsaPnpDevice);
932
933 IsaHwWaitForKey();
934 }
935 else
936 {
937 PdoExt->Flags &= ~ISAPNP_READ_PORT_ALLOW_FDO_SCAN;
938 }
939
941
942 if (NT_SUCCESS(Status))
943 PdoExt->Common.State = dsStopped;
944 break;
945 }
946
948 {
949 if (PdoExt->SpecialFiles > 0)
951 else if (PdoExt->Flags & ISAPNP_READ_PORT_NEED_REBALANCE)
953 else
955
956 break;
957 }
958
960 {
961 if (PdoExt->SpecialFiles > 0)
963 else
965 break;
966 }
967
970 break;
971
974 break;
975
977 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
979 else
981 break;
982
984 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
986 else
988 break;
989
992 break;
993
996 break;
997
1000 break;
1001
1002 case IRP_MN_QUERY_ID:
1003 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
1005 else
1007 break;
1008
1010 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
1012 break;
1013
1016 break;
1017
1020 break;
1021
1024 break;
1025
1029 break;
1030
1031 default:
1032 DPRINT("Unknown PnP code: %X\n", IrpSp->MinorFunction);
1033 break;
1034 }
1035
1036 Irp->IoStatus.Status = Status;
1038
1039 return Status;
1040}
#define PAGED_CODE()
#define CODE_SEG(...)
unsigned char BOOLEAN
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define ULongToPtr(ul)
Definition: basetsd.h:92
VOID IsaPnpRemoveLogicalDeviceDO(_In_ PDEVICE_OBJECT Pdo)
Definition: pdo.c:820
static NTSTATUS IsaPdoQueryDeviceUsageNotification(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:716
static NTSTATUS IsaPdoQueryDeviceText(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:411
static NTSTATUS IsaPdoQueryCapabilities(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:51
static NTSTATUS IsaReadPortQueryId(_Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:335
#define IS_READ_PORT(_d)
Definition: pdo.c:529
static NTSTATUS IsaReadPortRemoveDevice(_In_ PISAPNP_PDO_EXTENSION PdoExt, _In_ BOOLEAN FinalRemove)
Definition: pdo.c:782
static NTSTATUS IsaPdoQueryDeviceRelations(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:18
NTSTATUS IsaPdoPnp(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:864
static NTSTATUS IsaPdoQueryResourceRequirements(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:504
static NTSTATUS IsaPdoQueryBusInformation(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp)
Definition: pdo.c:691
static NTSTATUS IsaPdoQueryResources(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:469
static NTSTATUS IsaPdoQueryId(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:115
static NTSTATUS IsaPdoStartReadPort(_In_ PISAPNP_PDO_EXTENSION PdoExt, _In_ PCM_RESOURCE_LIST ResourceList)
Definition: pdo.c:534
static NTSTATUS IsaPdoQueryPnpDeviceState(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp)
Definition: pdo.c:90
static NTSTATUS IsaPdoFilterResourceRequirements(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:675
static NTSTATUS IsaPdoRemoveDevice(_In_ PISAPNP_PDO_EXTENSION PdoExt, _In_ BOOLEAN FinalRemove)
Definition: pdo.c:745
Definition: bufpool.h:45
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
UCHAR IsaHwTryReadDataPort(_In_ PUCHAR ReadDataPort)
Definition: hardware.c:1362
NTSTATUS IsaHwConfigureDevice(_In_ PISAPNP_FDO_EXTENSION FdoExt, _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice, _In_ PCM_RESOURCE_LIST Resources)
Definition: hardware.c:1603
#define __FUNCTION__
Definition: types.h:116
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
#define ULONG_PTR
Definition: config.h:101
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
_Must_inspect_result_ _In_opt_ PVOID _In_opt_ PVOID InstanceId
Definition: fsrtlfuncs.h:908
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
@ Isa
Definition: hwresource.cpp:138
NTSTATUS IsaPnpCreateReadPortDORequirements(_In_ PISAPNP_PDO_EXTENSION PdoExt, _In_opt_ ULONG SelectedReadPort)
Definition: isapnp.c:1042
NTSTATUS IsaPnpFillDeviceRelations(_In_ PISAPNP_FDO_EXTENSION FdoExt, _Inout_ PIRP Irp, _In_ BOOLEAN IncludeDataPort)
Definition: isapnp.c:1304
VOID IsaPnpRemoveReadPortDO(_In_ PDEVICE_OBJECT Pdo)
Definition: isapnp.c:1284
#define TAG_ISAPNP
Definition: isapnp.h:24
#define ISAPNP_HAS_MULTIPLE_LOGDEVS
Indicates if the parent card has multiple logical devices.
Definition: isapnp.h:135
#define ISAPNP_READ_PORT_ALLOW_FDO_SCAN
Allows the active FDO to scan the bus.
Definition: isapnp.h:189
@ dsStopped
Definition: isapnp.h:34
@ dsStarted
Definition: isapnp.h:35
@ IsaPnpLogicalDevice
Definition: isapnp.h:144
@ IsaPnpReadDataPort
Definition: isapnp.h:145
#define ISAPNP_READ_PORT_NEED_REBALANCE
The I/O resource requirements have changed.
Definition: isapnp.h:190
#define ISAPNP_HAS_RESOURCES
Cleared when the device has no boot resources.
Definition: isapnp.h:136
#define ISAPNP_SCANNED_BY_READ_PORT
The bus has been scanned by Read Port PDO.
Definition: isapnp.h:188
#define ISAPNP_ENUMERATED
Whether the device has been reported to the PnP manager.
Definition: isapnp.h:187
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define _Inout_
Definition: ms_sal.h:378
#define _In_
Definition: ms_sal.h:308
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
#define ANSI_NULL
#define IRP_MN_SURPRISE_REMOVAL
Definition: ntifs_ex.h:408
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
#define IoCompleteRequest
Definition: irp.c:1240
#define POWER_SYSTEM_MAXIMUM
Definition: ntpoapi.h:45
@ PowerSystemWorking
Definition: ntpoapi.h:36
@ PowerDeviceD0
Definition: ntpoapi.h:49
@ PowerDeviceD3
Definition: ntpoapi.h:52
#define STATUS_RESOURCE_REQUIREMENTS_CHANGED
Definition: ntstatus.h:103
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define STATUS_DEVICE_CONFIGURATION_ERROR
Definition: ntstatus.h:619
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:325
NTSTRSAFEVAPI RtlStringCchPrintfExW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, _Out_opt_ size_t *pcchRemaining, _In_ STRSAFE_DWORD dwFlags, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1246
#define L(x)
Definition: ntvdm.h:50
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
Definition: pnpmgr.c:1772
VOID NTAPI IoInvalidateDeviceState(IN PDEVICE_OBJECT DeviceObject)
Definition: pnpmgr.c:1848
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71
base of all file and directory entries
Definition: entries.h:83
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@393 u
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@393::@395 Port
PDEVICE_OBJECT Self
Definition: pciidex.h:60
PDEVICE_OBJECT Objects[1]
Definition: iotypes.h:2163
struct _IO_STACK_LOCATION::@3978::@4015 StartDevice
union _IO_STACK_LOCATION::@1564 Parameters
struct _IO_STACK_LOCATION::@3978::@4003 QueryDeviceRelations
struct _IO_STACK_LOCATION::@3978::@4010 QueryDeviceText
struct _IO_STACK_LOCATION::@3978::@4005 DeviceCapabilities
struct _IO_STACK_LOCATION::@3978::@4009 QueryId
struct _IO_STACK_LOCATION::@3978::@4011 UsageNotification
Definition: isapnp.h:77
UCHAR VendorId[3]
Definition: isapnp.h:78
LIST_ENTRY IdLink
Definition: isapnp.h:80
USHORT ProdId
Definition: isapnp.h:79
PDEVICE_OBJECT Pdo
Definition: isapnp.h:159
PDEVICE_OBJECT ReadPortPdo
Definition: isapnp.h:160
LIST_ENTRY CompatibleIdList
Definition: isapnp.h:122
UCHAR LogVendorId[3]
Definition: isapnp.h:120
PISAPNP_ALTERNATIVES Alternatives
Definition: isapnp.h:124
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
COMMON_DEVICE_EXTENSION Common
Definition: usbhub.h:204
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
uint16_t * PWCHAR
Definition: typedefs.h:56
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_DEVICE_BUSY
Definition: udferr_usr.h:129
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
PUSBHUB_PORT_PDO_EXTENSION NTAPI PdoExt(IN PDEVICE_OBJECT DeviceObject)
Definition: usbhub.c:133
_In_ WDFDEVICE _In_ PPNP_BUS_INFORMATION BusInformation
Definition: wdfdevice.h:3915
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_ WDFDRIVER _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ PDEVICE_OBJECT _In_opt_ PDEVICE_OBJECT _In_opt_ PDEVICE_OBJECT Pdo
Definition: wdfminiport.h:72
_Must_inspect_result_ _In_ WDFIORESREQLIST _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFIORESLIST * ResourceList
Definition: wdfresource.h:309
_In_ WDFIORESREQLIST RequirementsList
Definition: wdfresource.h:65
#define DeviceCapabilities
Definition: wingdi.h:4449
#define IoAdjustPagingPathCount(_Count, _Increment)
#define IRP_MN_CANCEL_STOP_DEVICE
@ RemovalRelations
Definition: iotypes.h:2155
@ BusRelations
Definition: iotypes.h:2152
@ TargetDeviceRelation
Definition: iotypes.h:2156
#define IRP_MN_QUERY_PNP_DEVICE_STATE
#define PNP_DEVICE_NOT_DISABLEABLE
Definition: iotypes.h:1006
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED
Definition: iotypes.h:1005
#define IRP_MN_START_DEVICE
#define PNP_DEVICE_FAILED
Definition: iotypes.h:1003
#define IRP_MN_DEVICE_USAGE_NOTIFICATION
#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS
#define IRP_MN_QUERY_ID
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define IRP_MN_QUERY_STOP_DEVICE
#define IRP_MN_QUERY_DEVICE_TEXT
#define IRP_MN_QUERY_CAPABILITIES
#define IRP_MN_QUERY_RESOURCES
* PDEVICE_CAPABILITIES
Definition: iotypes.h:965
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_STOP_DEVICE
@ DeviceTextDescription
Definition: iotypes.h:2945
@ BusQueryCompatibleIDs
Definition: iotypes.h:2938
@ BusQueryInstanceID
Definition: iotypes.h:2939
@ BusQueryDeviceID
Definition: iotypes.h:2936
@ BusQueryHardwareIDs
Definition: iotypes.h:2937
#define IRP_MN_QUERY_BUS_INFORMATION
@ DeviceUsageTypeHibernation
Definition: iotypes.h:1171
@ DeviceUsageTypeDumpFile
Definition: iotypes.h:1172
@ DeviceUsageTypePaging
Definition: iotypes.h:1170
#define IRP_MN_QUERY_REMOVE_DEVICE
#define ObReferenceObject
Definition: obfuncs.h:204
#define NT_VERIFY(exp)
Definition: rtlfuncs.h:3287
__wchar_t WCHAR
Definition: xmlstorage.h:180