mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[core] add ReactOS support
* Use Syslinux v4 and mboot.c32 to chainload setupldr.sys * Closes #266
This commit is contained in:
		
							parent
							
								
									6e1b50b7a0
								
							
						
					
					
						commit
						e9e27d7034
					
				
					 8 changed files with 66 additions and 17 deletions
				
			
		
							
								
								
									
										
											BIN
										
									
								
								res/syslinux/mboot.c32
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								res/syslinux/mboot.c32
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -1,3 +1,4 @@ | |||
| o ldlinux_v4.[bss|sys] have been renamed from ldlinux.[bss|sys] found in syslinux-4.07/core/ | ||||
| o ldlinux_v5.[bss|sys] have been renamed from ldlinux.[bss|sys] found in syslinux-5.10/core/ | ||||
| o mboot.c32 comes from syslinux-4.07/com32/mboot | ||||
|   http://www.kernel.org/pub/linux/utils/boot/syslinux/ | ||||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  * Rufus: The Reliable USB Formatting Utility | ||||
|  * ISO file extraction | ||||
|  * Copyright © 2011-2013 Pete Batard <pete@akeo.ie> | ||||
|  * Copyright © 2011-2014 Pete Batard <pete@akeo.ie> | ||||
|  * Based on libcdio's iso & udf samples: | ||||
|  * Copyright © 2003-2012 Rocky Bernstein <rocky@gnu.org> | ||||
|  * | ||||
|  | @ -65,6 +65,7 @@ static const char* efi_dirname = "/efi/boot"; | |||
| static const char* isolinux_name[] = { "isolinux.cfg", "syslinux.cfg", "extlinux.conf"}; | ||||
| static const char* pe_dirname[] = { "/i386", "/minint" }; | ||||
| static const char* pe_file[] = { "ntdetect.com", "setupldr.bin", "txtsetup.sif" }; | ||||
| static const char* reactos_name = "setupldr.sys"; // TODO: freeldr.sys doesn't seem to work
 | ||||
