1
1
Fork 0
mirror of https://github.com/pbatard/rufus.git synced 2024-08-14 23:57:05 +00:00

[syslinux] complete Syslinux v5 support

* Add download and copy of mandatory ldlinux.c32 to target
* With previous patch, this should address all Syslinux v5 related issues
* Closes #142
This commit is contained in:
Pete Batard 2013-06-15 17:31:55 +01:00
parent df5bce297d
commit 1dbaff6897
4 changed files with 90 additions and 38 deletions

View file

@ -98,6 +98,7 @@ static BOOL log_displayed = FALSE;
static BOOL iso_provided = FALSE; static BOOL iso_provided = FALSE;
extern BOOL force_large_fat32; extern BOOL force_large_fat32;
static int selection_default; static int selection_default;
char msgbox[1024], msgbox_title[32];
/* /*
* Globals * Globals
@ -947,7 +948,7 @@ static void CALLBACK BlockingTimer(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD
user_notified = TRUE; user_notified = TRUE;
uprintf("Blocking I/O operation detected\n"); uprintf("Blocking I/O operation detected\n");
MessageBoxU(hMainDialog, MessageBoxU(hMainDialog,
"Rufus detected that Windows is still flushing its internal buffers\n" APPLICATION_NAME " detected that Windows is still flushing its internal buffers\n"
"onto the USB device.\n\n" "onto the USB device.\n\n"
"Depending on the speed of your USB device, this operation may\n" "Depending on the speed of your USB device, this operation may\n"
"take a long time to complete, especially for large files.\n\n" "take a long time to complete, especially for large files.\n\n"
@ -1010,7 +1011,6 @@ DWORD WINAPI ISOScanThread(LPVOID param)
FILE* fd; FILE* fd;
const char* old_c32_name[NB_OLD_C32] = OLD_C32_NAMES; const char* old_c32_name[NB_OLD_C32] = OLD_C32_NAMES;
const char* new_c32_url[NB_OLD_C32] = NEW_C32_URL; const char* new_c32_url[NB_OLD_C32] = NEW_C32_URL;
char msg[1024], msg_title[32];
if (iso_path == NULL) if (iso_path == NULL)
goto out; goto out;
@ -1032,7 +1032,7 @@ DWORD WINAPI ISOScanThread(LPVOID param)
} }
} }
if ((!iso_report.has_bootmgr) && (!iso_report.has_isolinux) && (!IS_WINPE(iso_report.winpe)) && (!iso_report.has_efi)) { if ((!iso_report.has_bootmgr) && (!iso_report.has_isolinux) && (!IS_WINPE(iso_report.winpe)) && (!iso_report.has_efi)) {
MessageBoxU(hMainDialog, "This version of Rufus only supports bootable ISOs\n" MessageBoxU(hMainDialog, "This version of " APPLICATION_NAME " only supports bootable ISOs\n"
"based on bootmgr/WinPE, isolinux or EFI.\n" "based on bootmgr/WinPE, isolinux or EFI.\n"
"This ISO doesn't appear to use either...", "Unsupported ISO", MB_OK|MB_ICONINFORMATION); "This ISO doesn't appear to use either...", "Unsupported ISO", MB_OK|MB_ICONINFORMATION);
safe_free(iso_path); safe_free(iso_path);
@ -1053,16 +1053,16 @@ DWORD WINAPI ISOScanThread(LPVOID param)
use_own_c32[i] = TRUE; use_own_c32[i] = TRUE;
} else { } else {
PrintStatus(0, FALSE, "Obsolete %s detected", old_c32_name[i]); PrintStatus(0, FALSE, "Obsolete %s detected", old_c32_name[i]);
safe_sprintf(msg, sizeof(msg), "This ISO image seems to use an obsolete version of '%s'.\n" safe_sprintf(msgbox, sizeof(msgbox), "This ISO image seems to use an obsolete version of '%s'.\n"
"Because of this, boot menus may not display properly.\n\n" "Because of this, boot menus may not display properly.\n\n"
"Rufus can fix this issue by downloading a newer version for you:\n" APPLICATION_NAME " can fix this issue by downloading a newer version for you:\n"
"- Choose 'Yes' to connect to the internet and replace the file.\n" "- Choose 'Yes' to connect to the internet and replace the file\n"
"- Choose 'No' to leave the existing ISO file unmodified.\n" "- Choose 'No' to leave the existing ISO file unmodified\n"
"If you don't know what to do, you should select 'Yes'.\n\n" "If you don't know what to do, you should select 'Yes'.\n\n"
"Note: the new file will be downloaded in the current directory and once a " "Note: The new file will be downloaded in the current directory and once a "
"'%s' exists there, it will always be used as replacement.\n", old_c32_name[i], old_c32_name[i]); "'%s' exists there, it will be reused automatically.\n", old_c32_name[i], old_c32_name[i]);
safe_sprintf(msg_title, sizeof(msg_title), "Replace %s?", old_c32_name[i]); safe_sprintf(msgbox_title, sizeof(msgbox_title), "Replace %s?", old_c32_name[i]);
if (MessageBoxA(hMainDialog, msg, msg_title, MB_YESNO|MB_ICONWARNING) == IDYES) { if (MessageBoxA(hMainDialog, msgbox, msgbox_title, MB_YESNO|MB_ICONWARNING) == IDYES) {
SetWindowTextU(hISOProgressDlg, "Downloading file..."); SetWindowTextU(hISOProgressDlg, "Downloading file...");
SetWindowTextU(hISOFileName, new_c32_url[i]); SetWindowTextU(hISOFileName, new_c32_url[i]);
if (DownloadFile(new_c32_url[i], old_c32_name[i], hISOProgressDlg)) if (DownloadFile(new_c32_url[i], old_c32_name[i], hISOProgressDlg))
@ -1176,9 +1176,12 @@ void ToggleAdvanced(void)
static BOOL BootCheck(void) static BOOL BootCheck(void)
{ {
int fs, bt; int fs, bt, dt, r;
FILE* fd;
const char* ldlinux_c32 = "ldlinux.c32";
if (ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)) == DT_ISO) { dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
if (dt == DT_ISO) {
if (iso_path == NULL) { if (iso_path == NULL) {
MessageBoxA(hMainDialog, "Please click on the disc button to select a bootable ISO,\n" MessageBoxA(hMainDialog, "Please click on the disc button to select a bootable ISO,\n"
"or uncheck the \"Create a bootable disk...\" checkbox.", "or uncheck the \"Create a bootable disk...\" checkbox.",
@ -1224,6 +1227,31 @@ static BOOL BootCheck(void)
ShellExecuteA(hMainDialog, "open", SEVENZIP_URL, NULL, NULL, SW_SHOWNORMAL); ShellExecuteA(hMainDialog, "open", SEVENZIP_URL, NULL, NULL, SW_SHOWNORMAL);
return FALSE; return FALSE;
} }
} else if (dt == DT_SYSLINUX_V5) {
fd = fopen(ldlinux_c32, "rb");
if (fd != NULL) {
uprintf("Will reuse '%s' for Syslinux v5\n", ldlinux_c32);
fclose(fd);
} else {
PrintStatus(0, FALSE, "Missing '%s' file", ldlinux_c32);
safe_sprintf(msgbox, sizeof(msgbox), "Syslinux v5.0 or later requires a '%s' file to be installed.\n"
"Because this file is more than 100 KB in size, and always present on Syslinux v5+ ISO images, "
"it is not embedded in " APPLICATION_NAME ".\n\n"
APPLICATION_NAME " can download the missing file for you:\n"
"- Select 'Yes' to connect to the internet and download the file\n"
"- Select 'No' if you will manually copy this file on the drive later\n\n"
"Note: The file will be downloaded in the current directory and once a "
"'%s' exists there, it will be reused automatically.\n", ldlinux_c32, ldlinux_c32, ldlinux_c32);
safe_sprintf(msgbox_title, sizeof(msgbox_title), "Download %s?", ldlinux_c32);
r = MessageBoxA(hMainDialog, msgbox, msgbox_title, MB_YESNOCANCEL|MB_ICONWARNING);
if (r == IDCANCEL)
return FALSE;
if (r == IDYES) {
SetWindowTextU(hISOProgressDlg, "Downloading file...");
SetWindowTextU(hISOFileName, ldlinux_c32);
DownloadFile(LDLINUX_C32_URL, ldlinux_c32, hISOProgressDlg);
}
}
} }
return TRUE; return TRUE;
} }
@ -1695,31 +1723,36 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
selection_default = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); selection_default = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
nDeviceIndex = ComboBox_GetCurSel(hDeviceList); nDeviceIndex = ComboBox_GetCurSel(hDeviceList);
if (nDeviceIndex != CB_ERR) { if (nDeviceIndex != CB_ERR) {
if ((IsChecked(IDC_BOOT)) && (!BootCheck())) if ((IsChecked(IDC_BOOT)) && (!BootCheck())) {
format_op_in_progress = FALSE;
break; break;
}
GetWindowTextU(hDeviceList, tmp, ARRAYSIZE(tmp)); GetWindowTextU(hDeviceList, tmp, ARRAYSIZE(tmp));
_snprintf(str, ARRAYSIZE(str), "WARNING: ALL DATA ON DEVICE '%s'\r\nWILL BE DESTROYED.\r\n" _snprintf(str, ARRAYSIZE(str), "WARNING: ALL DATA ON DEVICE '%s'\r\nWILL BE DESTROYED.\r\n"
"To continue with this operation, click OK. To quit click CANCEL.", tmp); "To continue with this operation, click OK. To quit click CANCEL.", tmp);
if (MessageBoxU(hMainDialog, str, APPLICATION_NAME, MB_OKCANCEL|MB_ICONWARNING) == IDOK) { if (MessageBoxU(hMainDialog, str, APPLICATION_NAME, MB_OKCANCEL|MB_ICONWARNING) == IDCANCEL) {
// Disable all controls except cancel format_op_in_progress = FALSE;
EnableControls(FALSE); break;
DeviceNum = (DWORD)ComboBox_GetItemData(hDeviceList, nDeviceIndex);
FormatStatus = 0;
InitProgress();
format_thid = CreateThread(NULL, 0, FormatThread, (LPVOID)(uintptr_t)DeviceNum, 0, NULL);
if (format_thid == NULL) {
uprintf("Unable to start formatting thread");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_START_THREAD);
PostMessage(hMainDialog, UM_FORMAT_COMPLETED, 0, 0);
}
uprintf("\r\nFormat operation started");
PrintStatus(0, FALSE, "");
timer = 0;
safe_sprintf(szTimer, sizeof(szTimer), "00:00:00");
SendMessageA(GetDlgItem(hMainDialog, IDC_STATUS), SB_SETTEXTA,
SBT_OWNERDRAW | 1, (LPARAM)szTimer);
SetTimer(hMainDialog, TID_APP_TIMER, 1000, ClockTimer);
} }
// Disable all controls except cancel
EnableControls(FALSE);
DeviceNum = (DWORD)ComboBox_GetItemData(hDeviceList, nDeviceIndex);
FormatStatus = 0;
InitProgress();
format_thid = CreateThread(NULL, 0, FormatThread, (LPVOID)(uintptr_t)DeviceNum, 0, NULL);
if (format_thid == NULL) {
uprintf("Unable to start formatting thread");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_START_THREAD);
PostMessage(hMainDialog, UM_FORMAT_COMPLETED, 0, 0);
}
uprintf("\r\nFormat operation started");
PrintStatus(0, FALSE, "");
timer = 0;
safe_sprintf(szTimer, sizeof(szTimer), "00:00:00");
SendMessageA(GetDlgItem(hMainDialog, IDC_STATUS), SB_SETTEXTA,
SBT_OWNERDRAW | 1, (LPARAM)szTimer);
SetTimer(hMainDialog, TID_APP_TIMER, 1000, ClockTimer);
} }
if (format_thid == NULL) if (format_thid == NULL)
format_op_in_progress = FALSE; format_op_in_progress = FALSE;

View file

@ -195,6 +195,7 @@ typedef struct {
#define OLD_C32_NAMES {"menu.c32", "vesamenu.c32"} #define OLD_C32_NAMES {"menu.c32", "vesamenu.c32"}
#define OLD_C32_THRESHOLD {53500, 148000} #define OLD_C32_THRESHOLD {53500, 148000}
#define NEW_C32_URL {RUFUS_URL "/downloads/menu.c32", RUFUS_URL "/downloads/vesamenu.c32"} #define NEW_C32_URL {RUFUS_URL "/downloads/menu.c32", RUFUS_URL "/downloads/vesamenu.c32"}
#define LDLINUX_C32_URL RUFUS_URL "/downloads/ldlinux.c32"
/* ISO details that the application may want */ /* ISO details that the application may want */
#define WINPE_MININT 0x2A #define WINPE_MININT 0x2A

