mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[iso] add support for isolinux/syslinux ISO images
* use a modified syslinux that can use isolinux config files * update syslinux to git version * remove embedding of chain.c32 for the time being
This commit is contained in:
		
							parent
							
								
									7753c017d6
								
							
						
					
					
						commit
						36be65ed23
					
				
					 22 changed files with 323 additions and 126 deletions
				
			
		
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -1,3 +1,5 @@ | |||
| o ldlinux.bss and ldlinux.sys were extracted from syslinux-4.05/core/ | ||||
|   and chain.c32 from  syslinux-4.05/com32/modules: | ||||
|   http://www.kernel.org/pub/linux/utils/boot/syslinux/ | ||||
| o ldlinux.bss and ldlinux.sys were compiled from the syslinux git tree retreived | ||||
|   on 2012.02.13 from git://git.kernel.org/pub/scm/boot/syslinux/syslinux.git | ||||
|   with the included .diff applied to be able to use unmodified isolinux config. | ||||
| o chain.c32 is from syslinux-4.05/com32/modules: | ||||
|   http://www.kernel.org/pub/linux/utils/boot/syslinux/ | ||||
							
								
								
									
										29
									
								
								res/syslinux/syslinux.diff
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								res/syslinux/syslinux.diff
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| diff --git a/core/fs/lib/loadconfig.c b/core/fs/lib/loadconfig.c
 | ||||
| index c9652b6..4dfe1b9 100644
 | ||||
| --- a/core/fs/lib/loadconfig.c
 | ||||
| +++ b/core/fs/lib/loadconfig.c
 | ||||
| @@ -10,6 +10,8 @@
 | ||||
|   * This searches for extlinux.conf and syslinux.cfg in the install | ||||
|   * directory, followed by a set of fallback directories.  If found, | ||||
|   * set the current working directory to match. | ||||
| + * isolinux configuration values are added for the case where ISO
 | ||||
| + * content has been duplicated to a disk (typically bootable USB).
 | ||||
|   */ | ||||
|  int generic_load_config(void) | ||||
|  { | ||||
| @@ -17,12 +19,15 @@ int generic_load_config(void)
 | ||||
|  	NULL,			/* CurrentDirName */ | ||||
|  	"/boot/syslinux", | ||||
|  	"/syslinux", | ||||
| +	"/boot/isolinux",
 | ||||
| +	"/isolinux",
 | ||||
|  	"/", | ||||
|  	NULL | ||||
|      }; | ||||
|      static const char *filenames[] = { | ||||
|  	"extlinux.conf", | ||||
|  	"syslinux.cfg", | ||||
| +	"isolinux.cfg",
 | ||||
|  	NULL | ||||
|      }; | ||||
|   | ||||
							
								
								
									
										71
									
								
								src/format.c
									
										
									
									
									
								
							
							
						
						
									
										71
									
								
								src/format.c
									
										
									
									
									
								
							|  | @ -307,7 +307,7 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive) | |||
| 
 | ||||
| 	fake_fd._ptr = (char*)hPhysicalDrive; | ||||
| 	fake_fd._bufsiz = SelectedDrive.Geometry.BytesPerSector; | ||||
| 	if (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) == DT_SYSLINUX) { | ||||
| 	if (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) == DT_ISO_FAT) { | ||||
| 		r = write_syslinux_mbr(&fake_fd); | ||||
| 	} else { | ||||
| 		r = write_95b_mbr(&fake_fd); | ||||
|  | @ -321,10 +321,11 @@ out: | |||
| /*
 | ||||
|  * Process the Partition Boot Record | ||||
|  */ | ||||
| static BOOL WritePBR(HANDLE hLogicalVolume, BOOL bFreeDOS) | ||||
| static BOOL WritePBR(HANDLE hLogicalVolume) | ||||
| { | ||||
| 	int i; | ||||
| 	FILE fake_fd = { 0 }; | ||||
| 	BOOL bFreeDOS = (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) == DT_FREEDOS); | ||||
| 
 | ||||
| 	fake_fd._ptr = (char*)hLogicalVolume; | ||||
| 	fake_fd._bufsiz = SelectedDrive.Geometry.BytesPerSector; | ||||
|  | @ -510,10 +511,10 @@ DWORD WINAPI FormatThread(LPVOID param) | |||
| 	UpdateProgress(OP_FIX_MBR, -1.0f); | ||||
| 
 | ||||
| 	if (IsChecked(IDC_DOS)) { | ||||
| 		switch (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType))) { | ||||
| 		case DT_FREEDOS: | ||||
| 		switch(ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType))) { | ||||
| 		case DT_WINME: | ||||
| 		case DT_ISO: | ||||
| 		case DT_FREEDOS: | ||||
| 		case DT_ISO_NTFS: | ||||
| 			// We still have a lock, which we need to modify the volume boot record 
 | ||||
| 			// => no need to reacquire the lock...
 | ||||
| 			hLogicalVolume = GetDriveHandle(num, drive_name, TRUE, FALSE); | ||||
|  | @ -527,32 +528,14 @@ DWORD WINAPI FormatThread(LPVOID param) | |||
| 			// after the FS is re-mounted by Windows
 | ||||
| 			UnmountDrive(hLogicalVolume); | ||||
| 			PrintStatus(0, TRUE, "Writing partition boot record..."); | ||||
| 			if (!WritePBR(hLogicalVolume, ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) == DT_FREEDOS)) { | ||||
| 				// Errorcode has already been set
 | ||||
| 			if (!WritePBR(hLogicalVolume)) { | ||||
| 				if (!FormatStatus) | ||||
| 					FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT; | ||||
| 				goto out; | ||||
| 			} | ||||
| 
 | ||||
| 			// We must close and unlock the volume to write files to it
 | ||||
| 			safe_unlockclose(hLogicalVolume); | ||||
| 			UpdateProgress(OP_DOS, -1.0f); | ||||
| 			if (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) != DT_ISO) { | ||||
| 				PrintStatus(0, TRUE, "Copying DOS files..."); | ||||
| 				if (!ExtractDOS(drive_name)) { | ||||
| 					if (!FormatStatus) | ||||
| 						FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANNOT_COPY; | ||||
| 					goto out; | ||||
| 				} | ||||
| 			} else if (iso_path != NULL) { | ||||
| 				PrintStatus(0, TRUE, "Copying ISO files..."); | ||||
| 				drive_name[2] = 0; | ||||
| 				if ( (!ExtractISO(iso_path, drive_name, FALSE)) && (!FormatStatus)) { | ||||
| 					FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANNOT_COPY; | ||||
| 				} | ||||
| 				drive_name[2] = '\\'; | ||||
| 			} | ||||
| 			break; | ||||
| 		// Syslinux requires patching of the PBR after the files have been extracted
 | ||||
