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
Hib_InitDialog(HWND hwndDlg)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 BOOLEAN bHibernate;
23
24 if (GetPwrCapabilities(&PowerCaps))
25 {
26 CheckDlgButton(hwndDlg,
27 IDC_HIBERNATEFILE,
28 PowerCaps.HiberFilePresent ? BST_CHECKED : BST_UNCHECKED);
29
30 msex.dwLength = sizeof(msex);
31 if (!GlobalMemoryStatusEx(&msex))
32 {
33 return; // FIXME
34 }
35
36 if (GetWindowsDirectory(szTemp,MAX_PATH))
37 lpRoot = szTemp;
38 else
39 lpRoot = NULL;
40
41 // Get available space and size of selected volume.
42 if (!GetDiskFreeSpaceEx(lpRoot, &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes))
43 TotalNumberOfFreeBytes.QuadPart = 0;
44
45 // Print the free available space into selected volume.
46 StrFormatByteSize(TotalNumberOfFreeBytes.QuadPart, szTemp, _countof(szTemp));
47 SetDlgItemText(hwndDlg, IDC_FREESPACE, szTemp);
48
49 // Print the amount of space required for hibernation.
50 StrFormatByteSize(msex.ullTotalPhys, szTemp, _countof(szTemp));
51 SetDlgItemText(hwndDlg, IDC_SPACEFORHIBERNATEFILE, szTemp);
52
53 if (TotalNumberOfFreeBytes.QuadPart < msex.ullTotalPhys && !PowerCaps.HiberFilePresent)
54 {
55 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), FALSE);
56 ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), TRUE);
57 }
58 else
59 {
60 ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), FALSE);
61 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), TRUE);
62 }
63
64 bHibernate = PowerCaps.HiberFilePresent ? TRUE : FALSE;
65 if (CallNtPowerInformation(SystemReserveHiberFile, &bHibernate, sizeof(bHibernate), NULL, 0) != STATUS_SUCCESS)
66 {
67 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), FALSE);
68 }
69 }
70 }
71
72 INT_PTR
Hib_SaveData(HWND hwndDlg)73 Hib_SaveData(HWND hwndDlg)
74 {
75 BOOLEAN bHibernate;
76
77 bHibernate = (BOOLEAN)(IsDlgButtonChecked(hwndDlg, IDC_HIBERNATEFILE) == BST_CHECKED);
78
79 if (CallNtPowerInformation(SystemReserveHiberFile, &bHibernate, sizeof(bHibernate), NULL, 0) == STATUS_SUCCESS)
80 {
81 Hib_InitDialog(hwndDlg);
82 return TRUE;
83 }
84
85 return FALSE;
86 }
87
88 /* Property page dialog callback */
89 INT_PTR CALLBACK
HibernateDlgProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)90 HibernateDlgProc(HWND hwndDlg,
91 UINT uMsg,
92 WPARAM wParam,
93 LPARAM lParam)
94 {
95 switch (uMsg)
96 {
97 case WM_INITDIALOG:
98 Hib_InitDialog(hwndDlg);
99 return TRUE;
100
101 case WM_COMMAND:
102 switch (LOWORD(wParam))
103 {
104 case IDC_HIBERNATEFILE:
105 if (HIWORD(wParam) == BN_CLICKED)
106 {
107 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
108 }
109 break;
110 }
111 break;
112
113 case WM_NOTIFY:
114 if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
115 {
116 return Hib_SaveData(hwndDlg);
117 }
118 break;
119 }
120
121 return FALSE;
122 }
123