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 |  *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) | static errcode_t make_u32_list(int size, int num, __u32 *list, ext2_u32_list *ret) | ||||||
| { | { | ||||||
| 	ext2_u32_list	bb; | 	ext2_u32_list	bb; | ||||||
|  | @ -254,36 +272,27 @@ static void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter) | ||||||
| /*
 | /*
 | ||||||
|  * from e2fsprogs/misc/badblocks.c |  * from e2fsprogs/misc/badblocks.c | ||||||
|  */ |  */ | ||||||
| static int v_flag = 2;			/* verbose */ | static int v_flag = 2;					/* verbose */ | ||||||
| static int s_flag = 1;			/* show progress of test */ | static int s_flag = 1;					/* show progress of test */ | ||||||
| static int t_flag = 0;			/* number of test patterns */ | static int t_flag = 0;					/* number of test patterns */ | ||||||
| static unsigned int *t_patts = NULL;	/* test patterns */ | static unsigned int *t_patts = NULL;	/* test patterns */ | ||||||
| // TODO: set this from parameter
 | /* Abort test if more than this number of bad blocks has been encountered */ | ||||||
| static unsigned int max_bb = 32;		/* Abort test if more than this number of bad blocks has been encountered */ | static unsigned int max_bb = EXT2_BAD_BLOCKS_THRESHOLD; | ||||||
| static unsigned int d_flag = 0;		/* delay factor between reads */ |  | ||||||
| static DWORD time_start; | static DWORD time_start; | ||||||
| 
 |  | ||||||
| #define T_INC 32 |  | ||||||
| 
 |  | ||||||
| unsigned int sys_page_size = 4096; |  | ||||||
| 
 |  | ||||||
| static blk_t currently_testing = 0; | static blk_t currently_testing = 0; | ||||||
| static blk_t num_blocks = 0; | static blk_t num_blocks = 0; | ||||||
| static blk_t num_read_errors = 0; | static blk_t num_read_errors = 0; | ||||||
| static blk_t num_write_errors = 0; | static blk_t num_write_errors = 0; | ||||||
| static blk_t num_corruption_errors = 0; | static blk_t num_corruption_errors = 0; | ||||||
| static ext2_badblocks_list bb_list = NULL; | static ext2_badblocks_list bb_list = NULL; | ||||||
| static FILE *out; |  | ||||||
| static blk_t next_bad = 0; | static blk_t next_bad = 0; | ||||||
| static ext2_badblocks_iterate bb_iter = NULL; | static ext2_badblocks_iterate bb_iter = NULL; | ||||||
| 
 | 
 | ||||||
| enum error_types { READ_ERROR, WRITE_ERROR, CORRUPTION_ERROR }; |  | ||||||
| 
 |  | ||||||
| static __inline void *allocate_buffer(size_t size) { | static __inline void *allocate_buffer(size_t size) { | ||||||
| #ifdef __MINGW32__ | #ifdef __MINGW32__ | ||||||
| 	return __mingw_aligned_malloc(size, sys_page_size); | 	return __mingw_aligned_malloc(size, EXT2_SYS_PAGE_SIZE); | ||||||
| #else  | #else  | ||||||
| 	return _aligned_malloc(size, sys_page_size); | 	return _aligned_malloc(size, EXT2_SYS_PAGE_SIZE); | ||||||
| #endif | #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); | 	error_code = ext2fs_badblocks_list_add(bb_list, bad); | ||||||
| 	if (error_code) { | 	if (error_code) { | ||||||
| 		uprintf("Error %d adding to in-memory bad block list", error_code); | 		uprintf("Error %d adding to in-memory bad block list", error_code); | ||||||
| 		exit (1); | 		return 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* kludge:
 | 	/* kludge:
 | ||||||
|  | @ -403,9 +412,6 @@ static int do_read (HANDLE hDrive, unsigned char * buffer, int tryout, int block | ||||||
| 		    blk_t current_block) | 		    blk_t current_block) | ||||||
| { | { | ||||||
| 	long got; | 	long got; | ||||||
| //	DWORD tv1, tv2;
 |  | ||||||
| #define NANOSEC (1000000000L) |  | ||||||
| #define MILISEC (1000L) |  | ||||||
| 
 | 
 | ||||||
| #if 0 | #if 0 | ||||||
| 	printf("do_read: block %d, try %d\n", current_block, tryout); | 	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(); | 		print_status(); | ||||||
| 
 | 
 | ||||||
| 	/* Try the read */ | 	/* Try the read */ | ||||||
| //	if (d_flag)
 |  | ||||||
| //		tv1 = GetTickCount();
 |  | ||||||
| 	got = read_sectors(hDrive, block_size, current_block, tryout, buffer); | 	got = read_sectors(hDrive, block_size, current_block, tryout, buffer); | ||||||
| 		// read (dev, buffer, tryout * block_size);
 |  | ||||||
| //	if (d_flag)
 |  | ||||||
| //		tv2 = GetTickCount();
 |  | ||||||
| 	if (got < 0) | 	if (got < 0) | ||||||
| 		got = 0; | 		got = 0; | ||||||
| 	if (got & 511) | 	if (got & 511) | ||||||
| 		uprintf("Weird value (%ld) in do_read\n", got); | 		uprintf("Weird value (%ld) in do_read\n", got); | ||||||
| 	got /= block_size; | 	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; | 	return got; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -719,6 +683,7 @@ struct saved_blk_record { | ||||||
| 	int	num; | 	int	num; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | // TODO: this is untested!
 | ||||||
| static unsigned int test_nd(HANDLE hDrive, blk_t last_block, | static unsigned int test_nd(HANDLE hDrive, blk_t last_block, | ||||||
| 			     int block_size, blk_t first_block, | 			     int block_size, blk_t first_block, | ||||||
| 			     unsigned int blocks_at_once) | 			     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); | 	error_code = ext2fs_badblocks_list_iterate_begin(bb_list,&bb_iter); | ||||||
| 	if (error_code) { | 	if (error_code) { | ||||||
| 		uprintf("Error %d while beginning bad block list iteration", error_code); | 		uprintf("Error %d while beginning bad block list iteration", error_code); | ||||||
|  | 		// TODO
 | ||||||
| 		exit (1); | 		exit (1); | ||||||
| 	} | 	} | ||||||
| 	do { | 	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)); | 	test_record = malloc (blocks_at_once*sizeof(struct saved_blk_record)); | ||||||
| 	if (!blkbuf || !test_record) { | 	if (!blkbuf || !test_record) { | ||||||
| 		uprintf("Error while allocating buffers"); | 		uprintf("Error while allocating buffers"); | ||||||
|  | 		// TODO
 | ||||||
| 		exit (1); | 		exit (1); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -786,7 +753,7 @@ static unsigned int test_nd(HANDLE hDrive, blk_t last_block, | ||||||
| 				 block_size, test_record[i].block); | 				 block_size, test_record[i].block); | ||||||
| 			save_ptr += test_record[i].num * block_size; | 			save_ptr += test_record[i].num * block_size; | ||||||
| 		} | 		} | ||||||
| 		fflush (out); | 		// TODO
 | ||||||
| 		exit(1); | 		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) | int BadBlocks(HANDLE hPhysicalDrive, ULONGLONG disk_size, int block_size, int test_type) | ||||||
| { | { | ||||||
| 	errcode_t error_code; | 	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 num_passes = 0; | ||||||
| 	int passes_clean = 0; | 	int passes_clean = 0; | ||||||
| 	int bb_count; | 	blk_t bb_count = 0, first_block = 0, last_block = (blk_t)disk_size/block_size; | ||||||
| 	blk_t first_block = 0, last_block = (blk_t)disk_size/block_size; |  | ||||||
| 
 | 
 | ||||||
| 	error_code = ext2fs_badblocks_list_create(&bb_list, 0); | 	error_code = ext2fs_badblocks_list_create(&bb_list, 0); | ||||||
| 	if (error_code) { | 	if (error_code) { | ||||||
|  | @ -991,7 +954,7 @@ int BadBlocks(HANDLE hPhysicalDrive, ULONGLONG disk_size, int block_size, int te | ||||||
| 	} | 	} | ||||||
| 	time_start = GetTickCount(); | 	time_start = GetTickCount(); | ||||||
| 	do { | 	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) | 		if (bb_count) | ||||||
| 			passes_clean = 0; | 			passes_clean = 0; | ||||||
| 		else | 		else | ||||||
|  |  | ||||||
|  | @ -24,42 +24,40 @@ | ||||||
| #define __u32  UINT32 | #define __u32  UINT32 | ||||||
| #endif | #endif | ||||||
| typedef UINT32 blk_t; | typedef UINT32 blk_t; | ||||||
| typedef struct ext2_struct_u32_list *ext2_badblocks_list; | typedef DWORD  errcode_t; | ||||||
| typedef struct ext2_struct_u32_iterate *ext2_badblocks_iterate; | 
 | ||||||
| typedef struct ext2_struct_u32_list *ext2_u32_list; | typedef struct ext2_struct_u32_list         *ext2_badblocks_list; | ||||||
| typedef struct ext2_struct_u32_iterate *ext2_u32_iterate; | typedef struct ext2_struct_u32_iterate      *ext2_badblocks_iterate; | ||||||
| typedef long   errcode_t; | 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) \ | #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 { | typedef struct { | ||||||
| 	int	magic; | 	blk_t bb_count; | ||||||
| 	int	num; | 	blk_t num_read_errors; | ||||||
| 	int	size; | 	blk_t num_write_errors; | ||||||
| 	__u32	*list; | 	blk_t num_corruption_errors; | ||||||
| 	int	badblocks_flags; | } badblocks_report; | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 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 */ |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Shared prototypes |  * Shared prototypes | ||||||
|  |  | ||||||
|  | @ -26,6 +26,10 @@ const char* additional_copyrights = | ||||||
| "http://ms-sys.sourceforge.net\r\n" | "http://ms-sys.sourceforge.net\r\n" | ||||||
| "GNU General Public License (GPL) v2 or later\r\n" | "GNU General Public License (GPL) v2 or later\r\n" | ||||||
| "\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" | "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://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" | "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 | IDD_DIALOG DIALOGEX 12, 12, 206, 278 | ||||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||||
| EXSTYLE WS_EX_APPWINDOW | EXSTYLE WS_EX_APPWINDOW | ||||||
| CAPTION "Rufus v1.0.2.78" | CAPTION "Rufus v1.0.2.79" | ||||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||||
| BEGIN | BEGIN | ||||||
|     DEFPUSHBUTTON   "Start",IDC_START,94,236,50,14 |     DEFPUSHBUTTON   "Start",IDC_START,94,236,50,14 | ||||||
|  | @ -65,7 +65,7 @@ BEGIN | ||||||
|     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP |     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, |     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 |                     "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 |     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 |     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 |     LTEXT           "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 | ||||||
|  | @ -164,8 +164,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 1,0,2,78 |  FILEVERSION 1,0,2,79 | ||||||
|  PRODUCTVERSION 1,0,2,78 |  PRODUCTVERSION 1,0,2,79 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -182,13 +182,13 @@ BEGIN | ||||||
|         BEGIN |         BEGIN | ||||||
|             VALUE "CompanyName", "akeo.ie" |             VALUE "CompanyName", "akeo.ie" | ||||||
|             VALUE "FileDescription", "Rufus" |             VALUE "FileDescription", "Rufus" | ||||||
|             VALUE "FileVersion", "1.0.2.78" |             VALUE "FileVersion", "1.0.2.79" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011 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.0.2.78" |             VALUE "ProductVersion", "1.0.2.79" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue