Author: dchapyshev Date: Mon Jun 16 01:00:22 2008 New Revision: 33986
URL: http://svn.reactos.org/svn/reactos?rev=33986&view=rev Log: - Fork powrprof.dll - Replace .spec with .def - Implement EnumPwrSchemes - Implement GetActivePwrScheme - Implement DeletePwrScheme
Added: trunk/reactos/dll/win32/powrprof/powrprof.def (with props) trunk/reactos/dll/win32/powrprof/powrprof.rc (with props) Removed: trunk/reactos/dll/win32/powrprof/powrprof.spec trunk/reactos/dll/win32/powrprof/powrprof_ros.diff Modified: trunk/reactos/dll/win32/powrprof/powrprof.c trunk/reactos/dll/win32/powrprof/powrprof.rbuild
Modified: trunk/reactos/dll/win32/powrprof/powrprof.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/powrprof/powrprof... ============================================================================== --- trunk/reactos/dll/win32/powrprof/powrprof.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/powrprof/powrprof.c [iso-8859-1] Mon Jun 16 01:00:22 2008 @@ -1,5 +1,6 @@ /* * Copyright (C) 2005 Benjamin Cutler + * Copyright (C) 2008 Dmitry Chapyshev * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -19,335 +20,563 @@
#include <stdarg.h>
-#include "ntstatus.h" +#include <ntstatus.h> #define WIN32_NO_STATUS -#include "windef.h" -#include "winbase.h" -#include "winnt.h" -#include "winreg.h" -#include "winternl.h" -#include "powrprof.h" +#include <windows.h> +#include <winternl.h> +#include <powrprof.h> +#include <wchar.h> +#include <stdio.h> + #include "wine/debug.h" -#include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(powrprof);
-/* Notes to implementors: - * #1: The native implementation of these functions attempted to read in - * registry entries that I was unable to locate on any of the Windows - * machines I checked, but I only had desktops available, so maybe - * laptop users will have better luck. They return FNF errors because - * that's what the native DLL was returning during my tests. - * #2: These functions call NtPowerInformation but I don't know what they - * do with the results, and NtPowerInformation doesn't do much in WINE yet - * anyway. - * #3: Since I can't get several other functions working (see note #1), - * implementing these functions is going to have to wait until somebody can - * cobble together some sane test input. */ - -static const WCHAR szPowerCfgSubKey[] = { 'S', 'o', 'f', 't', 'w', 'a', 'r', 'e', - '\', 'M', 'i', 'c', 'r', 'o', 's', 'o', 'f', 't', '\', 'W', 'i', - 'n', 'd', 'o', 'w', 's', '\', 'C', 'u', 'r', 'r', 'e', 'n', 't', - 'V', 'e', 'r', 's', 'i', 'o', 'n', '\', 'C', 'o', 'n', 't', 'r', - 'o', 'l', 's', ' ', 'F', 'o', 'l', 'd', 'e', 'r', '\', 'P', 'o', - 'w', 'e', 'r', 'C', 'f', 'g', 0 }; -static const WCHAR szSemaphoreName[] = { 'P', 'o', 'w', 'e', 'r', 'P', 'r', 'o', - 'f', 'i', 'l', 'e', 'R', 'e', 'g', 'i', 's', 't', 'r', 'y', 'S', - 'e', 'm', 'a', 'p', 'h', 'o', 'r', 'e', 0 }; -static const WCHAR szDiskMax[] = { 'D', 'i', 's', 'k', 'S', 'p', 'i', 'n', 'd', - 'o', 'w', 'n', 'M', 'a', 'x', 0 }; -static const WCHAR szDiskMin[] = { 'D', 'i', 's', 'k', 'S', 'p', 'i', 'n', 'd', - 'o', 'w', 'n', 'M', 'i', 'n', 0 }; -static const WCHAR szLastID[] = { 'L', 'a', 's', 't', 'I', 'D', 0 }; -static HANDLE PPRegSemaphore = NULL; - -NTSTATUS WINAPI CallNtPowerInformation( - POWER_INFORMATION_LEVEL InformationLevel, - PVOID lpInputBuffer, ULONG nInputBufferSize, - PVOID lpOutputBuffer, ULONG nOutputBufferSize) -{ - return NtPowerInformation(InformationLevel, lpInputBuffer, - nInputBufferSize, lpOutputBuffer, nOutputBufferSize); -} - -BOOLEAN WINAPI CanUserWritePwrScheme(VOID) -{ - HKEY hKey = NULL; - LONG r; - BOOLEAN bSuccess = TRUE; - - TRACE("()\n"); - - r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szPowerCfgSubKey, 0, KEY_READ | KEY_WRITE, &hKey); - - if (r != ERROR_SUCCESS) { - TRACE("RegOpenKeyEx failed: %d\n", r); - bSuccess = FALSE; - } - - SetLastError(r); - RegCloseKey(hKey); - return bSuccess; -} - -BOOLEAN WINAPI DeletePwrScheme(UINT uiIndex) -{ - /* FIXME: See note #1 */ - FIXME("(%d) stub!\n", uiIndex); - SetLastError(ERROR_FILE_NOT_FOUND); - return FALSE; -} - -BOOLEAN WINAPI EnumPwrSchemes(PWRSCHEMESENUMPROC lpfnPwrSchemesEnumProc, - LPARAM lParam) -{ - /* FIXME: See note #1 */ - FIXME("(%p, %ld) stub!\n", lpfnPwrSchemesEnumProc, lParam); - SetLastError(ERROR_FILE_NOT_FOUND); - return FALSE; -} - -BOOLEAN WINAPI GetActivePwrScheme(PUINT puiID) -{ - /* FIXME: See note #1 */ - FIXME("(%p) stub!\n", puiID); - SetLastError(ERROR_FILE_NOT_FOUND); - return FALSE; -} - -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; -} - -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; -} - -BOOLEAN WINAPI GetPwrDiskSpindownRange(PUINT RangeMax, PUINT RangeMin) -{ - HKEY hKey; - BYTE lpValue[40]; - LONG r; - DWORD cbValue = sizeof(lpValue); - - TRACE("(%p, %p)\n", RangeMax, RangeMin); - - if (RangeMax == NULL || RangeMin == NULL) { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - SetLastError(ERROR_SUCCESS); - - WaitForSingleObject(PPRegSemaphore, INFINITE); - - r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szPowerCfgSubKey, 0, KEY_READ, &hKey); - if (r != ERROR_SUCCESS) { - TRACE("RegOpenKeyEx failed: %d\n", r); - TRACE("Using defaults: 3600, 3\n"); - *RangeMax = 3600; - *RangeMin = 3; - ReleaseSemaphore(PPRegSemaphore, 1, NULL); - return TRUE; - } - - r = RegQueryValueExW(hKey, szDiskMax, 0, 0, lpValue, &cbValue); - if (r != ERROR_SUCCESS) { - TRACE("Couldn't open DiskSpinDownMax: %d\n", r); - TRACE("Using default: 3600\n"); - *RangeMax = 3600; - } else { - *RangeMax = atoiW((LPCWSTR)lpValue); - } - - cbValue = sizeof(lpValue); - - r = RegQueryValueExW(hKey, szDiskMin, 0, 0, lpValue, &cbValue); - if (r != ERROR_SUCCESS) { - TRACE("Couldn't open DiskSpinDownMin: %d\n", r); - TRACE("Using default: 3\n"); - *RangeMin = 3; - } else { - *RangeMin = atoiW((LPCWSTR)lpValue); - } - - RegCloseKey(hKey); - - ReleaseSemaphore(PPRegSemaphore, 1, NULL); - - return TRUE; -} - -BOOLEAN WINAPI IsAdminOverrideActive(PADMINISTRATOR_POWER_POLICY p) -{ - FIXME("( %p) stub!\n", p); - return FALSE; -} - -BOOLEAN WINAPI IsPwrHibernateAllowed(VOID) -{ - /* FIXME: See note #2 */ - SYSTEM_POWER_CAPABILITIES PowerCaps; - FIXME("() stub!\n"); - NtPowerInformation(SystemPowerCapabilities, NULL, 0, &PowerCaps, sizeof(PowerCaps)); - return FALSE; -} - -BOOLEAN WINAPI IsPwrShutdownAllowed(VOID) -{ - /* FIXME: See note #2 */ - SYSTEM_POWER_CAPABILITIES PowerCaps; - FIXME("() stub!\n"); - NtPowerInformation(SystemPowerCapabilities, NULL, 0, &PowerCaps, sizeof(PowerCaps)); - return FALSE; -} - -BOOLEAN WINAPI IsPwrSuspendAllowed(VOID) -{ - /* FIXME: See note #2 */ - SYSTEM_POWER_CAPABILITIES PowerCaps; - FIXME("() stub!\n"); - NtPowerInformation(SystemPowerCapabilities, NULL, 0, &PowerCaps, sizeof(PowerCaps)); - return FALSE; -} - -BOOLEAN WINAPI ReadGlobalPwrPolicy(PGLOBAL_POWER_POLICY pGlobalPowerPolicy) -{ - /* FIXME: See note #1 */ - FIXME("(%p) stub!\n", pGlobalPowerPolicy); - SetLastError(ERROR_FILE_NOT_FOUND); - return FALSE; -} - -BOOLEAN WINAPI ReadProcessorPwrScheme(UINT uiID, - PMACHINE_PROCESSOR_POWER_POLICY pMachineProcessorPowerPolicy) -{ - /* FIXME: See note #1 */ - FIXME("(%d, %p) stub!\n", uiID, pMachineProcessorPowerPolicy); - SetLastError(ERROR_FILE_NOT_FOUND); - return FALSE; -} - -BOOLEAN WINAPI ReadPwrScheme(UINT uiID, - PPOWER_POLICY pPowerPolicy) -{ - /* FIXME: See note #1 */ - FIXME("(%d, %p) stub!\n", uiID, pPowerPolicy); - SetLastError(ERROR_FILE_NOT_FOUND); - return FALSE; -} - -BOOLEAN WINAPI SetActivePwrScheme(UINT uiID, - PGLOBAL_POWER_POLICY lpGlobalPowerPolicy, - PPOWER_POLICY lpPowerPolicy) -{ - /* FIXME: See note #1 */ - FIXME("(%d, %p, %p) stub!\n", uiID, lpGlobalPowerPolicy, lpPowerPolicy); - SetLastError(ERROR_FILE_NOT_FOUND); - return FALSE; -} - -BOOLEAN WINAPI SetSuspendState(BOOLEAN Hibernate, BOOLEAN ForceCritical, - BOOLEAN DisableWakeEvent) -{ - /* FIXME: I have NO idea how you're supposed to call NtInitiatePowerAction - * here, because it's not a documented function that I can find */ - FIXME("(%d, %d, %d) stub!\n", Hibernate, ForceCritical, DisableWakeEvent); - return TRUE; -} - -BOOLEAN WINAPI WriteGlobalPwrPolicy(PGLOBAL_POWER_POLICY pGlobalPowerPolicy) -{ - /* FIXME: See note #3 */ - FIXME("(%p) stub!\n", pGlobalPowerPolicy); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - -BOOLEAN WINAPI WriteProcessorPwrScheme(UINT ID, - PMACHINE_PROCESSOR_POWER_POLICY pMachineProcessorPowerPolicy) -{ - /* FIXME: See note #3 */ - FIXME("(%d, %p) stub!\n", ID, pMachineProcessorPowerPolicy); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - -BOOLEAN WINAPI WritePwrScheme(PUINT puiID, LPWSTR lpszName, LPWSTR lpszDescription, - PPOWER_POLICY pPowerPolicy) -{ - /* FIXME: See note #3 */ - FIXME("(%p, %s, %s, %p) stub!\n", puiID, debugstr_w(lpszName), debugstr_w(lpszDescription), pPowerPolicy); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - -BOOLEAN WINAPI ValidatePowerPolicies(PGLOBAL_POWER_POLICY pGPP, PPOWER_POLICY pPP) -{ - /* FIXME: See note #3 */ - FIXME("(%p, %p) stub!\n", pGPP, pPP); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return TRUE; - -} - -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -{ - FIXME("(%p, %d, %p) not fully implemented\n", hinstDLL, fdwReason, lpvReserved); - - switch(fdwReason) { - case DLL_PROCESS_ATTACH: { - - HKEY hKey; - LONG r; - - DisableThreadLibraryCalls(hinstDLL); - - r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szPowerCfgSubKey, 0, KEY_READ | KEY_WRITE, &hKey); - - if (r != ERROR_SUCCESS) { - TRACE("Couldn't open registry key HKLM\%s, using some sane(?) defaults\n", debugstr_w(szPowerCfgSubKey)); - } else { - BYTE lpValue[40]; - DWORD cbValue = sizeof(lpValue); - r = RegQueryValueExW(hKey, szLastID, 0, 0, lpValue, &cbValue); - if (r != ERROR_SUCCESS) { - TRACE("Couldn't open registry entry HKLM\%s\LastID, using some sane(?) defaults\n", debugstr_w(szPowerCfgSubKey)); + +static const WCHAR szPowerCfgSubKey[] = + L"Software\Microsoft\Windows\CurrentVersion\Controls Folder\PowerCfg"; +static const WCHAR szSemaphoreName[] = L"PowerProfileRegistrySemaphore"; +static const WCHAR szDiskMax[] = L"DiskSpindownMax"; +static const WCHAR szDiskMin[] = L"DiskSpindownMin"; +static const WCHAR szLastID[] = L"LastID"; + +HANDLE PPRegSemaphore = NULL; + +NTSTATUS WINAPI +CallNtPowerInformation(POWER_INFORMATION_LEVEL InformationLevel, + PVOID lpInputBuffer, + ULONG nInputBufferSize, + PVOID lpOutputBuffer, + ULONG nOutputBufferSize) +{ + return NtPowerInformation(InformationLevel, + lpInputBuffer, + nInputBufferSize, + lpOutputBuffer, + nOutputBufferSize); +} + + +BOOLEAN WINAPI +CanUserWritePwrScheme(VOID) +{ + HKEY hKey = NULL; + LONG Ret; + BOOLEAN bSuccess = TRUE; + + TRACE("()\n"); + + Ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szPowerCfgSubKey, 0, KEY_READ | KEY_WRITE, &hKey); + + if (Ret != ERROR_SUCCESS) + { + TRACE("RegOpenKeyEx failed: %d\n", Ret); + bSuccess = FALSE; + } + + SetLastError(Ret); + RegCloseKey(hKey); + return bSuccess; +} + + +BOOLEAN WINAPI +DeletePwrScheme(UINT uiIndex) +{ + WCHAR Buf[MAX_PATH]; + UINT Current; + LONG Err; + + swprintf(Buf, L"Control Panel\PowerCfg\PowerPolicies\%u", uiIndex); + + if (GetActivePwrScheme(&Current)) + { + if (Current == uiIndex) + { + SetLastError(ERROR_ACCESS_DENIED); + return FALSE; + } + else + { + Err = RegDeleteKey(HKEY_CURRENT_USER, (LPCTSTR) Buf); + if (Err != ERROR_SUCCESS) + { + TRACE("RegDeleteKey failed: %d\n", Err); + SetLastError(Err); + return FALSE; } + else + { + SetLastError(ERROR_SUCCESS); + return TRUE; + } + } + } + + return FALSE; +} + + +static BOOLEAN +POWRPROF_GetUserPowerPolicy(HKEY hKey, LPWSTR szNum, + USER_POWER_POLICY userPwrPolicy, + DWORD *dwName, LPWSTR szName, + DWORD *dwDesc, LPWSTR szDesc) +{ + HKEY hSubKey; + DWORD dwSize; + LONG Err; + + Err = RegOpenKeyW(hKey, szNum, &hSubKey); + if (Err != ERROR_SUCCESS) + { + ERR("RegOpenKeyW failed: %d\n", Err); + SetLastError(Err); + return FALSE; + } + + *dwName = MAX_PATH * sizeof(WCHAR); + Err = RegQueryValueExW(hSubKey, L"Name", NULL, NULL, (LPBYTE)szName, dwName); + if (Err != ERROR_SUCCESS) + { + ERR("RegQueryValueExW failed: %d\n", Err); + SetLastError(Err); + return FALSE; + } + + *dwDesc = MAX_PATH * sizeof(WCHAR); + Err = RegQueryValueExW(hSubKey, L"Description", NULL, NULL, (LPBYTE)szDesc, dwDesc); + if (Err != ERROR_SUCCESS) + { + ERR("RegQueryValueExW failed: %d\n", Err); + SetLastError(Err); + return FALSE; + } + + dwSize = sizeof(USER_POWER_POLICY); + Err = RegQueryValueExW(hSubKey, L"Policies", NULL, NULL, (LPBYTE)&userPwrPolicy, &dwSize); + if (Err != ERROR_SUCCESS) + { + ERR("RegQueryValueExW failed: %d\n", Err); + SetLastError(Err); + return FALSE; + } + + return TRUE; +} + +static BOOLEAN +POWRPROF_GetMachinePowerPolicy(LPWSTR szNum, MACHINE_POWER_POLICY machinePwrPolicy) +{ + HKEY hKey; + LONG Err; + WCHAR szPath[MAX_PATH]; + DWORD dwSize; + + swprintf(szPath, L"Software\Microsoft\Windows\CurrentVersion\Controls Folder\PowerCfg\PowerPolicies\%s", szNum); + + Err = RegOpenKeyW(HKEY_LOCAL_MACHINE, szPath, &hKey); + if (Err != ERROR_SUCCESS) + { + ERR("RegOpenKeyW failed: %d\n", Err); + SetLastError(Err); + return FALSE; + } + + dwSize = sizeof(MACHINE_POWER_POLICY); + Err = RegQueryValueExW(hKey, L"Policies", NULL, NULL, (LPBYTE)&machinePwrPolicy, &dwSize); + if (Err != ERROR_SUCCESS) + { + ERR("RegQueryValueExW failed: %d\n", Err); + SetLastError(Err); + return FALSE; + } + + return TRUE; +} + +BOOLEAN WINAPI +EnumPwrSchemes(PWRSCHEMESENUMPROC lpfnPwrSchemesEnumProc, + LPARAM lParam) +{ + HKEY hKey; + LONG Err; + DWORD dwSize, dwNameSize, dwDescSize, dwIndex = 0; + WCHAR szNum[3 + 1], szName[MAX_PATH], szDesc[MAX_PATH]; + PPOWER_POLICY pPwrPolicy; + USER_POWER_POLICY userPwrPolicy; + MACHINE_POWER_POLICY machinePwrPolicy; + + if (!lpfnPwrSchemesEnumProc) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + Err = RegOpenKeyW(HKEY_CURRENT_USER, L"Control Panel\PowerCfg\PowerPolicies", &hKey); + if (Err != ERROR_SUCCESS) + { + ERR("RegOpenKeyW failed: %d\n", Err); + SetLastError(Err); + return FALSE; + } + + ReleaseSemaphore(PPRegSemaphore, 1, NULL); + + dwSize = sizeof(szNum) / sizeof(WCHAR); + + while (RegEnumKeyExW(hKey, dwIndex, szNum, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + { + if (!POWRPROF_GetUserPowerPolicy(hKey, szNum, userPwrPolicy, + &dwNameSize, szName, + &dwDescSize, szDesc)) + { RegCloseKey(hKey); - } - - PPRegSemaphore = CreateSemaphoreW(NULL, 1, 1, szSemaphoreName); - if (PPRegSemaphore == NULL) { - ERR("Couldn't create Semaphore: %d\n", GetLastError()); + ReleaseSemaphore(PPRegSemaphore, 1, NULL); return FALSE; - } - break; - } - case DLL_PROCESS_DETACH: - CloseHandle(PPRegSemaphore); - break; - } - return TRUE; -} + } + + if (!POWRPROF_GetMachinePowerPolicy(szNum, machinePwrPolicy)) + { + RegCloseKey(hKey); + ReleaseSemaphore(PPRegSemaphore, 1, NULL); + return FALSE; + } + + ZeroMemory(&pPwrPolicy, sizeof(PPOWER_POLICY)); + pPwrPolicy->user = userPwrPolicy; + pPwrPolicy->mach = machinePwrPolicy; + + if (!lpfnPwrSchemesEnumProc(_wtoi(szNum), dwNameSize, szName, dwDescSize, szDesc, pPwrPolicy, lParam)) + break; + + dwSize = sizeof(szNum) / sizeof(WCHAR); + dwIndex++; + } + + RegCloseKey(hKey); + ReleaseSemaphore(PPRegSemaphore, 1, NULL); + SetLastError(ERROR_SUCCESS); + + return TRUE; +} + + +BOOLEAN WINAPI +GetActivePwrScheme(PUINT puiID) +{ + HKEY hKey; + WCHAR szBuf[MAX_PATH]; + DWORD dwSize; + LONG Err; + + TRACE("GetActivePwrScheme(%u)", puiID); + + Err = RegOpenKeyW(HKEY_CURRENT_USER, L"Control Panel\PowerCfg", &hKey); + if (Err != ERROR_SUCCESS) + { + ERR("RegOpenKey failed: %d\n", Err); + SetLastError(Err); + return FALSE; + } + + dwSize = MAX_PATH; + Err = RegQueryValueExW(hKey, L"CurrentPowerPolicy", + NULL, NULL, + (LPBYTE)&szBuf, &dwSize); + if (Err != ERROR_SUCCESS) + { + ERR("RegQueryValueEx failed: %d\n", Err); + RegCloseKey(hKey); + SetLastError(Err); + return FALSE; + } + + *puiID = _wtoi(szBuf); + + RegCloseKey(hKey); + SetLastError(ERROR_SUCCESS); + return TRUE; +} + + +BOOLEAN WINAPI +GetCurrentPowerPolicies(PGLOBAL_POWER_POLICY pGlobalPowerPolicy, + PPOWER_POLICY pPowerPolicy) +{ + 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; +} + + +BOOLEAN WINAPI +GetPwrCapabilities(PSYSTEM_POWER_CAPABILITIES lpSystemPowerCapabilities) +{ + NTSTATUS Ret; + + TRACE("(%p)\n", lpSystemPowerCapabilities); + + if (!lpSystemPowerCapabilities) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + Ret = NtPowerInformation(SystemPowerCapabilities, 0, 0, lpSystemPowerCapabilities, sizeof(SYSTEM_POWER_CAPABILITIES)); + + SetLastError(RtlNtStatusToDosError(Ret)); + + if (Ret == STATUS_SUCCESS) + return TRUE; + else + return FALSE; +} + + +BOOLEAN WINAPI +GetPwrDiskSpindownRange(PUINT RangeMax, PUINT RangeMin) +{ + HKEY hKey; + BYTE lpValue[40]; + LONG Ret; + DWORD cbValue = sizeof(lpValue); + + TRACE("(%p, %p)\n", RangeMax, RangeMin); + + if (RangeMax == NULL || RangeMin == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + SetLastError(ERROR_SUCCESS); + + WaitForSingleObject(PPRegSemaphore, INFINITE); + + Ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szPowerCfgSubKey, 0, KEY_READ, &hKey); + if (Ret != ERROR_SUCCESS) + { + TRACE("RegOpenKeyEx failed: %d\n", Ret); + TRACE("Using defaults: 3600, 3\n"); + *RangeMax = 3600; + *RangeMin = 3; + ReleaseSemaphore(PPRegSemaphore, 1, NULL); + return TRUE; + } + + Ret = RegQueryValueExW(hKey, szDiskMax, 0, 0, lpValue, &cbValue); + if (Ret != ERROR_SUCCESS) + { + TRACE("Couldn't open DiskSpinDownMax: %d\n", Ret); + TRACE("Using default: 3600\n"); + *RangeMax = 3600; + } + else + { + *RangeMax = _wtoi((LPCWSTR)lpValue); + } + + cbValue = sizeof(lpValue); + + Ret = RegQueryValueExW(hKey, szDiskMin, 0, 0, lpValue, &cbValue); + if (Ret != ERROR_SUCCESS) + { + TRACE("Couldn't open DiskSpinDownMin: %d\n", Ret); + TRACE("Using default: 3\n"); + *RangeMin = 3; + } + else + { + *RangeMin = _wtoi((LPCWSTR)lpValue); + } + + RegCloseKey(hKey); + + ReleaseSemaphore(PPRegSemaphore, 1, NULL); + SetLastError(ERROR_SUCCESS); + + return TRUE; +} + + +BOOLEAN WINAPI +IsAdminOverrideActive(PADMINISTRATOR_POWER_POLICY p) +{ + FIXME("( %p) stub!\n", p); + return FALSE; +} + + +BOOLEAN WINAPI +IsPwrHibernateAllowed(VOID) +{ + SYSTEM_POWER_CAPABILITIES PowerCaps; + FIXME("() stub!\n"); + NtPowerInformation(SystemPowerCapabilities, NULL, 0, &PowerCaps, sizeof(PowerCaps)); + return FALSE; +} + + +BOOLEAN WINAPI +IsPwrShutdownAllowed(VOID) +{ + SYSTEM_POWER_CAPABILITIES PowerCaps; + FIXME("() stub!\n"); + NtPowerInformation(SystemPowerCapabilities, NULL, 0, &PowerCaps, sizeof(PowerCaps)); + return FALSE; +} + + +BOOLEAN WINAPI +IsPwrSuspendAllowed(VOID) +{ + SYSTEM_POWER_CAPABILITIES PowerCaps; + FIXME("() stub!\n"); + NtPowerInformation(SystemPowerCapabilities, NULL, 0, &PowerCaps, sizeof(PowerCaps)); + return FALSE; +} + + +BOOLEAN WINAPI +ReadGlobalPwrPolicy(PGLOBAL_POWER_POLICY pGlobalPowerPolicy) +{ + FIXME("(%p) stub!\n", pGlobalPowerPolicy); + SetLastError(ERROR_FILE_NOT_FOUND); + return FALSE; +} + + +BOOLEAN WINAPI +ReadProcessorPwrScheme(UINT uiID, + PMACHINE_PROCESSOR_POWER_POLICY pMachineProcessorPowerPolicy) +{ + FIXME("(%d, %p) stub!\n", uiID, pMachineProcessorPowerPolicy); + SetLastError(ERROR_FILE_NOT_FOUND); + return FALSE; +} + + +BOOLEAN WINAPI +ReadPwrScheme(UINT uiID, + PPOWER_POLICY pPowerPolicy) +{ + FIXME("(%d, %p) stub!\n", uiID, pPowerPolicy); + SetLastError(ERROR_FILE_NOT_FOUND); + return FALSE; +} + + +BOOLEAN WINAPI +SetActivePwrScheme(UINT uiID, + PGLOBAL_POWER_POLICY lpGlobalPowerPolicy, + PPOWER_POLICY lpPowerPolicy) +{ + FIXME("(%d, %p, %p) stub!\n", uiID, lpGlobalPowerPolicy, lpPowerPolicy); + SetLastError(ERROR_FILE_NOT_FOUND); + return FALSE; +} + + +BOOLEAN WINAPI +SetSuspendState(BOOLEAN Hibernate, + BOOLEAN ForceCritical, + BOOLEAN DisableWakeEvent) +{ + FIXME("(%d, %d, %d) stub!\n", Hibernate, ForceCritical, DisableWakeEvent); + return TRUE; +} + + +BOOLEAN WINAPI +WriteGlobalPwrPolicy(PGLOBAL_POWER_POLICY pGlobalPowerPolicy) +{ + FIXME("(%p) stub!\n", pGlobalPowerPolicy); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + + +BOOLEAN WINAPI +WriteProcessorPwrScheme(UINT ID, + PMACHINE_PROCESSOR_POWER_POLICY pMachineProcessorPowerPolicy) +{ + FIXME("(%d, %p) stub!\n", ID, pMachineProcessorPowerPolicy); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + + +BOOLEAN WINAPI +WritePwrScheme(PUINT puiID, + LPWSTR lpszName, + LPWSTR lpszDescription, + PPOWER_POLICY pPowerPolicy) +{ + FIXME("(%p, %s, %s, %p) stub!\n", puiID, debugstr_w(lpszName), debugstr_w(lpszDescription), pPowerPolicy); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + + +BOOLEAN WINAPI +ValidatePowerPolicies(PGLOBAL_POWER_POLICY pGPP, PPOWER_POLICY pPP) +{ + FIXME("(%p, %p) stub!\n", pGPP, pPP); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return TRUE; +} + + +BOOL WINAPI +DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + FIXME("(%p, %d, %p) not fully implemented\n", hinstDLL, fdwReason, lpvReserved); + + switch(fdwReason) + { + case DLL_PROCESS_ATTACH: + { + + HKEY hKey; + LONG r; + + DisableThreadLibraryCalls(hinstDLL); + + r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szPowerCfgSubKey, 0, KEY_READ | KEY_WRITE, &hKey); + + if (r != ERROR_SUCCESS) + { + TRACE("Couldn't open registry key HKLM\%s, using some sane(?) defaults\n", debugstr_w(szPowerCfgSubKey)); + } + else + { + BYTE lpValue[40]; + DWORD cbValue = sizeof(lpValue); + r = RegQueryValueExW(hKey, szLastID, 0, 0, lpValue, &cbValue); + if (r != ERROR_SUCCESS) + { + TRACE("Couldn't open registry entry HKLM\%s\LastID, using some sane(?) defaults\n", debugstr_w(szPowerCfgSubKey)); + } + RegCloseKey(hKey); + } + + PPRegSemaphore = CreateSemaphoreW(NULL, 1, 1, szSemaphoreName); + if (PPRegSemaphore == NULL) + { + ERR("Couldn't create Semaphore: %d\n", GetLastError()); + return FALSE; + } + break; + } + case DLL_PROCESS_DETACH: + CloseHandle(PPRegSemaphore); + break; + } + return TRUE; +}
Added: trunk/reactos/dll/win32/powrprof/powrprof.def URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/powrprof/powrprof... ============================================================================== --- trunk/reactos/dll/win32/powrprof/powrprof.def (added) +++ trunk/reactos/dll/win32/powrprof/powrprof.def [iso-8859-1] Mon Jun 16 01:00:22 2008 @@ -1,0 +1,23 @@ +LIBRARY powrprof.dll +EXPORTS +CallNtPowerInformation@20 +CanUserWritePwrScheme@0 +DeletePwrScheme@4 +EnumPwrSchemes@8 +GetActivePwrScheme@4 +GetCurrentPowerPolicies@8 +GetPwrCapabilities@4 +GetPwrDiskSpindownRange +IsAdminOverrideActive +IsPwrHibernateAllowed +IsPwrShutdownAllowed +IsPwrSuspendAllowed +ReadGlobalPwrPolicy@4 +ReadProcessorPwrScheme +ReadPwrScheme@8 +SetActivePwrScheme@12 +SetSuspendState +WriteGlobalPwrPolicy@4 +WriteProcessorPwrScheme +WritePwrScheme +ValidatePowerPolicies@8
Propchange: trunk/reactos/dll/win32/powrprof/powrprof.def ------------------------------------------------------------------------------ svn:eol-style = native
Modified: trunk/reactos/dll/win32/powrprof/powrprof.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/powrprof/powrprof... ============================================================================== --- trunk/reactos/dll/win32/powrprof/powrprof.rbuild [iso-8859-1] (original) +++ trunk/reactos/dll/win32/powrprof/powrprof.rbuild [iso-8859-1] Mon Jun 16 01:00:22 2008 @@ -1,16 +1,16 @@ <?xml version="1.0"?> <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd"> -<module name="powrprof" type="win32dll" baseaddress="${BASEADDRESS_POWRPROF}" installbase="system32" installname="powrprof.dll" allowwarnings="true"> - <importlibrary definition="powrprof.spec.def" /> +<module name="powrprof" type="win32dll" baseaddress="${BASEADDRESS_POWRPROF}" installbase="system32" installname="powrprof.dll" unicode="yes"> + <importlibrary definition="powrprof.def" /> <include base="powrprof">.</include> - <include base="ReactOS">include/reactos/wine</include> - <define name="__WINESRC__" /> <define name="WINVER">0x600</define> <define name="_WIN32_WINNT">0x600</define> <library>wine</library> <library>advapi32</library> <library>kernel32</library> <library>ntdll</library> + <library>user32</library> + <library>comctl32</library> <file>powrprof.c</file> - <file>powrprof.spec</file> + <file>powrprof.rc</file> </module>
Added: trunk/reactos/dll/win32/powrprof/powrprof.rc URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/powrprof/powrprof... ============================================================================== --- trunk/reactos/dll/win32/powrprof/powrprof.rc (added) +++ trunk/reactos/dll/win32/powrprof/powrprof.rc [iso-8859-1] Mon Jun 16 01:00:22 2008 @@ -1,0 +1,7 @@ +#include <windows.h> + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "Power Profile Helper DLL\0" +#define REACTOS_STR_INTERNAL_NAME "powrprof\0" +#define REACTOS_STR_ORIGINAL_FILENAME "powrprof.dll\0" +#include <reactos/version.rc>
Propchange: trunk/reactos/dll/win32/powrprof/powrprof.rc ------------------------------------------------------------------------------ svn:eol-style = native
Removed: trunk/reactos/dll/win32/powrprof/powrprof.spec URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/powrprof/powrprof... ============================================================================== --- trunk/reactos/dll/win32/powrprof/powrprof.spec [iso-8859-1] (original) +++ trunk/reactos/dll/win32/powrprof/powrprof.spec (removed) @@ -1,21 +1,0 @@ -@ stdcall CallNtPowerInformation (long ptr long ptr long) -@ stdcall CanUserWritePwrScheme () -@ stdcall DeletePwrScheme (long) -@ stdcall EnumPwrSchemes (ptr long) -@ stdcall GetActivePwrScheme (ptr) -@ stdcall GetCurrentPowerPolicies (ptr ptr) -@ stdcall GetPwrCapabilities (ptr) -@ stdcall GetPwrDiskSpindownRange (ptr ptr) -@ stdcall IsAdminOverrideActive (ptr) -@ stdcall IsPwrHibernateAllowed () -@ stdcall IsPwrShutdownAllowed () -@ stdcall IsPwrSuspendAllowed () -@ stdcall ReadGlobalPwrPolicy (ptr) -@ stdcall ReadProcessorPwrScheme (long ptr) -@ stdcall ReadPwrScheme (long ptr) -@ stdcall SetActivePwrScheme (long ptr ptr) -@ stdcall SetSuspendState (long long long) -@ stdcall WriteGlobalPwrPolicy (ptr) -@ stdcall WriteProcessorPwrScheme (long ptr) -@ stdcall WritePwrScheme (ptr str str ptr) -@ stdcall ValidatePowerPolicies (ptr ptr)
Removed: trunk/reactos/dll/win32/powrprof/powrprof_ros.diff URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/powrprof/powrprof... ============================================================================== --- trunk/reactos/dll/win32/powrprof/powrprof_ros.diff [iso-8859-1] (original) +++ trunk/reactos/dll/win32/powrprof/powrprof_ros.diff (removed) @@ -1,30 +1,0 @@ -Index: powrprof.c -=================================================================== ---- powrprof.c (revision 26779) -+++ powrprof.c (working copy) -@@ -303,6 +303,15 @@ - return FALSE; - } - -+BOOLEAN WINAPI ValidatePowerPolicies(PGLOBAL_POWER_POLICY pGPP, PPOWER_POLICY pPP) -+{ -+ /* FIXME: See note #3 */ -+ FIXME("(%p, %p) stub!\n", pGPP, pPP); -+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED); -+ return TRUE; -+ -+} -+ - BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) - { - FIXME("(%p, %d, %p) not fully implemented\n", hinstDLL, fdwReason, lpvReserved); -Index: powrprof.spec -=================================================================== ---- powrprof.spec (revision 26779) -+++ powrprof.spec (working copy) -@@ -18,3 +18,4 @@ - @ stdcall WriteGlobalPwrPolicy (ptr) - @ stdcall WriteProcessorPwrScheme (long ptr) - @ stdcall WritePwrScheme (ptr str str ptr) -+@ stdcall ValidatePowerPolicies (ptr ptr) -\ No newline at end of file