Juan Lang : setupapi: Correct device enumeration.
Alexandre Julliard
julliard at winehq.org
Mon Oct 15 11:27:50 CDT 2007
Module: wine
Branch: master
Commit: a10a8eb134d275a97b403a40c03dc850c7b73c51
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a10a8eb134d275a97b403a40c03dc850c7b73c51
Author: Juan Lang <juan.lang at gmail.com>
Date: Fri Oct 12 08:30:10 2007 -0700
setupapi: Correct device enumeration.
---
dlls/setupapi/devinst.c | 82 +++++++++++++++++++++++++++++++++-------------
1 files changed, 59 insertions(+), 23 deletions(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 8abd2e7..bd58791 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -2137,25 +2137,26 @@ static void SETUPDI_EnumerateInterfaces(HDEVINFO DeviceInfoSet,
}
}
-static void SETUPDI_EnumerateMatchingDevices(HDEVINFO DeviceInfoSet,
- LPCWSTR parent, HKEY key, const GUID *class, DWORD flags)
+static void SETUPDI_EnumerateMatchingDeviceInstances(struct DeviceInfoSet *set,
+ LPCWSTR enumerator, LPCWSTR deviceName, HKEY deviceKey,
+ const GUID *class, DWORD flags)
{
- struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
DWORD i, len;
- WCHAR subKeyName[MAX_PATH];
+ WCHAR deviceInstance[MAX_PATH];
LONG l = ERROR_SUCCESS;
- TRACE("%s\n", debugstr_w(parent));
+ TRACE("%s %s\n", debugstr_w(enumerator), debugstr_w(deviceName));
for (i = 0; !l; i++)
{
- len = sizeof(subKeyName) / sizeof(subKeyName[0]);
- l = RegEnumKeyExW(key, i, subKeyName, &len, NULL, NULL, NULL, NULL);
+ len = sizeof(deviceInstance) / sizeof(deviceInstance[0]);
+ l = RegEnumKeyExW(deviceKey, i, deviceInstance, &len, NULL, NULL, NULL,
+ NULL);
if (!l)
{
HKEY subKey;
- l = RegOpenKeyExW(key, subKeyName, 0, KEY_READ, &subKey);
+ l = RegOpenKeyExW(deviceKey, deviceInstance, 0, KEY_READ, &subKey);
if (!l)
{
WCHAR classGuid[40];
@@ -2179,11 +2180,12 @@ static void SETUPDI_EnumerateMatchingDevices(HDEVINFO DeviceInfoSet,
LPWSTR instanceId;
instanceId = HeapAlloc(GetProcessHeap(), 0,
- (lstrlenW(parent) + lstrlenW(subKeyName) + 2)
- * sizeof(WCHAR));
+ (lstrlenW(deviceName) +
+ lstrlenW(deviceInstance) + 2) * sizeof(WCHAR));
if (instanceId)
{
- sprintfW(instanceId, fmt, parent, subKeyName);
+ sprintfW(instanceId, fmt, deviceName,
+ deviceInstance);
SETUPDI_AddDeviceToSet(set, &deviceClass,
0 /* FIXME: DevInst */, instanceId,
FALSE, NULL);
@@ -2200,46 +2202,80 @@ static void SETUPDI_EnumerateMatchingDevices(HDEVINFO DeviceInfoSet,
}
}
+static void SETUPDI_EnumerateMatchingDevices(HDEVINFO DeviceInfoSet,
+ LPCWSTR parent, HKEY key, const GUID *class, DWORD flags)
+{
+ struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
+ DWORD i, len;
+ WCHAR subKeyName[MAX_PATH];
+ LONG l = ERROR_SUCCESS;
+
+ TRACE("%s\n", debugstr_w(parent));
+
+ for (i = 0; !l; i++)
+ {
+ len = sizeof(subKeyName) / sizeof(subKeyName[0]);
+ l = RegEnumKeyExW(key, i, subKeyName, &len, NULL, NULL, NULL, NULL);
+ if (!l)
+ {
+ HKEY subKey;
+
+ l = RegOpenKeyExW(key, subKeyName, 0, KEY_READ, &subKey);
+ if (!l)
+ {
+ TRACE("%s\n", debugstr_w(subKeyName));
+ SETUPDI_EnumerateMatchingDeviceInstances(set, parent,
+ subKeyName, subKey, class, flags);
+ RegCloseKey(subKey);
+ }
+ /* Allow enumeration to continue */
+ l = ERROR_SUCCESS;
+ }
+ }
+}
+
static void SETUPDI_EnumerateDevices(HDEVINFO DeviceInfoSet, const GUID *class,
LPCWSTR enumstr, DWORD flags)
{
- HKEY classesKey = SetupDiOpenClassRegKeyExW(class, KEY_READ,
- DIOCR_INSTALLER, NULL, NULL);
+ HKEY enumKey;
+ LONG l;
TRACE("%p, %s, %s, %08x\n", DeviceInfoSet, debugstr_guid(class),
debugstr_w(enumstr), flags);
- if (classesKey != INVALID_HANDLE_VALUE)
+ l = RegCreateKeyExW(HKEY_LOCAL_MACHINE, Enum, 0, NULL, 0, KEY_READ, NULL,
+ &enumKey, NULL);
+ if (enumKey != INVALID_HANDLE_VALUE)
{
if (enumstr)
{
- HKEY enumKey;
- LONG l = RegOpenKeyExW(classesKey, enumstr, 0, KEY_READ,
- &enumKey);
+ HKEY enumStrKey;
+ l = RegOpenKeyExW(enumKey, enumstr, 0, KEY_READ,
+ &enumStrKey);
if (!l)
{
SETUPDI_EnumerateMatchingDevices(DeviceInfoSet, enumstr,
- enumKey, class, flags);
- RegCloseKey(enumKey);
+ enumStrKey, class, flags);
+ RegCloseKey(enumStrKey);
}
}
else
{
DWORD i, len;
WCHAR subKeyName[MAX_PATH];
- LONG l = ERROR_SUCCESS;
+ l = ERROR_SUCCESS;
for (i = 0; !l; i++)
{
len = sizeof(subKeyName) / sizeof(subKeyName[0]);
- l = RegEnumKeyExW(classesKey, i, subKeyName, &len, NULL,
+ l = RegEnumKeyExW(enumKey, i, subKeyName, &len, NULL,
NULL, NULL, NULL);
if (!l)
{
HKEY subKey;
- l = RegOpenKeyExW(classesKey, subKeyName, 0, KEY_READ,
+ l = RegOpenKeyExW(enumKey, subKeyName, 0, KEY_READ,
&subKey);
if (!l)
{
@@ -2252,7 +2288,7 @@ static void SETUPDI_EnumerateDevices(HDEVINFO DeviceInfoSet, const GUID *class,
}
}
}
- RegCloseKey(classesKey);
+ RegCloseKey(enumKey);
}
}
More information about the wine-cvs
mailing list