mirror of
https://github.com/reactos/reactos.git
synced 2024-06-28 08:51:29 +00:00
[SETUPAPI] Reimplement SetupDiBuildClassInfoListExW using CM_* functions
We can now enumerate device classes on other computers.
This commit is contained in:
parent
8da00cd97c
commit
f9df7af28a
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue