- Return the correct value if the PCI slot number is invalid
- Use the bus number from the PCI BIOS instead of doing a manual probe if we can because it is much more accurate (our probing code doesn't detect buses without devices present)
- Don't probe for devices at invalid locations on PCI type 2 buses
- Check for a valid bus number so we don't return the wrong value
svn path=/trunk/; revision=47162
(1 == BusHandler->BusNumber && 0 != Slot.u.bits.DeviceNumber))
{
DPRINT("Blacklisted PCI slot\n");
(1 == BusHandler->BusNumber && 0 != Slot.u.bits.DeviceNumber))
{
DPRINT("Blacklisted PCI slot\n");
- if (0 == Offset && 2 <= Length)
+ if (0 == Offset && sizeof(USHORT) <= Length)
{
*(PUSHORT)Buffer = PCI_INVALID_VENDORID;
{
*(PUSHORT)Buffer = PCI_INVALID_VENDORID;
+ /* Make sure the bus number is in our range of good bus numbers */
+ if (BusHandler->BusNumber > HalpMaxPciBus || BusHandler->BusNumber < HalpMinPciBus)
+ return 0;
+
/* Normalize the length */
if (Length > sizeof(PCI_COMMON_CONFIG)) Length = sizeof(PCI_COMMON_CONFIG);
/* Normalize the length */
if (Length > sizeof(PCI_COMMON_CONFIG)) Length = sizeof(PCI_COMMON_CONFIG);
/* Validate the vendor ID */
if (PciConfig->VendorID == PCI_INVALID_VENDORID)
{
/* Validate the vendor ID */
if (PciConfig->VendorID == PCI_INVALID_VENDORID)
{
- /* It's invalid, but we want to return this much */
- PciConfig->VendorID = PCI_INVALID_VENDORID;
- Len = sizeof(USHORT);
+ /* It's invalid, but we can copy PCI_INVALID_VENDORID */
+ if (Offset == 0 && Length >= sizeof(USHORT))
+ {
+ *(PUSHORT)Buffer = PCI_INVALID_VENDORID;
+ return sizeof(USHORT);
+ }
+
+ /* We can't copy PCI_INVALID_VENDORID so just return 0 */
+ return 0;
}
/* Now check if there's space left */
}
/* Now check if there's space left */
+ /* Make sure this bus number is in our range of good bus numbers */
+ if (BusHandler->BusNumber > HalpMaxPciBus || BusHandler->BusNumber < HalpMinPciBus)
+ return 0;
+
/* Normalize the length */
if (Length > sizeof(PCI_COMMON_CONFIG)) Length = sizeof(PCI_COMMON_CONFIG);
/* Normalize the length */
if (Length > sizeof(PCI_COMMON_CONFIG)) Length = sizeof(PCI_COMMON_CONFIG);
IN ULONG Length)
{
BUS_HANDLER BusHandler;
IN ULONG Length)
{
BUS_HANDLER BusHandler;
- PPCI_COMMON_CONFIG PciData = (PPCI_COMMON_CONFIG)Buffer;
/* Setup fake PCI Bus handler */
RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
/* Setup fake PCI Bus handler */
RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
/* Read configuration data */
HalpReadPCIConfig(&BusHandler, SlotNumber, Buffer, Offset, Length);
/* Read configuration data */
HalpReadPCIConfig(&BusHandler, SlotNumber, Buffer, Offset, Length);
- /* Check if caller only wanted at least Vendor ID */
- if (Length >= 2)
- {
- /* Validate it */
- if (PciData->VendorID != PCI_INVALID_VENDORID)
- {
- /* Check if this is the new maximum bus number */
- if (HalpMaxPciBus < BusHandler.BusNumber)
- {
- /* Set it */
- HalpMaxPciBus = BusHandler.BusNumber;
- }
- }
- }
-
/* Return length */
return Length;
}
/* Return length */
return Length;
}
ULONG i;
PCI_SLOT_NUMBER j;
ULONG VendorId = 0;
ULONG i;
PCI_SLOT_NUMBER j;
ULONG VendorId = 0;
/* Query registry information */
PciRegistryInfo = HalpQueryPciRegistryInfo();
/* Query registry information */
PciRegistryInfo = HalpQueryPciRegistryInfo();
{
/* Assume type 1 */
PciType = 1;
{
/* Assume type 1 */
PciType = 1;
+
+ /* Force a manual bus scan later */
+ MaxPciBusNumber = MAXULONG;
- /* Get the type and free the info structure */
PciType = PciRegistryInfo->HardwareMechanism & 0xF;
PciType = PciRegistryInfo->HardwareMechanism & 0xF;
+
+ /* Get MaxPciBusNumber and make it 0-based */
+ MaxPciBusNumber = PciRegistryInfo->NoBuses - 1;
+
+ /* Free the info structure */
ExFreePool(PciRegistryInfo);
}
ExFreePool(PciRegistryInfo);
}
/* Type 2 PCI Bus */
case 2:
/* Type 2 PCI Bus */
case 2:
- /* Copy the Type 1 handler data */
+ /* Copy the Type 2 handler data */
RtlCopyMemory(&PCIConfigHandler,
&PCIConfigHandlerType2,
sizeof (PCIConfigHandler));
RtlCopyMemory(&PCIConfigHandler,
&PCIConfigHandlerType2,
sizeof (PCIConfigHandler));
DbgPrint("HAL: Unknown PCI type\n");
}
DbgPrint("HAL: Unknown PCI type\n");
}
- /* Loop all possible buses */
- for (i = 0; i < 256; i++)
+ /* Run a forced bus scan if needed */
+ if (MaxPciBusNumber == MAXULONG)
- /* Loop all devices */
- for (j.u.AsULONG = 0; j.u.AsULONG < 32; j.u.AsULONG++)
+ /* Initialize the max bus number to 0xFF */
+ HalpMaxPciBus = 0xFF;
+
+ /* Initialize the counter */
+ MaxPciBusNumber = 0;
+
+ /* Loop all possible buses */
+ for (i = 0; i < HalpMaxPciBus; i++)
- /* Query the interface */
- if (HaliPciInterfaceReadConfig(NULL,
- i,
- j,
- &VendorId,
- 0,
- sizeof(ULONG)))
+ /* Loop all devices */
+ for (j.u.AsULONG = 0; j.u.AsULONG < BusData->MaxDevice; j.u.AsULONG++)
- /* Validate the vendor ID */
- if ((USHORT)VendorId != PCI_INVALID_VENDORID)
+ /* Query the interface */
+ if (HaliPciInterfaceReadConfig(NULL,
+ i,
+ j,
+ &VendorId,
+ 0,
+ sizeof(ULONG)))
- /* Set this as the maximum ID */
- HalpMaxPciBus = i;
- break;
+ /* Validate the vendor ID */
+ if ((USHORT)VendorId != PCI_INVALID_VENDORID)
+ {
+ /* Set this as the maximum ID */
+ MaxPciBusNumber = i;
+ break;
+ }
+ /* Set the real max bus number */
+ HalpMaxPciBus = MaxPciBusNumber;
+
/* We're done */
HalpPCIConfigInitialized = TRUE;
}
/* We're done */
HalpPCIConfigInitialized = TRUE;
}