diff --git a/reactos/boot/freeldr/freeldr/ntldr/setupldr.c b/reactos/boot/freeldr/freeldr/ntldr/setupldr.c index 20fc1b63a3d..f74122c3618 100644 --- a/reactos/boot/freeldr/freeldr/ntldr/setupldr.c +++ b/reactos/boot/freeldr/freeldr/ntldr/setupldr.c @@ -27,6 +27,7 @@ DBG_DEFAULT_CHANNEL(WINDOWS); #define TAG_BOOT_OPTIONS 'pOtB' +#define TAG_HARDWARE_ID 'dIwH' void WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock); @@ -133,6 +134,82 @@ SetupLdrScanBootDrivers(PLIST_ENTRY BootDriverListHead, HINF InfHandle, LPCSTR S } while (InfFindNextLine(&InfContext, &InfContext)); } +static VOID +SetupLdrLoadHardwareIdsDatabase(PSETUP_LOADER_BLOCK SetupBlock, HINF InfHandle, LPCSTR SearchPath) +{ + INFCONTEXT InfContext; + LPCSTR Id; + LPCSTR DriverName; + SIZE_T Size; + PVOID Temp; + PPNP_HARDWARE_ID HardwareId; + PPNP_HARDWARE_ID HeadHardwareId; + PPNP_HARDWARE_ID LastHardwareId = 0; + + /* + typedef struct _PNP_HARDWARE_ID + { + struct _PNP_HARDWARE_ID *Next; + PCHAR Id; + PCHAR DriverName; + PCHAR ClassGuid; + } PNP_HARDWARE_ID, *PPNP_HARDWARE_ID; + */ + + /* Open inf section */ + if (!InfFindFirstLine(InfHandle, "HardwareIdsDatabase", NULL, &InfContext)) + return; + + /* Load all HardwareIds */ + do + { + if (InfGetDataField(&InfContext, 0, &Id) && + InfGetDataField(&InfContext, 1, &DriverName)) + { + /* Allocate and initialize the new struct _PNP_HARDWARE_ID */ + Size = sizeof(PNP_HARDWARE_ID); + HardwareId = FrLdrHeapAlloc(Size, TAG_HARDWARE_ID); + if (HardwareId == NULL) + return; + + memset(HardwareId, 0, Size); + + /* For link field */ + if(LastHardwareId) + LastHardwareId->Next = (PPNP_HARDWARE_ID)((ULONG)HardwareId | 0x80000000); + else + HeadHardwareId = (PPNP_HARDWARE_ID)((ULONG)HardwareId | 0x80000000); //first record + + /* DPRINT */ + //ERR("SetupLdrLoadHardwareIdsDatabase: HardwareId - %p\n", HardwareId); + + LastHardwareId = HardwareId; + + /* Allocate and copy name Id */ + Size = strlen(Id) + 1; + Temp = FrLdrHeapAlloc(Size, TAG_HARDWARE_ID); + if (Temp == NULL) + return; + + memmove(Temp, Id, Size); + + HardwareId->Id = (PCHAR)((ULONG)Temp | 0x80000000); + + /* Allocate and copy driver name */ + Size = strlen(DriverName) + 1; + Temp = FrLdrHeapAlloc(Size, TAG_HARDWARE_ID); + if (Temp == NULL) + return; + + memmove(Temp, DriverName, Size); + + HardwareId->DriverName = (PCHAR)((ULONG)Temp | 0x80000000); + } + } while (InfFindNextLine(&InfContext, &InfContext)); + + SetupBlock->HardwareIdDatabase = (PPNP_HARDWARE_ID)((ULONG)HeadHardwareId | 0x80000000); +} + VOID LoadReactOSSetup(IN OperatingSystemItem* OperatingSystem, IN USHORT OperatingSystemVersion) @@ -328,6 +405,9 @@ LoadReactOSSetup(IN OperatingSystemItem* OperatingSystem, /* Get a list of boot drivers */ SetupLdrScanBootDrivers(&LoaderBlock->BootDriverListHead, InfHandle, BootPath); + /* Load HardwareIds Database */ + SetupLdrLoadHardwareIdsDatabase(SetupBlock, InfHandle, BootPath); + /* Close the inf file */ InfCloseFile(InfHandle);