https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9d29ee3a62d13feb71ffda...
commit 9d29ee3a62d13feb71ffda9cd2fd5bb13e383175 Author: Eric Kohl eric.kohl@reactos.org AuthorDate: Sun Jan 21 12:55:13 2018 +0100 Commit: Eric Kohl eric.kohl@reactos.org CommitDate: Mon Jan 22 00:35:21 2018 +0100
[DEVMGR] Implement missing device power information (current power state, power capabilities and power state mappings). --- dll/win32/devmgr/properties/advprop.cpp | 234 +++++++++++++++++++++++++++++++- 1 file changed, 230 insertions(+), 4 deletions(-)
diff --git a/dll/win32/devmgr/properties/advprop.cpp b/dll/win32/devmgr/properties/advprop.cpp index 0b59ad8634..44d8d0fa21 100644 --- a/dll/win32/devmgr/properties/advprop.cpp +++ b/dll/win32/devmgr/properties/advprop.cpp @@ -33,6 +33,28 @@
#include <winver.h>
+#define PDCAP_D0_SUPPORTED 0x00000001 +#define PDCAP_D1_SUPPORTED 0x00000002 +#define PDCAP_D2_SUPPORTED 0x00000004 +#define PDCAP_D3_SUPPORTED 0x00000008 +#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 +#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 +#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 +#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 +#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 + +typedef struct CM_Power_Data_s +{ + ULONG PD_Size; + DEVICE_POWER_STATE PD_MostRecentPowerState; + ULONG PD_Capabilities; + ULONG PD_D1Latency; + ULONG PD_D2Latency; + ULONG PD_D3Latency; + DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; + SYSTEM_POWER_STATE PD_DeepestSystemWake; +} CM_POWER_DATA, *PCM_POWER_DATA; +
static UINT WINAPI EnumDeviceDriverFilesCallback(IN PVOID Context, @@ -1381,6 +1403,204 @@ DisplayDeviceRelations( }
+static VOID +DisplayCurrentPowerState( + IN PDEVADVPROP_INFO dap, + IN HWND hwndListView) +{ + HDEVINFO DeviceInfoSet; + PSP_DEVINFO_DATA DeviceInfoData; + CM_POWER_DATA PowerData; + DWORD dwSize, dwType; + PCWSTR lpText = NULL; + + if (dap->CurrentDeviceInfoSet != INVALID_HANDLE_VALUE) + { + DeviceInfoSet = dap->CurrentDeviceInfoSet; + DeviceInfoData = &dap->CurrentDeviceInfoData; + } + else + { + DeviceInfoSet = dap->DeviceInfoSet; + DeviceInfoData = &dap->DeviceInfoData; + } + + dwSize = sizeof(CM_POWER_DATA); + if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet, + DeviceInfoData, + SPDRP_DEVICE_POWER_DATA, + &dwType, + (LPBYTE)&PowerData, + dwSize, + &dwSize)) + return; + + switch (PowerData.PD_MostRecentPowerState) + { +// case PowerDeviceUnspecified: + + case PowerDeviceD0: + lpText = L"D0"; + break; + + case PowerDeviceD1: + lpText = L"D1"; + break; + + case PowerDeviceD2: + lpText = L"D2"; + break; + + case PowerDeviceD3: + lpText = L"D3"; + break; + + default: + break; + } + + if (lpText != NULL) + SetListViewText(hwndListView, 0, lpText); +} + + +static VOID +DisplayPowerCapabilities( + IN PDEVADVPROP_INFO dap, + IN HWND hwndListView) +{ + HDEVINFO DeviceInfoSet; + PSP_DEVINFO_DATA DeviceInfoData; + CM_POWER_DATA PowerData; + DWORD dwSize, dwType; + INT index = 0; + + if (dap->CurrentDeviceInfoSet != INVALID_HANDLE_VALUE) + { + DeviceInfoSet = dap->CurrentDeviceInfoSet; + DeviceInfoData = &dap->CurrentDeviceInfoData; + } + else + { + DeviceInfoSet = dap->DeviceInfoSet; + DeviceInfoData = &dap->DeviceInfoData; + } + + dwSize = sizeof(CM_POWER_DATA); + if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet, + DeviceInfoData, + SPDRP_DEVICE_POWER_DATA, + &dwType, + (LPBYTE)&PowerData, + dwSize, + &dwSize)) + return; + + if (PowerData.PD_Capabilities & PDCAP_D0_SUPPORTED) + SetListViewText(hwndListView, index++, L"PDCAP_D0_SUPPORTED"); + + if (PowerData.PD_Capabilities & PDCAP_D1_SUPPORTED) + SetListViewText(hwndListView, index++, L"PDCAP_D1_SUPPORTED"); + + if (PowerData.PD_Capabilities & PDCAP_D2_SUPPORTED) + SetListViewText(hwndListView, index++, L"PDCAP_D2_SUPPORTED"); + + if (PowerData.PD_Capabilities & PDCAP_D3_SUPPORTED) + SetListViewText(hwndListView, index++, L"PDCAP_D3_SUPPORTED"); + + if (PowerData.PD_Capabilities & PDCAP_WAKE_FROM_D0_SUPPORTED) + SetListViewText(hwndListView, index++, L"PDCAP_WAKE_FROM_D0_SUPPORTED"); + + if (PowerData.PD_Capabilities & PDCAP_WAKE_FROM_D1_SUPPORTED) + SetListViewText(hwndListView, index++, L"PDCAP_WAKE_FROM_D1_SUPPORTED"); + + if (PowerData.PD_Capabilities & PDCAP_WAKE_FROM_D2_SUPPORTED) + SetListViewText(hwndListView, index++, L"PDCAP_WAKE_FROM_D2_SUPPORTED"); + + if (PowerData.PD_Capabilities & PDCAP_WAKE_FROM_D3_SUPPORTED) + SetListViewText(hwndListView, index++, L"PDCAP_WAKE_FROM_D3_SUPPORTED"); + + if (PowerData.PD_Capabilities & PDCAP_WARM_EJECT_SUPPORTED) + SetListViewText(hwndListView, index++, L"PDCAP_WARM_EJECT_SUPPORTED"); +} + + +static VOID +DisplayPowerStateMappings( + IN PDEVADVPROP_INFO dap, + IN HWND hwndListView) +{ + HDEVINFO DeviceInfoSet; + PSP_DEVINFO_DATA DeviceInfoData; + CM_POWER_DATA PowerData; + DWORD dwSize, dwType; + INT i; + DEVICE_POWER_STATE PowerState; + WCHAR szSystemStateBuffer[40]; + WCHAR szDeviceStateBuffer[40]; + WCHAR szOutBuffer[100]; + + if (dap->CurrentDeviceInfoSet != INVALID_HANDLE_VALUE) + { + DeviceInfoSet = dap->CurrentDeviceInfoSet; + DeviceInfoData = &dap->CurrentDeviceInfoData; + } + else + { + DeviceInfoSet = dap->DeviceInfoSet; + DeviceInfoData = &dap->DeviceInfoData; + } + + dwSize = sizeof(CM_POWER_DATA); + if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet, + DeviceInfoData, + SPDRP_DEVICE_POWER_DATA, + &dwType, + (LPBYTE)&PowerData, + dwSize, + &dwSize)) + return; + + for (i = PowerSystemWorking; i < PowerSystemMaximum; i++) + { + PowerState = PowerData.PD_PowerStateMapping[i]; + if ((PowerState >= PowerDeviceUnspecified) && (PowerState <= PowerDeviceD3)) + { + swprintf(szSystemStateBuffer, L"S%u", i - 1); + + switch (PowerState) + { + case PowerDeviceUnspecified: + wcscpy(szDeviceStateBuffer, L"Not specified"); + break; + + case PowerDeviceD0: + wcscpy(szDeviceStateBuffer, L"D0"); + break; + + case PowerDeviceD1: + wcscpy(szDeviceStateBuffer, L"D1"); + break; + + case PowerDeviceD2: + wcscpy(szDeviceStateBuffer, L"D2"); + break; + + case PowerDeviceD3: + wcscpy(szDeviceStateBuffer, L"D3"); + break; + + default: + break; + } + + swprintf(szOutBuffer, L"%s -> %s", szSystemStateBuffer, szDeviceStateBuffer); + SetListViewText(hwndListView, i, szOutBuffer); + } + } +} + + static VOID DisplayDeviceProperties(IN PDEVADVPROP_INFO dap, IN HWND hwndComboBox, @@ -1399,7 +1619,7 @@ DisplayDeviceProperties(IN PDEVADVPROP_INFO dap,
switch (Index) { - case 0: + case 0: /* Device ID */ SetListViewText(hwndListView, 0, dap->szDeviceID); break;
@@ -1514,16 +1734,22 @@ DisplayDeviceProperties(IN PDEVADVPROP_INFO dap, #if 0 case 20: /* Firmware Revision */ break; +#endif
case 21: /* Current Power State */ + DisplayCurrentPowerState(dap, + hwndListView); break;
- case 20: /* Power Capabilities */ + case 22: /* Power Capabilities */ + DisplayPowerCapabilities(dap, + hwndListView); break;
- case 21: /* Power State Mappings */ + case 23: /* Power State Mappings */ + DisplayPowerStateMappings(dap, + hwndListView); break; -#endif
default: SetListViewText(hwndListView, 0, L"<Not implemented yet>");