[NEWDEV] Fix HardwareId match logic in UpdateDriverForPlugAndPlayDevicesW (#7808)

Match Hardware ID correctly. This fix is required to install the latest (7.1.6) Virtual Box Guest Additions drivers.

- Add Compatible IDs match, call SetupDiGetDeviceRegistryPropertyW twice, once for SPDRP_HARDWAREID and once for SPDRP_COMPATIBLEIDS.
- Use case-insensitive comparison (wcscmp -> _wcsicmp)
- Convert code file to UTF-8 encoding
This commit is contained in:
Ratin Gao 2025-03-23 09:25:12 +08:00 committed by GitHub
parent ffa81857c2
commit cfcc8d85b2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,7 +1,7 @@
/* /*
* New device installer (newdev.dll) * New device installer (newdev.dll)
* *
* Copyright 2005-2006 Hervé Poussineau (hpoussin@reactos.org) * Copyright 2005-2006 Hervé Poussineau (hpoussin@reactos.org)
* 2005 Christoph von Wittich (Christoph@ActiveVB.de) * 2005 Christoph von Wittich (Christoph@ActiveVB.de)
* 2009 Colin Finck (colin@reactos.org) * 2009 Colin Finck (colin@reactos.org)
* *
@ -50,6 +50,7 @@ UpdateDriverForPlugAndPlayDevicesW(
LPWSTR Buffer = NULL; LPWSTR Buffer = NULL;
DWORD BufferSize; DWORD BufferSize;
LPCWSTR CurrentHardwareId; /* Pointer into Buffer */ LPCWSTR CurrentHardwareId; /* Pointer into Buffer */
DWORD Property;
BOOL FoundHardwareId, FoundAtLeastOneDevice = FALSE; BOOL FoundHardwareId, FoundAtLeastOneDevice = FALSE;
BOOL ret = FALSE; BOOL ret = FALSE;
@ -86,14 +87,17 @@ UpdateDriverForPlugAndPlayDevicesW(
break; break;
} }
/* Get Hardware ID */ /* Match Hardware ID */
HeapFree(GetProcessHeap(), 0, Buffer); FoundHardwareId = FALSE;
Property = SPDRP_HARDWAREID;
while (TRUE)
{
/* Get IDs data */
Buffer = NULL; Buffer = NULL;
BufferSize = 0; BufferSize = 0;
while (!SetupDiGetDeviceRegistryPropertyW( while (!SetupDiGetDeviceRegistryPropertyW(DevInstData.hDevInfo,
DevInstData.hDevInfo,
&DevInstData.devInfoData, &DevInstData.devInfoData,
SPDRP_HARDWAREID, Property,
NULL, NULL,
(PBYTE)Buffer, (PBYTE)Buffer,
BufferSize, BufferSize,
@ -101,7 +105,6 @@ UpdateDriverForPlugAndPlayDevicesW(
{ {
if (GetLastError() == ERROR_FILE_NOT_FOUND) if (GetLastError() == ERROR_FILE_NOT_FOUND)
{ {
Buffer = NULL;
break; break;
} }
else if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) else if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
@ -119,19 +122,24 @@ UpdateDriverForPlugAndPlayDevicesW(
goto cleanup; goto cleanup;
} }
} }
if (Buffer == NULL) if (Buffer)
continue; {
/* Check if we match the given hardware ID */ /* Check if we match the given hardware ID */
FoundHardwareId = FALSE;
for (CurrentHardwareId = Buffer; *CurrentHardwareId != UNICODE_NULL; CurrentHardwareId += wcslen(CurrentHardwareId) + 1) for (CurrentHardwareId = Buffer; *CurrentHardwareId != UNICODE_NULL; CurrentHardwareId += wcslen(CurrentHardwareId) + 1)
{ {
if (wcscmp(CurrentHardwareId, HardwareId) == 0) if (_wcsicmp(CurrentHardwareId, HardwareId) == 0)
{ {
FoundHardwareId = TRUE; FoundHardwareId = TRUE;
break; break;
} }
} }
}
if (FoundHardwareId || Property == SPDRP_COMPATIBLEIDS)
{
break;
}
Property = SPDRP_COMPATIBLEIDS;
}
if (!FoundHardwareId) if (!FoundHardwareId)
continue; continue;