| static const char* autorun_name = "autorun.inf"; | ||||
| static const char* old_c32_name[NB_OLD_C32] = OLD_C32_NAMES; | ||||
| static const int64_t old_c32_threshold[NB_OLD_C32] = OLD_C32_THRESHOLD; | ||||
|  | @ -161,6 +162,10 @@ static BOOL check_iso_props(const char* psz_dirname, BOOL* is_syslinux_cfg, BOOL | |||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// Check for ReactOS' setupldr.sys anywhere
 | ||||
| 		if ((iso_report.reactos_path[0] == 0) && (safe_stricmp(psz_basename, reactos_name) == 0)) | ||||
| 			safe_strcpy(iso_report.reactos_path, sizeof(iso_report.reactos_path), psz_fullpath); | ||||
| 
 | ||||
| 		// Check for the EFI boot directory
 | ||||
| 		if (safe_stricmp(psz_dirname, efi_dirname) == 0) | ||||
| 			iso_report.has_efi = TRUE; | ||||
|  |  | |||
|  | @ -45,6 +45,7 @@ | |||
| #define IDR_SL_LDLINUX_V4_SYS           401 | ||||
| #define IDR_SL_LDLINUX_V5_BSS           402 | ||||
| #define IDR_SL_LDLINUX_V5_SYS           403 | ||||
| #define IDR_SL_MBOOT_C32                404 | ||||
| #define IDR_LC_RUFUS_LOC                500 | ||||
| #define IDC_DEVICE                      1001 | ||||
| #define IDC_FILESYSTEM                  1002 | ||||
|  |  | |||
							
								
								
									
										13
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -1,6 +1,6 @@ | |||
| /*
 | ||||
|  * Rufus: The Reliable USB Formatting Utility | ||||
|  * Copyright © 2011-2013 Pete Batard <pete@akeo.ie> | ||||
|  * Copyright © 2011-2014 Pete Batard <pete@akeo.ie> | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  | @ -1153,9 +1153,9 @@ DWORD WINAPI ISOScanThread(LPVOID param) | |||
| 		goto out; | ||||
| 	} | ||||
| 	uprintf("ISO label: '%s'\r\n  Size: %lld bytes\r\n  Has a >64 chars filename: %s\r\n  Has a >4GB file: %s\r\n" | ||||
| 		"  Uses EFI: %s%s\r\n  Uses Bootmgr: %s\r\n  Uses WinPE: %s%s\r\n  Uses isolinux: %s %s\n", | ||||
| 		iso_report.label, iso_report.projected_size, iso_report.has_long_filename?"Yes":"No", | ||||
| 		iso_report.has_4GB_file?"Yes":"No", (iso_report.has_efi || iso_report.has_win7_efi)?"Yes":"No", | ||||
| 		"  ReactOS: %s\r\n  Uses EFI: %s%s\r\n  Uses Bootmgr: %s\r\n  Uses WinPE: %s%s\r\n  Uses isolinux: %s %s\r\n", | ||||
| 		iso_report.label, iso_report.projected_size, iso_report.has_long_filename?"Yes":"No", iso_report.has_4GB_file?"Yes":"No", | ||||
| 		IS_REACTOS(iso_report)?"Yes":"No", (iso_report.has_efi || iso_report.has_win7_efi)?"Yes":"No", | ||||
| 		(iso_report.has_win7_efi && (!iso_report.has_efi))?" (win7_x64)":"", iso_report.has_bootmgr?"Yes":"No", | ||||
| 		IS_WINPE(iso_report.winpe)?"Yes":"No", (iso_report.uses_minint)?" (with /minint)":"", iso_report.has_isolinux?"Yes":"No", | ||||
| 		iso_report.has_syslinux_v5?"(v5.0 or later)":iso_report.has_isolinux?"(v4.x or earlier)":""); | ||||
|  | @ -1164,7 +1164,8 @@ DWORD WINAPI ISOScanThread(LPVOID param) | |||
| 			uprintf("    With an old %s: %s\n", old_c32_name[i], iso_report.has_old_c32[i]?"Yes":"No"); | ||||
| 		} | ||||
| 	} | ||||
| 	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) && (!IS_REACTOS(iso_report)) ) { | ||||
| 		MessageBoxU(hMainDialog, lmprintf(MSG_082), lmprintf(MSG_081), MB_OK|MB_ICONINFORMATION); | ||||
| 		safe_free(iso_path); | ||||
| 		SetMBRProps(); | ||||
|  | @ -1324,7 +1325,7 @@ static BOOL BootCheck(void) | |||
| 				MessageBoxU(hMainDialog, lmprintf(MSG_097), lmprintf(MSG_090), MB_OK|MB_ICONERROR); | ||||
| 			} | ||||
| 			return FALSE; | ||||
| 		} else if (((fs == FS_FAT16)||(fs == FS_FAT32)) && (!iso_report.has_isolinux)) { | ||||
| 		} else if (((fs == FS_FAT16)||(fs == FS_FAT32)) && (!iso_report.has_isolinux) && (!IS_REACTOS(iso_report))) { | ||||
| 			// FAT/FAT32 can only be used for isolinux based ISO images or when the Target Type is UEFI
 | ||||
| 			MessageBoxU(hMainDialog, lmprintf(MSG_098), lmprintf(MSG_090), MB_OK|MB_ICONERROR); | ||||
| 			return FALSE; | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| /*
 | ||||
|  * Rufus: The Reliable USB Formatting Utility | ||||
|  * Copyright © 2011-2013 Pete Batard <pete@akeo.ie> | ||||
|  * Copyright © 2011-2014 Pete Batard <pete@akeo.ie> | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  | @ -212,11 +212,13 @@ typedef struct { | |||
| #define WINPE_I386      0x15 | ||||
| #define IS_WINPE(r)     (((r&WINPE_MININT) == WINPE_MININT)||((r&WINPE_I386) == WINPE_I386)) | ||||
| #define IS_EFI(r)       ((r.has_efi) || (r.has_win7_efi)) | ||||
| #define IS_REACTOS(r)   (r.reactos_path[0] != 0) | ||||
| 
 | ||||
| typedef struct { | ||||
| 	char label[192];		/* 3*64 to account for UTF-8 */ | ||||
| 	char usb_label[192];	/* converted USB label for workaround */ | ||||
| 	char cfg_path[128];		/* path to the ISO's isolinux.cfg */ | ||||
| 	char reactos_path[128];	/* path to the ISO's freeldr.sys or setupldr.sys */ | ||||
| 	uint64_t projected_size; | ||||
| 	// TODO: use a bitmask and #define tests for the following
 | ||||
| 	uint8_t winpe; | ||||
|  |  | |||
							
								
								
									
										12
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL | |||
| IDD_DIALOG DIALOGEX 12, 12, 206, 329 | ||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||
| EXSTYLE WS_EX_APPWINDOW | ||||
| CAPTION "Rufus v1.4.2.367" | ||||
| CAPTION "Rufus v1.4.2.368" | ||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||
| BEGIN | ||||
|     DEFPUSHBUTTON   "Start",IDC_START,94,291,50,14 | ||||
|  | @ -199,6 +199,7 @@ BEGIN | |||
|     "IDR_SL_LDLINUX_V4_SYS   RCDATA                  ""../res/syslinux/ldlinux_v4.sys""\r\n" | ||||
|     "IDR_SL_LDLINUX_V5_BSS   RCDATA                  ""../res/syslinux/ldlinux_v5.bss""\r\n" | ||||
|     "IDR_SL_LDLINUX_V5_SYS   RCDATA                  ""../res/syslinux/ldlinux_v5.sys""\r\n" | ||||
|     "IDR_SL_MBOOT_C32        RCDATA                  ""../res/syslinux/mboot.c32""\r\n" | ||||
|     "IDR_BR_MBR_BIN          RCDATA                  ""../res/mbr/mbr.bin""\r\n" | ||||
|     "IDR_FD_COMMAND_COM      RCDATA                  ""../res/freedos/COMMAND.COM""\r\n" | ||||
|     "IDR_FD_KERNEL_SYS       RCDATA                  ""../res/freedos/KERNEL.SYS""\r\n" | ||||
|  | @ -288,8 +289,8 @@ END | |||
| // | ||||
| 
 | ||||
| VS_VERSION_INFO VERSIONINFO | ||||
|  FILEVERSION 1,4,2,367 | ||||
|  PRODUCTVERSION 1,4,2,367 | ||||
|  FILEVERSION 1,4,2,368 | ||||
|  PRODUCTVERSION 1,4,2,368 | ||||
|  FILEFLAGSMASK 0x3fL | ||||
| #ifdef _DEBUG | ||||
|  FILEFLAGS 0x1L | ||||
|  | @ -306,13 +307,13 @@ BEGIN | |||
|         BEGIN | ||||
|             VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" | ||||
|             VALUE "FileDescription", "Rufus" | ||||
|             VALUE "FileVersion", "1.4.2.367" | ||||
|             VALUE "FileVersion", "1.4.2.368" | ||||
|             VALUE "InternalName", "Rufus" | ||||
|             VALUE "LegalCopyright", "© 2011-2014 Pete Batard (GPL v3)" | ||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||
|             VALUE "OriginalFilename", "rufus.exe" | ||||
|             VALUE "ProductName", "Rufus" | ||||
|             VALUE "ProductVersion", "1.4.2.367" | ||||
|             VALUE "ProductVersion", "1.4.2.368" | ||||
|         END | ||||
|     END | ||||
|     BLOCK "VarFileInfo" | ||||
|  | @ -352,6 +353,7 @@ IDR_SL_LDLINUX_V4_BSS   RCDATA                  "../res/syslinux/ldlinux_v4.bss" | |||
| IDR_SL_LDLINUX_V4_SYS   RCDATA                  "../res/syslinux/ldlinux_v4.sys" | ||||
| IDR_SL_LDLINUX_V5_BSS   RCDATA                  "../res/syslinux/ldlinux_v5.bss" | ||||
| IDR_SL_LDLINUX_V5_SYS   RCDATA                  "../res/syslinux/ldlinux_v5.sys" | ||||
| IDR_SL_MBOOT_C32        RCDATA                  "../res/syslinux/mboot.c32" | ||||
| IDR_BR_MBR_BIN          RCDATA                  "../res/mbr/mbr.bin" | ||||
| IDR_FD_COMMAND_COM      RCDATA                  "../res/freedos/COMMAND.COM" | ||||
| IDR_FD_KERNEL_SYS       RCDATA                  "../res/freedos/KERNEL.SYS" | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
|  * | ||||
|  *   Copyright 2003 Lars Munch Christensen - All Rights Reserved | ||||
|  *   Copyright 1998-2008 H. Peter Anvin - All Rights Reserved | ||||
|  *   Copyright 2012-2013 Pete Batard | ||||
|  *   Copyright 2012-2014 Pete Batard | ||||
|  * | ||||
|  *   Based on the Linux installer program for SYSLINUX by H. Peter Anvin | ||||
|  * | ||||
|  | @ -39,6 +39,8 @@ unsigned char* syslinux_ldlinux = NULL; | |||
| DWORD syslinux_ldlinux_len; | ||||
| unsigned char* syslinux_bootsect = NULL; | ||||
| DWORD syslinux_bootsect_len; | ||||
| unsigned char* syslinux_mboot = NULL; | ||||
| DWORD syslinux_mboot_len; | ||||
| 
 | ||||
| /*
 | ||||
|  * Wrapper for ReadFile suitable for libfat | ||||
|  | @ -77,12 +79,14 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter) | |||
| 	FILE* fd; | ||||
| 
 | ||||
| 	static unsigned char sectbuf[SECTOR_SIZE]; | ||||
| 	static LPSTR resource[2][2] = { | ||||
| 	static char* resource[2][2] = { | ||||
| 		{ MAKEINTRESOURCEA(IDR_SL_LDLINUX_V4_SYS), MAKEINTRESOURCEA(IDR_SL_LDLINUX_V4_BSS) }, | ||||
| 		{ MAKEINTRESOURCEA(IDR_SL_LDLINUX_V5_SYS), MAKEINTRESOURCEA(IDR_SL_LDLINUX_V5_BSS) } }; | ||||
| 	static char ldlinux_path[] = "?:\\ldlinux.sys"; | ||||
| 	static char* ldlinux_sys = &ldlinux_path[3]; | ||||
| 	const char* ldlinux_c32 = "ldlinux.c32"; | ||||
| 	const char* mboot_c32 = "mboot.c32"; | ||||
| 	char path[MAX_PATH]; | ||||
| 	struct libfat_filesystem *fs; | ||||
| 	libfat_sector_t s, *secp; | ||||
| 	libfat_sector_t *sectors = NULL; | ||||
|  | @ -223,6 +227,39 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter) | |||
| 				uprintf("Failed to create '%s': %s\n", ldlinux_path, WindowsErrorString()); | ||||
| 			} | ||||
| 		} | ||||
| 	} else if (IS_REACTOS(iso_report)) { | ||||
| 		uprintf("Setting up ReactOS...\n"); | ||||
| 		syslinux_mboot = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_SL_MBOOT_C32), | ||||
| 			_RT_RCDATA, "mboot.c32", &syslinux_mboot_len, FALSE); | ||||
| 		if (syslinux_mboot == NULL) { | ||||
| 			goto out; | ||||
| 		} | ||||
| 		/* Create mboot.c32 file */ | ||||
| 		safe_sprintf(path, sizeof(path), "%c:\\%s", drive_letter, mboot_c32); | ||||
| 		f_handle = CreateFileA(path, GENERIC_READ | GENERIC_WRITE, | ||||
| 				  FILE_SHARE_READ | FILE_SHARE_WRITE, | ||||
| 				  NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | ||||
| 		if (f_handle == INVALID_HANDLE_VALUE) { | ||||
| 			uprintf("Unable to create '%s'\n", path); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		if (!WriteFile(f_handle, syslinux_mboot, syslinux_mboot_len, | ||||
| 			   &bytes_written, NULL) || | ||||
| 			bytes_written != syslinux_mboot_len) { | ||||
| 			uprintf("Could not write '%s'\n", path); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		safe_closehandle(f_handle); | ||||
| 		safe_sprintf(path, sizeof(path), "%c:\\syslinux.cfg", drive_letter); | ||||
| 		fd = fopen(path, "w"); | ||||
| 		if (fd == NULL) { | ||||
| 			uprintf("Could not create ReactOS 'syslinux.cfg'\n"); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		/* Write the syslinux.cfg for ReactOS */ | ||||
| 		fprintf(fd, "DEFAULT ReactOS\nLABEL ReactOS\n  KERNEL %s\n  APPEND %s\n", | ||||
| 			mboot_c32, iso_report.reactos_path); | ||||
| 		fclose(fd); | ||||
| 	} | ||||
| 
 | ||||
| 	if (dt != DT_ISO) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue