我正在尝试为我的设备获取电源数据(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());
}
我相信你已经很久以前就已经开始了,因为这个问题是从18个月前开始的,但我刚刚遇到了同样的问题。我的谷歌搜索带我到你的线程。然后我明白了。因此,如果有其他人遇到此问题,问题是您提供给SetupDiGetClassDevs的标志。
你应该刚给它DIGCF_PRESENT标志。使用您提供的所有标志,您可以获取甚至不存在的设备的信息,从而导致您和我都得到的后续错误。
在我的情况下,我尝试启用/禁用netowrk接口,并使用Setup API获取必须传递给SetupDiSetClassInstallParams()的设备的索引。我没有缓存索引,但在处理Setup API函数时,随机出现了ERROR_NO_MORE_ITEMS。
后面的问题是“网络适配器列表”之间发生了变化,f.ex。,“Microsoft ISATAP适配器”从列表中消失了(我也可以看到它隐藏在设备管理器中)。
在我的情况下使用DIGCF_PROFILE而不是DIGCF_PRESENT为我工作。