mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[bb] badblocks check improvements & cleanup
* also added credits in about box
This commit is contained in:
		
							parent
							
								
									04bf6c6b3d
								
							
						
					
					
						commit
						5c2242beaa
					
				
					 4 changed files with 71 additions and 106 deletions
				
			
		
							
								
								
									
										103
									
								
								src/badblocks.c
									
										
									
									
									
								
							
							
						
						
									
										103
									
								
								src/badblocks.c
									
										
									
									
									
								
							|  | @ -47,6 +47,24 @@ | |||
| /*
 | ||||
|  *From e2fsprogs/lib/ext2fs/badblocks.c | ||||
|  */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Badblocks list | ||||
|  */ | ||||
| struct ext2_struct_u32_list { | ||||
| 	int   magic; | ||||
| 	int   num; | ||||
| 	int   size; | ||||
| 	__u32 *list; | ||||
| 	int   badblocks_flags; | ||||
| }; | ||||
| 
 | ||||
| struct ext2_struct_u32_iterate { | ||||
| 	int           magic; | ||||
| 	ext2_u32_list bb; | ||||
| 	int           ptr; | ||||
| }; | ||||
| 
 | ||||
| static errcode_t make_u32_list(int size, int num, __u32 *list, ext2_u32_list *ret) | ||||
| { | ||||
| 	ext2_u32_list	bb; | ||||
|  | @ -254,36 +272,27 @@ static void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter) | |||
| /*
 | ||||
|  * from e2fsprogs/misc/badblocks.c | ||||
|  */ | ||||
| static int v_flag = 2;			/* verbose */ | ||||
| static int s_flag = 1;			/* show progress of test */ | ||||
| static int t_flag = 0;			/* number of test patterns */ | ||||
| static int v_flag = 2;					/* verbose */ | ||||
| static int s_flag = 1;					/* show progress of test */ | ||||
| static int t_flag = 0;					/* number of test patterns */ | ||||
| static unsigned int *t_patts = NULL;	/* test patterns */ | ||||
| // TODO: set this from parameter
 | ||||
| static unsigned int max_bb = 32;		/* Abort test if more than this number of bad blocks has been encountered */ | ||||
| static unsigned int d_flag = 0;		/* delay factor between reads */ | ||||
| /* Abort test if more than this number of bad blocks has been encountered */ | ||||
| static unsigned int max_bb = EXT2_BAD_BLOCKS_THRESHOLD; | ||||
| static DWORD time_start; | ||||
| 
 | ||||
| #define T_INC 32 | ||||
| 
 | ||||
| unsigned int sys_page_size = 4096; | ||||
| 
 | ||||
| static blk_t currently_testing = 0; | ||||
| static blk_t num_blocks = 0; | ||||
| static blk_t num_read_errors = 0; | ||||
| static blk_t num_write_errors = 0; | ||||
| static blk_t num_corruption_errors = 0; | ||||
| static ext2_badblocks_list bb_list = NULL; | ||||
| static FILE *out; | ||||
| static blk_t next_bad = 0; | ||||
| static ext2_badblocks_iterate bb_iter = NULL; | ||||
| 
 | ||||
| enum error_types { READ_ERROR, WRITE_ERROR, CORRUPTION_ERROR }; | ||||
| 
 | ||||
