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);
                    }
                }
            }
        }
예제 #2
0
        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);
        }