I am trying to fetch power data for my devices(cm_power_data_s).
I am using the SetupDiGetDeviceRegistryProperty
API to do so.
While this works fine for some devices, it doesn't work for others.
The data returned by SetupDiEnumDeviceInfo
is null
, and without this, I can't use SetupDiGetDeviceRegistryProperty
.
I tried manually filling sp_devinfo_data
by making a wmi
query to get the class GUID
, but SetupDiGetDeviceRegistryProperty
doesn't return the buffer size with it (same as passing null data).
Can someone please help?
Here's my code:
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());
}