mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 05:22:57 +00:00
Implement PNP_AddID.
svn path=/trunk/; revision=22310
This commit is contained in:
parent
b9bcb95e37
commit
47a7900e91
1 changed files with 102 additions and 9 deletions
|
@ -1039,24 +1039,117 @@ PNP_UninstallDevInst(handle_t BindingHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static BOOL
|
||||||
|
CheckForDeviceId(LPWSTR lpDeviceIdList,
|
||||||
|
LPWSTR lpDeviceId)
|
||||||
|
{
|
||||||
|
LPWSTR lpPtr;
|
||||||
|
DWORD dwLength;
|
||||||
|
|
||||||
|
lpPtr = lpDeviceIdList;
|
||||||
|
while (*lpPtr != 0)
|
||||||
|
{
|
||||||
|
dwLength = wcslen(lpPtr);
|
||||||
|
if (!_wcsicmp(lpPtr, lpDeviceId))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
lpPtr += (dwLength + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
AppendDeviceId(LPWSTR lpDeviceIdList,
|
||||||
|
LPDWORD lpDeviceIdListSize,
|
||||||
|
LPWSTR lpDeviceId)
|
||||||
|
{
|
||||||
|
DWORD dwLen;
|
||||||
|
DWORD dwPos;
|
||||||
|
|
||||||
|
dwLen = wcslen(lpDeviceId);
|
||||||
|
dwPos = (*lpDeviceIdListSize / sizeof(WCHAR)) - 1;
|
||||||
|
|
||||||
|
wcscpy(&lpDeviceIdList[dwPos], lpDeviceId);
|
||||||
|
|
||||||
|
dwPos += (dwLen + 1);
|
||||||
|
|
||||||
|
lpDeviceIdList[dwPos] = 0;
|
||||||
|
|
||||||
|
*lpDeviceIdListSize = dwPos * sizeof(WCHAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Function 34 */
|
/* Function 34 */
|
||||||
CONFIGRET
|
CONFIGRET
|
||||||
PNP_AddID(handle_t BindingHandle,
|
PNP_AddID(handle_t BindingHandle,
|
||||||
wchar_t *DeviceInstance, /* in, string, unique */
|
wchar_t *DeviceInstance,
|
||||||
wchar_t *DeviceId, /* in, string */
|
wchar_t *DeviceId,
|
||||||
DWORD Flags)
|
DWORD Flags)
|
||||||
{
|
{
|
||||||
CONFIGRET ret = CR_SUCCESS;
|
CONFIGRET ret = CR_SUCCESS;
|
||||||
|
HKEY hDeviceKey;
|
||||||
|
LPWSTR pszSubKey;
|
||||||
|
DWORD dwDeviceIdListSize;
|
||||||
|
WCHAR szDeviceIdList[512];
|
||||||
|
|
||||||
DPRINT1("PNP_AddID() called\n");
|
DPRINT("PNP_AddID() called\n");
|
||||||
DPRINT1(" DeviceInstance: %S\n", DeviceInstance);
|
DPRINT(" DeviceInstance: %S\n", DeviceInstance);
|
||||||
DPRINT1(" DeviceId: %S\n", DeviceId);
|
DPRINT(" DeviceId: %S\n", DeviceId);
|
||||||
DPRINT1(" Flags: %lx\n", Flags);
|
DPRINT(" Flags: %lx\n", Flags);
|
||||||
|
|
||||||
/* FIXME */
|
if (RegOpenKeyExW(hEnumKey,
|
||||||
ret = CR_CALL_NOT_IMPLEMENTED;
|
DeviceInstance,
|
||||||
|
0,
|
||||||
|
KEY_QUERY_VALUE | KEY_SET_VALUE,
|
||||||
|
&hDeviceKey) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DPRINT("Failed to open the device key!\n");
|
||||||
|
return CR_INVALID_DEVNODE;
|
||||||
|
}
|
||||||
|
|
||||||
DPRINT1("PNP_AddID() done (returns %lx)\n", ret);
|
pszSubKey = (Flags & CM_ADD_ID_COMPATIBLE) ? L"CompatibleIDs" : L"HardwareID";
|
||||||
|
|
||||||
|
dwDeviceIdListSize = 512 * sizeof(WCHAR);
|
||||||
|
if (RegQueryValueExW(hDeviceKey,
|
||||||
|
pszSubKey,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
(LPBYTE)szDeviceIdList,
|
||||||
|
&dwDeviceIdListSize) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DPRINT("Failed to query the desired ID string!\n");
|
||||||
|
ret = CR_REGISTRY_ERROR;
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check whether the device ID is already in use */
|
||||||
|
if (CheckForDeviceId(szDeviceIdList, DeviceId))
|
||||||
|
{
|
||||||
|
DPRINT("Device ID was found in the ID string!\n");
|
||||||
|
ret = CR_SUCCESS;
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Append the Device ID */
|
||||||
|
AppendDeviceId(szDeviceIdList, &dwDeviceIdListSize, DeviceId);
|
||||||
|
|
||||||
|
if (RegSetValueExW(hDeviceKey,
|
||||||
|
pszSubKey,
|
||||||
|
0,
|
||||||
|
REG_MULTI_SZ,
|
||||||
|
(LPBYTE)szDeviceIdList,
|
||||||
|
dwDeviceIdListSize) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DPRINT("Failed to set the desired ID string!\n");
|
||||||
|
ret = CR_REGISTRY_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
Done:
|
||||||
|
RegCloseKey(hDeviceKey);
|
||||||
|
|
||||||
|
DPRINT("PNP_AddID() done (returns %lx)\n", ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue