ReactOS 0.4.16-dev-106-g10b08aa
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 */
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 == IsaPnpReadDataPort)
482 {
484 if (!ResourceList)
485 return STATUS_NO_MEMORY;
486
487 Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
488 return STATUS_SUCCESS;
489 }
490
491 if (!PdoExt->ResourceList)
492 return Irp->IoStatus.Status;
493
494 ListSize = PdoExt->ResourceListSize;
496 if (!ResourceList)
497 return STATUS_NO_MEMORY;
498
499 RtlCopyMemory(ResourceList, PdoExt->ResourceList, ListSize);
500 Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
501 return STATUS_SUCCESS;
502}
503
504static
505CODE_SEG("PAGE")
511{
512 ULONG ListSize;
514
516
517 PAGED_CODE();
518
519 if (PdoExt->Common.Signature == IsaPnpReadDataPort)
520 {
522 if (!RequirementsList)
523 return STATUS_NO_MEMORY;
524
525 Irp->IoStatus.Information = (ULONG_PTR)RequirementsList;
526 return STATUS_SUCCESS;
527 }
528
529 if (!PdoExt->RequirementsList)
530 return Irp->IoStatus.Status;
531
532 ListSize = PdoExt->RequirementsList->ListSize;
534 if (!RequirementsList)
535 return STATUS_NO_MEMORY;
536
537 RtlCopyMemory(RequirementsList, PdoExt->RequirementsList, ListSize);
538 Irp->IoStatus.Information = (ULONG_PTR)RequirementsList;
539 return STATUS_SUCCESS;
540}
541
542#define IS_READ_PORT(_d) ((_d)->Type == CmResourceTypePort && (_d)->u.Port.Length > 1)
543
544static
545CODE_SEG("PAGE")
550{
551 PISAPNP_FDO_EXTENSION FdoExt = PdoExt->FdoExt;
553 ULONG i;
554
555 PAGED_CODE();
556
557 if (!ResourceList)
558 {
559 DPRINT1("No resource list\n");
561 }
562
563 if (ResourceList->List[0].PartialResourceList.Version != 1 ||
564 ResourceList->List[0].PartialResourceList.Revision != 1)
565 {
566 DPRINT1("Bad resource list version (%u.%u)\n",
567 ResourceList->List[0].PartialResourceList.Version,
568 ResourceList->List[0].PartialResourceList.Revision);
570 }
571
572#if 0
573 /* Try various Read Ports from the list */
574 if (ResourceList->List[0].PartialResourceList.Count > 3)
575 {
576 ULONG SelectedPort = 0;
577
578 for (i = 0; i < ResourceList->List[0].PartialResourceList.Count; i++)
579 {
580 PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor =
581 &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
582
583 if (IS_READ_PORT(PartialDescriptor))
584 {
585 PUCHAR ReadDataPort = ULongToPtr(PartialDescriptor->u.Port.Start.u.LowPart + 3);
586 ULONG Cards;
587
588 /*
589 * Remember the first Read Port in the resource list.
590 * It will be selected by default even if no card has been detected.
591 */
592 if (!SelectedPort)
593 SelectedPort = PartialDescriptor->u.Port.Start.u.LowPart;
594
595 Cards = IsaHwTryReadDataPort(ReadDataPort);
597
598 /* We detected some ISAPNP cards */
599 if (Cards > 0)
600 {
601 SelectedPort = PartialDescriptor->u.Port.Start.u.LowPart;
602 break;
603 }
604 }
605 }
606
607 ASSERT(SelectedPort != 0);
608
609 /* Discard the Read Ports at conflicting locations */
610 PdoExt->SelectedPort = SelectedPort;
613
614 return STATUS_SUCCESS;
615 }
616 /* Set the Read Port */
617 else if (ResourceList->List[0].PartialResourceList.Count == 3)
618#else
619 if (ResourceList->List[0].PartialResourceList.Count > 3) /* Temporary HACK */
620#endif
621 {
622 PdoExt->Flags &= ~ISAPNP_READ_PORT_NEED_REBALANCE;
623
624 for (i = 0; i < ResourceList->List[0].PartialResourceList.Count; i++)
625 {
626 PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor =
627 &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
628
629 if (IS_READ_PORT(PartialDescriptor))
630 {
631 PUCHAR ReadDataPort = ULongToPtr(PartialDescriptor->u.Port.Start.u.LowPart + 3);
632
633 /* Run the isolation protocol */
634 FdoExt->Cards = IsaHwTryReadDataPort(ReadDataPort);
635
636 if (FdoExt->Cards > 0)
637 {
638 FdoExt->ReadDataPort = ReadDataPort;
639
640 IsaPnpAcquireDeviceDataLock(FdoExt);
641
642 /* Card identification */
643 Status = IsaHwFillDeviceList(FdoExt);
645
646 IsaPnpReleaseDeviceDataLock(FdoExt);
647
650
653
654 return Status;
655 }
656 else
657 {
659#if 0 /* See the 'if 0' above */
660 break;
661#endif
662 }
663 }
664 }
665 }
666 else
667 {
669 }
670
671 /* Mark Read Port as started, even if no card has been detected */
672 return STATUS_SUCCESS;
673}
674
675static
676CODE_SEG("PAGE")
682{
683 PAGED_CODE();
684
685 /* TODO: Handle */
688 return Irp->IoStatus.Status;
689}
690
691static
692CODE_SEG("PAGE")
697{
699
700 PAGED_CODE();
701
703 sizeof(PNP_BUS_INFORMATION),
704 TAG_ISAPNP);
705 if (!BusInformation)
707
708 BusInformation->BusTypeGuid = GUID_BUS_TYPE_ISAPNP;
709 BusInformation->LegacyBusType = Isa;
710 BusInformation->BusNumber = PdoExt->FdoExt->BusNumber;
711
712 Irp->IoStatus.Information = (ULONG_PTR)BusInformation;
713 return STATUS_SUCCESS;
714}
715
716static
717CODE_SEG("PAGE")
723{
724 BOOLEAN InPath = IrpSp->Parameters.UsageNotification.InPath;
725
726 PAGED_CODE();
727
728 switch (IrpSp->Parameters.UsageNotification.Type)
729 {
733 IoAdjustPagingPathCount(&PdoExt->SpecialFiles, InPath);
735 break;
736
737 default:
738 return Irp->IoStatus.Status;
739 }
740
741 /* Do not send it to FDO for compatibility */
742 return STATUS_SUCCESS;
743}
744
745static
746CODE_SEG("PAGE")
750 _In_ BOOLEAN FinalRemove)
751{
752 PISAPNP_FDO_EXTENSION FdoExt = PdoExt->FdoExt;
753
754 PAGED_CODE();
755
756 /* Deactivate the device if previously activated */
757 if (PdoExt->Common.State == dsStarted)
758 {
759 IsaHwWakeDevice(PdoExt->IsaPnpDevice);
760 IsaHwDeactivateDevice(PdoExt->IsaPnpDevice);
761
763
764 PdoExt->Common.State = dsStopped;
765 }
766
767 if (FinalRemove && !(PdoExt->Flags & ISAPNP_ENUMERATED))
768 {
769 IsaPnpAcquireDeviceDataLock(FdoExt);
770
771 RemoveEntryList(&PdoExt->IsaPnpDevice->DeviceLink);
772 --FdoExt->DeviceCount;
773
774 IsaPnpReleaseDeviceDataLock(FdoExt);
775
777 }
778
779 return STATUS_SUCCESS;
780}
781
782static
783CODE_SEG("PAGE")
787 _In_ BOOLEAN FinalRemove)
788{
789 PISAPNP_FDO_EXTENSION FdoExt = PdoExt->FdoExt;
791
792 PAGED_CODE();
793
794 IsaPnpAcquireDeviceDataLock(FdoExt);
795
796 /* Logical devices will receive a remove request afterwards */
797 for (Entry = FdoExt->DeviceListHead.Flink;
798 Entry != &FdoExt->DeviceListHead;
799 Entry = Entry->Flink)
800 {
803 DeviceLink);
804
805 LogDevice->Flags &= ~ISAPNP_PRESENT;
806 }
807
808 IsaPnpReleaseDeviceDataLock(FdoExt);
809
810 PdoExt->Flags &= ~ISAPNP_READ_PORT_ALLOW_FDO_SCAN;
812
813 if (FinalRemove && !(PdoExt->Flags & ISAPNP_ENUMERATED))
814 {
816 }
817
818 return STATUS_SUCCESS;
819}
820
821CODE_SEG("PAGE")
822VOID
825{
826 PISAPNP_PDO_EXTENSION PdoExt = Pdo->DeviceExtension;
827 PISAPNP_LOGICAL_DEVICE LogDev = PdoExt->IsaPnpDevice;
829
830 PAGED_CODE();
831 ASSERT(LogDev);
832
833 DPRINT("Removing CSN %u, LDN %u\n", LogDev->CSN, LogDev->LDN);
834
835 if (PdoExt->RequirementsList)
836 ExFreePoolWithTag(PdoExt->RequirementsList, TAG_ISAPNP);
837
838 if (PdoExt->ResourceList)
839 ExFreePoolWithTag(PdoExt->ResourceList, TAG_ISAPNP);
840
841 if (LogDev->FriendlyName)
843
844 if (LogDev->Resources)
846
847 Entry = LogDev->CompatibleIdList.Flink;
848 while (Entry != &LogDev->CompatibleIdList)
849 {
850 PISAPNP_COMPATIBLE_ID_ENTRY CompatibleId =
852
853 RemoveEntryList(&CompatibleId->IdLink);
854
855 Entry = Entry->Flink;
856
857 ExFreePoolWithTag(CompatibleId, TAG_ISAPNP);
858 }
859
861
863}
864
865CODE_SEG("PAGE")
871{
872 NTSTATUS Status = Irp->IoStatus.Status;
873
874 PAGED_CODE();
875
876 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
877 {
878 DPRINT("%s(%p, %p) CSN %u, LDN %u, Minor - %X\n",
880 PdoExt,
881 Irp,
882 PdoExt->IsaPnpDevice->CSN,
883 PdoExt->IsaPnpDevice->LDN,
885 }
886 else
887 {
888 DPRINT("%s(%p, %p) ReadPort, Minor - %X\n",
890 PdoExt,
891 Irp,
893 }
894
895 switch (IrpSp->MinorFunction)
896 {
898 {
899 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
900 {
901 IsaHwWakeDevice(PdoExt->IsaPnpDevice);
902
904 PdoExt->IsaPnpDevice,
905 IrpSp->Parameters.StartDevice.AllocatedResources);
906 if (NT_SUCCESS(Status))
907 {
908 IsaHwActivateDevice(PdoExt->FdoExt, PdoExt->IsaPnpDevice);
909 }
910 else
911 {
912 DPRINT1("Failed to configure CSN %u, LDN %u with status 0x%08lx\n",
913 PdoExt->IsaPnpDevice->CSN, PdoExt->IsaPnpDevice->LDN, Status);
914 }
915
917 }
918 else
919 {
921 IrpSp->Parameters.StartDevice.AllocatedResources);
922 }
923
924 if (NT_SUCCESS(Status))
925 PdoExt->Common.State = dsStarted;
926 break;
927 }
928
930 {
931 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
932 {
933 IsaHwWakeDevice(PdoExt->IsaPnpDevice);
934 IsaHwDeactivateDevice(PdoExt->IsaPnpDevice);
935
937 }
938 else
939 {
940 PdoExt->Flags &= ~ISAPNP_READ_PORT_ALLOW_FDO_SCAN;
941 }
942
944
945 if (NT_SUCCESS(Status))
946 PdoExt->Common.State = dsStopped;
947 break;
948 }
949
951 {
952 if (PdoExt->SpecialFiles > 0)
954 else if (PdoExt->Flags & ISAPNP_READ_PORT_NEED_REBALANCE)
956 else
958
959 break;
960 }
961
963 {
964 if (PdoExt->SpecialFiles > 0)
966 else
968 break;
969 }
970
973 break;
974
977 break;
978
981 {
983
984 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
985 Status = IsaPdoRemoveDevice(PdoExt, FinalRemove);
986 else
987 Status = IsaReadPortRemoveDevice(PdoExt, FinalRemove);
988 break;
989 }
990
993 break;
994
997 break;
998
1001 break;
1002
1003 case IRP_MN_QUERY_ID:
1004 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
1006 else
1008 break;
1009
1011 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
1013 break;
1014
1017 break;
1018
1021 break;
1022
1025 break;
1026
1030 break;
1031
1032 default:
1033 DPRINT("Unknown PnP code: %X\n", IrpSp->MinorFunction);
1034 break;
1035 }
1036
1037 Irp->IoStatus.Status = Status;
1039
1040 return Status;
1041}
#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:823
static NTSTATUS IsaPdoQueryDeviceUsageNotification(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:719
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:542
static NTSTATUS IsaReadPortRemoveDevice(_In_ PISAPNP_PDO_EXTENSION PdoExt, _In_ BOOLEAN FinalRemove)
Definition: pdo.c:785
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:867
static NTSTATUS IsaPdoQueryResourceRequirements(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:507
static NTSTATUS IsaPdoQueryBusInformation(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp)
Definition: pdo.c:694
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:547
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:678
static NTSTATUS IsaPdoRemoveDevice(_In_ PISAPNP_PDO_EXTENSION PdoExt, _In_ BOOLEAN FinalRemove)
Definition: pdo.c:748
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:33
VOID IsaHwWakeDevice(_In_ PISAPNP_LOGICAL_DEVICE LogicalDevice)
Definition: hardware.c:1650
VOID IsaHwWaitForKey(VOID)
Definition: hardware.c:1684
VOID IsaHwDeactivateDevice(_In_ PISAPNP_LOGICAL_DEVICE LogicalDevice)
Definition: hardware.c:1673
UCHAR IsaHwTryReadDataPort(_In_ PUCHAR ReadDataPort)
Definition: hardware.c:1259
NTSTATUS IsaHwConfigureDevice(_In_ PISAPNP_FDO_EXTENSION FdoExt, _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice, _In_ PCM_RESOURCE_LIST Resources)
Definition: hardware.c:1517
VOID IsaHwActivateDevice(_In_ PISAPNP_FDO_EXTENSION FdoExt, _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice)
Definition: hardware.c:1661
#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 IsaPnpFillDeviceRelations(_In_ PISAPNP_FDO_EXTENSION FdoExt, _Inout_ PIRP Irp, _In_ BOOLEAN IncludeDataPort)
Definition: isapnp.c:1054
VOID IsaPnpRemoveReadPortDO(_In_ PDEVICE_OBJECT Pdo)
Definition: isapnp.c:1042
PIO_RESOURCE_REQUIREMENTS_LIST IsaPnpCreateReadPortDORequirements(_In_opt_ ULONG SelectedReadPort)
Definition: isapnp.c:821
PCM_RESOURCE_LIST IsaPnpCreateReadPortDOResources(VOID)
Definition: isapnp.c:967
#define TAG_ISAPNP
Definition: isapnp.h:26
#define ISAPNP_READ_PORT_ALLOW_FDO_SCAN
Allows the active FDO to scan the bus.
Definition: isapnp.h:77
@ dsStopped
Definition: isapnp.h:30
@ dsStarted
Definition: isapnp.h:31
@ IsaPnpLogicalDevice
Definition: isapnp.h:37
@ IsaPnpReadDataPort
Definition: isapnp.h:38
#define ISAPNP_READ_PORT_NEED_REBALANCE
The I/O resource requirements have changed.
Definition: isapnp.h:78
#define ISAPNP_SCANNED_BY_READ_PORT
The bus has been scanned by Read Port PDO.
Definition: isapnp.h:76
#define ISAPNP_ENUMERATED
Whether the device has been reported to the PnP manager.
Definition: isapnp.h:75
#define ISAPNP_HAS_MULTIPLE_LOGDEVS
Definition: isapnpres.h:99
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
FORCEINLINE PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
Definition: precomp.h:45
#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:73
base of all file and directory entries
Definition: entries.h:83
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@391::@393 Port
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@391 u
PDEVICE_OBJECT Self
Definition: pciidex.h:60
PDEVICE_OBJECT Objects[1]
Definition: iotypes.h:2163
struct _IO_STACK_LOCATION::@3974::@4007 UsageNotification
struct _IO_STACK_LOCATION::@3974::@4001 DeviceCapabilities
struct _IO_STACK_LOCATION::@3974::@4011 StartDevice
struct _IO_STACK_LOCATION::@3974::@4005 QueryId
struct _IO_STACK_LOCATION::@3974::@4006 QueryDeviceText
struct _IO_STACK_LOCATION::@3974::@3999 QueryDeviceRelations
union _IO_STACK_LOCATION::@1575 Parameters
Definition: isapnpres.h:53
UCHAR VendorId[3]
Definition: isapnpres.h:54
LIST_ENTRY IdLink
Definition: isapnpres.h:56
USHORT ProdId
Definition: isapnpres.h:55
PUCHAR ReadDataPort
Definition: isapnp.h:64
LIST_ENTRY DeviceListHead
Definition: precomp.h:82
PDEVICE_OBJECT Pdo
Definition: isapnp.h:52
PDEVICE_OBJECT ReadPortPdo
Definition: isapnp.h:53
LIST_ENTRY CompatibleIdList
Definition: isapnpres.h:129
PISAPNP_RESOURCE Resources
Definition: isapnpres.h:127
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:3301
__wchar_t WCHAR
Definition: xmlstorage.h:180