+ PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+ PPCI_DEVICE PciDevice;
+ PLIST_ENTRY CurrentBus, CurrentEntry;
+ KIRQL OldIrql;
+ BOOLEAN Found = FALSE;
+
+ KeAcquireSpinLock(&DriverExtension->BusListLock, &OldIrql);
+ CurrentBus = DriverExtension->BusListHead.Flink;
+ while (!Found && CurrentBus != &DriverExtension->BusListHead)
+ {
+ FdoDeviceExtension = CONTAINING_RECORD(CurrentBus, FDO_DEVICE_EXTENSION, ListEntry);
+
+ KeAcquireSpinLockAtDpcLevel(&FdoDeviceExtension->DeviceListLock);
+ CurrentEntry = FdoDeviceExtension->DeviceListHead.Flink;
+ while (!Found && CurrentEntry != &FdoDeviceExtension->DeviceListHead)
+ {
+ PciDevice = CONTAINING_RECORD(CurrentEntry, PCI_DEVICE, ListEntry);
+ if (PciDevice->PciConfig.VendorID == VendorID &&
+ PciDevice->PciConfig.DeviceID == DeviceID)
+ {
+ if (!(Flags & PCI_USE_SUBSYSTEM_IDS) || (
+ PciDevice->PciConfig.u.type0.SubVendorID == SubVendorID &&
+ PciDevice->PciConfig.u.type0.SubSystemID == SubSystemID))
+ {
+ if (!(Flags & PCI_USE_REVISION) ||
+ PciDevice->PciConfig.RevisionID == RevisionID)
+ {
+ DPRINT("Found the PCI device\n");
+ Found = TRUE;
+ }
+ }
+ }