1 /* 2 * PROJECT: ReactOS Power Configuration Applet 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: dll/cpl/powercfg/hibernate.c 5 * PURPOSE: hibernate tab of applet 6 * PROGRAMMERS: Alexander Wurzinger (Lohnegrim at gmx dot net) 7 * Johannes Anderwald (johannes.anderwald@reactos.org) 8 * Martin Rottensteiner 9 * Dmitry Chapyshev (lentind@yandex.ru) 10 */ 11 12 #include "powercfg.h" 13 14 static VOID 15 Hib_InitDialog(HWND hwndDlg) 16 { 17 SYSTEM_POWER_CAPABILITIES PowerCaps; 18 MEMORYSTATUSEX msex; 19 TCHAR szTemp[MAX_PATH]; 20 LPTSTR lpRoot; 21 ULARGE_INTEGER FreeBytesAvailable, TotalNumberOfBytes, TotalNumberOfFreeBytes; 22 23 if (GetPwrCapabilities(&PowerCaps)) 24 { 25 CheckDlgButton(hwndDlg, 26 IDC_HIBERNATEFILE, 27 PowerCaps.HiberFilePresent ? BST_CHECKED : BST_UNCHECKED); 28 29 msex.dwLength = sizeof(msex); 30 if (!GlobalMemoryStatusEx(&msex)) 31 { 32 return; // FIXME 33 } 34 35 if (GetWindowsDirectory(szTemp,MAX_PATH)) 36 lpRoot = szTemp; 37 else 38 lpRoot = NULL; 39 40 // Get available space and size of selected volume. 41 if (!GetDiskFreeSpaceEx(lpRoot, &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes)) 42 TotalNumberOfFreeBytes.QuadPart = 0; 43 44 // Print the free available space into selected volume. 45 StrFormatByteSize(TotalNumberOfFreeBytes.QuadPart, szTemp, _countof(szTemp)); 46 SetDlgItemText(hwndDlg, IDC_FREESPACE, szTemp); 47 48 // Print the amount of space required for hibernation. 49 StrFormatByteSize(msex.ullTotalPhys, szTemp, _countof(szTemp)); 50 SetDlgItemText(hwndDlg, IDC_SPACEFORHIBERNATEFILE, szTemp); 51 52 if (TotalNumberOfFreeBytes.QuadPart < msex.ullTotalPhys && !PowerCaps.HiberFilePresent) 53 { 54 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), FALSE); 55 ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), TRUE); 56 } 57 else 58 { 59 ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), FALSE); 60 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), TRUE); 61 } 62 } 63 } 64 65 INT_PTR 66 Hib_SaveData(HWND hwndDlg) 67 { 68 BOOLEAN bHibernate; 69 70 bHibernate = (BOOLEAN)(IsDlgButtonChecked(hwndDlg, IDC_HIBERNATEFILE) == BST_CHECKED); 71 72 if (CallNtPowerInformation(SystemReserveHiberFile, &bHibernate, sizeof(bHibernate), NULL, 0) == STATUS_SUCCESS) 73 { 74 Hib_InitDialog(hwndDlg); 75 return TRUE; 76 } 77 78 return FALSE; 79 } 80 81 /* Property page dialog callback */ 82 INT_PTR CALLBACK 83 HibernateDlgProc(HWND hwndDlg, 84 UINT uMsg, 85 WPARAM wParam, 86 LPARAM lParam) 87 { 88 switch (uMsg) 89 { 90 case WM_INITDIALOG: 91 Hib_InitDialog(hwndDlg); 92 return TRUE; 93 94 case WM_COMMAND: 95 switch (LOWORD(wParam)) 96 { 97 case IDC_HIBERNATEFILE: 98 if (HIWORD(wParam) == BN_CLICKED) 99 { 100 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 101 } 102 break; 103 } 104 break; 105 106 case WM_NOTIFY: 107 if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY) 108 { 109 return Hib_SaveData(hwndDlg); 110 } 111 break; 112 } 113 114 return FALSE; 115 } 116