setupapi: Implement SetupDiEnumDeviceInterfaces.
This commit is contained in:
parent
69b0b42455
commit
be863b07ff
@ -2084,29 +2084,115 @@ BOOL WINAPI SetupDiCreateDeviceInterfaceW(
|
|||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* SetupDiEnumDeviceInterfaces (SETUPAPI.@)
|
* SetupDiEnumDeviceInterfaces (SETUPAPI.@)
|
||||||
|
*
|
||||||
|
* PARAMS
|
||||||
|
* DeviceInfoSet [I] Set of devices from which to enumerate
|
||||||
|
* interfaces
|
||||||
|
* DeviceInfoData [I] (Optional) If specified, a specific device
|
||||||
|
* instance from which to enumerate interfaces.
|
||||||
|
* If it isn't specified, all interfaces for all
|
||||||
|
* devices in the set are enumerated.
|
||||||
|
* InterfaceClassGuid [I] The interface class to enumerate.
|
||||||
|
* MemberIndex [I] An index of the interface instance to enumerate.
|
||||||
|
* A caller should start with MemberIndex set to 0,
|
||||||
|
* and continue until the function fails with
|
||||||
|
* ERROR_NO_MORE_ITEMS.
|
||||||
|
* DeviceInterfaceData [I/O] Returns an enumerated interface. Its cbSize
|
||||||
|
* member must be set to
|
||||||
|
* sizeof(SP_DEVICE_INTERFACE_DATA).
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
* Success: non-zero value.
|
||||||
|
* Failure: FALSE. Call GetLastError() for more info.
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI SetupDiEnumDeviceInterfaces(
|
BOOL WINAPI SetupDiEnumDeviceInterfaces(
|
||||||
HDEVINFO devinfo,
|
HDEVINFO DeviceInfoSet,
|
||||||
PSP_DEVINFO_DATA DeviceInfoData,
|
PSP_DEVINFO_DATA DeviceInfoData,
|
||||||
CONST GUID * InterfaceClassGuid,
|
CONST GUID * InterfaceClassGuid,
|
||||||
DWORD MemberIndex,
|
DWORD MemberIndex,
|
||||||
PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
|
PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
|
||||||
{
|
{
|
||||||
|
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
FIXME("%p, %p, %s, 0x%08x, %p\n", devinfo, DeviceInfoData,
|
TRACE("%p, %p, %s, %d, %p\n", DeviceInfoSet, DeviceInfoData,
|
||||||
debugstr_guid(InterfaceClassGuid), MemberIndex, DeviceInterfaceData);
|
debugstr_guid(InterfaceClassGuid), MemberIndex, DeviceInterfaceData);
|
||||||
|
|
||||||
if (devinfo && devinfo != (HDEVINFO)INVALID_HANDLE_VALUE)
|
if (!DeviceInfoSet || DeviceInfoSet == (HDEVINFO)INVALID_HANDLE_VALUE ||
|
||||||
|
set->magic != SETUP_DEVICE_INFO_SET_MAGIC)
|
||||||
{
|
{
|
||||||
struct DeviceInfoSet *list = (struct DeviceInfoSet *)devinfo;
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
if (list->magic == SETUP_DEVICE_INFO_SET_MAGIC)
|
return FALSE;
|
||||||
SetLastError(ERROR_NO_MORE_ITEMS);
|
}
|
||||||
|
if (DeviceInfoData && (DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA) ||
|
||||||
|
!DeviceInfoData->Reserved))
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!DeviceInterfaceData ||
|
||||||
|
DeviceInterfaceData->cbSize != sizeof(SP_DEVICE_INTERFACE_DATA))
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (DeviceInfoData)
|
||||||
|
{
|
||||||
|
struct DeviceInfo *devInfo =
|
||||||
|
(struct DeviceInfo *)DeviceInfoData->Reserved;
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
|
if ((ret = SETUPDI_FindInterface(devInfo, InterfaceClassGuid, &i)))
|
||||||
|
{
|
||||||
|
if (MemberIndex < devInfo->interfaces[i].cInstances)
|
||||||
|
memcpy(DeviceInterfaceData,
|
||||||
|
&devInfo->interfaces[i].instances[MemberIndex],
|
||||||
|
sizeof(SP_DEVICE_INTERFACE_DATA));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_NO_MORE_ITEMS);
|
||||||
|
ret = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
SetLastError(ERROR_INVALID_HANDLE);
|
SetLastError(ERROR_NO_MORE_ITEMS);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
SetLastError(ERROR_INVALID_HANDLE);
|
{
|
||||||
|
DWORD i, cEnumerated = 0;
|
||||||
|
BOOL found = FALSE;
|
||||||
|
|
||||||
|
for (i = 0; !found && cEnumerated < MemberIndex + 1 &&
|
||||||
|
i < set->cDevices; i++)
|
||||||
|
{
|
||||||
|
struct DeviceInfo *devInfo =
|
||||||
|
(struct DeviceInfo *)set->devices[i].Reserved;
|
||||||
|
DWORD interfaceIndex;
|
||||||
|
|
||||||
|
if (SETUPDI_FindInterface(devInfo, InterfaceClassGuid,
|
||||||
|
&interfaceIndex))
|
||||||
|
{
|
||||||
|
struct InterfaceInstances *interface =
|
||||||
|
&devInfo->interfaces[interfaceIndex];
|
||||||
|
|
||||||
|
if (cEnumerated + interface->cInstances < MemberIndex + 1)
|
||||||
|
cEnumerated += interface->cInstances;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DWORD instanceIndex = MemberIndex - cEnumerated;
|
||||||
|
|
||||||
|
memcpy(DeviceInterfaceData,
|
||||||
|
&interface->instances[instanceIndex],
|
||||||
|
sizeof(SP_DEVICE_INTERFACE_DATA));
|
||||||
|
cEnumerated += instanceIndex + 1;
|
||||||
|
found = TRUE;
|
||||||
|
ret = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
SetLastError(ERROR_NO_MORE_ITEMS);
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -364,6 +364,7 @@ static void testCreateDeviceInterface(void)
|
|||||||
SP_DEVINFO_DATA devInfo = { 0 };
|
SP_DEVINFO_DATA devInfo = { 0 };
|
||||||
SP_DEVICE_INTERFACE_DATA interfaceData = { sizeof(interfaceData),
|
SP_DEVICE_INTERFACE_DATA interfaceData = { sizeof(interfaceData),
|
||||||
{ 0 } };
|
{ 0 } };
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
ret = pSetupDiCreateDeviceInterfaceA(set, NULL, NULL, NULL, 0, NULL);
|
ret = pSetupDiCreateDeviceInterfaceA(set, NULL, NULL, NULL, 0, NULL);
|
||||||
@ -395,8 +396,14 @@ static void testCreateDeviceInterface(void)
|
|||||||
ok(ret, "SetupDiCreateDeviceInterfaceA failed: %08x\n", GetLastError());
|
ok(ret, "SetupDiCreateDeviceInterfaceA failed: %08x\n", GetLastError());
|
||||||
ret = pSetupDiEnumDeviceInterfaces(set, &devInfo, &guid, 0,
|
ret = pSetupDiEnumDeviceInterfaces(set, &devInfo, &guid, 0,
|
||||||
&interfaceData);
|
&interfaceData);
|
||||||
todo_wine
|
|
||||||
ok(ret, "SetupDiEnumDeviceInterfaces failed: %d\n", GetLastError());
|
ok(ret, "SetupDiEnumDeviceInterfaces failed: %d\n", GetLastError());
|
||||||
|
i = 0;
|
||||||
|
while (pSetupDiEnumDeviceInterfaces(set, &devInfo, &guid, i,
|
||||||
|
&interfaceData))
|
||||||
|
i++;
|
||||||
|
ok(i == 2, "expected 2 interfaces, got %d\n", i);
|
||||||
|
ok(GetLastError() == ERROR_NO_MORE_ITEMS,
|
||||||
|
"SetupDiEnumDeviceInterfaces failed: %08x\n", GetLastError());
|
||||||
pSetupDiDestroyDeviceInfoList(set);
|
pSetupDiDestroyDeviceInfoList(set);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user