private void GetHostControllerPowerMap(IntPtr handle) { UsbUser.WdmusbPowerState powerState = UsbUser.WdmusbPowerState.WdmUsbPowerSystemWorking; for (; powerState <= UsbUser.WdmusbPowerState.WdmUsbPowerSystemShutdown; powerState++) { UsbUser.UsbuserPowerInfoRequest powerInfoRequest = new UsbUser.UsbuserPowerInfoRequest { Header = { UsbUserRequest = UsbUser.UsbuserGetPowerStateMap, }, PowerInformation = { SystemState = powerState } }; powerInfoRequest.Header.RequestBufferLength = (uint)Marshal.SizeOf(powerInfoRequest); IntPtr ptrPowerInfoRequest = IntPtr.Zero; try { // // Now query USBHUB for the USB_POWER_INFO structure for this hub. // For Selective Suspend support // int nBytes = Marshal.SizeOf(powerInfoRequest); ptrPowerInfoRequest = Marshal.AllocHGlobal(nBytes); Marshal.StructureToPtr(powerInfoRequest, ptrPowerInfoRequest, true); var success = KernelApi.DeviceIoControl(handle, UsbUser.IoctlUsbUserRequest, ptrPowerInfoRequest, nBytes, ptrPowerInfoRequest, nBytes, out _, IntPtr.Zero); if (!success) { CoreTraceSource.Source.TraceEvent(TraceEventType.Error, CoreTraceSource.UsbControllerSourceId, $"[{nameof(KernelApi.DeviceIoControl)}] Returned Error Code: [{KernelApi.GetLastError():X}]"); } else { powerInfoRequest = (UsbUser.UsbuserPowerInfoRequest)Marshal.PtrToStructure(ptrPowerInfoRequest, typeof(UsbUser.UsbuserPowerInfoRequest)); PowerInfo.Add(powerInfoRequest.PowerInformation); } } finally { if (ptrPowerInfoRequest != IntPtr.Zero) { Marshal.FreeHGlobal(ptrPowerInfoRequest); } } } }
public static string Display(this UsbUser.WdmusbPowerState state) { string result; switch (state) { case UsbUser.WdmusbPowerState.WdmUsbPowerNotMapped: result = "S? (unmapped)"; break; case UsbUser.WdmusbPowerState.WdmUsbPowerSystemUnspecified: result = "S? (unspecified)"; break; case UsbUser.WdmusbPowerState.WdmUsbPowerSystemWorking: result = "S0 (working)"; break; case UsbUser.WdmusbPowerState.WdmUsbPowerSystemSleeping1: result = "S1 (sleep)"; break; case UsbUser.WdmusbPowerState.WdmUsbPowerSystemSleeping2: result = "S2 (sleep)"; break; case UsbUser.WdmusbPowerState.WdmUsbPowerSystemSleeping3: result = "S3 (sleep)"; break; case UsbUser.WdmusbPowerState.WdmUsbPowerSystemHibernate: result = "S4 (Hibernate)"; break; case UsbUser.WdmusbPowerState.WdmUsbPowerSystemShutdown: result = "S5 (shutdown)"; break; case UsbUser.WdmusbPowerState.WdmUsbPowerDeviceUnspecified: result = "D? (unspecified)"; break; case UsbUser.WdmusbPowerState.WdmUsbPowerDeviceD0: result = "D0"; break; case UsbUser.WdmusbPowerState.WdmUsbPowerDeviceD1: result = "D1"; break; case UsbUser.WdmusbPowerState.WdmUsbPowerDeviceD2: result = "D2"; break; case UsbUser.WdmusbPowerState.WdmUsbPowerDeviceD3: result = "D3"; break; default: throw new ArgumentOutOfRangeException(nameof(state), state, null); } return(result); }