Мой 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 работало для меня.

Другие вопросы по тегам