setupapi: Store pointer to set in device, and use it to make sure that a device is a member of a set.

This commit is contained in:
Juan Lang 2007-09-21 17:07:37 -07:00 committed by Alexandre Julliard
parent 21b7e1faf6
commit d0a2866a90
1 changed files with 26 additions and 7 deletions

View File

@ -124,10 +124,11 @@ struct InterfaceInstances
/* Pointed to by SP_DEVINFO_DATA's Reserved member */
struct DeviceInfo
{
HKEY key;
BOOL phantom;
LPWSTR instanceId;
struct list interfaces;
struct DeviceInfoSet *set;
HKEY key;
BOOL phantom;
LPWSTR instanceId;
struct list interfaces;
};
static void SETUPDI_GuidToString(const GUID *guid, LPWSTR guidStr)
@ -386,14 +387,15 @@ static BOOL SETUPDI_SetInterfaceSymbolicLink(SP_DEVICE_INTERFACE_DATA *iface,
return ret;
}
static struct DeviceInfo *SETUPDI_AllocateDeviceInfo(LPCWSTR instanceId,
BOOL phantom)
static struct DeviceInfo *SETUPDI_AllocateDeviceInfo(struct DeviceInfoSet *set,
LPCWSTR instanceId, BOOL phantom)
{
struct DeviceInfo *devInfo = HeapAlloc(GetProcessHeap(), 0,
sizeof(struct DeviceInfo));
if (devInfo)
{
devInfo->set = set;
devInfo->instanceId = HeapAlloc(GetProcessHeap(), 0,
(lstrlenW(instanceId) + 1) * sizeof(WCHAR));
if (devInfo->instanceId)
@ -470,7 +472,7 @@ static BOOL SETUPDI_AddDeviceToSet(struct DeviceInfoSet *set,
SP_DEVINFO_DATA **dev)
{
BOOL ret = FALSE;
struct DeviceInfo *devInfo = SETUPDI_AllocateDeviceInfo(instanceId,
struct DeviceInfo *devInfo = SETUPDI_AllocateDeviceInfo(set, instanceId,
phantom);
TRACE("%p, %s, %d, %s, %d\n", set, debugstr_guid(guid), devInst,
@ -1364,6 +1366,11 @@ BOOL WINAPI SetupDiRegisterDeviceInfo(
return FALSE;
}
devInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
if (devInfo->set != set)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (devInfo->phantom)
{
devInfo->phantom = FALSE;
@ -1504,6 +1511,11 @@ BOOL WINAPI SetupDiGetDeviceInstanceIdW(
return FALSE;
}
devInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
if (devInfo->set != set)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
TRACE("instance ID: %s\n", debugstr_w(devInfo->instanceId));
if (DeviceInstanceIdSize < lstrlenW(devInfo->instanceId) + 1)
{
@ -2115,6 +2127,7 @@ BOOL WINAPI SetupDiCreateDeviceInterfaceW(
PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
{
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
struct DeviceInfo *devInfo;
SP_DEVICE_INTERFACE_DATA *iface = NULL;
BOOL ret;
@ -2138,6 +2151,12 @@ BOOL WINAPI SetupDiCreateDeviceInterfaceW(
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
devInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
if (devInfo->set != set)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (!InterfaceClassGuid)
{
SetLastError(ERROR_INVALID_USER_BUFFER);