| 		case DT_SYSLINUX: | ||||
| 		case DT_ISO_FAT: | ||||
| 			PrintStatus(0, TRUE, "Installing Syslinux..."); | ||||
| 			if (!InstallSyslinux(num, drive_name)) { | ||||
| 				FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INSTALL_FAILURE; | ||||
| 			} | ||||
|  | @ -560,7 +543,7 @@ DWORD WINAPI FormatThread(LPVOID param) | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// We issue a complete remount of the filesystem at the end on account of:
 | ||||
| 	// We issue a complete remount of the filesystem at on account of:
 | ||||
| 	// - Ensuring the file explorer properly detects that the volume was updated
 | ||||
| 	// - Ensuring that an NTFS system will be reparsed so that it becomes bootable
 | ||||
| 	// TODO: on cancellation, this can leave the drive unmounted!
 | ||||
|  | @ -573,9 +556,39 @@ DWORD WINAPI FormatThread(LPVOID param) | |||
| 				uprintf("Failed to remount %s on %s\n", drive_guid, drive_name); | ||||
| 				// This will leave the drive unaccessible and must be flagged as an error
 | ||||
| 				FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_REMOUNT_VOLUME); | ||||
| 				goto out; | ||||
| 			} | ||||
| 		} else { | ||||
| 			uprintf("Could not remount %s %s\n", drive_name, WindowsErrorString()); | ||||
| 			// Try to continue regardless
 | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (IsChecked(IDC_DOS)) { | ||||
| 		UpdateProgress(OP_DOS, -1.0f); | ||||
| 		switch(ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType))) { | ||||
| 		case DT_WINME: | ||||
| 		case DT_FREEDOS: | ||||
| 			PrintStatus(0, TRUE, "Copying DOS files..."); | ||||
| 			if (!ExtractDOS(drive_name)) { | ||||
| 				if (!FormatStatus) | ||||
| 					FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANNOT_COPY; | ||||
| 				goto out; | ||||
| 			} | ||||
| 			break; | ||||
| 		case DT_ISO_NTFS: | ||||
| 		case DT_ISO_FAT: | ||||
| 			// TODO: ISO_FAT: ensure the ISO doesn't have ldlinux.sys as it will break the existing one
 | ||||
| 			if (iso_path != NULL) { | ||||
| 				PrintStatus(0, TRUE, "Copying ISO files..."); | ||||
| 				drive_name[2] = 0; | ||||
| 				if ( (!ExtractISO(iso_path, drive_name, FALSE)) && (!FormatStatus)) { | ||||
| 					FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANNOT_COPY; | ||||
| 					goto out; | ||||
| 				} | ||||
| 				// TODO: ISO_FAT: create menu and stuff
 | ||||
| 			} | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										29
									
								
								src/iso.c
									
										
									
									
									
								
							
							
						
						
									
										29
									
								
								src/iso.c
									
										
									
									
									
								
							|  | @ -63,7 +63,8 @@ RUFUS_ISO_REPORT iso_report; | |||
| int64_t iso_blocking_status = -1; | ||||
| #define ISO_BLOCKING(x) do {x; iso_blocking_status++; } while(0) | ||||
| static const char *psz_extract_dir; | ||||
| static const char *isolinux_name = "isolinux", *bootmgr_name = "bootmgr"; | ||||
| static const char *bootmgr_name = "bootmgr"; | ||||
| static const char *isolinux_name[] = { "isolinux.cfg", "syslinux.cfg", "extlinux.conf"}; | ||||
| static uint64_t total_blocks, nb_blocks; | ||||
| static BOOL scan_only = FALSE; | ||||
| 
 | ||||
|  | @ -126,13 +127,7 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha | |||
| 			goto out; | ||||
| 		} | ||||
| 		if (udf_is_dir(p_udf_dirent)) { | ||||
| 			if (!scan_only) { | ||||
| 				_mkdir(psz_fullpath); | ||||
| 			} else { | ||||
| 				// Check for an "isolinux\" dir in root (psz_path = "")
 | ||||
| 				if ((*psz_path == 0) && (safe_strcmp(psz_basename, isolinux_name) == 0)) | ||||
| 					iso_report.has_isolinux = TRUE; | ||||
| 			} | ||||
| 			if (!scan_only) _mkdir(psz_fullpath); | ||||
| 			p_udf_dirent2 = udf_opendir(p_udf_dirent); | ||||
| 			if (p_udf_dirent2 != NULL) { | ||||
| 				if (udf_extract_files(p_udf, p_udf_dirent2, &psz_fullpath[strlen(psz_extract_dir)])) | ||||
|  | @ -144,6 +139,11 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha | |||
| 				// Check for a "bootmgr" file in root (psz_path = "")
 | ||||
| 				if ((*psz_path == 0) && (safe_strcmp(psz_basename, bootmgr_name) == 0)) | ||||
| 					iso_report.has_bootmgr = TRUE; | ||||
| 				// Check for a syslinux config file anywhere
 | ||||
| 				for (i=0; i<ARRAYSIZE(isolinux_name); i++) { | ||||
| 					if (safe_strcmp(psz_basename, isolinux_name[i]) == 0) | ||||
| 						iso_report.has_isolinux = TRUE; | ||||
| 				} | ||||
| 				if (i_file_length >= FOUR_GIGABYTES) | ||||
| 					iso_report.has_4GB_file = TRUE; | ||||
| 				total_blocks += i_file_length/UDF_BLOCKSIZE; | ||||
|  | @ -242,13 +242,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) | |||
| 			continue; | ||||
| 		iso9660_name_translate(p_statbuf->filename, psz_basename); | ||||
| 		if (p_statbuf->type == _STAT_DIR) { | ||||
| 			if (!scan_only) { | ||||
| 				_mkdir(psz_fullpath); | ||||
| 			} else { | ||||
| 				// Check for an "isolinux\" dir in root (psz_path = "")
 | ||||
| 				if ((*psz_path == 0) && (safe_strcmp(psz_basename, isolinux_name) == 0)) | ||||
| 					iso_report.has_isolinux = TRUE; | ||||
| 			} | ||||
| 			if (!scan_only) _mkdir(psz_fullpath); | ||||
| 			if (iso_extract_files(p_iso, psz_iso_name)) | ||||
| 				goto out; | ||||
| 		} else { | ||||
|  | @ -257,6 +251,11 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) | |||
| 				// Check for a "bootmgr" file in root (psz_path = "")
 | ||||
| 				if ((*psz_path == 0) && (safe_strcmp(psz_basename, bootmgr_name) == 0)) | ||||
| 					iso_report.has_bootmgr = TRUE; | ||||
| 				// Check for a syslinux config file anywhere
 | ||||
| 				for (i=0; i<ARRAYSIZE(isolinux_name); i++) { | ||||
| 					if (safe_strcmp(psz_basename, isolinux_name[i]) == 0) | ||||
| 						iso_report.has_isolinux = TRUE; | ||||
| 				} | ||||
| 				if (i_file_length >= FOUR_GIGABYTES) | ||||
| 					iso_report.has_4GB_file = TRUE; | ||||
| 				total_blocks += i_file_length/ISO_BLOCKSIZE; | ||||
|  |  | |||
							
								
								
									
										29
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										29
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -965,9 +965,10 @@ DWORD WINAPI ISOScanThread(LPVOID param) | |||
| 	} | ||||
| 	uprintf("ISO size: %lld bytes, 4GB:%c, bootmgr:%c, isolinux:%c\n", iso_report.projected_size, | ||||
| 		iso_report.has_4GB_file?'Y':'N', iso_report.has_bootmgr?'Y':'N', iso_report.has_isolinux?'Y':'N'); | ||||
| 	if (!iso_report.has_bootmgr) { | ||||
| 		MessageBoxU(hMainDialog, "This version of Rufus supports only\n" | ||||
| 			"ISO images that rely on 'bootmgr' - sorry.", "Unsupported ISO", MB_OK|MB_ICONINFORMATION); | ||||
| 	if ((!iso_report.has_bootmgr) && (!iso_report.has_isolinux)) { | ||||
| 		MessageBoxU(hMainDialog, "This version of Rufus only supports bootable ISOs\n" | ||||
| 			"based on 'bootmgr' or 'isolinux'.\n" | ||||
| 			"This ISO image doesn't appear to use either...", "Unsupported ISO", MB_OK|MB_ICONINFORMATION); | ||||
| 		safe_free(iso_path); | ||||
| 	} else { | ||||
| 		for (i=(int)safe_strlen(iso_path); (i>0)&&(iso_path[i]!='\\'); i--); | ||||
|  | @ -1095,7 +1096,7 @@ void InitDialog(HWND hDlg) | |||
| static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) | ||||
| { | ||||
| 	DRAWITEMSTRUCT* pDI; | ||||
| 	int nDeviceIndex, fs; | ||||
| 	int nDeviceIndex, fs, dt; | ||||
| 	DWORD DeviceNum; | ||||
| 	char str[MAX_PATH], tmp[128]; | ||||
| 	static UINT uDOSChecked = BST_CHECKED; | ||||
|  | @ -1218,11 +1219,10 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | |||
| 				if (bWithFreeDOS) | ||||
| 					IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "FreeDOS"), DT_FREEDOS)); | ||||
| 				if (bWithSyslinux) | ||||
| 					IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "Syslinux"), DT_SYSLINUX)); | ||||
| 					IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "ISO Image"), DT_ISO_FAT)); | ||||
| 			} | ||||
| 			if (fs == FS_NTFS) { | ||||
| 				// Only allow ISO with NTFS for the time being
 | ||||
| 				IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "ISO Image"), DT_ISO)); | ||||
| 				IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "ISO Image"), DT_ISO_NTFS)); | ||||
| 			} | ||||
| 			IGNORE_RETVAL(ComboBox_SetCurSel(hDOSType, (bWithFreeDOS && (fs != FS_NTFS))?1:0)); | ||||
| 			if (!IsWindowEnabled(hDOS)) { | ||||
|  | @ -1234,7 +1234,8 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | |||
| 		case IDC_DOSTYPE: | ||||
| 			if (HIWORD(wParam) != CBN_SELCHANGE) | ||||
| 				break; | ||||
| 			if (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) != DT_ISO) { | ||||
| 			dt = (int)ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)); | ||||
| 			if ((dt != DT_ISO_NTFS) && (dt != DT_ISO_FAT)) { | ||||
| 				ShowWindow(hSelectISO, SW_HIDE); | ||||
| 				break; | ||||
| 			} | ||||
|  | @ -1272,7 +1273,8 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | |||
| 			FormatStatus = 0; | ||||
| 			nDeviceIndex = ComboBox_GetCurSel(hDeviceList); | ||||
| 			if (nDeviceIndex != CB_ERR) { | ||||
| 				if (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) == DT_ISO) { | ||||
| 				dt = (int)ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)); | ||||
| 				if ((dt == DT_ISO_NTFS) || (dt == DT_ISO_FAT)) { | ||||
| 					if (iso_path == NULL) { | ||||
| 						MessageBoxA(hMainDialog, "Please click on the disc button to select a bootable ISO,\n" | ||||
| 							"or uncheck the \"Create a bootable disk...\" checkbox.", | ||||
|  | @ -1284,6 +1286,15 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | |||
| 							"for the selected target.", "ISO image too big...", MB_OK|MB_ICONERROR); | ||||
| 						break; | ||||
| 					} | ||||
| 					if ((dt == DT_ISO_NTFS) && (!iso_report.has_bootmgr)) { | ||||
| 						MessageBoxA(hMainDialog, "Only 'bootmgr' based ISO " | ||||
| 							"images can be used with NTFS.", "Unsupported ISO...", MB_OK|MB_ICONERROR); | ||||
| 						break; | ||||
| 					} else if ((dt == DT_ISO_FAT) && (!iso_report.has_isolinux)) { | ||||
| 						MessageBoxA(hMainDialog, "Only 'isolinux' based ISO " | ||||
| 							"images can be used with FAT.", "Unsupported ISO...", MB_OK|MB_ICONERROR); | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 				GetWindowTextA(hDeviceList, tmp, sizeof(tmp)); | ||||
| 				safe_sprintf(str, sizeof(str), "WARNING: ALL DATA ON DEVICE %s\r\nWILL BE DESTROYED.\r\n" | ||||
|  |  | |||
|  | @ -125,8 +125,8 @@ enum { | |||
| enum dos_type { | ||||
| 	DT_WINME = 0, | ||||
| 	DT_FREEDOS, | ||||
| 	DT_SYSLINUX, | ||||
| 	DT_ISO, | ||||
| 	DT_ISO_FAT, | ||||
| 	DT_ISO_NTFS, | ||||
| 	DT_MAX | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										14
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										14
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -33,7 +33,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL | |||
| IDD_DIALOG DIALOGEX 12, 12, 206, 278 | ||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||
| EXSTYLE WS_EX_APPWINDOW | ||||
| CAPTION "Rufus v1.1.0.131" | ||||
| CAPTION "Rufus v1.1.0.132" | ||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||
| BEGIN | ||||
|     DEFPUSHBUTTON   "Start",IDC_START,94,236,50,14 | ||||
|  | @ -71,7 +71,7 @@ BEGIN | |||
|     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP | ||||
|     CONTROL         "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL, | ||||
|                     "SysLink",WS_TABSTOP,46,47,114,9 | ||||
|     LTEXT           "Version 1.1.0 (Build 131)",IDC_STATIC,46,19,78,8 | ||||
|     LTEXT           "Version 1.1.0 (Build 132)",IDC_STATIC,46,19,78,8 | ||||
|     PUSHBUTTON      "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP | ||||
|     EDITTEXT        IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL | ||||
|     LTEXT           "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 | ||||
|  | @ -171,7 +171,6 @@ BEGIN | |||
|     "#if defined(WITH_SYSLINUX)\r\n" | ||||
|     "IDR_SL_LDLINUX_BSS      RCDATA                  ""../res/syslinux/ldlinux.bss""\r\n" | ||||
|     "IDR_SL_LDLINUX_SYS      RCDATA                  ""../res/syslinux/ldlinux.sys""\r\n" | ||||
|     "IDR_SL_CHAIN_C32        RCDATA                  ""../res/syslinux/chain.c32""\r\n" | ||||
|     "#endif\r\n" | ||||
|     "\r\n" | ||||
|     "// Must reference a manifest for visual styles and elevation\r\n" | ||||
|  | @ -223,8 +222,8 @@ END | |||
| // | ||||
| 
 | ||||
| VS_VERSION_INFO VERSIONINFO | ||||
|  FILEVERSION 1,1,0,131 | ||||
|  PRODUCTVERSION 1,1,0,131 | ||||
|  FILEVERSION 1,1,0,132 | ||||
|  PRODUCTVERSION 1,1,0,132 | ||||
|  FILEFLAGSMASK 0x3fL | ||||
| #ifdef _DEBUG | ||||
|  FILEFLAGS 0x1L | ||||
|  | @ -241,13 +240,13 @@ BEGIN | |||
|         BEGIN | ||||
|             VALUE "CompanyName", "akeo.ie" | ||||
|             VALUE "FileDescription", "Rufus" | ||||
|             VALUE "FileVersion", "1.1.0.131" | ||||
|             VALUE "FileVersion", "1.1.0.132" | ||||
|             VALUE "InternalName", "Rufus" | ||||
|             VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" | ||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||
|             VALUE "OriginalFilename", "rufus.exe" | ||||
|             VALUE "ProductName", "Rufus" | ||||
|             VALUE "ProductVersion", "1.1.0.131" | ||||
|             VALUE "ProductVersion", "1.1.0.132" | ||||
|         END | ||||
|     END | ||||
|     BLOCK "VarFileInfo" | ||||
|  | @ -309,7 +308,6 @@ IDR_FD_EGA18_CPX        RCDATA                  "../res/freedos/ega18.cpx" | |||
| #if defined(WITH_SYSLINUX) | ||||
| IDR_SL_LDLINUX_BSS      RCDATA                  "../res/syslinux/ldlinux.bss" | ||||
| IDR_SL_LDLINUX_SYS      RCDATA                  "../res/syslinux/ldlinux.sys" | ||||
| IDR_SL_CHAIN_C32        RCDATA                  "../res/syslinux/chain.c32" | ||||
| #endif | ||||
| 
 | ||||
| // Must reference a manifest for visual styles and elevation | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ | |||
| #include "resource.h" | ||||
| 
 | ||||
| #include "syslinux.h" | ||||
| #include "syslxfs.h" | ||||
| #include "libfat.h" | ||||
| #include "setadv.h" | ||||
| 
 | ||||
|  | @ -199,7 +200,7 @@ BOOL InstallSyslinux(DWORD num, const char* drive_name) | |||
| 	} | ||||
| 
 | ||||
| 	/* Make the syslinux boot sector */ | ||||
| 	syslinux_make_bootsect(sectbuf); | ||||
| 	syslinux_make_bootsect(sectbuf, VFAT); | ||||
| 
 | ||||
| 	/* Write boot sector back */ | ||||
| 	if (SetFilePointer(d_handle, 0, NULL, FILE_BEGIN) != 0 || | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <ItemGroup Label="ProjectConfigurations"> | ||||
|     <ProjectConfiguration Include="Debug|Win32"> | ||||
|  | @ -21,10 +21,12 @@ | |||
|   <ItemGroup> | ||||
|     <ClInclude Include="..\advconst.h" /> | ||||
|     <ClInclude Include="..\syslinux.h" /> | ||||
|     <ClInclude Include="..\syslxcom.h" /> | ||||
|     <ClInclude Include="..\syslxfs.h" /> | ||||
|     <ClInclude Include="..\syslxint.h" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="..\fat.c" /> | ||||
|     <ClCompile Include="..\fs.c" /> | ||||
|     <ClCompile Include="..\setadv.c" /> | ||||
|     <ClCompile Include="..\syslxmod.c" /> | ||||
|   </ItemGroup> | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <ItemGroup> | ||||
|     <Filter Include="Source Files"> | ||||
|  | @ -20,9 +20,15 @@ | |||
|     <ClInclude Include="..\syslxint.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\syslxfs.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\syslxcom.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="..\fat.c"> | ||||
|     <ClCompile Include="..\fs.c"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\setadv.c"> | ||||
|  |  | |||
|  | @ -12,6 +12,6 @@ USE_MSVCRT=1 | |||
| TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib \ | ||||
|            $(SDK_LIB_PATH)\user32.lib | ||||
| 
 | ||||
| SOURCES=fat.c         \ | ||||
| SOURCES=fs.c          \ | ||||
|         setadv.c      \ | ||||
|         syslxmod.c | ||||
|  | @ -1,4 +1,4 @@ | |||
| noinst_LIBRARIES = libinstaller.a | ||||
| 
 | ||||
| libinstaller_a_SOURCES = fat.c setadv.c syslxmod.c | ||||
| libinstaller_a_SOURCES = fs.c setadv.c syslxmod.c | ||||
| libinstaller_a_CFLAGS = $(AM_CFLAGS) | ||||
|  | @ -52,7 +52,7 @@ am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) | |||
| am__v_at_0 = @ | ||||
| libinstaller_a_AR = $(AR) $(ARFLAGS) | ||||
| libinstaller_a_LIBADD = | ||||
| am_libinstaller_a_OBJECTS = libinstaller_a-fat.$(OBJEXT) \
 | ||||
| am_libinstaller_a_OBJECTS = libinstaller_a-fs.$(OBJEXT) \
 | ||||
| 	libinstaller_a-setadv.$(OBJEXT) \
 | ||||
| 	libinstaller_a-syslxmod.$(OBJEXT) | ||||
| libinstaller_a_OBJECTS = $(am_libinstaller_a_OBJECTS) | ||||
|  | @ -167,7 +167,7 @@ top_build_prefix = @top_build_prefix@ | |||
| top_builddir = @top_builddir@ | ||||
| top_srcdir = @top_srcdir@ | ||||
| noinst_LIBRARIES = libinstaller.a | ||||
| libinstaller_a_SOURCES = fat.c setadv.c syslxmod.c | ||||
| libinstaller_a_SOURCES = fs.c setadv.c syslxmod.c | ||||
| libinstaller_a_CFLAGS = $(AM_CFLAGS) | ||||
| all: all-am | ||||
| 
 | ||||
|  | @ -225,13 +225,13 @@ distclean-compile: | |||
| 	$(AM_V_CC) @AM_BACKSLASH@ | ||||
| 	$(COMPILE) -c `$(CYGPATH_W) '$<'` | ||||
| 
 | ||||
| libinstaller_a-fat.o: fat.c | ||||
| libinstaller_a-fs.o: fs.c | ||||
| 	$(AM_V_CC) @AM_BACKSLASH@ | ||||
| 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-fat.o `test -f 'fat.c' || echo '$(srcdir)/'`fat.c | ||||
| 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-fs.o `test -f 'fs.c' || echo '$(srcdir)/'`fs.c | ||||
| 
 | ||||
| libinstaller_a-fat.obj: fat.c | ||||
| libinstaller_a-fs.obj: fs.c | ||||
| 	$(AM_V_CC) @AM_BACKSLASH@ | ||||
| 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-fat.obj `if test -f 'fat.c'; then $(CYGPATH_W) 'fat.c'; else $(CYGPATH_W) '$(srcdir)/fat.c'; fi` | ||||
| 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-fs.obj `if test -f 'fs.c'; then $(CYGPATH_W) 'fs.c'; else $(CYGPATH_W) '$(srcdir)/fs.c'; fi` | ||||
| 
 | ||||
| libinstaller_a-setadv.o: setadv.c | ||||
| 	$(AM_V_CC) @AM_BACKSLASH@ | ||||
|  |  | |||
|  | @ -1,7 +1,8 @@ | |||
| /* ----------------------------------------------------------------------- *
 | ||||
|  * | ||||
|  *   Copyright 1998-2008 H. Peter Anvin - All Rights Reserved | ||||
|  *   Copyright 2009-2010 Intel Corporation; author H. Peter Anvin | ||||
|  *   Copyright 1998-2011 H. Peter Anvin - All Rights Reserved | ||||
|  *   Copyright 2009-2011 Intel Corporation; author H. Peter Anvin | ||||
|  *   Copyright 2011 Paulo Alcantara <pcacjr@gmail.com> | ||||
|  * | ||||
|  *   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 | ||||
|  | @ -12,7 +13,7 @@ | |||
|  * ----------------------------------------------------------------------- */ | ||||
| 
 | ||||
| /*
 | ||||
|  * fat.c - Initial sanity check for FAT-based installers | ||||
|  * fs.c - Generic sanity check for FAT/NTFS-based installers | ||||
|  */ | ||||
| 
 | ||||
| #define _XOPEN_SOURCE 500	/* Required on glibc 2.x */ | ||||
|  | @ -25,45 +26,41 @@ | |||
| 
 | ||||
| #include "syslinux.h" | ||||
| #include "syslxint.h" | ||||
| #include "syslxcom.h" | ||||
| #include "syslxfs.h" | ||||
| 
 | ||||
| void syslinux_make_bootsect(void *bs) | ||||
| void syslinux_make_bootsect(void *bs, int fs_type) | ||||
| { | ||||
|     struct boot_sector *bootsect = bs; | ||||
|     const struct boot_sector *sbs = | ||||
| 	(const struct boot_sector *)boot_sector; | ||||
|     if (fs_type == VFAT) { | ||||
| 	struct fat_boot_sector *bootsect = bs; | ||||
| 	const struct fat_boot_sector *sbs = | ||||
| 	    (const struct fat_boot_sector *)boot_sector; | ||||
| 
 | ||||
|     memcpy(&bootsect->bsHead, &sbs->bsHead, bsHeadLen); | ||||
|     memcpy(&bootsect->bsCode, &sbs->bsCode, bsCodeLen); | ||||
| 	memcpy(&bootsect->FAT_bsHead, &sbs->FAT_bsHead, FAT_bsHeadLen); | ||||
| 	memcpy(&bootsect->FAT_bsCode, &sbs->FAT_bsCode, FAT_bsCodeLen); | ||||
|     } else if (fs_type == NTFS) { | ||||
| 	struct ntfs_boot_sector *bootsect = bs; | ||||
| 	const struct ntfs_boot_sector *sbs = | ||||
| 	    (const struct ntfs_boot_sector *)boot_sector; | ||||
| 
 | ||||
| 	memcpy(&bootsect->NTFS_bsHead, &sbs->NTFS_bsHead, NTFS_bsHeadLen); | ||||
| 	memcpy(&bootsect->NTFS_bsCode, &sbs->NTFS_bsCode, NTFS_bsCodeLen); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Check to see that what we got was indeed an MS-DOS boot sector/superblock; | ||||
|  * Return NULL if OK and otherwise an error message; | ||||
|  */ | ||||
| const char *syslinux_check_bootsect(const void *bs) | ||||
| static const char *check_fat_bootsect(const void *bs, int *fs_type) | ||||
| { | ||||
|     int sectorsize; | ||||
|     const struct fat_boot_sector *sectbuf = bs; | ||||
|     long long sectors, fatsectors, dsectors; | ||||
|     long long clusters; | ||||
|     int rootdirents, clustersize; | ||||
|     const struct boot_sector *sectbuf = bs; | ||||
| 
 | ||||
|     /* Must be 0xF0 or 0xF8..0xFF */ | ||||
|     if (get_8(§buf->bsMedia) != 0xF0 && get_8(§buf->bsMedia) < 0xF8) | ||||
| 	return "invalid media signature (not a FAT filesystem?)"; | ||||
| 
 | ||||
|     sectorsize = get_16(§buf->bsBytesPerSec); | ||||
|     if (sectorsize == SECTOR_SIZE) | ||||
| 	;			/* ok */ | ||||
|     else if (sectorsize >= 512 && sectorsize <= 4096 && | ||||
| 	     (sectorsize & (sectorsize - 1)) == 0) | ||||
| 	return "unsupported sectors size"; | ||||
|     else | ||||
| 	return "impossible sector size"; | ||||
| 
 | ||||
|     clustersize = get_8(§buf->bsSecPerClust); | ||||
|     if (clustersize == 0 || (clustersize & (clustersize - 1))) | ||||
| 	return "impossible cluster size"; | ||||
| 	return "impossible cluster size on an FAT volume"; | ||||
| 
 | ||||
|     sectors = get_16(§buf->bsSectors); | ||||
|     sectors = sectors ? sectors : get_32(§buf->bsHugeSectors); | ||||
|  | @ -79,16 +76,19 @@ const char *syslinux_check_bootsect(const void *bs) | |||
|     dsectors -= (rootdirents + sectorsize / 32 - 1) / sectorsize; | ||||
| 
 | ||||
|     if (dsectors < 0) | ||||
| 	return "negative number of data sectors"; | ||||
| 
 | ||||
|     if (fatsectors == 0) | ||||
| 	return "zero FAT sectors"; | ||||
| 	return "negative number of data sectors on an FAT volume"; | ||||
| 
 | ||||
|     clusters = dsectors / clustersize; | ||||
| 
 | ||||
|     fatsectors = get_16(§buf->bsFATsecs); | ||||
|     fatsectors = fatsectors ? fatsectors : get_32(§buf->bs32.FATSz32); | ||||
|     fatsectors *= get_8(§buf->bsFATs); | ||||
| 
 | ||||
|     if (!fatsectors) | ||||
| 	return "zero FAT sectors"; | ||||
| 
 | ||||
|     if (clusters < 0xFFF5) { | ||||
| 	/* FAT12 or FAT16 */ | ||||
| 
 | ||||
| 	if (!get_16(§buf->bsFATsecs)) | ||||
| 	    return "zero FAT sectors (FAT12/16)"; | ||||
| 
 | ||||
|  | @ -100,10 +100,10 @@ const char *syslinux_check_bootsect(const void *bs) | |||
| 		if (clusters < 0xFF5) | ||||
| 		    return "less than 4084 clusters but claims FAT16"; | ||||
| 	    } else if (!memcmp(§buf->bs16.FileSysType, "FAT32   ", 8)) { | ||||
| 		    return "less than 65525 clusters but claims FAT32"; | ||||
| 		return "less than 65525 clusters but claims FAT32"; | ||||
| 	    } else if (memcmp(§buf->bs16.FileSysType, "FAT     ", 8)) { | ||||
| 		static char fserr[] = | ||||
| 		    "filesystem type \"????????\" not supported"; | ||||
| 		static char fserr[] = "filesystem type \"????????\" not " | ||||
| 		    "supported"; | ||||
| 		memcpy(fserr + 17, §buf->bs16.FileSysType, 8); | ||||
| 		return fserr; | ||||
| 	    } | ||||
|  | @ -119,8 +119,54 @@ const char *syslinux_check_bootsect(const void *bs) | |||
| 	    memcmp(§buf->bs32.FileSysType, "FAT32   ", 8)) | ||||
| 	    return "missing FAT32 signature"; | ||||
|     } else { | ||||
| 	return "impossibly large number of clusters"; | ||||
| 	return "impossibly large number of clusters on an FAT volume"; | ||||
|     } | ||||
| 
 | ||||
|     if (fs_type) | ||||
| 	*fs_type = VFAT; | ||||
| 
 | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| static const char *check_ntfs_bootsect(const void *bs, int *fs_type) | ||||
| { | ||||
|     const struct ntfs_boot_sector *sectbuf = bs; | ||||
| 
 | ||||
|     if (memcmp(§buf->bsOemName, "NTFS    ", 8) && | ||||
| 	memcmp(§buf->bsOemName, "MSWIN4.0", 8) && | ||||
| 	memcmp(§buf->bsOemName, "MSWIN4.1", 8)) | ||||
| 	return "unknown OEM name but claims NTFS"; | ||||
| 
 | ||||
|     if (fs_type) | ||||
| 	*fs_type = NTFS; | ||||
| 
 | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| const char *syslinux_check_bootsect(const void *bs, int *fs_type) | ||||
| { | ||||
|     uint8_t media_sig; | ||||
|     int sectorsize; | ||||
|     const struct fat_boot_sector *sectbuf = bs; | ||||
|     const char *retval; | ||||
| 
 | ||||
|     media_sig = get_8(§buf->bsMedia); | ||||
|     /* Must be 0xF0 or 0xF8-0xFF for FAT/NTFS volumes */ | ||||
|     if (media_sig != 0xF0 && media_sig < 0xF8) | ||||
| 	return "invalid media signature (not an FAT/NTFS volume?)"; | ||||
| 
 | ||||
|     sectorsize = get_16(§buf->bsBytesPerSec); | ||||
|     if (sectorsize == SECTOR_SIZE) ;	/* ok */ | ||||
|     else if (sectorsize >= 512 && sectorsize <= 4096 && | ||||
| 	     (sectorsize & (sectorsize - 1)) == 0) | ||||
| 	return "unsupported sectors size"; | ||||
|     else | ||||
| 	return "impossible sector size"; | ||||
| 
 | ||||
|     if (ntfs_check_zero_fields((struct ntfs_boot_sector *)bs)) | ||||
| 	retval = check_ntfs_bootsect(bs, fs_type); | ||||
|     else | ||||
| 	retval = check_fat_bootsect(bs, fs_type); | ||||
| 
 | ||||
|     return retval; | ||||
| } | ||||
|  | @ -20,6 +20,7 @@ | |||
|  * Return 0 on success, -1 on error, and set errno. | ||||
|  * | ||||
|  */ | ||||
| //#define  _GNU_SOURCE
 | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|  | @ -28,6 +29,8 @@ | |||
| #include <string.h> | ||||
| #include <errno.h> | ||||
| #include "syslxint.h" | ||||
| #include "syslxcom.h" | ||||
| #include "syslxfs.h" | ||||
| 
 | ||||
| unsigned char syslinux_adv[2 * ADV_SIZE]; | ||||
| 
 | ||||
|  |  | |||
|  | @ -14,7 +14,6 @@ | |||
| #define SYSLINUX_H | ||||
| 
 | ||||
| #include <inttypes.h> | ||||
| #include <sys/types.h> | ||||
| #include "advconst.h" | ||||
| #include "setadv.h" | ||||
| 
 | ||||
|  | @ -41,10 +40,10 @@ extern const int syslinux_mbr_mtime; | |||
| #define SECTOR_SIZE	(1 << SECTOR_SHIFT) | ||||
| 
 | ||||
| /* This takes a boot sector and merges in the syslinux fields */ | ||||
| void syslinux_make_bootsect(void *); | ||||
| void syslinux_make_bootsect(void *bs, int fs_type); | ||||
| 
 | ||||
| /* Check to see that what we got was indeed an MS-DOS boot sector/superblock */ | ||||
| const char *syslinux_check_bootsect(const void *bs); | ||||
| const char *syslinux_check_bootsect(const void *bs, int *fs_type); | ||||
| 
 | ||||
| /* This patches the boot sector and ldlinux.sys based on a sector map */ | ||||
| typedef uint64_t sector_t; | ||||
|  |  | |||
							
								
								
									
										6
									
								
								src/syslinux/libinstaller/syslxcom.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/syslinux/libinstaller/syslxcom.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | |||
| #ifndef _H_SYSLXCOM_ | ||||
| #define _H_SYSLXCOM_ | ||||
| 
 | ||||
| /* Rufus placeholder */ | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										26
									
								
								src/syslinux/libinstaller/syslxfs.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/syslinux/libinstaller/syslxfs.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| /*
 | ||||
|  *   Copyright 2011 Paulo Alcantara <pcacjr@gmail.com> | ||||
|  * | ||||
|  *   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 | ||||
|  *   the Free Software Foundation, Inc., 53 Temple Place Ste 330, | ||||
|  *   Boston MA 02111-1307, USA; either version 2 of the License, or | ||||
|  *   (at your option) any later version; incorporated herein by reference. | ||||
|  * | ||||
|  * ----------------------------------------------------------------------- */ | ||||
| 
 | ||||
| #ifndef _SYSLXFS_H_ | ||||
| #define _SYSLXFS_H_ | ||||
| 
 | ||||
| /* Global fs_type for handling fat, ntfs, ext2/3/4 and btrfs */ | ||||
| enum filesystem { | ||||
|     NONE, | ||||
|     EXT2, | ||||
|     BTRFS, | ||||
|     VFAT, | ||||
|     NTFS, | ||||
| }; | ||||
| 
 | ||||
| //extern int fs_type;
 | ||||
| 
 | ||||
| #endif /* _SYSLXFS_H_ */ | ||||
|  | @ -2,6 +2,7 @@ | |||
|  * | ||||
|  *   Copyright 2007-2008 H. Peter Anvin - All Rights Reserved | ||||
|  *   Copyright 2009-2011 Intel Corporation; author: H. Peter Anvin | ||||
|  *   Copyright 2011 Paulo Alcantara <pcacjr@gmail.com> | ||||
|  * | ||||
|  *   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 | ||||
|  | @ -193,7 +194,7 @@ struct syslinux_extent { | |||
| }; | ||||
| 
 | ||||
| /* FAT bootsector format, also used by other disk-based derivatives */ | ||||
| struct boot_sector { | ||||
| struct fat_boot_sector { | ||||
|     uint8_t bsJump[3]; | ||||
|     char bsOemName[8]; | ||||
|     uint16_t bsBytesPerSec; | ||||
|  | @ -241,15 +242,70 @@ struct boot_sector { | |||
|     uint16_t bsForwardPtr; | ||||
|     uint16_t bsSignature; | ||||
| }; | ||||
| 
 | ||||
| /* NTFS bootsector format */ | ||||
| struct ntfs_boot_sector { | ||||
|     uint8_t bsJump[3]; | ||||
|     char bsOemName[8]; | ||||
|     uint16_t bsBytesPerSec; | ||||
|     uint8_t bsSecPerClust; | ||||
|     uint16_t bsResSectors; | ||||
|     uint8_t bsZeroed_0[3]; | ||||
|     uint16_t bsZeroed_1; | ||||
|     uint8_t bsMedia; | ||||
|     uint16_t bsZeroed_2; | ||||
|     uint16_t bsUnused_0; | ||||
|     uint16_t bsUnused_1; | ||||
|     uint32_t bsUnused_2; | ||||
|     uint32_t bsZeroed_3; | ||||
|     uint32_t bsUnused_3; | ||||
|     uint64_t bsTotalSectors; | ||||
|     uint64_t bsMFTLogicalClustNr; | ||||
|     uint64_t bsMFTMirrLogicalClustNr; | ||||
|     uint8_t bsClustPerMFTrecord; | ||||
|     uint8_t bsUnused_4[3]; | ||||
|     uint8_t bsClustPerIdxBuf; | ||||
|     uint8_t bsUnused_5[3]; | ||||
|     uint64_t bsVolSerialNr; | ||||
|     uint32_t bsUnused_6; | ||||
| 
 | ||||
|     uint8_t Code[420]; | ||||
| 
 | ||||
|     uint32_t bsMagic; | ||||
|     uint16_t bsForwardPtr; | ||||
|     uint16_t bsSignature; | ||||
| }; | ||||
| #pragma pack(pop) | ||||
| 
 | ||||
| #define bsHead      bsJump | ||||
| #define bsHeadLen   offsetof(struct boot_sector, bsBytesPerSec) | ||||
| #define bsCode	    bs32.Code	/* The common safe choice */ | ||||
| #define bsCodeLen   (offsetof(struct boot_sector, bsSignature) - \ | ||||
| 		     offsetof(struct boot_sector, bsCode)) | ||||
| #define FAT_bsHead      bsJump | ||||
| #define FAT_bsHeadLen   offsetof(struct fat_boot_sector, bsBytesPerSec) | ||||
| #define FAT_bsCode	    bs32.Code	/* The common safe choice */ | ||||
| #define FAT_bsCodeLen   (offsetof(struct fat_boot_sector, bsSignature) - \ | ||||
| 		     offsetof(struct fat_boot_sector, FAT_bsCode)) | ||||
| 
 | ||||
| static inline int fat_check_sb_fields(const struct boot_sector *sb) | ||||
| #define NTFS_bsHead     bsJump | ||||
| #define NTFS_bsHeadLen  offsetof(struct ntfs_boot_sector, bsOemName) | ||||
| #define NTFS_bsCode     Code | ||||
| #define NTFS_bsCodeLen  (offsetof(struct ntfs_boot_sector, bsSignature) - \ | ||||
|                             offsetof(struct ntfs_boot_sector, NTFS_bsCode)) | ||||
| 
 | ||||
| /* Check if there are specific zero fields in an NTFS boot sector */ | ||||
| static inline int ntfs_check_zero_fields(const struct ntfs_boot_sector *sb) | ||||
| { | ||||
|     return !sb->bsResSectors && (!sb->bsZeroed_0[0] && !sb->bsZeroed_0[1] && | ||||
|             !sb->bsZeroed_0[2]) && !sb->bsZeroed_1 && !sb->bsZeroed_2 && | ||||
|             !sb->bsZeroed_3; | ||||
| } | ||||
| 
 | ||||
| static inline int ntfs_check_sb_fields(const struct ntfs_boot_sector *sb) | ||||
| { | ||||
|     return ntfs_check_zero_fields(sb) && | ||||
|             (!memcmp(sb->bsOemName, "NTFS    ", 8) || | ||||
|              !memcmp(sb->bsOemName, "MSWIN4.0", 8) || | ||||
|              !memcmp(sb->bsOemName, "MSWIN4.1", 8)); | ||||
| } | ||||
| 
 | ||||
| static inline int fat_check_sb_fields(const struct fat_boot_sector *sb) | ||||
| { | ||||
|     return sb->bsResSectors && sb->bsFATs && | ||||
|             (!memcmp(sb->bs16.FileSysType, "FAT12   ", 8) || | ||||
|  |  | |||
|  | @ -110,7 +110,7 @@ int syslinux_patch(const sector_t *sectp, int nsectors, | |||
|     int nsect = ((boot_image_len + SECTOR_SIZE - 1) >> SECTOR_SHIFT) + 2; | ||||
|     uint32_t csum; | ||||
|     int i, dw, nptrs; | ||||
|     struct boot_sector *sbs = (struct boot_sector *)boot_sector; | ||||
|     struct fat_boot_sector *sbs = (struct fat_boot_sector *)boot_sector; | ||||
|     uint64_t *advptrs; | ||||
| 
 | ||||
|     if (nsectors < nsect) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue