[Win32k]
[reactos.git] / reactos / base / applications / msconfig / freeldrpage.c
1 /*
2 * PROJECT: ReactOS Applications
3 * LICENSE: LGPL - See COPYING in the top level directory
4 * FILE: base/applications/msconfig/freeldrpage.c
5 * PURPOSE: Freeloader configuration page message handler
6 * COPYRIGHT: Copyright 2005-2006 Christoph von Wittich <Christoph@ApiViewer.de>
7 * 2011 Gregor Schneider <Gregor.Schneider@reactos.org>
8 */
9
10 #include "precomp.h"
11
12 HWND hFreeLdrPage;
13 HWND hFreeLdrDialog;
14
15 typedef struct
16 {
17 ULONG TimeOut;
18 WCHAR szDefaultOS[512];
19 ULONG szDefaultPos;
20 ULONG OSConfigurationCount;
21 BOOL UseBootIni;
22 } FREELDR_SETTINGS;
23
24 static FREELDR_SETTINGS Settings = { 0, { 0, }, 0, 0, FALSE };
25
26 #define BUFFER_SIZE 512
27
28 static BOOL
29 LoadBootIni(WCHAR *szDrive, HWND hDlg)
30 {
31 WCHAR szBuffer[BUFFER_SIZE];
32 HWND hDlgCtrl;
33 FILE * file;
34 UINT length;
35 LRESULT pos;
36 HRESULT hr;
37
38 hr = StringCbCopyW(szBuffer, sizeof(szBuffer), szDrive);
39 if (FAILED(hr))
40 return FALSE;
41
42 hr = StringCbCatW(szBuffer, sizeof(szBuffer), L"freeldr.ini");
43 if (FAILED(hr))
44 return FALSE;
45
46 file = _wfopen(szBuffer, L"rt");
47 if (!file)
48 {
49 hr = StringCbCopyW(szBuffer, sizeof(szBuffer), szDrive);
50 if (FAILED(hr))
51 return FALSE;
52
53 hr = StringCbCatW(szBuffer, sizeof(szBuffer), L"boot.ini");
54 if (FAILED(hr))
55 return FALSE;
56
57 file = _wfopen(szBuffer, L"rt");
58 if (!file)
59 return FALSE;
60 }
61
62 hDlgCtrl = GetDlgItem(hDlg, IDC_LIST_BOX);
63
64 while(!feof(file))
65 {
66 if (fgetws(szBuffer, BUFFER_SIZE, file))
67 {
68 length = wcslen(szBuffer);
69 if (length > 1)
70 {
71 szBuffer[length] = L'\0';
72 szBuffer[length - 1] = L'\0';
73
74 pos = SendMessageW(hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)szBuffer);
75
76 if (szBuffer[0] == L'[')
77 continue;
78
79 if (!_wcsnicmp(szBuffer, L"timeout=", 8))
80 {
81 Settings.TimeOut = _wtoi(&szBuffer[8]);
82 continue;
83 }
84
85 if (!_wcsnicmp(szBuffer, L"default=", 8))
86 {
87 wcscpy(Settings.szDefaultOS, &szBuffer[8]);
88 continue;
89 }
90 if (pos != LB_ERR)
91 SendMessage(hDlgCtrl, LB_SETITEMDATA, pos, 1); // indicate that this item is an boot entry
92 Settings.OSConfigurationCount++;
93 }
94 }
95 }
96
97 fclose(file);
98 Settings.UseBootIni = TRUE;
99
100 pos = SendMessageW(hDlgCtrl, LB_FINDSTRING, 3, (LPARAM)Settings.szDefaultOS);
101 if (pos != LB_ERR)
102 {
103 Settings.szDefaultPos = pos;
104 SendMessage(hDlgCtrl, LB_SETCURSEL, pos, 0);
105 }
106
107 SetDlgItemInt(hDlg, IDC_TXT_BOOT_TIMEOUT, Settings.TimeOut, FALSE);
108 if (Settings.OSConfigurationCount < 2)
109 {
110 EnableWindow(GetDlgItem(hDlg, IDC_BTN_SET_DEFAULT_BOOT), FALSE);
111 EnableWindow(GetDlgItem(hDlg, IDC_BTN_MOVE_UP_BOOT_OPTION), FALSE);
112 EnableWindow(GetDlgItem(hDlg, IDC_BTN_MOVE_DOWN_BOOT_OPTION), FALSE);
113 }
114 return TRUE;
115 }
116
117 static BOOL
118 InitializeFreeLDRDialog(HWND hDlg)
119 {
120 WCHAR winDir[PATH_MAX];
121 WCHAR* ptr = NULL;
122
123 GetWindowsDirectoryW(winDir, PATH_MAX);
124 ptr = wcschr(winDir, L'\\');
125 if (ptr == NULL)
126 {
127 return FALSE;
128 }
129 ptr[1] = L'\0';
130 return LoadBootIni(winDir, hDlg);
131 }
132
133 INT_PTR CALLBACK
134 FreeLdrPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
135 {
136 LRESULT pos;
137
138 switch (message) {
139 case WM_INITDIALOG:
140 hFreeLdrDialog = hDlg;
141 SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
142 InitializeFreeLDRDialog(hDlg);
143 return TRUE;
144 case WM_COMMAND:
145 switch(HIWORD(wParam))
146 {
147 case LBN_SELCHANGE:
148 pos = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);
149 if (pos != LB_ERR)
150 {
151 LPARAM res = SendMessage((HWND)lParam, LB_GETITEMDATA, pos, 0);
152 if (!res) /* line is not a default one */
153 SendMessage((HWND)lParam, LB_SETCURSEL, Settings.szDefaultPos, 0);
154 else
155 Settings.szDefaultPos = pos;
156
157
158 }
159 break;
160 }
161 }
162 return 0;
163 }