mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[iso] UI ISO support improvements
* add ISO scan and extract progress dialog * compute sizes and set properties * allow cancellation * minor other updates
This commit is contained in:
parent
013db6a6d8
commit
fd0e6d4b3b
10 changed files with 238 additions and 78 deletions
|
@ -385,6 +385,11 @@ void __cdecl FormatThread(void* param)
|
|||
FILE* log_fd;
|
||||
int r;
|
||||
|
||||
#ifdef RUFUS_TEST
|
||||
ExtractISO(ISO_IMAGE, ISO_DEST, FALSE);
|
||||
goto out;
|
||||
#endif
|
||||
|
||||
hPhysicalDrive = GetDriveHandle(num, NULL, TRUE, TRUE);
|
||||
if (hPhysicalDrive == INVALID_HANDLE_VALUE) {
|
||||
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OPEN_FAILED;
|
||||
|
|
142
src/iso.c
142
src/iso.c
|
@ -38,26 +38,33 @@
|
|||
#include <cdio/udf.h>
|
||||
|
||||
#include "rufus.h"
|
||||
#include "msapi_utf8.h"
|
||||
#include "resource.h"
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
#ifndef PBS_MARQUEE
|
||||
#define PBS_MARQUEE 0x08
|
||||
#endif
|
||||
#ifndef PBM_SETMARQUEE
|
||||
#define PBM_SETMARQUEE (WM_USER+10)
|
||||
#endif
|
||||
// How often should we update the progress bar (in 2K blocks) as updating
|
||||
// the progress bar for every block will bring extraction to a crawl
|
||||
#define PROGRESS_UPDATE 1024
|
||||
#define FOUR_GIGABYTES 4294967296LL
|
||||
|
||||
#define print_vd_info(title, fn) \
|
||||
if (fn(p_iso, &psz_str)) { \
|
||||
uprintf(title ": %s\n", psz_str); \
|
||||
} \
|
||||
free(psz_str); \
|
||||
psz_str = NULL;
|
||||
|
||||
/* Needed for UDF ISO access */
|
||||
// TODO: should be able to elmininate those with an alternate approach
|
||||
// Needed for UDF ISO access
|
||||
CdIo_t* cdio_open (const char *psz_source, driver_id_t driver_id) {return NULL;}
|
||||
void cdio_destroy (CdIo_t *p_cdio) {}
|
||||
|
||||
const char *psz_extract_dir = "D:/tmp/iso";
|
||||
RUFUS_ISO_REPORT iso_report;
|
||||
static const char *psz_extract_dir;
|
||||
static uint64_t total_blocks, nb_blocks;
|
||||
static BOOL scan_only = FALSE;
|
||||
|
||||
// TODO: Unicode support, progress computation, timestamp preservation
|
||||
// TODO: Unicode support, timestamp & permissions preservation
|
||||
|
||||
static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const char *psz_path)
|
||||
{
|
||||
|
@ -72,7 +79,8 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
|
|||
if ((p_udf_dirent == NULL) || (psz_path == NULL))
|
||||
return 1;
|
||||
|
||||
while (udf_readdir(p_udf_dirent)) {
|
||||
while ((p_udf_dirent = udf_readdir(p_udf_dirent)) != NULL) {
|
||||
if (FormatStatus) goto out;
|
||||
psz_basename = udf_get_filename(p_udf_dirent);
|
||||
i_length = (int)(3 + strlen(psz_path) + strlen(psz_basename) + strlen(psz_extract_dir));
|
||||
psz_fullpath = (char*)calloc(sizeof(char), i_length);
|
||||
|
@ -84,22 +92,34 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
|
|||
if (i_length < 0) {
|
||||
goto out;
|
||||
}
|
||||
uprintf("Extracting: %s\n", psz_fullpath);
|
||||
if (udf_is_dir(p_udf_dirent)) {
|
||||
_mkdir(psz_fullpath);
|
||||
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)]))
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
i_file_length = udf_get_file_length(p_udf_dirent);
|
||||
if (scan_only) {
|
||||
if (i_file_length >= FOUR_GIGABYTES)
|
||||
iso_report.has_4GB_file = TRUE;
|
||||
total_blocks += i_file_length/UDF_BLOCKSIZE;
|
||||
if ((i_file_length != 0) && (i_file_length%UDF_BLOCKSIZE == 0))
|
||||
total_blocks++;
|
||||
safe_free(psz_fullpath);
|
||||
continue;
|
||||
}
|
||||
uprintf("Extracting: %s\n", psz_fullpath);
|
||||
SetWindowTextU(hISOFileName, psz_fullpath);
|
||||
fd = fopen(psz_fullpath, "wb");
|
||||
if (fd == NULL) {
|
||||
uprintf(" Unable to create file\n");
|
||||
goto out;
|
||||
}
|
||||
i_file_length = udf_get_file_length(p_udf_dirent);
|
||||
while (i_file_length > 0) {
|
||||
if (FormatStatus) goto out;
|
||||
memset(buf, 0, UDF_BLOCKSIZE);
|
||||
i_read = udf_read_block(p_udf_dirent, buf, 1);
|
||||
if (i_read < 0) {
|
||||
|
@ -112,18 +132,22 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
|
|||
goto out;
|
||||
}
|
||||
i_file_length -= i_read;
|
||||
if (nb_blocks++ % PROGRESS_UPDATE == 0)
|
||||
SendMessage(hISOProgressBar, PBM_SETPOS, (WPARAM)((MAX_PROGRESS*nb_blocks)/total_blocks), 0);
|
||||
}
|
||||
fclose(fd);
|
||||
fd = NULL;
|
||||
}
|
||||
free(psz_fullpath);
|
||||
safe_free(psz_fullpath);
|
||||
}
|
||||
return 0;
|
||||
|
||||
out:
|
||||
if (p_udf_dirent != NULL)
|
||||
udf_dirent_free(p_udf_dirent);
|
||||
if (fd != NULL)
|
||||
fclose(fd);
|
||||
free(psz_fullpath);
|
||||
safe_free(psz_fullpath);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -154,6 +178,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
|||
return 1;
|
||||
|
||||
_CDIO_LIST_FOREACH (p_entnode, p_entlist) {
|
||||
if (FormatStatus) goto out;
|
||||
p_statbuf = (iso9660_stat_t*) _cdio_list_node_data(p_entnode);
|
||||
/* Eliminate . and .. entries */
|
||||
if ( (strcmp(p_statbuf->filename, ".") == 0)
|
||||
|
@ -161,18 +186,28 @@ 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) {
|
||||
_mkdir(psz_fullpath);
|
||||
if (!scan_only)
|
||||
_mkdir(psz_fullpath);
|
||||
if (iso_extract_files(p_iso, psz_iso_name))
|
||||
goto out;
|
||||
} else {
|
||||
i_file_length = p_statbuf->size;
|
||||
if (scan_only) {
|
||||
if (i_file_length >= FOUR_GIGABYTES)
|
||||
iso_report.has_4GB_file = TRUE;
|
||||
total_blocks += i_file_length/ISO_BLOCKSIZE;
|
||||
if ((i_file_length != 0) && (i_file_length%ISO_BLOCKSIZE == 0))
|
||||
total_blocks++;
|
||||
continue;
|
||||
}
|
||||
uprintf("Extracting: %s\n", psz_fullpath);
|
||||
fd = fopen(psz_fullpath, "wb");
|
||||
if (fd == NULL) {
|
||||
uprintf(" Unable to create file\n");
|
||||
goto out;
|
||||
}
|
||||
i_file_length = p_statbuf->size;
|
||||
for (i = 0; i_file_length > 0; i++) {
|
||||
if (FormatStatus) goto out;
|
||||
memset(buf, 0, ISO_BLOCKSIZE);
|
||||
lsn = p_statbuf->lsn + (lsn_t)i;
|
||||
if (iso9660_iso_seek_read(p_iso, buf, lsn, 1) != ISO_BLOCKSIZE) {
|
||||
|
@ -186,6 +221,8 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
|||
goto out;
|
||||
}
|
||||
i_file_length -= ISO_BLOCKSIZE;
|
||||
if (nb_blocks++ % PROGRESS_UPDATE == 0)
|
||||
SendMessage(hISOProgressBar, PBM_SETPOS, (WPARAM)((MAX_PROGRESS*nb_blocks)/total_blocks), 0);
|
||||
}
|
||||
fclose(fd);
|
||||
fd = NULL;
|
||||
|
@ -200,17 +237,46 @@ out:
|
|||
return r;
|
||||
}
|
||||
|
||||
BOOL ExtractISO(const char* src_iso, const char* dest_dir)
|
||||
BOOL ExtractISO(const char* src_iso, const char* dest_dir, bool scan)
|
||||
{
|
||||
BOOL r = FALSE;
|
||||
iso9660_t* p_iso = NULL;
|
||||
udf_t* p_udf = NULL;
|
||||
udf_dirent_t* p_udf_root;
|
||||
char *psz_str = NULL;
|
||||
char vol_id[UDF_VOLID_SIZE] = "";
|
||||
char volset_id[UDF_VOLSET_ID_SIZE+1] = "";
|
||||
LONG progress_style;
|
||||
const char* scan_text = "Scanning ISO image...\n";
|
||||
|
||||
if ((src_iso == NULL) || (dest_dir == NULL))
|
||||
return FALSE;
|
||||
|
||||
scan_only = scan;
|
||||
cdio_loglevel_default = CDIO_LOG_DEBUG;
|
||||
psz_extract_dir = dest_dir;
|
||||
progress_style = GetWindowLong(hISOProgressBar, GWL_STYLE);
|
||||
if (scan_only) {
|
||||
uprintf(scan_text);
|
||||
total_blocks = 0;
|
||||
iso_report.projected_size = 0;
|
||||
iso_report.has_4GB_file = FALSE;
|
||||
// Change the Window title and static text
|
||||
SetWindowTextU(hISOProgressDlg, scan_text);
|
||||
SetWindowTextU(hISOFileName, scan_text);
|
||||
// Change progress style to marquee for scanning
|
||||
SetWindowLong(hISOProgressBar, GWL_STYLE, progress_style | PBS_MARQUEE);
|
||||
SendMessage(hISOProgressBar, PBM_SETMARQUEE, TRUE, 0);
|
||||
} else {
|
||||
uprintf("Extracting files...\n");
|
||||
if (total_blocks == 0) {
|
||||
uprintf("Error: ISO has not been properly scanned.\n");
|
||||
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_ISO_SCAN);
|
||||
goto out;
|
||||
}
|
||||
nb_blocks = 0;
|
||||
SetWindowLong(hISOProgressBar, GWL_STYLE, progress_style & (~PBS_MARQUEE));
|
||||
SendMessage(hISOProgressBar, PBM_SETPOS, 0, 0);
|
||||
}
|
||||
ShowWindow(hISOProgressDlg, SW_SHOW);
|
||||
UpdateWindow(hISOProgressDlg);
|
||||
|
||||
/* First try to open as UDF - fallback to ISO if it failed */
|
||||
p_udf = udf_open(src_iso);
|
||||
|
@ -222,20 +288,7 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir)
|
|||
uprintf("Couldn't locate UDF root directory\n");
|
||||
goto out;
|
||||
}
|
||||
vol_id[0] = 0; volset_id[0] = 0;
|
||||
|
||||
/* Show basic UDF Volume info */
|
||||
if (udf_get_volume_id(p_udf, vol_id, sizeof(vol_id)) > 0)
|
||||
uprintf("Volume id: %s\n", vol_id);
|
||||
if (udf_get_volume_id(p_udf, volset_id, sizeof(volset_id)) >0 ) {
|
||||
volset_id[UDF_VOLSET_ID_SIZE]='\0';
|
||||
uprintf("Volume set id: %s\n", volset_id);
|
||||
}
|
||||
uprintf("Partition number: %d\n", udf_get_part_number(p_udf));
|
||||
|
||||
/* Recursively extract files */
|
||||
r = udf_extract_files(p_udf, p_udf_root, "");
|
||||
|
||||
goto out;
|
||||
|
||||
try_iso:
|
||||
|
@ -244,22 +297,19 @@ try_iso:
|
|||
uprintf("Unable to open image '%s'.\n", src_iso);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Show basic ISO9660 info from the Primary Volume Descriptor. */
|
||||
print_vd_info("Application", iso9660_ifs_get_application_id);
|
||||
print_vd_info("Preparer ", iso9660_ifs_get_preparer_id);
|
||||
print_vd_info("Publisher ", iso9660_ifs_get_publisher_id);
|
||||
print_vd_info("System ", iso9660_ifs_get_system_id);
|
||||
print_vd_info("Volume ", iso9660_ifs_get_volume_id);
|
||||
print_vd_info("Volume Set ", iso9660_ifs_get_volumeset_id);
|
||||
|
||||
r = iso_extract_files(p_iso, "");
|
||||
|
||||
out:
|
||||
if (scan_only) {
|
||||
// We use the fact that UDF_BLOCKSIZE and ISO_BLOCKSIZE are the same here
|
||||
iso_report.projected_size = total_blocks * ISO_BLOCKSIZE;
|
||||
}
|
||||
SendMessage(hISOProgressDlg, UM_ISO_EXIT, 0, 0);
|
||||
if (p_iso != NULL)
|
||||
iso9660_close(p_iso);
|
||||
if (p_udf != NULL)
|
||||
udf_close(p_udf);
|
||||
|
||||
if ((r != 0) && (FormatStatus == 0))
|
||||
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(scan_only?ERROR_ISO_SCAN:ERROR_ISO_EXTRACT);
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -1431,14 +1431,14 @@ find_lsn_recurse (void *p_image, iso9660_readdir_t iso9660_readdir,
|
|||
}
|
||||
|
||||
if (statbuf->lsn == lsn) {
|
||||
iso9660_stat_t *ret_stat = calloc(1, len);
|
||||
len = sizeof(iso9660_stat_t)+strlen(statbuf->filename)+1;
|
||||
const unsigned int len2 = sizeof(iso9660_stat_t)+strlen(statbuf->filename)+1;
|
||||
iso9660_stat_t *ret_stat = calloc(1, len2);
|
||||
if (!ret_stat)
|
||||
{
|
||||
cdio_warn("Couldn't calloc(1, %d)", len);
|
||||
cdio_warn("Couldn't calloc(1, %d)", len2);
|
||||
return NULL;
|
||||
}
|
||||
memcpy(ret_stat, statbuf, len);
|
||||
memcpy(ret_stat, statbuf, len2);
|
||||
_cdio_list_free (entlist, true);
|
||||
_cdio_list_free (dirlist, true);
|
||||
return ret_stat;
|
||||
|
|
|
@ -101,7 +101,7 @@ realloc_symlink(/*in/out*/ iso9660_stat_t *p_stat, uint8_t i_grow)
|
|||
#define CHECK_CE \
|
||||
{ cont_extent = from_733(*rr->u.CE.extent); \
|
||||
cont_offset = from_733(*rr->u.CE.offset); \
|
||||
cont_size = from_733(*rr->u.CE.size); \
|
||||
cont_size = from_733(*rr->u.CE.size); \
|
||||
(void)cont_extent; (void)cont_offset, (void)cont_size; }
|
||||
|
||||
#define SETUP_ROCK_RIDGE(DE,CHR,LEN) \
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
TARGETNAME=ms-sys
|
||||
TARGETTYPE=LIBRARY
|
||||
|
||||
INCLUDES=$(DDK_INC_PATH);.\inc
|
||||
INCLUDES=$(DDK_INC_PATH);.\inc;..\msvc-missing
|
||||
C_DEFINES=$(C_DEFINES) /DDDKBUILD /DUNICODE /D_UNICODE /DISOLATION_AWARE_ENABLED
|
||||
|
||||
!IFNDEF MSC_WARNING_LEVEL
|
||||
|
|
|
@ -7,7 +7,8 @@
|
|||
#define IDD_ABOUTBOX 103
|
||||
#define IDD_NOTIFICATION 104
|
||||
#define IDD_LICENSE 105
|
||||
#define IDS_VERSION 106
|
||||
#define IDD_ISO_EXTRACT 106
|
||||
#define IDS_VERSION 107
|
||||
#define IDR_FD_COMMAND_COM 300
|
||||
#define IDR_FD_KERNEL_SYS 301
|
||||
#define IDR_FD_DISPLAY_EXE 302
|
||||
|
@ -53,6 +54,9 @@
|
|||
#define IDC_DOSTYPE 1013
|
||||
#define IDC_NBPASSES 1014
|
||||
#define IDC_TEST 1015
|
||||
#define IDC_ISO_PROGRESS 1020
|
||||
#define IDC_ISO_FILENAME 1021
|
||||
#define IDC_ISO_ABORT 1022
|
||||
#define IDC_ABOUT_LICENSE 1030
|
||||
#define IDC_ABOUT_ICON 1031
|
||||
#define IDC_RUFUS_BOLD 1032
|
||||
|
@ -69,7 +73,7 @@
|
|||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NO_MFC 1
|
||||
#define _APS_NEXT_RESOURCE_VALUE 107
|
||||
#define _APS_NEXT_RESOURCE_VALUE 108
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1043
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
|
|
88
src/rufus.c
88
src/rufus.c
|
@ -56,6 +56,7 @@ char szFolderPath[MAX_PATH];
|
|||
float fScale = 1.0f;
|
||||
int default_fs;
|
||||
HWND hDeviceList, hCapacity, hFileSystem, hClusterSize, hLabel, hDOSType, hNBPasses;
|
||||
HWND hISOProgressDlg = NULL, hISOProgressBar, hISOFileName;
|
||||
BOOL bWithFreeDOS, bWithSyslinux;
|
||||
|
||||
static HWND hDeviceTooltip = NULL, hFSTooltip = NULL, hProgress = NULL;
|
||||
|
@ -880,6 +881,42 @@ static void CALLBACK ClockTimer(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dw
|
|||
SendMessageA(GetDlgItem(hWnd, IDC_STATUS), SB_SETTEXTA, SBT_OWNERDRAW | 1, (LPARAM)szTimer);
|
||||
}
|
||||
|
||||
/* Callback for the modeless ISO extraction progress */
|
||||
BOOL CALLBACK ISOProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
CenterDialog(hDlg);
|
||||
hISOProgressBar = GetDlgItem(hDlg, IDC_ISO_PROGRESS);
|
||||
hISOFileName = GetDlgItem(hDlg, IDC_ISO_FILENAME);
|
||||
// Use maximum granularity for the progress bar
|
||||
SendMessage(hISOProgressBar, PBM_SETRANGE, 0, MAX_PROGRESS<<16);
|
||||
return TRUE;
|
||||
case UM_ISO_EXIT:
|
||||
DestroyWindow(hDlg);
|
||||
hISOProgressDlg = NULL;
|
||||
return TRUE;
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDC_ISO_ABORT:
|
||||
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED;
|
||||
PrintStatus(0, "Cancelling - please wait...");
|
||||
return TRUE;
|
||||
}
|
||||
case WM_CLOSE: // prevent closure using Alt-F4
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// The scanning process can be blocking for message processing => use a thread
|
||||
void __cdecl ISOScanThread(void* param)
|
||||
{
|
||||
ExtractISO(ISO_IMAGE, ISO_DEST, TRUE);
|
||||
uprintf("Projected size: %lld\nHas 4GB: %s\n", iso_report.projected_size, iso_report.has_4GB_file?"TRUE":"FALSE");
|
||||
_endthread();
|
||||
}
|
||||
|
||||
/*
|
||||
* Main dialog callback
|
||||
*/
|
||||
|
@ -1000,13 +1037,23 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
|||
case IDC_ABOUT:
|
||||
CreateAboutBox();
|
||||
break;
|
||||
#ifdef RUFUS_TEST
|
||||
case IDC_TEST:
|
||||
// ExtractISO("D:\\Incoming\\GRMSDKX_EN_DVD.iso", NULL);
|
||||
// ExtractISO("D:\\fd11src.iso", NULL);
|
||||
// ExtractISO("D:\\Incoming\\en_windows_driver_kit_3790.iso", NULL);
|
||||
// ExtractISO("D:\\Incoming\\en_windows_7_ultimate_with_sp1_x64_dvd_618240.iso", NULL);
|
||||
ExtractISO("D:\\Incoming\\Windows 8 Preview\\WindowsDeveloperPreview-64bit-English-Developer.iso", NULL);
|
||||
FormatStatus = 0;
|
||||
// You'd think that Windows would let you instantiate a modeless dialog wherever
|
||||
// but you'd be wrong. It has to be done in the main callback!
|
||||
if (!IsWindow(hISOProgressDlg)) {
|
||||
hISOProgressDlg = CreateDialogA(hMainInstance, MAKEINTRESOURCEA(IDD_ISO_EXTRACT),
|
||||
hDlg, (DLGPROC)ISOProc);
|
||||
// The window is not visible by default but takes focus => restore it
|
||||
SetFocus(hDlg);
|
||||
}
|
||||
if (_beginthread(ISOScanThread, 0, NULL) == -1L) {
|
||||
uprintf("Unable to start ISO scanning thread");
|
||||
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_START_THREAD);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case IDC_DEVICE:
|
||||
switch (HIWORD(wParam)) {
|
||||
case CBN_SELCHANGE:
|
||||
|
@ -1043,6 +1090,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
|||
if (format_thid != -1L) {
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
FormatStatus = 0;
|
||||
nDeviceIndex = ComboBox_GetCurSel(hDeviceList);
|
||||
if (nDeviceIndex != CB_ERR) {
|
||||
GetWindowTextA(hDeviceList, tmp, sizeof(tmp));
|
||||
|
@ -1054,6 +1102,12 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
|||
DeviceNum = (DWORD)ComboBox_GetItemData(hDeviceList, nDeviceIndex);
|
||||
FormatStatus = 0;
|
||||
InitProgress();
|
||||
if (!IsWindow(hISOProgressDlg)) {
|
||||
hISOProgressDlg = CreateDialogA(hMainInstance, MAKEINTRESOURCEA(IDD_ISO_EXTRACT),
|
||||
hDlg, (DLGPROC)ISOProc);
|
||||
// The window is not visible by default but takes focus => restore it
|
||||
SetFocus(hDlg);
|
||||
}
|
||||
format_thid = _beginthread(FormatThread, 0, (void*)(uintptr_t)DeviceNum);
|
||||
if (format_thid == -1L) {
|
||||
uprintf("Unable to start formatting thread");
|
||||
|
@ -1157,22 +1211,28 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
|||
MessageBoxA(NULL, "Could not create Window", "DialogBox failure", MB_ICONSTOP);
|
||||
goto out;
|
||||
}
|
||||
CenterDialog(hDlg);
|
||||
// CenterDialog(hDlg);
|
||||
#ifndef RUFUS_TEST
|
||||
ShowWindow(GetDlgItem(hDlg, IDC_TEST), SW_HIDE);
|
||||
#endif
|
||||
ShowWindow(hDlg, SW_SHOWNORMAL);
|
||||
UpdateWindow(hDlg);
|
||||
|
||||
// Do our own event processing and process "magic" commands
|
||||
while(GetMessage(&msg, NULL, 0, 0)) {
|
||||
// The following ensures the processing of the ISO progress window messages
|
||||
if (!IsWindow(hISOProgressDlg) || !IsDialogMessage(hISOProgressDlg, &msg)) {
|
||||
#ifdef DISABLE_AUTORUN
|
||||
// Alt-D => Delete the NoDriveTypeAutorun key on exit (useful if the app crashed)
|
||||
if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'D')) {
|
||||
PrintStatus(0, "NoDriveTypeAutorun will be deleted on exit.");
|
||||
existing_key = FALSE;
|
||||
continue;
|
||||
}
|
||||
// Alt-D => Delete the NoDriveTypeAutorun key on exit (useful if the app crashed)
|
||||
if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'D')) {
|
||||
PrintStatus(0, "NoDriveTypeAutorun will be deleted on exit.");
|
||||
existing_key = FALSE;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
|
|
28
src/rufus.h
28
src/rufus.h
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
#include <windows.h>
|
||||
#include <winioctl.h> // for DISK_GEOMETRY
|
||||
#include <stdint.h>
|
||||
|
||||
#pragma once
|
||||
|
||||
|
@ -24,6 +25,15 @@
|
|||
#define RUFUS_DEBUG // print debug info to Debug facility (use debugview to consult)
|
||||
#define DISABLE_AUTORUN // disable new USB drive notification from explorer when application is running
|
||||
|
||||
/* Features not ready for prime time and that may *DESTROY* your data - USE AT YOUR OWN RISKS! */
|
||||
//#define RUFUS_TEST
|
||||
#define ISO_DEST "D:/tmp/iso"
|
||||
#define ISO_IMAGE "D:\\Incoming\\Windows 8 Preview\\WindowsDeveloperPreview-64bit-English-Developer.iso"
|
||||
//#define ISO_IMAGE "D:\\fd11src.iso", "D:/tmp/iso"
|
||||
//#define ISO_IMAGE "D:\\Incoming\\GRMSDKX_EN_DVD.iso"
|
||||
//#define ISO_IMAGE "D:\\Incoming\\en_windows_driver_kit_3790.iso"
|
||||
//#define ISO_IMAGE "D:\\Incoming\\en_windows_7_ultimate_with_sp1_x64_dvd_618240.iso"
|
||||
|
||||
#define STR_NO_LABEL "NO_LABEL"
|
||||
#define RUFUS_CANCELBOX_TITLE "Rufus - Cancellation"
|
||||
#define DRIVE_INDEX_MIN 0x80
|
||||
|
@ -74,7 +84,8 @@ extern void _uprintf(const char *format, ...);
|
|||
|
||||
/* Custom Windows messages */
|
||||
enum user_message_type {
|
||||
UM_FORMAT_COMPLETED = WM_APP
|
||||
UM_FORMAT_COMPLETED = WM_APP,
|
||||
UM_ISO_EXIT
|
||||
};
|
||||
|
||||
/* Custom notifications */
|
||||
|
@ -136,18 +147,26 @@ typedef struct {
|
|||
} ClusterSize[FS_MAX];
|
||||
} RUFUS_DRIVE_INFO;
|
||||
|
||||
/* ISO details that the application may want */
|
||||
typedef struct {
|
||||
uint64_t projected_size;
|
||||
BOOL has_4GB_file;
|
||||
} RUFUS_ISO_REPORT;
|
||||
|
||||
/*
|
||||
* Globals
|
||||
*/
|
||||
extern HINSTANCE hMainInstance;
|
||||
extern HWND hMainDialog, hStatus, hDeviceList, hCapacity;
|
||||
extern HWND hFileSystem, hClusterSize, hLabel, hDOSType, hNBPasses;
|
||||
extern HWND hISOProgressDlg, hISOProgressBar, hISOFileName;
|
||||
extern float fScale;
|
||||
extern char szFolderPath[MAX_PATH];
|
||||
extern DWORD FormatStatus;
|
||||
extern RUFUS_DRIVE_INFO SelectedDrive;
|
||||
extern const int nb_steps[FS_MAX];
|
||||
extern BOOL bWithFreeDOS;
|
||||
extern RUFUS_ISO_REPORT iso_report;
|
||||
|
||||
/*
|
||||
* Shared prototypes
|
||||
|
@ -165,13 +184,14 @@ extern void DestroyTooltip(HWND hWnd);
|
|||
extern void DestroyAllTooltips(void);
|
||||
extern BOOL Notification(int type, char* title, char* format, ...);
|
||||
extern BOOL ExtractDOS(const char* path);
|
||||
extern BOOL ExtractISO(const char* src_iso, const char* dest_dir);
|
||||
extern BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan);
|
||||
extern BOOL InstallSyslinux(DWORD num, const char* drive_name);
|
||||
extern void __cdecl FormatThread(void* param);
|
||||
extern BOOL CreatePartition(HANDLE hDrive);
|
||||
extern HANDLE GetDriveHandle(DWORD DriveIndex, char* DriveLetter, BOOL bWriteAccess, BOOL bLockDrive);
|
||||
extern BOOL GetDriveLabel(DWORD DriveIndex, char* letter, char** label);
|
||||
extern BOOL UnmountDrive(HANDLE hDrive);
|
||||
extern BOOL CreateProgress(void);
|
||||
|
||||
__inline static BOOL UnlockDrive(HANDLE hDrive)
|
||||
{
|
||||
|
@ -191,6 +211,8 @@ extern void StrArrayAdd(StrArray* arr, const char* str);
|
|||
extern void StrArrayClear(StrArray* arr);
|
||||
extern void StrArrayDestroy(StrArray* arr);
|
||||
|
||||
|
||||
|
||||
/* Clang/MinGW32 has an issue with intptr_t */
|
||||
#ifndef _UINTPTR_T_DEFINED
|
||||
#define _UINTPTR_T_DEFINED
|
||||
|
@ -218,3 +240,5 @@ typedef struct {
|
|||
#define ERROR_INVALID_VOLUME_SIZE 0x1204
|
||||
#define ERROR_CANT_START_THREAD 0x1205
|
||||
#define ERROR_BADBLOCKS_FAILURE 0x1206
|
||||
#define ERROR_ISO_SCAN 0x1207
|
||||
#define ERROR_ISO_EXTRACT 0x1208
|
||||
|
|
29
src/rufus.rc
29
src/rufus.rc
|
@ -31,9 +31,9 @@ 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
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_APPWINDOW
|
||||
CAPTION "Rufus v1.0.7.121"
|
||||
CAPTION "Rufus v1.0.7.122"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "Start",IDC_START,94,236,50,14
|
||||
|
@ -70,7 +70,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.0.7 (Build 121)",IDC_STATIC,46,19,78,8
|
||||
LTEXT "Version 1.0.7 (Build 122)",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
|
||||
|
@ -91,6 +91,16 @@ BEGIN
|
|||
DEFPUSHBUTTON "Close",IDCANCEL,211,44,50,14
|
||||
END
|
||||
|
||||
IDD_ISO_EXTRACT DIALOGEX 0, 0, 262, 73
|
||||
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Extracting Files..."
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
LTEXT "",IDC_ISO_FILENAME,14,9,232,14
|
||||
CONTROL "",IDC_ISO_PROGRESS,"msctls_progress32",WS_BORDER,14,32,231,8
|
||||
PUSHBUTTON "Abort",IDC_ISO_ABORT,112,50,50,14
|
||||
END
|
||||
|
||||
IDD_LICENSE DIALOGEX 0, 0, 335, 205
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Rufus License"
|
||||
|
@ -184,7 +194,6 @@ GUIDELINES DESIGNINFO
|
|||
BEGIN
|
||||
IDD_DIALOG, DIALOG
|
||||
BEGIN
|
||||
BOTTOMMARGIN, 264
|
||||
END
|
||||
|
||||
IDD_ABOUTBOX, DIALOG
|
||||
|
@ -195,6 +204,10 @@ BEGIN
|
|||
BEGIN
|
||||
END
|
||||
|
||||
IDD_ISO_EXTRACT, DIALOG
|
||||
BEGIN
|
||||
END
|
||||
|
||||
IDD_LICENSE, DIALOG
|
||||
BEGIN
|
||||
END
|
||||
|
@ -208,8 +221,8 @@ END
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,0,7,121
|
||||
PRODUCTVERSION 1,0,7,121
|
||||
FILEVERSION 1,0,7,122
|
||||
PRODUCTVERSION 1,0,7,122
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -226,13 +239,13 @@ BEGIN
|
|||
BEGIN
|
||||
VALUE "CompanyName", "akeo.ie"
|
||||
VALUE "FileDescription", "Rufus"
|
||||
VALUE "FileVersion", "1.0.7.121"
|
||||
VALUE "FileVersion", "1.0.7.122"
|
||||
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.7.121"
|
||||
VALUE "ProductVersion", "1.0.7.122"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
|
@ -217,6 +217,10 @@ const char* StrError(DWORD error_code)
|
|||
return "Unable to create formatting thread";
|
||||
case ERROR_BADBLOCKS_FAILURE:
|
||||
return "Bad blocks check didn't complete";
|
||||
case ERROR_ISO_SCAN:
|
||||
return "ISO image scan failure";
|
||||
case ERROR_ISO_EXTRACT:
|
||||
return "ISO image scan failure";
|
||||
default:
|
||||
uprintf("Unknown error: %08X\n", error_code);
|
||||
SetLastError(error_code);
|
||||
|
|
Loading…
Reference in a new issue