1

我正在尝试为我的设备(cm_power_data_s)获取电源数据。
我正在使用SetupDiGetDeviceRegistryPropertyAPI 来执行此操作。
虽然这适用于某些设备,但不适用于其他设备。
返回的数据SetupDiEnumDeviceInfonull,没有这个,我不能用SetupDiGetDeviceRegistryProperty。 我尝试通过查询获取类来
手动填充,但不返回缓冲区大小(与传递空数据相同)。有人可以帮忙吗?这是我的代码:sp_devinfo_datawmiGUIDSetupDiGetDeviceRegistryProperty

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());

        }
4

2 回答 2

1

我敢肯定,自从这个问题是 18 个月前的问题以来,您早已继续前进,但我刚刚遇到了完全相同的问题。我的谷歌搜索把我带到了你的线程。然后我想通了。因此,万一其他人遇到这个问题,问题是您提供给 SetupDiGetClassDevs 的标志。

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

于 2019-01-08T18:51:52.273 回答
0

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

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

在我的情况下,使用 DIGCF_PROFILE而不是DIGCF_PRESENT 对我有用。

于 2019-03-06T17:39:45.110 回答