| static __inline void *allocate_buffer(size_t size) { | ||||
| #ifdef __MINGW32__ | ||||
| 	return __mingw_aligned_malloc(size, sys_page_size); | ||||
| 	return __mingw_aligned_malloc(size, EXT2_SYS_PAGE_SIZE); | ||||
| #else  | ||||
| 	return _aligned_malloc(size, sys_page_size); | ||||
| 	return _aligned_malloc(size, EXT2_SYS_PAGE_SIZE); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
|  | @ -311,7 +320,7 @@ static int bb_output (blk_t bad, enum error_types error_type) | |||
| 	error_code = ext2fs_badblocks_list_add(bb_list, bad); | ||||
| 	if (error_code) { | ||||
| 		uprintf("Error %d adding to in-memory bad block list", error_code); | ||||
| 		exit (1); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	/* kludge:
 | ||||
|  | @ -403,9 +412,6 @@ static int do_read (HANDLE hDrive, unsigned char * buffer, int tryout, int block | |||
| 		    blk_t current_block) | ||||
| { | ||||
| 	long got; | ||||
| //	DWORD tv1, tv2;
 | ||||
| #define NANOSEC (1000000000L) | ||||
| #define MILISEC (1000L) | ||||
| 
 | ||||
| #if 0 | ||||
| 	printf("do_read: block %d, try %d\n", current_block, tryout); | ||||
|  | @ -415,54 +421,12 @@ static int do_read (HANDLE hDrive, unsigned char * buffer, int tryout, int block | |||
| 		print_status(); | ||||
| 
 | ||||
| 	/* Try the read */ | ||||
| //	if (d_flag)
 | ||||
| //		tv1 = GetTickCount();
 | ||||
| 	got = read_sectors(hDrive, block_size, current_block, tryout, buffer); | ||||
| 		// read (dev, buffer, tryout * block_size);
 | ||||
| //	if (d_flag)
 | ||||
| //		tv2 = GetTickCount();
 | ||||
| 	if (got < 0) | ||||
| 		got = 0; | ||||
| 	if (got & 511) | ||||
| 		uprintf("Weird value (%ld) in do_read\n", got); | ||||
| 	got /= block_size; | ||||
| 	if (d_flag && got == tryout) { | ||||
| // TODO: either remove or update for Windows
 | ||||
| #ifdef HAVE_NANOSLEEP | ||||
| 		struct timespec ts; | ||||
| 		ts.tv_sec = tv2.tv_sec - tv1.tv_sec; | ||||
| 		ts.tv_nsec = (tv2.tv_usec - tv1.tv_usec) * MILISEC; | ||||
| 		if (ts.tv_nsec < 0) { | ||||
| 			ts.tv_nsec += NANOSEC; | ||||
| 			ts.tv_sec -= 1; | ||||
| 		} | ||||
| 		/* increase/decrease the sleep time based on d_flag value */ | ||||
| 		ts.tv_sec = ts.tv_sec * d_flag / 100; | ||||
| 		ts.tv_nsec = ts.tv_nsec * d_flag / 100; | ||||
| 		if (ts.tv_nsec > NANOSEC) { | ||||
| 			ts.tv_sec += ts.tv_nsec / NANOSEC; | ||||
| 			ts.tv_nsec %= NANOSEC; | ||||
| 		} | ||||
| 		if (ts.tv_sec || ts.tv_nsec) | ||||
| 			nanosleep(&ts, NULL); | ||||
| #else | ||||
| #ifdef HAVE_USLEEP | ||||
| 		struct timeval tv; | ||||
| 		tv.tv_sec = tv2.tv_sec - tv1.tv_sec; | ||||
| 		tv.tv_usec = tv2.tv_usec - tv1.tv_usec; | ||||
| 		tv.tv_sec = tv.tv_sec * d_flag / 100; | ||||
| 		tv.tv_usec = tv.tv_usec * d_flag / 100; | ||||
| 		if (tv.tv_usec > 1000000) { | ||||
| 			tv.tv_sec += tv.tv_usec / 1000000; | ||||
| 			tv.tv_usec %= 1000000; | ||||
| 		} | ||||
| 		if (tv.tv_sec) | ||||
| 			sleep(tv.tv_sec); | ||||
| 		if (tv.tv_usec) | ||||
| 			usleep(tv.tv_usec); | ||||
| #endif | ||||
| #endif | ||||
| 	} | ||||
| 	return got; | ||||
| } | ||||
| 
 | ||||
|  | @ -719,6 +683,7 @@ struct saved_blk_record { | |||
| 	int	num; | ||||
| }; | ||||
| 
 | ||||
| // TODO: this is untested!
 | ||||
| static unsigned int test_nd(HANDLE hDrive, blk_t last_block, | ||||
| 			     int block_size, blk_t first_block, | ||||
| 			     unsigned int blocks_at_once) | ||||
|  | @ -745,6 +710,7 @@ static unsigned int test_nd(HANDLE hDrive, blk_t last_block, | |||
| 	error_code = ext2fs_badblocks_list_iterate_begin(bb_list,&bb_iter); | ||||
| 	if (error_code) { | ||||
| 		uprintf("Error %d while beginning bad block list iteration", error_code); | ||||
| 		// TODO
 | ||||
| 		exit (1); | ||||
| 	} | ||||
| 	do { | ||||
|  | @ -755,6 +721,7 @@ static unsigned int test_nd(HANDLE hDrive, blk_t last_block, | |||
| 	test_record = malloc (blocks_at_once*sizeof(struct saved_blk_record)); | ||||
| 	if (!blkbuf || !test_record) { | ||||
| 		uprintf("Error while allocating buffers"); | ||||
| 		// TODO
 | ||||
| 		exit (1); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -786,7 +753,7 @@ static unsigned int test_nd(HANDLE hDrive, blk_t last_block, | |||
| 				 block_size, test_record[i].block); | ||||
| 			save_ptr += test_record[i].num * block_size; | ||||
| 		} | ||||
| 		fflush (out); | ||||
| 		// TODO
 | ||||
| 		exit(1); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -963,14 +930,10 @@ static unsigned int test_nd(HANDLE hDrive, blk_t last_block, | |||
| int BadBlocks(HANDLE hPhysicalDrive, ULONGLONG disk_size, int block_size, int test_type) | ||||
| { | ||||
| 	errcode_t error_code; | ||||
| 	unsigned int blocks_at_once = 64; | ||||
| 	unsigned int (*test_func)(HANDLE, blk_t, | ||||
| 				  int, blk_t, | ||||
| 				  unsigned int); | ||||
| 	unsigned int (*test_func)(HANDLE, blk_t, int, blk_t, unsigned int); | ||||
| 	int num_passes = 0; | ||||
| 	int passes_clean = 0; | ||||
| 	int bb_count; | ||||
| 	blk_t first_block = 0, last_block = (blk_t)disk_size/block_size; | ||||
| 	blk_t bb_count = 0, first_block = 0, last_block = (blk_t)disk_size/block_size; | ||||
| 
 | ||||
| 	error_code = ext2fs_badblocks_list_create(&bb_list, 0); | ||||
| 	if (error_code) { | ||||
|  | @ -991,7 +954,7 @@ int BadBlocks(HANDLE hPhysicalDrive, ULONGLONG disk_size, int block_size, int te | |||
| 	} | ||||
| 	time_start = GetTickCount(); | ||||
| 	do { | ||||
| 		bb_count = test_func(hPhysicalDrive, last_block, block_size, first_block, blocks_at_once); | ||||
| 		bb_count = test_func(hPhysicalDrive, last_block, block_size, first_block, EXT2_BLOCKS_AT_ONCE); | ||||
| 		if (bb_count) | ||||
| 			passes_clean = 0; | ||||
| 		else | ||||
|  |  | |||
|  | @ -24,42 +24,40 @@ | |||
| #define __u32  UINT32 | ||||
| #endif | ||||
| typedef UINT32 blk_t; | ||||
| typedef struct ext2_struct_u32_list *ext2_badblocks_list; | ||||
| typedef struct ext2_struct_u32_iterate *ext2_badblocks_iterate; | ||||
| typedef struct ext2_struct_u32_list *ext2_u32_list; | ||||
| typedef struct ext2_struct_u32_iterate *ext2_u32_iterate; | ||||
| typedef long   errcode_t; | ||||
| typedef DWORD  errcode_t; | ||||
| 
 | ||||
| typedef struct ext2_struct_u32_list         *ext2_badblocks_list; | ||||
| typedef struct ext2_struct_u32_iterate      *ext2_badblocks_iterate; | ||||
| typedef struct ext2_struct_u32_list         *ext2_u32_list; | ||||
| typedef struct ext2_struct_u32_iterate      *ext2_u32_iterate; | ||||
| 
 | ||||
| #define EXT2_ET_NO_MEMORY                   (ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_NOT_ENOUGH_MEMORY) | ||||
| #define EXT2_ET_MAGIC_BADBLOCKS_LIST        (ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OBJECT_IN_LIST) | ||||
| #define EXT2_ET_MAGIC_BADBLOCKS_ITERATE     (ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INVALID_BLOCK) | ||||
| 
 | ||||
| #define EXT2_ET_NO_MEMORY                        (2133571398L) | ||||
| #define EXT2_ET_MAGIC_BADBLOCKS_LIST             (2133571330L) | ||||
| #define EXT2_ET_MAGIC_BADBLOCKS_ITERATE          (2133571331L) | ||||
| 
 | ||||
| #define EXT2_CHECK_MAGIC(struct, code) \ | ||||
| 	  if ((struct)->magic != (code)) return (code) | ||||
| 	if ((struct)->magic != (code)) return (code) | ||||
| #define EXT2_BAD_BLOCKS_THRESHOLD           32 | ||||
| #define EXT2_BLOCKS_AT_ONCE                 64 | ||||
| #define EXT2_SYS_PAGE_SIZE                  4096 | ||||
| 
 | ||||
| enum test_type { | ||||
| 	BADBLOCKS_RO,		/* Read-only */ | ||||
| 	BADBLOCKS_RW,		/* DESTRUCTIVE read-write */ | ||||
| 	BADBLOCKS_ND		/* non-destructive read-write */ | ||||
| }; | ||||
| enum error_types { READ_ERROR, WRITE_ERROR, CORRUPTION_ERROR }; | ||||
| 
 | ||||
| /*
 | ||||
|  * Badblocks list | ||||
|  * Badblocks report | ||||
|  */ | ||||
| struct ext2_struct_u32_list { | ||||
| 	int	magic; | ||||
| 	int	num; | ||||
| 	int	size; | ||||
| 	__u32	*list; | ||||
| 	int	badblocks_flags; | ||||
| }; | ||||
| 
 | ||||
| struct ext2_struct_u32_iterate { | ||||
| 	int			magic; | ||||
| 	ext2_u32_list		bb; | ||||
| 	int			ptr; | ||||
| }; | ||||
| 
 | ||||
| /* Test type */ | ||||
| enum { | ||||
| 	BADBLOCKS_RO,	/* Read-only */ | ||||
| 	BADBLOCKS_RW,	/* *DESTRUCTIVE* read-write */ | ||||
| 	BADBLOCKS_ND	/* non-destructive read-write */ | ||||
| }; | ||||
| typedef struct { | ||||
| 	blk_t bb_count; | ||||
| 	blk_t num_read_errors; | ||||
| 	blk_t num_write_errors; | ||||
| 	blk_t num_corruption_errors; | ||||
| } badblocks_report; | ||||
| 
 | ||||
| /*
 | ||||
|  * Shared prototypes | ||||
|  |  | |||
|  | @ -26,6 +26,10 @@ const char* additional_copyrights = | |||
| "http://ms-sys.sourceforge.net\r\n" | ||||
| "GNU General Public License (GPL) v2 or later\r\n" | ||||
| "\r\n" | ||||
| "Bad blocks testing from e2fsprogs by Theodore T'so and al:\r\n" | ||||
| "http://e2fsprogs.sourceforge.net\r\n" | ||||
| "GNU General Public License (GPL) v3 compatible\r\n" | ||||
| "\r\n" | ||||
| "fmifs.dll usage based on Formatx by Mark Russinovich:\r\n" | ||||
| "http://doc.sch130.nsc.ru/www.sysinternals.com/ntw2k/source/fmifs.shtml\r\n" | ||||
| "http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/fmifs\r\n" | ||||
|  |  | |||
							
								
								
									
										12
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -30,7 +30,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL | |||
| IDD_DIALOG DIALOGEX 12, 12, 206, 278 | ||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||
| EXSTYLE WS_EX_APPWINDOW | ||||
| CAPTION "Rufus v1.0.2.78" | ||||
| CAPTION "Rufus v1.0.2.79" | ||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||
| BEGIN | ||||
|     DEFPUSHBUTTON   "Start",IDC_START,94,236,50,14 | ||||
|  | @ -65,7 +65,7 @@ BEGIN | |||
|     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP | ||||
|     CONTROL         "<a href=""https://github.com/pbatard/rufus/wiki/Rufus"">https://github.com/pbatard/rufus</a>",IDC_ABOUT_RUFUS_URL, | ||||
|                     "SysLink",WS_TABSTOP,46,47,114,9 | ||||
|     LTEXT           "Version 1.0.2 (Build 78)",IDC_STATIC,46,19,78,8 | ||||
|     LTEXT           "Version 1.0.2 (Build 79)",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 | ||||
|  | @ -164,8 +164,8 @@ END | |||
| // | ||||
| 
 | ||||
| VS_VERSION_INFO VERSIONINFO | ||||
|  FILEVERSION 1,0,2,78 | ||||
|  PRODUCTVERSION 1,0,2,78 | ||||
|  FILEVERSION 1,0,2,79 | ||||
|  PRODUCTVERSION 1,0,2,79 | ||||
|  FILEFLAGSMASK 0x3fL | ||||
| #ifdef _DEBUG | ||||
|  FILEFLAGS 0x1L | ||||
|  | @ -182,13 +182,13 @@ BEGIN | |||
|         BEGIN | ||||
|             VALUE "CompanyName", "akeo.ie" | ||||
|             VALUE "FileDescription", "Rufus" | ||||
|             VALUE "FileVersion", "1.0.2.78" | ||||
|             VALUE "FileVersion", "1.0.2.79" | ||||
|             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.0.2.78" | ||||
|             VALUE "ProductVersion", "1.0.2.79" | ||||
|         END | ||||
|     END | ||||
|     BLOCK "VarFileInfo" | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue