|
13 | 13 | #include <phplug.h>
|
14 | 14 | #include <settings.h>
|
15 | 15 | #include <mapldr.h>
|
| 16 | +#include <secedit.h> |
16 | 17 |
|
17 | 18 | #include <devprv.h>
|
18 | 19 |
|
@@ -2855,8 +2856,7 @@ VOID NTAPI PhpDevPropFillStringOrStringList(
|
2855 | 2856 | }
|
2856 | 2857 | }
|
2857 | 2858 |
|
2858 |
| -_Function_class_(PH_DEVICE_PROPERTY_FILL_CALLBACK) |
2859 |
| -VOID NTAPI PhpDevPropFillBinary( |
| 2859 | +VOID PhpDevPropFillBinaryCommon( |
2860 | 2860 | _In_ HDEVINFO DeviceInfoSet,
|
2861 | 2861 | _In_ PPH_DEVINFO_DATA DeviceInfoData,
|
2862 | 2862 | _In_ const DEVPROPKEY* PropertyKey,
|
@@ -2912,13 +2912,203 @@ VOID NTAPI PhpDevPropFillBinary(
|
2912 | 2912 | );
|
2913 | 2913 | }
|
2914 | 2914 | }
|
| 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 | + ); |
2915 | 2933 |
|
2916 | 2934 | if (Property->Valid)
|
2917 | 2935 | {
|
2918 | 2936 | Property->AsString = PhBufferToHexString(Property->Binary.Buffer, Property->Binary.Size);
|
2919 | 2937 | }
|
2920 | 2938 | }
|
2921 | 2939 |
|
| 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 | + |
2922 | 3112 | static const PH_DEVICE_PROPERTY_TABLE_ENTRY PhpDeviceItemPropertyTable[] =
|
2923 | 3113 | {
|
2924 | 3114 | { PhDevicePropertyName, &DEVPKEY_NAME, PhpDevPropFillString, 0 },
|
@@ -2964,7 +3154,7 @@ static const PH_DEVICE_PROPERTY_TABLE_ENTRY PhpDeviceItemPropertyTable[] =
|
2964 | 3154 | { PhDevicePropertyExclusive, &DEVPKEY_Device_Exclusive, PhpDevPropFillBoolean, 0 },
|
2965 | 3155 | { PhDevicePropertyCharacteristics, &DEVPKEY_Device_Characteristics, PhpDevPropFillUInt32Hex, 0 },
|
2966 | 3156 | { 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 }, |
2968 | 3158 | { PhDevicePropertyRemovalPolicy, &DEVPKEY_Device_RemovalPolicy, PhpDevPropFillUInt32, 0 },
|
2969 | 3159 | { PhDevicePropertyRemovalPolicyDefault, &DEVPKEY_Device_RemovalPolicyDefault, PhpDevPropFillUInt32, 0 },
|
2970 | 3160 | { PhDevicePropertyRemovalPolicyOverride, &DEVPKEY_Device_RemovalPolicyOverride, PhpDevPropFillUInt32, 0 },
|
|
0 commit comments