[SETUPAPI] Reimplement SetupDiBuildClassInfoListExW using CM_* functions

We can now enumerate device classes on other computers.
This commit is contained in:
Hervé Poussineau 2021-04-11 11:46:41 +02:00
parent 8da00cd97c
commit f9df7af28a

View file

@ -725,13 +725,12 @@ BOOL WINAPI SetupDiBuildClassInfoListExW(
LPCWSTR MachineName, LPCWSTR MachineName,
PVOID Reserved) PVOID Reserved)
{ {
WCHAR szKeyName[40]; GUID CurrentClassGuid;
HKEY hClassesKey = INVALID_HANDLE_VALUE;
HKEY hClassKey; HKEY hClassKey;
DWORD dwLength;
DWORD dwIndex; DWORD dwIndex;
LONG lError;
DWORD dwGuidListIndex = 0; DWORD dwGuidListIndex = 0;
HMACHINE hMachine = NULL;
CONFIGRET cr;
TRACE("%s(0x%lx %p %lu %p %s %p)\n", __FUNCTION__, Flags, ClassGuidList, TRACE("%s(0x%lx %p %lu %p %s %p)\n", __FUNCTION__, Flags, ClassGuidList,
ClassGuidListSize, RequiredSize, debugstr_w(MachineName), Reserved); ClassGuidListSize, RequiredSize, debugstr_w(MachineName), Reserved);
@ -747,39 +746,36 @@ BOOL WINAPI SetupDiBuildClassInfoListExW(
return FALSE; return FALSE;
} }
hClassesKey = SetupDiOpenClassRegKeyExW(NULL, if (MachineName)
KEY_ENUMERATE_SUB_KEYS,
DIOCR_INSTALLER,
MachineName,
Reserved);
if (hClassesKey == INVALID_HANDLE_VALUE)
{ {
return FALSE; cr = CM_Connect_MachineW(MachineName, &hMachine);
if (cr != CR_SUCCESS)
{
SetLastError(GetErrorCodeFromCrCode(cr));
return FALSE;
}
} }
for (dwIndex = 0; ; dwIndex++) for (dwIndex = 0; ; dwIndex++)
{ {
dwLength = 40; cr = CM_Enumerate_Classes_Ex(dwIndex,
lError = RegEnumKeyExW(hClassesKey, &CurrentClassGuid,
dwIndex, 0,
szKeyName, hMachine);
&dwLength, if (cr == CR_SUCCESS)
NULL,
NULL,
NULL,
NULL);
TRACE("RegEnumKeyExW() returns %d\n", lError);
if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA)
{ {
TRACE("Key name: %s\n", debugstr_w(szKeyName)); TRACE("Guid: %s\n", debugstr_guid(&CurrentClassGuid));
if (CM_Open_Class_Key_ExW(&CurrentClassGuid,
if (RegOpenKeyExW(hClassesKey, NULL,
szKeyName, KEY_QUERY_VALUE,
0, RegDisposition_OpenExisting,
KEY_QUERY_VALUE, &hClassKey,
&hClassKey)) CM_OPEN_CLASS_KEY_INSTALLER,
hMachine) != CR_SUCCESS)
{ {
RegCloseKey(hClassesKey); SetLastError(GetErrorCodeFromCrCode(cr));
if (hMachine)
CM_Disconnect_Machine(hMachine);
return FALSE; return FALSE;
} }
@ -823,27 +819,20 @@ BOOL WINAPI SetupDiBuildClassInfoListExW(
RegCloseKey(hClassKey); RegCloseKey(hClassKey);
TRACE("Guid: %s\n", debugstr_w(szKeyName));
if (dwGuidListIndex < ClassGuidListSize) if (dwGuidListIndex < ClassGuidListSize)
{ {
if (szKeyName[0] == '{' && szKeyName[37] == '}') ClassGuidList[dwGuidListIndex] = CurrentClassGuid;
{
szKeyName[37] = 0;
}
TRACE("Guid: %p\n", &szKeyName[1]);
UuidFromStringW(&szKeyName[1],
&ClassGuidList[dwGuidListIndex]);
} }
dwGuidListIndex++; dwGuidListIndex++;
} }
if (lError != ERROR_SUCCESS) if (cr != ERROR_SUCCESS)
break; break;
} }
RegCloseKey(hClassesKey); if (hMachine)
CM_Disconnect_Machine(hMachine);
if (RequiredSize != NULL) if (RequiredSize != NULL)
*RequiredSize = dwGuidListIndex; *RequiredSize = dwGuidListIndex;