Skip to content

Commit 4cf3b77

Browse files
committed
devprv power data format
1 parent 9522c7d commit 4cf3b77

File tree

1 file changed

+193
-3
lines changed

1 file changed

+193
-3
lines changed

SystemInformer/devprv.c

Lines changed: 193 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <phplug.h>
1414
#include <settings.h>
1515
#include <mapldr.h>
16+
#include <secedit.h>
1617

1718
#include <devprv.h>
1819

@@ -2855,8 +2856,7 @@ VOID NTAPI PhpDevPropFillStringOrStringList(
28552856
}
28562857
}
28572858

2858-
_Function_class_(PH_DEVICE_PROPERTY_FILL_CALLBACK)
2859-
VOID NTAPI PhpDevPropFillBinary(
2859+
VOID PhpDevPropFillBinaryCommon(
28602860
_In_ HDEVINFO DeviceInfoSet,
28612861
_In_ PPH_DEVINFO_DATA DeviceInfoData,
28622862
_In_ const DEVPROPKEY* PropertyKey,
@@ -2912,13 +2912,203 @@ VOID NTAPI PhpDevPropFillBinary(
29122912
);
29132913
}
29142914
}
2915+
}
2916+
2917+
_Function_class_(PH_DEVICE_PROPERTY_FILL_CALLBACK)
2918+
VOID NTAPI PhpDevPropFillBinary(
2919+
_In_ HDEVINFO DeviceInfoSet,
2920+
_In_ PPH_DEVINFO_DATA DeviceInfoData,
2921+
_In_ const DEVPROPKEY* PropertyKey,
2922+
_Out_ PPH_DEVICE_PROPERTY Property,
2923+
_In_ ULONG Flags
2924+
)
2925+
{
2926+
PhpDevPropFillBinaryCommon(
2927+
DeviceInfoSet,
2928+
DeviceInfoData,
2929+
PropertyKey,
2930+
Property,
2931+
Flags
2932+
);
29152933

29162934
if (Property->Valid)
29172935
{
29182936
Property->AsString = PhBufferToHexString(Property->Binary.Buffer, Property->Binary.Size);
29192937
}
29202938
}
29212939

