get sysdm to work with freeldr.ini as well
[reactos.git] / reactos / dll / cpl / sysdm / startrec.c
1
2 /*
3 * PROJECT: ReactOS System Control Panel Applet
4 * LICENSE: GPL - See COPYING in the top level directory
5 * FILE: dll/cpl/sysdm/startrec.c
6 * PURPOSE: Computer settings for startup and recovery
7 * COPYRIGHT: Copyright 2006 Ged Murphy <gedmurphy@gmail.com>
8 * Copyright 2006 Christoph von Wittich <Christoph@ApiViewer.de>
9 *
10 */
11
12 #include "precomp.h"
13
14 static TCHAR m_szFreeldrIni[MAX_PATH + 15];
15 static TCHAR szBootLdrSection[12];
16 static TCHAR szBootLdrDefault[10];
17
18 void SetTimeout(HWND hwndDlg, int Timeout)
19 {
20 if (Timeout == 0)
21 {
22 EnableWindow(GetDlgItem(hwndDlg, IDC_STRRECLISTUPDWN), FALSE);
23 }
24 else
25 {
26 EnableWindow(GetDlgItem(hwndDlg, IDC_STRRECLISTUPDWN), TRUE);
27 }
28 SendDlgItemMessage(hwndDlg, IDC_STRRECLISTUPDWN, UDM_SETPOS, (WPARAM) 0, (LPARAM) MAKELONG((short) Timeout, 0));
29 }
30
31 /* Property page dialog callback */
32 INT_PTR CALLBACK
33 StartRecDlgProc(HWND hwndDlg,
34 UINT uMsg,
35 WPARAM wParam,
36 LPARAM lParam)
37 {
38 TCHAR *szSystemDrive;
39 TCHAR szDefaultOS[MAX_PATH];
40 TCHAR szDefaultOSName[MAX_PATH];
41 TCHAR szTimeout[10];
42 int iTimeout;
43
44 UNREFERENCED_PARAMETER(lParam);
45
46 switch(uMsg)
47 {
48 case WM_INITDIALOG:
49 {
50 DWORD dwBufSize;
51
52 /* get Path to freeldr.ini or boot.ini */
53 szSystemDrive = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(TCHAR));
54 if (szSystemDrive != NULL)
55 {
56 dwBufSize = GetEnvironmentVariable(_T("SystemDrive"), szSystemDrive, MAX_PATH);
57 if (dwBufSize > MAX_PATH)
58 {
59 TCHAR *szTmp;
60 DWORD dwBufSize2;
61
62 szTmp = HeapReAlloc(GetProcessHeap(), 0, szSystemDrive, dwBufSize * sizeof(TCHAR));
63 if (szTmp == NULL)
64 goto FailGetSysDrive;
65
66 szSystemDrive = szTmp;
67
68 dwBufSize2 = GetEnvironmentVariable(_T("SystemDrive"), szSystemDrive, dwBufSize);
69 if (dwBufSize2 > dwBufSize || dwBufSize2 == 0)
70 goto FailGetSysDrive;
71 }
72 else if (dwBufSize == 0)
73 {
74 FailGetSysDrive:
75 HeapFree(GetProcessHeap(), 0, szSystemDrive);
76 szSystemDrive = NULL;
77 return FALSE;
78 }
79
80 if (szSystemDrive != NULL)
81 {
82 if (m_szFreeldrIni != NULL)
83 {
84 _tcscpy(m_szFreeldrIni, szSystemDrive);
85 _tcscat(m_szFreeldrIni, _T("\\freeldr.ini"));
86 if (!PathFileExists(m_szFreeldrIni))
87 {
88 _tcscpy(m_szFreeldrIni, szSystemDrive);
89 _tcscat(m_szFreeldrIni, _T("\\boot.ini"));
90 _tcscpy(szBootLdrSection, _T("boot loader"));
91 _tcscpy(szBootLdrDefault, _T("default"));
92 }
93 else
94 {
95 _tcscpy(szBootLdrSection, _T("FREELOADER"));
96 _tcscpy(szBootLdrDefault, _T("DefaultOS"));
97 }
98 }
99 HeapFree(GetProcessHeap(), 0, szSystemDrive);
100 }
101 }
102
103 if (m_szFreeldrIni == NULL)
104 return FALSE;
105
106 SetDlgItemText(hwndDlg, IDC_STRRECDUMPFILE, _T("%SystemRoot%\\MiniDump"));
107
108 /* load settings from freeldr.ini */
109 GetPrivateProfileString(szBootLdrSection, szBootLdrDefault, NULL, szDefaultOS, MAX_PATH, m_szFreeldrIni);
110 GetPrivateProfileString(_T("operating systems"), szDefaultOS, NULL, szDefaultOSName, MAX_PATH, m_szFreeldrIni);
111 SendDlgItemMessage(hwndDlg, IDC_STRECOSCOMBO, CB_ADDSTRING, (WPARAM)0, (LPARAM)szDefaultOSName);
112 SendDlgItemMessage(hwndDlg, IDC_STRECOSCOMBO, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
113
114 /* timeout */
115 iTimeout = GetPrivateProfileInt(szBootLdrSection, _T("timeout"), 0, m_szFreeldrIni);
116 SetTimeout(hwndDlg, iTimeout);
117 if (iTimeout != 0)
118 SendDlgItemMessage(hwndDlg, IDC_STRECLIST, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
119
120 }
121 break;
122
123 case WM_COMMAND:
124 {
125 switch(LOWORD(wParam))
126 {
127 case IDC_STRRECEDIT:
128 {
129 ShellExecute(0, _T("open"), _T("notepad"), m_szFreeldrIni, NULL, SW_SHOWNORMAL);
130 break;
131 }
132 case IDOK:
133 {
134 /* save timeout */
135 if (SendDlgItemMessage(hwndDlg, IDC_STRECLIST, BM_GETCHECK, (WPARAM)0, (LPARAM)0) == BST_CHECKED)
136 iTimeout = SendDlgItemMessage(hwndDlg, IDC_STRRECLISTUPDWN, UDM_GETPOS, (WPARAM)0, (LPARAM)0);
137 else
138 iTimeout = 0;
139 _stprintf(szTimeout, _T("%i"), iTimeout);
140 WritePrivateProfileString(szBootLdrSection, _T("timeout"), szTimeout, m_szFreeldrIni);
141 }
142 case IDCANCEL:
143 {
144 EndDialog(hwndDlg,
145 LOWORD(wParam));
146 return TRUE;
147 break;
148 }
149 case IDC_STRECLIST:
150 {
151 if (SendDlgItemMessage(hwndDlg, IDC_STRECLIST, BM_GETCHECK, (WPARAM)0, (LPARAM)0) == BST_CHECKED)
152 SetTimeout(hwndDlg, 30);
153 else
154 SetTimeout(hwndDlg, 0);
155 }
156 }
157 }
158 break;
159 }
160 return FALSE;
161 }