View file

@ -30,7 +30,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 206, 329 IDD_DIALOG DIALOGEX 12, 12, 206, 329
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW EXSTYLE WS_EX_APPWINDOW
CAPTION "Rufus v1.3.4.253" CAPTION "Rufus v1.3.4.254"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "Start",IDC_START,94,291,50,14 DEFPUSHBUTTON "Start",IDC_START,94,291,50,14
@ -278,8 +278,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,3,4,253 FILEVERSION 1,3,4,254
PRODUCTVERSION 1,3,4,253 PRODUCTVERSION 1,3,4,254
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -296,13 +296,13 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
VALUE "FileDescription", "Rufus" VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "1.3.4.253" VALUE "FileVersion", "1.3.4.254"
VALUE "InternalName", "Rufus" VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011-2013 Pete Batard (GPL v3)" VALUE "LegalCopyright", "© 2011-2013 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
VALUE "OriginalFilename", "rufus.exe" VALUE "OriginalFilename", "rufus.exe"
VALUE "ProductName", "Rufus" VALUE "ProductName", "Rufus"
VALUE "ProductVersion", "1.3.4.253" VALUE "ProductVersion", "1.3.4.254"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View file

@ -73,6 +73,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter)
DWORD bytes_read; DWORD bytes_read;
DWORD bytes_written; DWORD bytes_written;
BOOL r = FALSE; BOOL r = FALSE;
FILE* fd;
static unsigned char sectbuf[SECTOR_SIZE]; static unsigned char sectbuf[SECTOR_SIZE];
static LPSTR resource[2][2] = { static LPSTR resource[2][2] = {
@ -80,6 +81,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter)
{ MAKEINTRESOURCEA(IDR_SL_LDLINUX_V5_SYS), MAKEINTRESOURCEA(IDR_SL_LDLINUX_V5_BSS) } }; { MAKEINTRESOURCEA(IDR_SL_LDLINUX_V5_SYS), MAKEINTRESOURCEA(IDR_SL_LDLINUX_V5_BSS) } };
static char ldlinux_path[] = "?:\\ldlinux.sys"; static char ldlinux_path[] = "?:\\ldlinux.sys";
static char* ldlinux_sys = &ldlinux_path[3]; static char* ldlinux_sys = &ldlinux_path[3];
const char* ldlinux_c32 = "ldlinux.c32";
struct libfat_filesystem *fs; struct libfat_filesystem *fs;
libfat_sector_t s, *secp; libfat_sector_t s, *secp;
libfat_sector_t *sectors = NULL; libfat_sector_t *sectors = NULL;
@ -202,6 +204,22 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter)
} }
uprintf("Succesfully wrote Syslinux boot record\n"); uprintf("Succesfully wrote Syslinux boot record\n");
if (dt == DT_SYSLINUX_V5) {
fd = fopen(ldlinux_c32, "rb");
if (fd == NULL) {
uprintf("Caution: No '%s' was provided. The target will be missing a mandatory Syslinux file!\n", ldlinux_c32);
} else {
fclose(fd);
ldlinux_path[11] = 'c'; ldlinux_path[12] = '3'; ldlinux_path[13] = '2';
if (CopyFileA(ldlinux_c32, ldlinux_path, TRUE)) {
uprintf("Created '%s' (from local copy)", ldlinux_path);
} else {
uprintf("Failed to create '%s': %s\n", ldlinux_path, WindowsErrorString());
}
}
}
if (dt != DT_ISO) if (dt != DT_ISO)
UpdateProgress(OP_DOS, -1.0f); UpdateProgress(OP_DOS, -1.0f);