2 * FreeLoader - install.c
4 * Copyright (C) 2001 Brian Palmer <brianp@sginet.com>
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.
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.
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.
28 * These includes are required to define
29 * the fat_data and fat32_data arrays.
34 BOOL
BackupBootSector(LPCTSTR lpszVolumeName
);
35 BOOL
InstallBootSector(LPCTSTR lpszVolumeType
);
37 int main(int argc
, char *argv
[])
42 _tprintf(_T("syntax: install x: [fs_type]\nwhere fs_type is fat or fat32\n"));
46 if (!OpenVolume(argv
[1]))
51 BackupBootSector(argv
[1]);
53 InstallBootSector(argv
[2]);
55 _tprintf(_T("You must now copy freeldr.sys & freeldr.ini to %s.\n"), argv
[1]);
62 BOOL
BackupBootSector(LPCTSTR lpszVolumeName
)
65 TCHAR szFileName
[MAX_PATH
];
67 BYTE BootSectorBuffer
[512];
68 DWORD dwNumberOfBytesWritten
;
72 // Find the next unused filename and open it
74 for (Count
=0; ; Count
++)
77 // Generate the next filename
79 _stprintf(szFileName
, _T("%s\\bootsect.%03ld"), lpszVolumeName
, Count
);
82 // Try to create a new file, fail if exists
84 hBackupFile
= CreateFile(szFileName
, GENERIC_WRITE
, 0, NULL
, CREATE_NEW
, /*FILE_ATTRIBUTE_SYSTEM*/0, NULL
);
87 // Check to see if it worked
89 if (hBackupFile
!= INVALID_HANDLE_VALUE
)
96 // Check to see if it already existed
98 if (!(GetLastError() != ERROR_ALREADY_EXISTS
))
100 _tprintf(_T("%s:%d: "), __FILE__
, __LINE__
);
101 _tprintf(_T("Boot sector backup failed. Error code %ld.\n"), GetLastError());
107 // Try to read the boot sector
109 if (!ReadVolumeSector(0, BootSectorBuffer
))
111 CloseHandle(hBackupFile
);
116 // Try to write the boot sector data to the file
118 bRetVal
= WriteFile(hBackupFile
, BootSectorBuffer
, 512, &dwNumberOfBytesWritten
, NULL
);
119 if (!bRetVal
|| (dwNumberOfBytesWritten
!= 512))
121 CloseHandle(hBackupFile
);
122 _tprintf(_T("%s:%d: "), __FILE__
, __LINE__
);
123 _tprintf(_T("WriteFile() failed. Error code %ld.\n"), GetLastError());
127 _tprintf(_T("Boot sector backed up to file: %s\n"), szFileName
);
129 CloseHandle(hBackupFile
);
134 BOOL
InstallBootSector(LPCTSTR lpszVolumeType
)
136 BYTE BootSectorBuffer
[512];
139 // Read in the old boot sector
141 if (!ReadVolumeSector(0, BootSectorBuffer
))
146 if (_tcsicmp(lpszVolumeType
, _T("fat")) == 0)
149 // Update the BPB in the new boot sector
151 memcpy((fat_data
+3), (BootSectorBuffer
+3), 59 /*fat BPB length*/);
154 // Write out new boot sector
156 if (!WriteVolumeSector(0, fat_data
))
161 else if (_tcsicmp(lpszVolumeType
, _T("fat32")) == 0)
164 // Update the BPB in the new boot sector
166 memcpy((fat32_data
+3), (BootSectorBuffer
+3), 87 /*fat32 BPB length*/);
169 // Write out new boot sector
171 if (!WriteVolumeSector(0, fat32_data
))
177 // Write out new extra sector
179 if (!WriteVolumeSector(14, (fat32_data
+512)))
186 _tprintf(_T("%s:%d: "), __FILE__
, __LINE__
);
187 _tprintf(_T("File system type %s unknown.\n"), lpszVolumeType
);
191 _tprintf(_T("%s boot sector installed.\n"), lpszVolumeType
);