BOOLEAN WINAPI GetCurrentPowerPolicies( PGLOBAL_POWER_POLICY pGlobalPowerPolicy, PPOWER_POLICY pPowerPolicy) { /* FIXME: See note #2 */ SYSTEM_POWER_POLICY ACPower, DCPower; FIXME("(%p, %p) stub!\n", pGlobalPowerPolicy, pPowerPolicy); NtPowerInformation(SystemPowerPolicyAc, 0, 0, &ACPower, sizeof(SYSTEM_POWER_POLICY)); NtPowerInformation(SystemPowerPolicyDc, 0, 0, &DCPower, sizeof(SYSTEM_POWER_POLICY)); return FALSE; }
NTSTATUS WINAPI CallNtPowerInformation( POWER_INFORMATION_LEVEL InformationLevel, PVOID lpInputBuffer, ULONG nInputBufferSize, PVOID lpOutputBuffer, ULONG nOutputBufferSize) { return NtPowerInformation(InformationLevel, lpInputBuffer, nInputBufferSize, lpOutputBuffer, nOutputBufferSize); }
BOOLEAN WINAPI IsPwrSuspendAllowed(VOID) { /* FIXME: See note #2 */ SYSTEM_POWER_CAPABILITIES PowerCaps; FIXME("() stub!\n"); NtPowerInformation(SystemPowerCapabilities, NULL, 0, &PowerCaps, sizeof(PowerCaps)); return FALSE; }
/* * @implemented */ BOOL WINAPI GetSystemPowerStatus(LPSYSTEM_POWER_STATUS PowerStatus) { NTSTATUS Status; SYSTEM_BATTERY_STATE SysBatState; Status = NtPowerInformation(SystemBatteryState, NULL, 0, &SysBatState, sizeof(SYSTEM_BATTERY_STATE)); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return FALSE; } RtlZeroMemory(PowerStatus, sizeof(LPSYSTEM_POWER_STATUS)); PowerStatus->BatteryLifeTime = BATTERY_LIFE_UNKNOWN; PowerStatus->BatteryFullLifeTime = BATTERY_LIFE_UNKNOWN; PowerStatus->BatteryLifePercent = BATTERY_PERCENTAGE_UNKNOWN; if (SysBatState.MaxCapacity) { if (SysBatState.MaxCapacity >= SysBatState.RemainingCapacity) PowerStatus->BatteryLifePercent = (SysBatState.RemainingCapacity / SysBatState.MaxCapacity) * 100; else PowerStatus->BatteryLifePercent = 100; /* 100% */ if (PowerStatus->BatteryLifePercent <= 32) PowerStatus->BatteryFlag |= BATTERY_FLAG_LOW; if (PowerStatus->BatteryLifePercent >= 67) PowerStatus->BatteryFlag |= BATTERY_FLAG_HIGH; } if (!SysBatState.BatteryPresent) PowerStatus->BatteryFlag |= BATTERY_FLAG_NO_BATTERY; if (SysBatState.Charging) PowerStatus->BatteryFlag |= BATTERY_FLAG_CHARGING; if (!SysBatState.AcOnLine && SysBatState.BatteryPresent) PowerStatus->ACLineStatus = AC_LINE_OFFLINE; else PowerStatus->ACLineStatus = AC_LINE_ONLINE; if (SysBatState.EstimatedTime) PowerStatus->BatteryLifeTime = SysBatState.EstimatedTime; return TRUE; }
VOID PhSipTickCpuDialog( VOID ) { ULONG64 dpcCount; ULONG i; dpcCount = 0; if (NT_SUCCESS(NtQuerySystemInformation( SystemInterruptInformation, InterruptInformation, sizeof(SYSTEM_INTERRUPT_INFORMATION) * NumberOfProcessors, NULL ))) { for (i = 0; i < NumberOfProcessors; i++) dpcCount += InterruptInformation[i].DpcCount; } PhUpdateDelta(&ContextSwitchesDelta, PhPerfInformation.ContextSwitches); PhUpdateDelta(&InterruptsDelta, PhCpuTotals.InterruptCount); PhUpdateDelta(&DpcsDelta, dpcCount); PhUpdateDelta(&SystemCallsDelta, PhPerfInformation.SystemCalls); if (!NT_SUCCESS(NtPowerInformation( ProcessorInformation, NULL, 0, PowerInformation, sizeof(PROCESSOR_POWER_INFORMATION) * NumberOfProcessors ))) { memset(PowerInformation, 0, sizeof(PROCESSOR_POWER_INFORMATION) * NumberOfProcessors); } if (WindowsVersion >= WINDOWS_7) { if (PreviousPerformanceDistribution) PhFree(PreviousPerformanceDistribution); PreviousPerformanceDistribution = CurrentPerformanceDistribution; CurrentPerformanceDistribution = NULL; PhSipQueryProcessorPerformanceDistribution(&CurrentPerformanceDistribution); } CpuTicked++; if (CpuTicked > 2) CpuTicked = 2; PhSipUpdateCpuGraphs(); PhSipUpdateCpuPanel(); }
BOOLEAN WINAPI GetPwrCapabilities( PSYSTEM_POWER_CAPABILITIES lpSystemPowerCapabilities) { NTSTATUS r; TRACE("(%p)\n", lpSystemPowerCapabilities); r = NtPowerInformation(SystemPowerCapabilities, 0, 0, lpSystemPowerCapabilities, sizeof(SYSTEM_POWER_CAPABILITIES)); SetLastError(RtlNtStatusToDosError(r)); return r == STATUS_SUCCESS; }
VOID PhSipInitializeCpuDialog( VOID ) { ULONG i; PhInitializeDelta(&ContextSwitchesDelta); PhInitializeDelta(&InterruptsDelta); PhInitializeDelta(&DpcsDelta); PhInitializeDelta(&SystemCallsDelta); NumberOfProcessors = (ULONG)PhSystemBasicInformation.NumberOfProcessors; CpusGraphHandle = PhAllocate(sizeof(HWND) * NumberOfProcessors); CpusGraphState = PhAllocate(sizeof(PH_GRAPH_STATE) * NumberOfProcessors); InterruptInformation = PhAllocate(sizeof(SYSTEM_INTERRUPT_INFORMATION) * NumberOfProcessors); PowerInformation = PhAllocate(sizeof(PROCESSOR_POWER_INFORMATION) * NumberOfProcessors); PhInitializeGraphState(&CpuGraphState); for (i = 0; i < NumberOfProcessors; i++) PhInitializeGraphState(&CpusGraphState[i]); CpuTicked = 0; if (!NT_SUCCESS(NtPowerInformation( ProcessorInformation, NULL, 0, PowerInformation, sizeof(PROCESSOR_POWER_INFORMATION) * NumberOfProcessors ))) { memset(PowerInformation, 0, sizeof(PROCESSOR_POWER_INFORMATION) * NumberOfProcessors); } CurrentPerformanceDistribution = NULL; PreviousPerformanceDistribution = NULL; if (WindowsVersion >= WINDOWS_7) PhSipQueryProcessorPerformanceDistribution(&CurrentPerformanceDistribution); }
/* create the volatile hardware registry keys */ static void create_hardware_registry_keys(void) { static const WCHAR SystemW[] = {'H','a','r','d','w','a','r','e','\\', 'D','e','s','c','r','i','p','t','i','o','n','\\', 'S','y','s','t','e','m',0}; static const WCHAR fpuW[] = {'F','l','o','a','t','i','n','g','P','o','i','n','t','P','r','o','c','e','s','s','o','r',0}; static const WCHAR cpuW[] = {'C','e','n','t','r','a','l','P','r','o','c','e','s','s','o','r',0}; static const WCHAR FeatureSetW[] = {'F','e','a','t','u','r','e','S','e','t',0}; static const WCHAR IdentifierW[] = {'I','d','e','n','t','i','f','i','e','r',0}; static const WCHAR ProcessorNameStringW[] = {'P','r','o','c','e','s','s','o','r','N','a','m','e','S','t','r','i','n','g',0}; static const WCHAR SysidW[] = {'A','T',' ','c','o','m','p','a','t','i','b','l','e',0}; static const WCHAR mhzKeyW[] = {'~','M','H','z',0}; static const WCHAR VendorIdentifierW[] = {'V','e','n','d','o','r','I','d','e','n','t','i','f','i','e','r',0}; static const WCHAR VenidIntelW[] = {'G','e','n','u','i','n','e','I','n','t','e','l',0}; /* static const WCHAR VenidAMDW[] = {'A','u','t','h','e','n','t','i','c','A','M','D',0}; */ static const WCHAR PercentDW[] = {'%','d',0}; static const WCHAR IntelCpuDescrW[] = {'x','8','6',' ','F','a','m','i','l','y',' ','%','d',' ','M','o','d','e','l',' ','%','d', ' ','S','t','e','p','p','i','n','g',' ','%','d',0}; static const WCHAR IntelCpuStringW[] = {'I','n','t','e','l','(','R',')',' ','P','e','n','t','i','u','m','(','R',')',' ','4',' ', 'C','P','U',' ','2','.','4','0','G','H','z',0}; unsigned int i; HKEY hkey, system_key, cpu_key, fpu_key; SYSTEM_CPU_INFORMATION sci; PROCESSOR_POWER_INFORMATION power_info; WCHAR idW[60]; NtQuerySystemInformation( SystemCpuInformation, &sci, sizeof(sci), NULL ); if (NtPowerInformation(ProcessorInformation, NULL, 0, &power_info, sizeof(power_info))) power_info.MaxMhz = 0; /*TODO: report 64bit processors properly*/ sprintfW( idW, IntelCpuDescrW, sci.Level, HIBYTE(sci.Revision), LOBYTE(sci.Revision) ); if (RegCreateKeyExW( HKEY_LOCAL_MACHINE, SystemW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &system_key, NULL )) return; set_reg_value( system_key, IdentifierW, SysidW ); if (RegCreateKeyExW( system_key, fpuW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &fpu_key, NULL )) fpu_key = 0; if (RegCreateKeyExW( system_key, cpuW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &cpu_key, NULL )) cpu_key = 0; for (i = 0; i < NtCurrentTeb()->Peb->NumberOfProcessors; i++) { WCHAR numW[10]; sprintfW( numW, PercentDW, i ); if (!RegCreateKeyExW( cpu_key, numW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL )) { RegSetValueExW( hkey, FeatureSetW, 0, REG_DWORD, (BYTE *)&sci.FeatureSet, sizeof(DWORD) ); set_reg_value( hkey, IdentifierW, idW ); /*TODO; report amd's properly*/ set_reg_value( hkey, ProcessorNameStringW, IntelCpuStringW ); set_reg_value( hkey, VendorIdentifierW, VenidIntelW ); RegSetValueExW( hkey, mhzKeyW, 0, REG_DWORD, (BYTE *)&power_info.MaxMhz, sizeof(DWORD) ); RegCloseKey( hkey ); } if (!RegCreateKeyExW( fpu_key, numW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL )) { set_reg_value( hkey, IdentifierW, idW ); RegCloseKey( hkey ); } } RegCloseKey( fpu_key ); RegCloseKey( cpu_key ); RegCloseKey( system_key ); }
/* * @implemented */ BOOL WINAPI GetSystemPowerStatus(IN LPSYSTEM_POWER_STATUS PowerStatus) { NTSTATUS Status; SYSTEM_BATTERY_STATE BattState; ULONG Max, Current; Status = NtPowerInformation(SystemBatteryState, NULL, 0, &BattState, sizeof(SYSTEM_BATTERY_STATE)); if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return FALSE; } RtlZeroMemory(PowerStatus, sizeof(SYSTEM_POWER_STATUS)); PowerStatus->BatteryLifeTime = BATTERY_LIFE_UNKNOWN; PowerStatus->BatteryFullLifeTime = BATTERY_LIFE_UNKNOWN; PowerStatus->BatteryLifePercent = BATTERY_PERCENTAGE_UNKNOWN; PowerStatus->ACLineStatus = AC_LINE_ONLINE; Max = BattState.MaxCapacity; Current = BattState.RemainingCapacity; if (Max) { if (Current <= Max) { PowerStatus->BatteryLifePercent = (UCHAR)((100 * Current + Max / 2) / Max); } else { PowerStatus->BatteryLifePercent = 100; } if (PowerStatus->BatteryLifePercent <= 4) PowerStatus->BatteryFlag |= BATTERY_FLAG_CRITICAL; if (PowerStatus->BatteryLifePercent <= 32) PowerStatus->BatteryFlag |= BATTERY_FLAG_LOW; if (PowerStatus->BatteryLifePercent >= 67) PowerStatus->BatteryFlag |= BATTERY_FLAG_HIGH; } if (!BattState.BatteryPresent) PowerStatus->BatteryFlag |= BATTERY_FLAG_NO_BATTERY; if (BattState.Charging) PowerStatus->BatteryFlag |= BATTERY_FLAG_CHARGING; if (!(BattState.AcOnLine) && (BattState.BatteryPresent)) PowerStatus->ACLineStatus = AC_LINE_OFFLINE; if (BattState.EstimatedTime) PowerStatus->BatteryLifeTime = BattState.EstimatedTime; return TRUE; }
/* create the volatile hardware registry keys */ static void create_hardware_registry_keys(void) { static const WCHAR SystemW[] = {'H','a','r','d','w','a','r','e','\\', 'D','e','s','c','r','i','p','t','i','o','n','\\', 'S','y','s','t','e','m',0}; static const WCHAR fpuW[] = {'F','l','o','a','t','i','n','g','P','o','i','n','t','P','r','o','c','e','s','s','o','r',0}; static const WCHAR cpuW[] = {'C','e','n','t','r','a','l','P','r','o','c','e','s','s','o','r',0}; static const WCHAR FeatureSetW[] = {'F','e','a','t','u','r','e','S','e','t',0}; static const WCHAR IdentifierW[] = {'I','d','e','n','t','i','f','i','e','r',0}; static const WCHAR ProcessorNameStringW[] = {'P','r','o','c','e','s','s','o','r','N','a','m','e','S','t','r','i','n','g',0}; static const WCHAR SysidW[] = {'A','T',' ','c','o','m','p','a','t','i','b','l','e',0}; static const WCHAR ARMSysidW[] = {'A','R','M',' ','p','r','o','c','e','s','s','o','r',' ','f','a','m','i','l','y',0}; static const WCHAR mhzKeyW[] = {'~','M','H','z',0}; static const WCHAR VendorIdentifierW[] = {'V','e','n','d','o','r','I','d','e','n','t','i','f','i','e','r',0}; static const WCHAR VenidIntelW[] = {'G','e','n','u','i','n','e','I','n','t','e','l',0}; /* static const WCHAR VenidAMDW[] = {'A','u','t','h','e','n','t','i','c','A','M','D',0}; */ static const WCHAR PercentDW[] = {'%','d',0}; static const WCHAR IntelCpuDescrW[] = {'x','8','6',' ','F','a','m','i','l','y',' ','%','d',' ','M','o','d','e','l',' ','%','d', ' ','S','t','e','p','p','i','n','g',' ','%','d',0}; static const WCHAR ARMCpuDescrW[] = {'A','R','M',' ','F','a','m','i','l','y',' ','%','d',' ','M','o','d','e','l',' ','%','d', ' ','R','e','v','i','s','i','o','n',' ','%','d',0}; static const WCHAR IntelCpuStringW[] = {'I','n','t','e','l','(','R',')',' ','P','e','n','t','i','u','m','(','R',')',' ','4',' ', 'C','P','U',' ','2','.','4','0','G','H','z',0}; unsigned int i; HKEY hkey, system_key, cpu_key, fpu_key; SYSTEM_CPU_INFORMATION sci; PROCESSOR_POWER_INFORMATION* power_info; ULONG sizeof_power_info = sizeof(PROCESSOR_POWER_INFORMATION) * NtCurrentTeb()->Peb->NumberOfProcessors; WCHAR idW[60]; NtQuerySystemInformation( SystemCpuInformation, &sci, sizeof(sci), NULL ); power_info = HeapAlloc( GetProcessHeap(), 0, sizeof_power_info ); if (power_info == NULL) return; if (NtPowerInformation( ProcessorInformation, NULL, 0, power_info, sizeof_power_info )) memset( power_info, 0, sizeof_power_info ); /*TODO: report 64bit processors properly*/ switch(sci.Architecture) { case PROCESSOR_ARCHITECTURE_ARM: case PROCESSOR_ARCHITECTURE_ARM64: sprintfW( idW, ARMCpuDescrW, sci.Level, HIBYTE(sci.Revision), LOBYTE(sci.Revision) ); break; default: case PROCESSOR_ARCHITECTURE_INTEL: sprintfW( idW, IntelCpuDescrW, sci.Level, HIBYTE(sci.Revision), LOBYTE(sci.Revision) ); break; } if (RegCreateKeyExW( HKEY_LOCAL_MACHINE, SystemW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &system_key, NULL )) { HeapFree( GetProcessHeap(), 0, power_info ); return; } switch(sci.Architecture) { case PROCESSOR_ARCHITECTURE_ARM: case PROCESSOR_ARCHITECTURE_ARM64: set_reg_value( system_key, IdentifierW, ARMSysidW ); break; default: case PROCESSOR_ARCHITECTURE_INTEL: set_reg_value( system_key, IdentifierW, SysidW ); break; } if (sci.Architecture == PROCESSOR_ARCHITECTURE_ARM || sci.Architecture == PROCESSOR_ARCHITECTURE_ARM64 || RegCreateKeyExW( system_key, fpuW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &fpu_key, NULL )) fpu_key = 0; if (RegCreateKeyExW( system_key, cpuW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &cpu_key, NULL )) cpu_key = 0; for (i = 0; i < NtCurrentTeb()->Peb->NumberOfProcessors; i++) { WCHAR numW[10]; sprintfW( numW, PercentDW, i ); if (!RegCreateKeyExW( cpu_key, numW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL )) { RegSetValueExW( hkey, FeatureSetW, 0, REG_DWORD, (BYTE *)&sci.FeatureSet, sizeof(DWORD) ); set_reg_value( hkey, IdentifierW, idW ); /*TODO; report ARM and AMD properly*/ set_reg_value( hkey, ProcessorNameStringW, IntelCpuStringW ); set_reg_value( hkey, VendorIdentifierW, VenidIntelW ); RegSetValueExW( hkey, mhzKeyW, 0, REG_DWORD, (BYTE *)&power_info[i].MaxMhz, sizeof(DWORD) ); RegCloseKey( hkey ); } if (sci.Architecture != PROCESSOR_ARCHITECTURE_ARM && sci.Architecture != PROCESSOR_ARCHITECTURE_ARM64 && !RegCreateKeyExW( fpu_key, numW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL )) { set_reg_value( hkey, IdentifierW, idW ); RegCloseKey( hkey ); } } RegCloseKey( fpu_key ); RegCloseKey( cpu_key ); RegCloseKey( system_key ); HeapFree( GetProcessHeap(), 0, power_info ); }