https://git.reactos.org/?p=reactos.git;a=commitdiff;h=df36ee9fe24de5e9d7498…
commit df36ee9fe24de5e9d7498ea3927c8c724bd0c0e3
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Sun Sep 23 20:17:35 2018 +0200
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Sun Sep 23 20:19:26 2018 +0200
[SETUPAPI] Replace the remaining internal calls to SetupDiOpenDevRegKey and
SetupDiCreateDevRegKeyW by calls to SETUPDI_OpenDrvKey, SETUPDI_CreateDevKey or
SETUPDI_CreateDrvKey.
---
dll/win32/setupapi/devinst.c | 389 +++++++++++++++++++---------------
dll/win32/setupapi/setupapi_private.h | 2 +
2 files changed, 218 insertions(+), 173 deletions(-)
diff --git a/dll/win32/setupapi/devinst.c b/dll/win32/setupapi/devinst.c
index a4d102e3b8..10ffd29251 100644
--- a/dll/win32/setupapi/devinst.c
+++ b/dll/win32/setupapi/devinst.c
@@ -1414,17 +1414,8 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
struct DeviceInfo *deviceInfo;
HKEY key = INVALID_HANDLE_VALUE;
- LPWSTR lpGuidString = NULL;
- LPWSTR DriverKey = NULL; /* {GUID}\Index */
- LPWSTR pDeviceInstance; /* Points into DriverKey, on the Index field */
- DWORD Index; /* Index used in the DriverKey name */
- DWORD dwSize;
- DWORD Disposition;
DWORD rc;
HKEY hHWProfileKey = INVALID_HANDLE_VALUE;
- HKEY hEnumKey = NULL;
- HKEY hClassKey = NULL;
- HKEY hDeviceKey = INVALID_HANDLE_VALUE;
HKEY hKey = NULL;
HKEY RootKey;
@@ -1482,41 +1473,13 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
if (KeyType == DIREG_DEV)
{
-
- rc = RegCreateKeyExW(
- RootKey,
- REGSTR_PATH_SYSTEMENUM,
- 0,
- NULL,
- REG_OPTION_NON_VOLATILE,
- KEY_CREATE_SUB_KEY,
- NULL,
- &hEnumKey,
- NULL);
- if (rc != ERROR_SUCCESS)
- {
- SetLastError(rc);
- goto cleanup;
- }
- rc = RegCreateKeyExW(
- hEnumKey,
- deviceInfo->instanceId,
- 0,
- NULL,
- REG_OPTION_NON_VOLATILE,
#if _WIN32_WINNT >= 0x502
- KEY_READ | KEY_WRITE,
+ hKey = SETUPDI_CreateDevKey(RootKey, deviceInfo, KEY_READ | KEY_WRITE);
#else
- KEY_ALL_ACCESS,
+ hKey = SETUPDI_CreateDevKey(RootKey, deviceInfo, KEY_ALL_ACCESS);
#endif
- NULL,
- &hKey,
- NULL);
- if (rc != ERROR_SUCCESS)
- {
- SetLastError(rc);
+ if (hKey == INVALID_HANDLE_VALUE)
goto cleanup;
- }
if (Scope == DICS_FLAG_GLOBAL)
{
@@ -1541,123 +1504,13 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
}
else /* KeyType == DIREG_DRV */
{
- /* Open device key, to read Driver value */
- hDeviceKey = SETUPDI_OpenDevKey(RootKey, deviceInfo, KEY_QUERY_VALUE |
KEY_SET_VALUE);
- if (hDeviceKey == INVALID_HANDLE_VALUE)
- goto cleanup;
-
- rc = RegOpenKeyExW(RootKey, REGSTR_PATH_CLASS_NT, 0, KEY_CREATE_SUB_KEY,
&hClassKey);
- if (rc != ERROR_SUCCESS)
- {
- SetLastError(rc);
- goto cleanup;
- }
-
- rc = RegQueryValueExW(hDeviceKey, REGSTR_VAL_DRIVER, NULL, NULL, NULL,
&dwSize);
- if (rc != ERROR_SUCCESS)
- {
- /* Create a new driver key */
-
- if (UuidToStringW((UUID*)&DeviceInfoData->ClassGuid,
&lpGuidString) != RPC_S_OK)
- goto cleanup;
-
- /* The driver key is in
\System\CurrentControlSet\Control\Class\{GUID}\Index */
- DriverKey = HeapAlloc(GetProcessHeap(), 0, (strlenW(lpGuidString) + 7) *
sizeof(WCHAR) + sizeof(UNICODE_NULL));
- if (!DriverKey)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- goto cleanup;
- }
-
- DriverKey[0] = '{';
- strcpyW(&DriverKey[1], lpGuidString);
- pDeviceInstance = &DriverKey[strlenW(DriverKey)];
- *pDeviceInstance++ = '}';
- *pDeviceInstance++ = '\\';
-
- /* Try all values for Index between 0 and 9999 */
- Index = 0;
- while (Index <= 9999)
- {
- sprintfW(pDeviceInstance, InstanceKeyFormat, Index);
- rc = RegCreateKeyExW(hClassKey,
- DriverKey,
- 0,
- NULL,
- REG_OPTION_NON_VOLATILE,
#if _WIN32_WINNT >= 0x502
- KEY_READ | KEY_WRITE,
+ hKey = SETUPDI_CreateDrvKey(RootKey, deviceInfo,
(UUID*)&DeviceInfoData->ClassGuid, KEY_READ | KEY_WRITE);
#else
- KEY_ALL_ACCESS,
+ hKey = SETUPDI_CreateDrvKey(RootKey, deviceInfo,
(UUID*)&DeviceInfoData->ClassGuid, KEY_ALL_ACCESS);
#endif
- NULL,
- &hKey,
- &Disposition);
- if (rc != ERROR_SUCCESS)
- {
- SetLastError(rc);
- goto cleanup;
- }
- if (Disposition == REG_CREATED_NEW_KEY)
- break;
- RegCloseKey(hKey);
- hKey = NULL;
- Index++;
- }
-
- if (Index > 9999)
- {
- /* Unable to create more than 9999 devices within the same class */
- SetLastError(ERROR_GEN_FAILURE);
- goto cleanup;
- }
-
- /* Write the new Driver value */
- rc = RegSetValueExW(hDeviceKey, REGSTR_VAL_DRIVER, 0, REG_SZ, (const BYTE
*)DriverKey, (strlenW(DriverKey) + 1) * sizeof(WCHAR));
- if (rc != ERROR_SUCCESS)
- {
- SetLastError(rc);
- goto cleanup;
- }
-
- }
- else
- {
- /* Open the existing driver key */
-
- DriverKey = HeapAlloc(GetProcessHeap(), 0, dwSize);
- if (!DriverKey)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- goto cleanup;
- }
-
- rc = RegQueryValueExW(hDeviceKey, REGSTR_VAL_DRIVER, NULL, NULL,
(LPBYTE)DriverKey, &dwSize);
- if (rc != ERROR_SUCCESS)
- {
- SetLastError(rc);
- goto cleanup;
- }
-
- rc = RegCreateKeyExW(hClassKey,
- DriverKey,
- 0,
- NULL,
- REG_OPTION_NON_VOLATILE,
-#if _WIN32_WINNT >= 0x502
- KEY_READ | KEY_WRITE,
-#else
- KEY_ALL_ACCESS,
-#endif
- NULL,
- &hKey,
- &Disposition);
- if (rc != ERROR_SUCCESS)
- {
- SetLastError(rc);
- goto cleanup;
- }
- }
+ if (hKey == INVALID_HANDLE_VALUE)
+ goto cleanup;
}
/* Do installation of the specified section */
@@ -1669,17 +1522,8 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
key = hKey;
cleanup:
- if (lpGuidString)
- RpcStringFreeW(&lpGuidString);
- HeapFree(GetProcessHeap(), 0, DriverKey);
if (hHWProfileKey != INVALID_HANDLE_VALUE)
RegCloseKey(hHWProfileKey);
- if (hEnumKey != NULL)
- RegCloseKey(hEnumKey);
- if (hClassKey != NULL)
- RegCloseKey(hClassKey);
- if (hDeviceKey != INVALID_HANDLE_VALUE)
- RegCloseKey(hDeviceKey);
if (hKey != NULL && hKey != key)
RegCloseKey(hKey);
@@ -4315,7 +4159,6 @@ BOOL WINAPI SetupDiCallClassInstaller(
if (CanHandle & DEVICE_COINSTALLER)
{
-// hKey = SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData,
DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_QUERY_VALUE);
hKey = SETUPDI_OpenDrvKey(((struct DeviceInfoSet
*)DeviceInfoSet)->HKLM, (struct DeviceInfo *)DeviceInfoData->Reserved,
KEY_QUERY_VALUE);
if (hKey != INVALID_HANDLE_VALUE)
{
@@ -5218,8 +5061,10 @@ SetupDiChangeState(
IN HDEVINFO DeviceInfoSet,
IN OUT PSP_DEVINFO_DATA DeviceInfoData)
{
+ struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
+ struct DeviceInfo *deviceInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
PSP_PROPCHANGE_PARAMS PropChange;
- HKEY hKey = INVALID_HANDLE_VALUE;
+ HKEY hRootKey = INVALID_HANDLE_VALUE, hKey = INVALID_HANDLE_VALUE;
LPCWSTR RegistryValueName;
DWORD dwConfigFlags, dwLength, dwRegType;
LONG rc;
@@ -5247,10 +5092,19 @@ SetupDiChangeState(
case DICS_ENABLE:
case DICS_DISABLE:
{
+ if (PropChange->Scope == DICS_FLAG_GLOBAL)
+ hRootKey = set->HKLM;
+ else /* PropChange->Scope == DICS_FLAG_CONFIGSPECIFIC */
+ {
+ hRootKey = OpenHardwareProfileKey(set->HKLM, PropChange->HwProfile,
KEY_CREATE_SUB_KEY);
+ if (hRootKey == INVALID_HANDLE_VALUE)
+ goto cleanup;
+ }
+
/* Enable/disable device in registry */
- hKey = SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData,
PropChange->Scope, PropChange->HwProfile, DIREG_DEV, KEY_QUERY_VALUE |
KEY_SET_VALUE);
+ hKey = SETUPDI_OpenDrvKey(hRootKey, deviceInfo, KEY_QUERY_VALUE |
KEY_SET_VALUE);
if (hKey == INVALID_HANDLE_VALUE && GetLastError() ==
ERROR_FILE_NOT_FOUND)
- hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet, DeviceInfoData,
PropChange->Scope, PropChange->HwProfile, DIREG_DEV, NULL, NULL);
+ hKey = SETUPDI_CreateDevKey(hRootKey, deviceInfo, KEY_QUERY_VALUE |
KEY_SET_VALUE);
if (hKey == INVALID_HANDLE_VALUE)
break;
dwLength = sizeof(DWORD);
@@ -5315,6 +5169,9 @@ SetupDiChangeState(
}
cleanup:
+ if (hRootKey != INVALID_HANDLE_VALUE && hRootKey != set->HKLM)
+ RegCloseKey(hRootKey);
+
if (hKey != INVALID_HANDLE_VALUE)
RegCloseKey(hKey);
@@ -5344,6 +5201,8 @@ SetupDiRegisterCoDeviceInstallers(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData)
{
+ struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
+ struct DeviceInfo *deviceInfo;
BOOL ret = FALSE; /* Return value */
TRACE("%p %p\n", DeviceInfoSet, DeviceInfoData);
@@ -5390,14 +5249,20 @@ SetupDiRegisterCoDeviceInstallers(
goto cleanup;
lstrcatW(SectionName, DotCoInstallers);
+ deviceInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
+
/* Open/Create driver key information */
#if _WIN32_WINNT >= 0x502
- hKey = SETUPDI_OpenDrvKey(((struct DeviceInfoSet *)DeviceInfoSet)->HKLM,
(struct DeviceInfo *)DeviceInfoData->Reserved, KEY_READ | KEY_WRITE);
+ hKey = SETUPDI_OpenDrvKey(set->HKLM, deviceInfo, KEY_READ | KEY_WRITE);
#else
- hKey = SETUPDI_OpenDrvKey(((struct DeviceInfoSet *)DeviceInfoSet)->HKLM,
(struct DeviceInfo *)DeviceInfoData->Reserved, KEY_ALL_ACCESS);
+ hKey = SETUPDI_OpenDrvKey(set->HKLM, deviceInfo, KEY_ALL_ACCESS);
#endif
if (hKey == INVALID_HANDLE_VALUE && GetLastError() ==
ERROR_FILE_NOT_FOUND)
- hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet, DeviceInfoData,
DICS_FLAG_GLOBAL, 0, DIREG_DRV, NULL, NULL);
+#if _WIN32_WINNT >= 0x502
+ hKey = SETUPDI_CreateDrvKey(set->HKLM, deviceInfo,
(UUID*)&DeviceInfoData->ClassGuid, KEY_READ | KEY_WRITE);
+#else
+ hKey = SETUPDI_CreateDrvKey(set->HKLM, deviceInfo,
(UUID*)&DeviceInfoData->ClassGuid, KEY_ALL_ACCESS);
+#endif
if (hKey == INVALID_HANDLE_VALUE)
goto cleanup;
@@ -5490,6 +5355,8 @@ SetupDiInstallDevice(
IN HDEVINFO DeviceInfoSet,
IN OUT PSP_DEVINFO_DATA DeviceInfoData)
{
+ struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
+ struct DeviceInfo *deviceInfo;
SP_DEVINSTALL_PARAMS_W InstallParams;
struct DriverInfoElement *SelectedDriver;
SYSTEMTIME DriverDate;
@@ -5633,14 +5500,20 @@ SetupDiInstallDevice(
strcpyW(SelectedDriver->Details.InfFileName, NewFileName);
}
+ deviceInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
+
/* Open/Create driver key information */
#if _WIN32_WINNT >= 0x502
- hKey = SETUPDI_OpenDrvKey(((struct DeviceInfoSet *)DeviceInfoSet)->HKLM, (struct
DeviceInfo *)DeviceInfoData->Reserved, KEY_READ | KEY_WRITE);
+ hKey = SETUPDI_OpenDrvKey(set->HKLM, deviceInfo, KEY_READ | KEY_WRITE);
#else
- hKey = SETUPDI_OpenDrvKey(((struct DeviceInfoSet *)DeviceInfoSet)->HKLM, (struct
DeviceInfo *)DeviceInfoData->Reserved, KEY_ALL_ACCESS);
+ hKey = SETUPDI_OpenDrvKey(set->HKLM, deviceInfo, KEY_ALL_ACCESS);
#endif
if (hKey == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_NOT_FOUND)
- hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL,
0, DIREG_DRV, NULL, NULL);
+#if _WIN32_WINNT >= 0x502
+ hKey = SETUPDI_CreateDrvKey(set->HKLM, deviceInfo,
(UUID*)&DeviceInfoData->ClassGuid, KEY_READ | KEY_WRITE);
+#else
+ hKey = SETUPDI_CreateDrvKey(set->HKLM, deviceInfo,
(UUID*)&DeviceInfoData->ClassGuid, KEY_ALL_ACCESS);
+#endif
if (hKey == INVALID_HANDLE_VALUE)
goto cleanup;
@@ -5780,6 +5653,176 @@ cleanup:
return ret;
}
+HKEY SETUPDI_CreateDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired)
+{
+ HKEY enumKey, key = INVALID_HANDLE_VALUE;
+ LONG l;
+
+ l = RegCreateKeyExW(RootKey, REGSTR_PATH_SYSTEMENUM, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY, NULL, &enumKey, NULL);
+ if (!l)
+ {
+ l = RegCreateKeyExW(enumKey, devInfo->instanceId, 0, NULL,
REG_OPTION_NON_VOLATILE, samDesired, NULL, &key, NULL);
+ RegCloseKey(enumKey);
+ }
+ if (l)
+ SetLastError(l);
+ return key;
+}
+
+HKEY SETUPDI_CreateDrvKey(HKEY RootKey, struct DeviceInfo *devInfo, UUID *ClassGuid,
REGSAM samDesired)
+{
+ HKEY key = INVALID_HANDLE_VALUE;
+ LPWSTR lpGuidString = NULL;
+ LPWSTR DriverKey = NULL; /* {GUID}\Index */
+ LPWSTR pDeviceInstance; /* Points into DriverKey, on the Index field */
+ DWORD Index; /* Index used in the DriverKey name */
+ DWORD dwSize;
+ DWORD Disposition;
+ DWORD rc;
+ HKEY hHWProfileKey = INVALID_HANDLE_VALUE;
+ HKEY hEnumKey = NULL;
+ HKEY hClassKey = NULL;
+ HKEY hDeviceKey = INVALID_HANDLE_VALUE;
+ HKEY hKey = NULL;
+
+ /* Open device key, to read Driver value */
+ hDeviceKey = SETUPDI_OpenDevKey(RootKey, devInfo, KEY_QUERY_VALUE | KEY_SET_VALUE);
+ if (hDeviceKey == INVALID_HANDLE_VALUE)
+ goto cleanup;
+
+ rc = RegOpenKeyExW(RootKey, REGSTR_PATH_CLASS_NT, 0, KEY_CREATE_SUB_KEY,
&hClassKey);
+ if (rc != ERROR_SUCCESS)
+ {
+ SetLastError(rc);
+ goto cleanup;
+ }
+
+ rc = RegQueryValueExW(hDeviceKey, REGSTR_VAL_DRIVER, NULL, NULL, NULL, &dwSize);
+ if (rc != ERROR_SUCCESS)
+ {
+ /* Create a new driver key */
+
+ if (UuidToStringW(ClassGuid, &lpGuidString) != RPC_S_OK)
+ goto cleanup;
+
+ /* The driver key is in \System\CurrentControlSet\Control\Class\{GUID}\Index */
+ DriverKey = HeapAlloc(GetProcessHeap(), 0, (strlenW(lpGuidString) + 7) *
sizeof(WCHAR) + sizeof(UNICODE_NULL));
+ if (!DriverKey)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ goto cleanup;
+ }
+
+ DriverKey[0] = '{';
+ strcpyW(&DriverKey[1], lpGuidString);
+ pDeviceInstance = &DriverKey[strlenW(DriverKey)];
+ *pDeviceInstance++ = '}';
+ *pDeviceInstance++ = '\\';
+
+ /* Try all values for Index between 0 and 9999 */
+ Index = 0;
+ while (Index <= 9999)
+ {
+ sprintfW(pDeviceInstance, InstanceKeyFormat, Index);
+ rc = RegCreateKeyExW(hClassKey,
+ DriverKey,
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+#if _WIN32_WINNT >= 0x502
+ KEY_READ | KEY_WRITE,
+#else
+ KEY_ALL_ACCESS,
+#endif
+ NULL,
+ &hKey,
+ &Disposition);
+ if (rc != ERROR_SUCCESS)
+ {
+ SetLastError(rc);
+ goto cleanup;
+ }
+ if (Disposition == REG_CREATED_NEW_KEY)
+ break;
+ RegCloseKey(hKey);
+ hKey = NULL;
+ Index++;
+ }
+
+ if (Index > 9999)
+ {
+ /* Unable to create more than 9999 devices within the same class */
+ SetLastError(ERROR_GEN_FAILURE);
+ goto cleanup;
+ }
+
+ /* Write the new Driver value */
+ rc = RegSetValueExW(hDeviceKey, REGSTR_VAL_DRIVER, 0, REG_SZ, (const BYTE
*)DriverKey, (strlenW(DriverKey) + 1) * sizeof(WCHAR));
+ if (rc != ERROR_SUCCESS)
+ {
+ SetLastError(rc);
+ goto cleanup;
+ }
+ }
+ else
+ {
+ /* Open the existing driver key */
+
+ DriverKey = HeapAlloc(GetProcessHeap(), 0, dwSize);
+ if (!DriverKey)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ goto cleanup;
+ }
+
+ rc = RegQueryValueExW(hDeviceKey, REGSTR_VAL_DRIVER, NULL, NULL,
(LPBYTE)DriverKey, &dwSize);
+ if (rc != ERROR_SUCCESS)
+ {
+ SetLastError(rc);
+ goto cleanup;
+ }
+
+ rc = RegCreateKeyExW(hClassKey,
+ DriverKey,
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+#if _WIN32_WINNT >= 0x502
+ KEY_READ | KEY_WRITE,
+#else
+ KEY_ALL_ACCESS,
+#endif
+ NULL,
+ &hKey,
+ &Disposition);
+ if (rc != ERROR_SUCCESS)
+ {
+ SetLastError(rc);
+ goto cleanup;
+ }
+ }
+
+ key = hKey;
+
+cleanup:
+ if (lpGuidString)
+ RpcStringFreeW(&lpGuidString);
+ HeapFree(GetProcessHeap(), 0, DriverKey);
+ if (hHWProfileKey != INVALID_HANDLE_VALUE)
+ RegCloseKey(hHWProfileKey);
+ if (hEnumKey != NULL)
+ RegCloseKey(hEnumKey);
+ if (hClassKey != NULL)
+ RegCloseKey(hClassKey);
+ if (hDeviceKey != INVALID_HANDLE_VALUE)
+ RegCloseKey(hDeviceKey);
+ if (hKey != NULL && hKey != key)
+ RegCloseKey(hKey);
+
+ TRACE("Returning 0x%p\n", hKey);
+ return hKey;
+}
+
HKEY SETUPDI_OpenDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired)
{
HKEY enumKey, key = INVALID_HANDLE_VALUE;
diff --git a/dll/win32/setupapi/setupapi_private.h
b/dll/win32/setupapi/setupapi_private.h
index 8625ae7d2c..63c391867b 100644
--- a/dll/win32/setupapi/setupapi_private.h
+++ b/dll/win32/setupapi/setupapi_private.h
@@ -312,6 +312,8 @@ SETUP_CreateDevicesList(
IN CONST GUID *Class OPTIONAL,
IN PCWSTR Enumerator OPTIONAL);
+HKEY SETUPDI_CreateDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired);
+HKEY SETUPDI_CreateDrvKey(HKEY RootKey, struct DeviceInfo *devInfo, UUID *ClassGuid,
REGSAM samDesired);
HKEY SETUPDI_OpenDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired);
HKEY SETUPDI_OpenDrvKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired);