https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9d29ee3a62d13feb71ffda9cd2fd5bb13e383175

commit 9d29ee3a62d13feb71ffda9cd2fd5bb13e383175
Author:     Eric Kohl <[email protected]>
AuthorDate: Sun Jan 21 12:55:13 2018 +0100
Commit:     Eric Kohl <[email protected]>
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>");

Reply via email to