我的SetupDiEnumDeviceInfo为某些设备返回ERROR_NO_MORE_ITEMS(C#)

问题描述 投票:0回答:2

我正在尝试为我的设备获取电源数据(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());

        }
c# windows drivers setupapi
2个回答
0
投票

我相信你已经很久以前就已经开始了,因为这个问题是从18个月前开始的,但我刚刚遇到了同样的问题。我的谷歌搜索带我到你的线程。然后我明白了。因此,如果有其他人遇到此问题,问题是您提供给SetupDiGetClassDevs的标志。

你应该刚给它DIGCF_PRESENT标志。使用您提供的所有标志,您可以获取甚至不存在的设备的信息,从而导致您和我都得到的后续错误。


0
投票

在我的情况下,我尝试启用/禁用netowrk接口,并使用Setup API获取必须传递给SetupDiSetClassInstallParams()的设备的索引。我没有缓存索引,但在处理Setup API函数时,随机出现了ERROR_NO_MORE_ITEMS。

后面的问题是“网络适配器列表”之间发生了变化,f.ex。,“Microsoft ISATAP适配器”从列表中消失了(我也可以看到它隐藏在设备管理器中)。

在我的情况下使用DIGCF_PROFILE而不是DIGCF_PRESENT为我工作。

© www.soinside.com 2019 - 2024. All rights reserved.