[NTFS]
[reactos.git] / reactos / boot / freeldr / install / install.c
1 /*
2 * FreeLoader - install.c
3 *
4 * Copyright (C) 2001 Brian Palmer <brianp@sginet.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21 #include <windows.h>
22 #include <tchar.h>
23 #include <stdio.h>
24 #include "install.h"
25 #include "volume.h"
26
27 /*
28 * These includes are required to define
29 * the fat_data and fat32_data arrays.
30 */
31 #include "fat.h"
32 #include "fat32.h"
33
34 BOOL BackupBootSector(LPCTSTR lpszVolumeName);
35 BOOL InstallBootSector(LPCTSTR lpszVolumeType);
36
37 int main(int argc, char *argv[])
38 {
39
40 if (argc < 3)
41 {
42 _tprintf(_T("syntax: install x: [fs_type]\nwhere fs_type is fat or fat32\n"));
43 return -1;
44 }
45
46 if (!OpenVolume(argv[1]))
47 {
48 return -1;
49 }
50
51 BackupBootSector(argv[1]);
52
53 InstallBootSector(argv[2]);
54
55 _tprintf(_T("You must now copy freeldr.sys & freeldr.ini to %s.\n"), argv[1]);
56
57 CloseVolume();
58
59 return 0;
60 }
61
62 BOOL BackupBootSector(LPCTSTR lpszVolumeName)
63 {
64 HANDLE hBackupFile;
65 TCHAR szFileName[MAX_PATH];
66 ULONG Count;
67 BYTE BootSectorBuffer[512];
68 DWORD dwNumberOfBytesWritten;
69 BOOL bRetVal;
70
71 //
72 // Find the next unused filename and open it
73 //
74 for (Count=0; ; Count++)
75 {
76 //
77 // Generate the next filename
78 //
79 _stprintf(szFileName, _T("%s\\bootsect.%03ld"), lpszVolumeName, Count);
80
81 //
82 // Try to create a new file, fail if exists
83 //
84 hBackupFile = CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_NEW, /*FILE_ATTRIBUTE_SYSTEM*/0, NULL);
85
86 //
87 // Check to see if it worked
88 //
89 if (hBackupFile != INVALID_HANDLE_VALUE)
90 {
91 break;
92 }
93
94 //
95 // Nope, didn't work
96 // Check to see if it already existed
97 //
98 if (!(GetLastError() != ERROR_ALREADY_EXISTS))
99 {
100 _tprintf(_T("%s:%d: "), __FILE__, __LINE__);
101 _tprintf(_T("Boot sector backup failed. Error code %ld.\n"), GetLastError());
102 return FALSE;
103 }
104 }
105
106 //
107 // Try to read the boot sector
108 //
109 if (!ReadVolumeSector(0, BootSectorBuffer))
110 {
111 CloseHandle(hBackupFile);
112 return FALSE;
113 }
114
115 //
116 // Try to write the boot sector data to the file
117 //
118 bRetVal = WriteFile(hBackupFile, BootSectorBuffer, 512, &dwNumberOfBytesWritten, NULL);
119 if (!bRetVal || (dwNumberOfBytesWritten != 512))
120 {
121 CloseHandle(hBackupFile);
122 _tprintf(_T("%s:%d: "), __FILE__, __LINE__);
123 _tprintf(_T("WriteFile() failed. Error code %ld.\n"), GetLastError());
124 return FALSE;
125 }
126
127 _tprintf(_T("Boot sector backed up to file: %s\n"), szFileName);
128
129 CloseHandle(hBackupFile);
130
131 return TRUE;
132 }
133
134 BOOL InstallBootSector(LPCTSTR lpszVolumeType)
135 {
136 BYTE BootSectorBuffer[512];
137
138 //
139 // Read in the old boot sector
140 //
141 if (!ReadVolumeSector(0, BootSectorBuffer))
142 {
143 return FALSE;
144 }
145
146 if (_tcsicmp(lpszVolumeType, _T("fat")) == 0)
147 {
148 //
149 // Update the BPB in the new boot sector
150 //
151 memcpy((fat_data+3), (BootSectorBuffer+3), 59 /*fat BPB length*/);
152
153 //
154 // Write out new boot sector
155 //
156 if (!WriteVolumeSector(0, fat_data))
157 {
158 return FALSE;
159 }
160 }
161 else if (_tcsicmp(lpszVolumeType, _T("fat32")) == 0)
162 {
163 //
164 // Update the BPB in the new boot sector
165 //
166 memcpy((fat32_data+3), (BootSectorBuffer+3), 87 /*fat32 BPB length*/);
167
168 //
169 // Write out new boot sector
170 //
171 if (!WriteVolumeSector(0, fat32_data))
172 {
173 return FALSE;
174 }
175
176 //
177 // Write out new extra sector
178 //
179 if (!WriteVolumeSector(14, (fat32_data+512)))
180 {
181 return FALSE;
182 }
183 }
184 else
185 {
186 _tprintf(_T("%s:%d: "), __FILE__, __LINE__);
187 _tprintf(_T("File system type %s unknown.\n"), lpszVolumeType);
188 return FALSE;
189 }
190
191 _tprintf(_T("%s boot sector installed.\n"), lpszVolumeType);
192
193 return TRUE;
194 }