mirror of
https://github.com/reactos/reactos.git
synced 2025-05-28 21:48:19 +00:00
[SETUPAPI] Replace the remaining internal calls to SetupDiOpenDevRegKey and SetupDiCreateDevRegKeyW by calls to SETUPDI_OpenDrvKey, SETUPDI_CreateDevKey or SETUPDI_CreateDrvKey.
This commit is contained in:
parent
3d3bd4e77e
commit
df36ee9fe2
2 changed files with 218 additions and 173 deletions
|
@ -1414,17 +1414,8 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
|
||||||
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
|
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
|
||||||
struct DeviceInfo *deviceInfo;
|
struct DeviceInfo *deviceInfo;
|
||||||
HKEY key = INVALID_HANDLE_VALUE;
|
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;
|
DWORD rc;
|
||||||
HKEY hHWProfileKey = INVALID_HANDLE_VALUE;
|
HKEY hHWProfileKey = INVALID_HANDLE_VALUE;
|
||||||
HKEY hEnumKey = NULL;
|
|
||||||
HKEY hClassKey = NULL;
|
|
||||||
HKEY hDeviceKey = INVALID_HANDLE_VALUE;
|
|
||||||
HKEY hKey = NULL;
|
HKEY hKey = NULL;
|
||||||
HKEY RootKey;
|
HKEY RootKey;
|
||||||
|
|
||||||
|
@ -1482,41 +1473,13 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
|
||||||
|
|
||||||
if (KeyType == DIREG_DEV)
|
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
|
#if _WIN32_WINNT >= 0x502
|
||||||
KEY_READ | KEY_WRITE,
|
hKey = SETUPDI_CreateDevKey(RootKey, deviceInfo, KEY_READ | KEY_WRITE);
|
||||||
#else
|
#else
|
||||||
KEY_ALL_ACCESS,
|
hKey = SETUPDI_CreateDevKey(RootKey, deviceInfo, KEY_ALL_ACCESS);
|
||||||
#endif
|
#endif
|
||||||
NULL,
|
if (hKey == INVALID_HANDLE_VALUE)
|
||||||
&hKey,
|
|
||||||
NULL);
|
|
||||||
if (rc != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SetLastError(rc);
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
|
|
||||||
if (Scope == DICS_FLAG_GLOBAL)
|
if (Scope == DICS_FLAG_GLOBAL)
|
||||||
{
|
{
|
||||||
|
@ -1541,124 +1504,14 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
|
||||||
}
|
}
|
||||||
else /* KeyType == DIREG_DRV */
|
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
|
#if _WIN32_WINNT >= 0x502
|
||||||
KEY_READ | KEY_WRITE,
|
hKey = SETUPDI_CreateDrvKey(RootKey, deviceInfo, (UUID*)&DeviceInfoData->ClassGuid, KEY_READ | KEY_WRITE);
|
||||||
#else
|
#else
|
||||||
KEY_ALL_ACCESS,
|
hKey = SETUPDI_CreateDrvKey(RootKey, deviceInfo, (UUID*)&DeviceInfoData->ClassGuid, KEY_ALL_ACCESS);
|
||||||
#endif
|
#endif
|
||||||
NULL,
|
if (hKey == INVALID_HANDLE_VALUE)
|
||||||
&hKey,
|
|
||||||
&Disposition);
|
|
||||||
if (rc != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SetLastError(rc);
|
|
||||||
goto cleanup;
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do installation of the specified section */
|
/* Do installation of the specified section */
|
||||||
if (InfHandle)
|
if (InfHandle)
|
||||||
|
@ -1669,17 +1522,8 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
|
||||||
key = hKey;
|
key = hKey;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
if (lpGuidString)
|
|
||||||
RpcStringFreeW(&lpGuidString);
|
|
||||||
HeapFree(GetProcessHeap(), 0, DriverKey);
|
|
||||||
if (hHWProfileKey != INVALID_HANDLE_VALUE)
|
if (hHWProfileKey != INVALID_HANDLE_VALUE)
|
||||||
RegCloseKey(hHWProfileKey);
|
RegCloseKey(hHWProfileKey);
|
||||||
if (hEnumKey != NULL)
|
|
||||||
RegCloseKey(hEnumKey);
|
|
||||||
if (hClassKey != NULL)
|
|
||||||
RegCloseKey(hClassKey);
|
|
||||||
if (hDeviceKey != INVALID_HANDLE_VALUE)
|
|
||||||
RegCloseKey(hDeviceKey);
|
|
||||||
if (hKey != NULL && hKey != key)
|
if (hKey != NULL && hKey != key)
|
||||||
RegCloseKey(hKey);
|
RegCloseKey(hKey);
|
||||||
|
|
||||||
|
@ -4315,7 +4159,6 @@ BOOL WINAPI SetupDiCallClassInstaller(
|
||||||
|
|
||||||
if (CanHandle & DEVICE_COINSTALLER)
|
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);
|
hKey = SETUPDI_OpenDrvKey(((struct DeviceInfoSet *)DeviceInfoSet)->HKLM, (struct DeviceInfo *)DeviceInfoData->Reserved, KEY_QUERY_VALUE);
|
||||||
if (hKey != INVALID_HANDLE_VALUE)
|
if (hKey != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
@ -5218,8 +5061,10 @@ SetupDiChangeState(
|
||||||
IN HDEVINFO DeviceInfoSet,
|
IN HDEVINFO DeviceInfoSet,
|
||||||
IN OUT PSP_DEVINFO_DATA DeviceInfoData)
|
IN OUT PSP_DEVINFO_DATA DeviceInfoData)
|
||||||
{
|
{
|
||||||
|
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
|
||||||
|
struct DeviceInfo *deviceInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
|
||||||
PSP_PROPCHANGE_PARAMS PropChange;
|
PSP_PROPCHANGE_PARAMS PropChange;
|
||||||
HKEY hKey = INVALID_HANDLE_VALUE;
|
HKEY hRootKey = INVALID_HANDLE_VALUE, hKey = INVALID_HANDLE_VALUE;
|
||||||
LPCWSTR RegistryValueName;
|
LPCWSTR RegistryValueName;
|
||||||
DWORD dwConfigFlags, dwLength, dwRegType;
|
DWORD dwConfigFlags, dwLength, dwRegType;
|
||||||
LONG rc;
|
LONG rc;
|
||||||
|
@ -5247,10 +5092,19 @@ SetupDiChangeState(
|
||||||
case DICS_ENABLE:
|
case DICS_ENABLE:
|
||||||
case DICS_DISABLE:
|
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 */
|
/* 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)
|
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)
|
if (hKey == INVALID_HANDLE_VALUE)
|
||||||
break;
|
break;
|
||||||
dwLength = sizeof(DWORD);
|
dwLength = sizeof(DWORD);
|
||||||
|
@ -5315,6 +5169,9 @@ SetupDiChangeState(
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
if (hRootKey != INVALID_HANDLE_VALUE && hRootKey != set->HKLM)
|
||||||
|
RegCloseKey(hRootKey);
|
||||||
|
|
||||||
if (hKey != INVALID_HANDLE_VALUE)
|
if (hKey != INVALID_HANDLE_VALUE)
|
||||||
RegCloseKey(hKey);
|
RegCloseKey(hKey);
|
||||||
|
|
||||||
|
@ -5344,6 +5201,8 @@ SetupDiRegisterCoDeviceInstallers(
|
||||||
IN HDEVINFO DeviceInfoSet,
|
IN HDEVINFO DeviceInfoSet,
|
||||||
IN PSP_DEVINFO_DATA DeviceInfoData)
|
IN PSP_DEVINFO_DATA DeviceInfoData)
|
||||||
{
|
{
|
||||||
|
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
|
||||||
|
struct DeviceInfo *deviceInfo;
|
||||||
BOOL ret = FALSE; /* Return value */
|
BOOL ret = FALSE; /* Return value */
|
||||||
|
|
||||||
TRACE("%p %p\n", DeviceInfoSet, DeviceInfoData);
|
TRACE("%p %p\n", DeviceInfoSet, DeviceInfoData);
|
||||||
|
@ -5390,14 +5249,20 @@ SetupDiRegisterCoDeviceInstallers(
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
lstrcatW(SectionName, DotCoInstallers);
|
lstrcatW(SectionName, DotCoInstallers);
|
||||||
|
|
||||||
|
deviceInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
|
||||||
|
|
||||||
/* Open/Create driver key information */
|
/* Open/Create driver key information */
|
||||||
#if _WIN32_WINNT >= 0x502
|
#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
|
#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
|
#endif
|
||||||
if (hKey == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_NOT_FOUND)
|
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)
|
if (hKey == INVALID_HANDLE_VALUE)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -5490,6 +5355,8 @@ SetupDiInstallDevice(
|
||||||
IN HDEVINFO DeviceInfoSet,
|
IN HDEVINFO DeviceInfoSet,
|
||||||
IN OUT PSP_DEVINFO_DATA DeviceInfoData)
|
IN OUT PSP_DEVINFO_DATA DeviceInfoData)
|
||||||
{
|
{
|
||||||
|
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
|
||||||
|
struct DeviceInfo *deviceInfo;
|
||||||
SP_DEVINSTALL_PARAMS_W InstallParams;
|
SP_DEVINSTALL_PARAMS_W InstallParams;
|
||||||
struct DriverInfoElement *SelectedDriver;
|
struct DriverInfoElement *SelectedDriver;
|
||||||
SYSTEMTIME DriverDate;
|
SYSTEMTIME DriverDate;
|
||||||
|
@ -5633,14 +5500,20 @@ SetupDiInstallDevice(
|
||||||
strcpyW(SelectedDriver->Details.InfFileName, NewFileName);
|
strcpyW(SelectedDriver->Details.InfFileName, NewFileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deviceInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
|
||||||
|
|
||||||
/* Open/Create driver key information */
|
/* Open/Create driver key information */
|
||||||
#if _WIN32_WINNT >= 0x502
|
#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
|
#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
|
#endif
|
||||||
if (hKey == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_NOT_FOUND)
|
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)
|
if (hKey == INVALID_HANDLE_VALUE)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -5780,6 +5653,176 @@ cleanup:
|
||||||
return ret;
|
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 SETUPDI_OpenDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired)
|
||||||
{
|
{
|
||||||
HKEY enumKey, key = INVALID_HANDLE_VALUE;
|
HKEY enumKey, key = INVALID_HANDLE_VALUE;
|
||||||
|
|
|
@ -312,6 +312,8 @@ SETUP_CreateDevicesList(
|
||||||
IN CONST GUID *Class OPTIONAL,
|
IN CONST GUID *Class OPTIONAL,
|
||||||
IN PCWSTR Enumerator 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_OpenDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired);
|
||||||
HKEY SETUPDI_OpenDrvKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired);
|
HKEY SETUPDI_OpenDrvKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue