Мой SetupDiEnumDeviceInfo возвращает ERROR_NO_MORE_ITEMS для определенных устройств (C#)
Я пытаюсь получить данные о мощности для моих устройств (cm_power_data_s).
Я использую SetupDiGetDeviceRegistryProperty
API для этого.
Хотя это работает нормально для некоторых устройств, это не работает для других.
Данные, возвращаемые SetupDiEnumDeviceInfo
является null
и без этого я не могу использовать SetupDiGetDeviceRegistryProperty
,
Я пробовал вручную заполнять sp_devinfo_data
сделав wmi
запрос, чтобы получить класс GUID
, но SetupDiGetDeviceRegistryProperty
не возвращает размер буфера с ним (так же, как передача нулевых данных).
Может кто-нибудь, пожалуйста, помогите?
Вот мой код:
uint SPDRP_DEVICE_POWER_DATA = 0x0000001E;
int proptype;
int size;
//int D3, D2, D1, D3wake, cap = 0;
DEVPROPKEY key = DEVPROPKEY.DEVPKEY_Device_PowerData;
IntPtr hDevInfo = SetupDiGetClassDevs(IntPtr.Zero, DevID, IntPtr.Zero, DIGCF.DIGCF_ALLCLASSES | DIGCF.DIGCF_PRESENT | DIGCF.DIGCF_DEVICEINTERFACE);
if (hDevInfo == (IntPtr)INVALID_HANDLE_VALUE)
{
throw new ArgumentNullException("invalidhandle");
}
SP_DEVINFO_DATA data = new SP_DEVINFO_DATA();
data.cbSize = Marshal.SizeOf(data);
SetupDiEnumDeviceInfo(hDevInfo, 0, ref data); // This data is empty for some devices
// SetupDiGetSelectedDevice(hDevInfo, ref data);
int aa = Marshal.GetLastWin32Error();
bool b = SetupDiGetDeviceRegistryProperty(hDevInfo, ref data, SPDRP_DEVICE_POWER_DATA, out proptype, IntPtr.Zero, 0, out size);
int a = Marshal.GetLastWin32Error();
if (size == 0)
{
return "";
// throw new ArgumentNullException("Power Data cannot be fetched");
}
IntPtr buffer1 = Marshal.AllocHGlobal(size);
if (!SetupDiGetDeviceRegistryProperty(hDevInfo, ref data, SPDRP_DEVICE_POWER_DATA, out proptype, buffer1, size, out size))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
0 ответов
Я уверен, что вы уже давно перешли, так как этот вопрос задан 18 месяцев назад, но я только что решил именно эту проблему. Мой поиск в Google привел меня к вашей теме. Тогда я понял это. Таким образом, в случае, если кто-нибудь еще ударит по этому вопросу, проблема в флагах, которые вы указали в SetupDiGetClassDevs.
Вы должны были просто дать ему флаг DIGCF_PRESENT. Со всеми предоставленными вами флагами вы получаете информацию об устройствах, которых даже нет, что приводит к точно следующей ошибке, которую мы оба получили.
В моем случае я попытался включить / отключить интерфейс netowrk и использовал Setup API для получения индекса устройства, которое должно быть передано в SetupDiSetClassInstallParams(). Я не кэшировал индекс, но случайно получил ERROR_NO_MORE_ITEMS при работе с функциями API настройки.
Проблема заключалась в том, что "список сетевых адаптеров" изменился между ними, например, "адаптер Microsoft ISATAP" исчез из списка (я также мог видеть, что он скрыт в диспетчере устройств).
В моем случае использование DIGCF_PROFILE вместо DIGCF_PRESENT работало для меня.