https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9d29ee3a62d13feb71ffd…
commit 9d29ee3a62d13feb71ffda9cd2fd5bb13e383175
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Sun Jan 21 12:55:13 2018 +0100
Commit: Eric Kohl <eric.kohl(a)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>");