2940+
static const PH_STRINGREF UnknownString = PH_STRINGREF_INIT(L"Unk");
2941+
2942+
PPH_STRINGREF PhpDevPowerStateString(
2943+
_In_ DEVICE_POWER_STATE PowerState
2944+
)
2945+
{
2946+
static const PH_STRINGREF states[] =
2947+
{
2948+
PH_STRINGREF_INIT(L"Uns"), // PowerDeviceUnspecified
2949+
PH_STRINGREF_INIT(L"D0"), // PowerDeviceD0
2950+
PH_STRINGREF_INIT(L"D1"), // PowerDeviceD1
2951+
PH_STRINGREF_INIT(L"D2"), // PowerDeviceD2
2952+
PH_STRINGREF_INIT(L"D3"), // PowerDeviceD3
2953+
PH_STRINGREF_INIT(L"D4"), // PowerDeviceD4
2954+
PH_STRINGREF_INIT(L"Max"), // PowerDeviceMaximum
2955+
};
2956+
2957+
if (PowerState < RTL_NUMBER_OF(states))
2958+
return (PPH_STRINGREF)&states[PowerState];
2959+
2960+
return (PPH_STRINGREF)&UnknownString;
2961+
}
2962+
2963+
PPH_STRINGREF PhpDevSysPowerStateString(
2964+
_In_ SYSTEM_POWER_STATE PowerState
2965+
)
2966+
{
2967+
static const PH_STRINGREF states[] =
2968+
{
2969+
PH_STRINGREF_INIT(L"Uns"), // PowerSystemUnspecified
2970+
PH_STRINGREF_INIT(L"S0"), // PowerSystemWorking
2971+
PH_STRINGREF_INIT(L"S1"), // PowerSystemSleep1
2972+
PH_STRINGREF_INIT(L"S2"), // PowerSystemSleep2
2973+
PH_STRINGREF_INIT(L"S3"), // PowerSystemSleep3
2974+
PH_STRINGREF_INIT(L"S4"), // PowerSystemHybernate
2975+
PH_STRINGREF_INIT(L"S5"), // PowerSystemShutdown
2976+
PH_STRINGREF_INIT(L"Max"), // PowerSystemMaximum
2977+
};
2978+
2979+
if (PowerState < RTL_NUMBER_OF(states))
2980+
return (PPH_STRINGREF)&states[PowerState];
2981+
2982+
return (PPH_STRINGREF)&UnknownString;
2983+
}
2984+
2985+
PPH_STRING PhpDevSysPowerPowerDataString(
2986+
_In_ PCM_POWER_DATA PowerData
2987+
)
2988+
{
2989+
static const PH_ACCESS_ENTRY pdCap[9] =
2990+
{
2991+
{ L"PDCAP_D0_SUPPORTED", PDCAP_D0_SUPPORTED, FALSE, FALSE, L"D0" },
2992+
{ L"PDCAP_D1_SUPPORTED", PDCAP_D1_SUPPORTED, FALSE, FALSE, L"D1" },
2993+
{ L"PDCAP_D2_SUPPORTED", PDCAP_D2_SUPPORTED, FALSE, FALSE, L"D2" },
2994+
{ L"PDCAP_D3_SUPPORTED", PDCAP_D3_SUPPORTED, FALSE, FALSE, L"D3" },
2995+
{ L"PDCAP_WAKE_FROM_D0_SUPPORTED", PDCAP_WAKE_FROM_D0_SUPPORTED, FALSE, FALSE, L"Wake from D0" },
2996+
{ L"PDCAP_WAKE_FROM_D1_SUPPORTED", PDCAP_WAKE_FROM_D1_SUPPORTED, FALSE, FALSE, L"Wake from D1" },
2997+
{ L"PDCAP_WAKE_FROM_D2_SUPPORTED", PDCAP_WAKE_FROM_D2_SUPPORTED, FALSE, FALSE, L"Wake from D2" },
2998+
{ L"PDCAP_WAKE_FROM_D3_SUPPORTED", PDCAP_WAKE_FROM_D3_SUPPORTED, FALSE, FALSE, L"Wake from D3" },
2999+
{ L"PDCAP_WARM_EJECT_SUPPORTED", PDCAP_WARM_EJECT_SUPPORTED, FALSE, FALSE, L"Warm eject" },
3000+
};
3001+
3002+
PH_FORMAT format[29];
3003+
ULONG count = 0;
3004+
PPH_STRING capabilities;
3005+
PPH_STRING string;
3006+
3007+
PhInitFormatSR(&format[count], *PhpDevPowerStateString(PowerData->PD_MostRecentPowerState));
3008+
count++; // TODO(jxy-s) if PhInitFormat were inline instead of macros we could clean this up
3009+
if (PowerData->PD_D1Latency)
3010+
{
3011+
PhInitFormatS(&format[count], L", ");
3012+
count++;
3013+
PhInitFormatU(&format[count], PowerData->PD_D1Latency);
3014+
count++;
3015+
PhInitFormatS(&format[count], L" D1 latency");
3016+
count++;
3017+
}
3018+
if (PowerData->PD_D2Latency)
3019+
{
3020+
PhInitFormatS(&format[count], L", ");
3021+
count++;
3022+
PhInitFormatU(&format[count], PowerData->PD_D2Latency);
3023+
count++;
3024+
PhInitFormatS(&format[count], L" D2 latency");
3025+
count++;
3026+
}
3027+
if (PowerData->PD_D2Latency)
3028+
{
3029+
PhInitFormatS(&format[count], L", ");
3030+
count++;
3031+
PhInitFormatU(&format[count], PowerData->PD_D3Latency);
3032+
count++;
3033+
PhInitFormatS(&format[count], L" D3 latency");
3034+
count++;
3035+
}
3036+
PhInitFormatS(&format[count], L", S0->");
3037+
count++;
3038+
PhInitFormatSR(&format[count], *PhpDevPowerStateString(PowerData->PD_PowerStateMapping[PowerSystemWorking]));
3039+
count++;
3040+
PhInitFormatS(&format[count], L", S1->");
3041+
count++;
3042+
PhInitFormatSR(&format[count], *PhpDevPowerStateString(PowerData->PD_PowerStateMapping[PowerSystemSleeping1]));
3043+
count++;
3044+
PhInitFormatS(&format[count], L", S2->");
3045+
count++;
3046+
PhInitFormatSR(&format[count], *PhpDevPowerStateString(PowerData->PD_PowerStateMapping[PowerSystemSleeping2]));
3047+
count++;
3048+
PhInitFormatS(&format[count], L", S3->");
3049+
count++;
3050+
PhInitFormatSR(&format[count], *PhpDevPowerStateString(PowerData->PD_PowerStateMapping[PowerSystemSleeping3]));
3051+
count++;
3052+
PhInitFormatS(&format[count], L", S4->");
3053+
count++;
3054+
PhInitFormatSR(&format[count], *PhpDevPowerStateString(PowerData->PD_PowerStateMapping[PowerSystemHibernate]));
3055+
count++;
3056+
PhInitFormatS(&format[count], L", S5->");
3057+
count++;
3058+
PhInitFormatSR(&format[count], *PhpDevPowerStateString(PowerData->PD_PowerStateMapping[PowerSystemShutdown]));
3059+
count++;
3060+
capabilities = PhGetAccessString(PowerData->PD_Capabilities, (PVOID)pdCap, RTL_NUMBER_OF(pdCap));
3061+
PhInitFormatS(&format[count], L", (");
3062+
count++;
3063+
PhInitFormatSR(&format[count], capabilities->sr);
3064+
count++;
3065+
PhInitFormatS(&format[count], L" (0x");
3066+
count++;
3067+
PhInitFormatX(&format[count], PowerData->PD_Capabilities);
3068+
count++;
3069+
PhInitFormatS(&format[count], L"))");
3070+
count++;
3071+
if (PowerData->PD_DeepestSystemWake != PowerSystemUnspecified)
3072+
{
3073+
PhInitFormatS(&format[count], L", Deepest wake ");
3074+
count++;
3075+
PhInitFormatSR(&format[count], *PhpDevSysPowerStateString(PowerData->PD_DeepestSystemWake));
3076+
count++;
3077+
}
3078+
3079+
string = PhFormat(format, count, 20);
3080+
3081+
PhDereferenceObject(capabilities);
3082+
3083+
return string;
3084+
}
3085+
3086+
_Function_class_(PH_DEVICE_PROPERTY_FILL_CALLBACK)
3087+
VOID NTAPI PhpDevPropFillPowerData(
3088+
_In_ HDEVINFO DeviceInfoSet,
3089+
_In_ PPH_DEVINFO_DATA DeviceInfoData,
3090+
_In_ const DEVPROPKEY* PropertyKey,
3091+
_Out_ PPH_DEVICE_PROPERTY Property,
3092+
_In_ ULONG Flags
3093+
)
3094+
{
3095+
PhpDevPropFillBinaryCommon(
3096+
DeviceInfoSet,
3097+
DeviceInfoData,
3098+
PropertyKey,
3099+
Property,
3100+
Flags
3101+
);
3102+
3103+
if (Property->Valid)
3104+
{
3105+
if (Property->Binary.Size >= sizeof(CM_POWER_DATA))
3106+
Property->AsString = PhpDevSysPowerPowerDataString((PCM_POWER_DATA)Property->Binary.Buffer);
3107+
else
3108+
Property->AsString = PhBufferToHexString(Property->Binary.Buffer, Property->Binary.Size);
3109+
}
3110+
}
3111+
29223112
static const PH_DEVICE_PROPERTY_TABLE_ENTRY PhpDeviceItemPropertyTable[] =
29233113
{
29243114
{ PhDevicePropertyName, &DEVPKEY_NAME, PhpDevPropFillString, 0 },
@@ -2964,7 +3154,7 @@ static const PH_DEVICE_PROPERTY_TABLE_ENTRY PhpDeviceItemPropertyTable[] =
29643154
{ PhDevicePropertyExclusive, &DEVPKEY_Device_Exclusive, PhpDevPropFillBoolean, 0 },
29653155
{ PhDevicePropertyCharacteristics, &DEVPKEY_Device_Characteristics, PhpDevPropFillUInt32Hex, 0 },
29663156
{ PhDevicePropertyAddress, &DEVPKEY_Device_Address, PhpDevPropFillUInt32Hex, 0 },
2967-
{ PhDevicePropertyPowerData, &DEVPKEY_Device_PowerData, PhpDevPropFillBinary, 0 }, // TODO(jxy-s) CM_POWER_DATA could be formatted AsString nicer
3157+
{ PhDevicePropertyPowerData, &DEVPKEY_Device_PowerData, PhpDevPropFillPowerData, 0 },
29683158
{ PhDevicePropertyRemovalPolicy, &DEVPKEY_Device_RemovalPolicy, PhpDevPropFillUInt32, 0 },
29693159
{ PhDevicePropertyRemovalPolicyDefault, &DEVPKEY_Device_RemovalPolicyDefault, PhpDevPropFillUInt32, 0 },
29703160
{ PhDevicePropertyRemovalPolicyOverride, &DEVPKEY_Device_RemovalPolicyOverride, PhpDevPropFillUInt32, 0 },

0 commit comments

Comments
 (0)