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