mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[core] factorize the img/zero disk writing code
* Also fix a WDK warning
This commit is contained in:
parent
d385a097c0
commit
71520baf31
3 changed files with 109 additions and 138 deletions
234
src/format.c
234
src/format.c
|
@ -1264,7 +1264,7 @@ out:
|
||||||
// incompatibilities from one version of Windows to the next.
|
// incompatibilities from one version of Windows to the next.
|
||||||
// Maybe when we use wimlib we'll review this, but for now just turn it off.
|
// Maybe when we use wimlib we'll review this, but for now just turn it off.
|
||||||
//#define SET_INTERNAL_DRIVES_OFFLINE
|
//#define SET_INTERNAL_DRIVES_OFFLINE
|
||||||
BOOL SetupWinToGo(const char* drive_name, BOOL use_ms_efi)
|
static BOOL SetupWinToGo(const char* drive_name, BOOL use_ms_efi)
|
||||||
{
|
{
|
||||||
#ifdef SET_INTERNAL_DRIVES_OFFLINE
|
#ifdef SET_INTERNAL_DRIVES_OFFLINE
|
||||||
static char san_policy_path[] = "?:\\san_policy.xml";
|
static char san_policy_path[] = "?:\\san_policy.xml";
|
||||||
|
@ -1432,7 +1432,7 @@ static BOOL CALLBACK FormatPromptCallback(HWND hWnd, LPARAM lParam)
|
||||||
* disk in drive X: before you can use it'. You will also get that popup if you start a
|
* disk in drive X: before you can use it'. You will also get that popup if you start a
|
||||||
* bad blocks check and cancel it before it completes. We have to close that popup manually.
|
* bad blocks check and cancel it before it completes. We have to close that popup manually.
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI CloseFormatPromptThread(LPVOID param) {
|
static DWORD WINAPI CloseFormatPromptThread(LPVOID param) {
|
||||||
HWND hFormatPrompt;
|
HWND hFormatPrompt;
|
||||||
|
|
||||||
while(format_op_in_progress) {
|
while(format_op_in_progress) {
|
||||||
|
@ -1447,7 +1447,7 @@ DWORD WINAPI CloseFormatPromptThread(LPVOID param) {
|
||||||
ExitThread(0);
|
ExitThread(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_progress(const uint64_t processed_bytes)
|
static void update_progress(const uint64_t processed_bytes)
|
||||||
{
|
{
|
||||||
if (_GetTickCount64() > LastRefresh + 25) {
|
if (_GetTickCount64() > LastRefresh + 25) {
|
||||||
LastRefresh = _GetTickCount64();
|
LastRefresh = _GetTickCount64();
|
||||||
|
@ -1457,6 +1457,99 @@ void update_progress(const uint64_t processed_bytes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Write an image file or zero a drive */
|
||||||
|
static BOOL WriteDrive(HANDLE hPhysicalDrive, HANDLE hSourceImage)
|
||||||
|
{
|
||||||
|
const DWORD SectorSize = SelectedDrive.Geometry.BytesPerSector;
|
||||||
|
BOOL s, ret = FALSE;
|
||||||
|
LARGE_INTEGER li;
|
||||||
|
DWORD rSize, wSize, BufSize;
|
||||||
|
uint64_t wb, target_size = hSourceImage?img_report.projected_size:SelectedDrive.DiskSize;
|
||||||
|
uint8_t *buffer = NULL, *aligned_buffer;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// We poked the MBR and other stuff, so we need to rewind
|
||||||
|
li.QuadPart = 0;
|
||||||
|
if (!SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN))
|
||||||
|
uprintf("Warning: Unable to rewind image position - wrong data might be copied!");
|
||||||
|
LastRefresh = 0;
|
||||||
|
|
||||||
|
if (img_report.compression_type != BLED_COMPRESSION_NONE) {
|
||||||
|
uprintf("Writing Compressed Image...");
|
||||||
|
bled_init(_uprintf, update_progress, &FormatStatus);
|
||||||
|
bled_uncompress_with_handles(hSourceImage, hPhysicalDrive, img_report.compression_type);
|
||||||
|
bled_exit();
|
||||||
|
} else {
|
||||||
|
uprintf(hSourceImage?"Writing Image...":"Zeroing drive...");
|
||||||
|
// Our buffer size must be a multiple of the sector size
|
||||||
|
BufSize = ((DD_BUFFER_SIZE + SectorSize - 1) / SectorSize) * SectorSize;
|
||||||
|
buffer = (uint8_t*)calloc(BufSize + SectorSize, 1); // +1 sector for align
|
||||||
|
if (buffer == NULL) {
|
||||||
|
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
uprintf("could not allocate disk write buffer");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747.aspx does buffer sector alignment
|
||||||
|
aligned_buffer = ((void *)((((uintptr_t)(buffer)) + (SectorSize)-1) & (~(((uintptr_t)(SectorSize)) - 1))));
|
||||||
|
|
||||||
|
// Don't bother trying for something clever, using double buffering overlapped and whatnot:
|
||||||
|
// With Windows' default optimizations, sync read + sync write for sequential operations
|
||||||
|
// will be as fast, if not faster, than whatever async scheme you can come up with.
|
||||||
|
rSize = BufSize;
|
||||||
|
for (wb = 0, wSize = 0; wb < (uint64_t)SelectedDrive.DiskSize; wb += wSize) {
|
||||||
|
if (_GetTickCount64() > LastRefresh + 25) {
|
||||||
|
LastRefresh = _GetTickCount64();
|
||||||
|
format_percent = (100.0f*wb) / (1.0f*target_size);
|
||||||
|
PrintInfo(0, hSourceImage?MSG_261:MSG_286, format_percent);
|
||||||
|
UpdateProgress(OP_FORMAT, format_percent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hSourceImage != NULL) {
|
||||||
|
s = ReadFile(hSourceImage, aligned_buffer, BufSize, &rSize, NULL);
|
||||||
|
if (!s) {
|
||||||
|
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_READ_FAULT;
|
||||||
|
uprintf("read error: %s", WindowsErrorString());
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (rSize == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Don't overflow our projected size (mostly for VHDs)
|
||||||
|
if (wb + rSize > target_size) {
|
||||||
|
rSize = (DWORD)(target_size - wb);
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteFile fails unless the size is a multiple of sector size
|
||||||
|
if (rSize % SectorSize != 0)
|
||||||
|
rSize = ((rSize + SectorSize - 1) / SectorSize) * SectorSize;
|
||||||
|
for (i = 0; i < WRITE_RETRIES; i++) {
|
||||||
|
CHECK_FOR_USER_CANCEL;
|
||||||
|
s = WriteFile(hPhysicalDrive, aligned_buffer, rSize, &wSize, NULL);
|
||||||
|
if ((s) && (wSize == rSize))
|
||||||
|
break;
|
||||||
|
if (s)
|
||||||
|
uprintf("write error: Wrote %d bytes, expected %d bytes\n", wSize, rSize);
|
||||||
|
else
|
||||||
|
uprintf("write error: %s", WindowsErrorString());
|
||||||
|
if (i < WRITE_RETRIES - 1) {
|
||||||
|
li.QuadPart = wb;
|
||||||
|
SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN);
|
||||||
|
uprintf(" RETRYING...\n");
|
||||||
|
} else {
|
||||||
|
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_WRITE_FAULT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i >= WRITE_RETRIES) goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RefreshDriveLayout(hPhysicalDrive);
|
||||||
|
ret = TRUE;
|
||||||
|
out:
|
||||||
|
safe_free(buffer);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Standalone thread for the formatting operation
|
* Standalone thread for the formatting operation
|
||||||
* According to http://msdn.microsoft.com/en-us/library/windows/desktop/aa364562.aspx
|
* According to http://msdn.microsoft.com/en-us/library/windows/desktop/aa364562.aspx
|
||||||
|
@ -1471,20 +1564,18 @@ void update_progress(const uint64_t processed_bytes)
|
||||||
DWORD WINAPI FormatThread(void* param)
|
DWORD WINAPI FormatThread(void* param)
|
||||||
{
|
{
|
||||||
int i, r, pt, tt, fs, bt;
|
int i, r, pt, tt, fs, bt;
|
||||||
BOOL s, ret, use_large_fat32, windows_to_go;
|
BOOL ret, use_large_fat32, windows_to_go;
|
||||||
const DWORD SectorSize = SelectedDrive.Geometry.BytesPerSector;
|
const DWORD SectorSize = SelectedDrive.Geometry.BytesPerSector;
|
||||||
DWORD rSize, wSize, BufSize, DriveIndex = (DWORD)(uintptr_t)param;
|
DWORD DriveIndex = (DWORD)(uintptr_t)param;
|
||||||
HANDLE hPhysicalDrive = INVALID_HANDLE_VALUE;
|
HANDLE hPhysicalDrive = INVALID_HANDLE_VALUE;
|
||||||
HANDLE hLogicalVolume = INVALID_HANDLE_VALUE;
|
HANDLE hLogicalVolume = INVALID_HANDLE_VALUE;
|
||||||
HANDLE hSourceImage = INVALID_HANDLE_VALUE;
|
HANDLE hSourceImage = INVALID_HANDLE_VALUE;
|
||||||
SYSTEMTIME lt;
|
SYSTEMTIME lt;
|
||||||
FILE* log_fd;
|
FILE* log_fd;
|
||||||
LARGE_INTEGER li;
|
uint8_t *buffer = NULL, extra_partitions = 0;
|
||||||
uint64_t wb;
|
|
||||||
uint8_t *buffer = NULL, *aligned_buffer, extra_partitions = 0;
|
|
||||||
char *bb_msg, *guid_volume = NULL;
|
char *bb_msg, *guid_volume = NULL;
|
||||||
char drive_name[] = "?:\\";
|
char drive_name[] = "?:\\";
|
||||||
char drive_letters[27];
|
char drive_letters[27], fs_type[32];
|
||||||
char logfile[MAX_PATH], *userdir;
|
char logfile[MAX_PATH], *userdir;
|
||||||
char efi_dst[] = "?:\\efi\\boot\\bootx64.efi";
|
char efi_dst[] = "?:\\efi\\boot\\bootx64.efi";
|
||||||
char kolibri_dst[] = "?:\\MTLD_F32";
|
char kolibri_dst[] = "?:\\MTLD_F32";
|
||||||
|
@ -1586,57 +1677,8 @@ DWORD WINAPI FormatThread(void* param)
|
||||||
}
|
}
|
||||||
CreateThread(NULL, 0, CloseFormatPromptThread, NULL, 0, NULL);
|
CreateThread(NULL, 0, CloseFormatPromptThread, NULL, 0, NULL);
|
||||||
|
|
||||||
// TODO: factorize this with DD write?
|
|
||||||
if (zero_drive) {
|
if (zero_drive) {
|
||||||
li.QuadPart = 0;
|
WriteDrive(hPhysicalDrive, NULL);
|
||||||
SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN);
|
|
||||||
uprintf("Zeroing drive...");
|
|
||||||
// Our buffer size must be a multiple of the sector size
|
|
||||||
BufSize = ((DD_BUFFER_SIZE + SectorSize - 1) / SectorSize) * SectorSize;
|
|
||||||
buffer = (uint8_t*)calloc(BufSize + SectorSize, 1); // +1 sector for align
|
|
||||||
if (buffer == NULL) {
|
|
||||||
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_ENOUGH_MEMORY;
|
|
||||||
uprintf("could not allocate zeroing buffer");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747.aspx does buffer sector alignment
|
|
||||||
aligned_buffer = ((void *)((((uintptr_t)(buffer)) + (SectorSize)-1) & (~(((uintptr_t)(SectorSize)) - 1))));
|
|
||||||
for (wb = 0, wSize = 0; wb < (uint64_t)SelectedDrive.DiskSize; wb += wSize) {
|
|
||||||
if (_GetTickCount64() > LastRefresh + 25) {
|
|
||||||
LastRefresh = _GetTickCount64();
|
|
||||||
format_percent = (100.0f*wb) / (1.0f*SelectedDrive.DiskSize);
|
|
||||||
PrintInfo(0, MSG_286, format_percent);
|
|
||||||
UpdateProgress(OP_FORMAT, format_percent);
|
|
||||||
}
|
|
||||||
// Don't overflow our projected size
|
|
||||||
if (wb + BufSize > (uint64_t)SelectedDrive.DiskSize) {
|
|
||||||
BufSize = (DWORD)(SelectedDrive.DiskSize - wb);
|
|
||||||
}
|
|
||||||
// WriteFile fails unless the size is a multiple of sector size
|
|
||||||
if (BufSize % SectorSize != 0)
|
|
||||||
BufSize = ((BufSize + SectorSize - 1) / SectorSize) * SectorSize;
|
|
||||||
for (i = 0; i < WRITE_RETRIES; i++) {
|
|
||||||
CHECK_FOR_USER_CANCEL;
|
|
||||||
s = WriteFile(hPhysicalDrive, aligned_buffer, BufSize, &wSize, NULL);
|
|
||||||
if ((s) && (wSize == BufSize))
|
|
||||||
break;
|
|
||||||
if (s)
|
|
||||||
uprintf("write error: Wrote %d bytes, expected %d bytes\n", wSize, BufSize);
|
|
||||||
else
|
|
||||||
uprintf("write error: %s", WindowsErrorString());
|
|
||||||
if (i < WRITE_RETRIES - 1) {
|
|
||||||
li.QuadPart = wb;
|
|
||||||
SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN);
|
|
||||||
uprintf(" RETRYING...\n");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_WRITE_FAULT;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i >= WRITE_RETRIES) goto out;
|
|
||||||
}
|
|
||||||
RefreshDriveLayout(hPhysicalDrive);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1707,11 +1749,6 @@ DWORD WINAPI FormatThread(void* param)
|
||||||
|
|
||||||
// Write an image file
|
// Write an image file
|
||||||
if (IsChecked(IDC_BOOT) && (bt == BT_IMG)) {
|
if (IsChecked(IDC_BOOT) && (bt == BT_IMG)) {
|
||||||
char fs_type[32];
|
|
||||||
// We poked the MBR and other stuff, so we need to rewind
|
|
||||||
li.QuadPart = 0;
|
|
||||||
if (!SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN))
|
|
||||||
uprintf("Warning: Unable to rewind image position - wrong data might be copied!");
|
|
||||||
hSourceImage = CreateFileU(image_path, GENERIC_READ, FILE_SHARE_READ, NULL,
|
hSourceImage = CreateFileU(image_path, GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||||
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
||||||
if (hSourceImage == INVALID_HANDLE_VALUE) {
|
if (hSourceImage == INVALID_HANDLE_VALUE) {
|
||||||
|
@ -1719,75 +1756,10 @@ DWORD WINAPI FormatThread(void* param)
|
||||||
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OPEN_FAILED;
|
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OPEN_FAILED;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
LastRefresh = 0;
|
|
||||||
|
|
||||||
if (img_report.compression_type != BLED_COMPRESSION_NONE) {
|
WriteDrive(hPhysicalDrive, hSourceImage);
|
||||||
uprintf("Writing Compressed Image...");
|
|
||||||
bled_init(_uprintf, update_progress, &FormatStatus);
|
|
||||||
bled_uncompress_with_handles(hSourceImage, hPhysicalDrive, img_report.compression_type);
|
|
||||||
bled_exit();
|
|
||||||
} else {
|
|
||||||
uprintf("Writing Image...");
|
|
||||||
// Our buffer size must be a multiple of the sector size
|
|
||||||
BufSize = ((DD_BUFFER_SIZE + SectorSize - 1) / SectorSize) * SectorSize;
|
|
||||||
buffer = (uint8_t*)malloc(BufSize + SectorSize); // +1 sector for align
|
|
||||||
if (buffer == NULL) {
|
|
||||||
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_NOT_ENOUGH_MEMORY;
|
|
||||||
uprintf("could not allocate DD buffer");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747.aspx does buffer sector alignment
|
|
||||||
aligned_buffer = ((void *) ((((uintptr_t)(buffer)) + (SectorSize) - 1) & (~(((uintptr_t)(SectorSize)) - 1))));
|
|
||||||
|
|
||||||
// Don't bother trying for something clever, using double buffering overlapped and whatnot:
|
|
||||||
// With Windows' default optimizations, sync read + sync write for sequential operations
|
|
||||||
// will be as fast, if not faster, than whatever async scheme you can come up with.
|
|
||||||
for (wb = 0, wSize = 0; ; wb += wSize) {
|
|
||||||
s = ReadFile(hSourceImage, aligned_buffer, BufSize, &rSize, NULL);
|
|
||||||
if (!s) {
|
|
||||||
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_READ_FAULT;
|
|
||||||
uprintf("read error: %s", WindowsErrorString());
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
if (rSize == 0)
|
|
||||||
break;
|
|
||||||
if (_GetTickCount64() > LastRefresh + 25) {
|
|
||||||
LastRefresh = _GetTickCount64();
|
|
||||||
format_percent = (100.0f*wb)/(1.0f*img_report.projected_size);
|
|
||||||
PrintInfo(0, MSG_261, format_percent);
|
|
||||||
UpdateProgress(OP_FORMAT, format_percent);
|
|
||||||
}
|
|
||||||
// Don't overflow our projected size (mostly for VHDs)
|
|
||||||
if (wb + rSize > img_report.projected_size) {
|
|
||||||
rSize = (DWORD)(img_report.projected_size - wb);
|
|
||||||
}
|
|
||||||
// WriteFile fails unless the size is a multiple of sector size
|
|
||||||
if (rSize % SectorSize != 0)
|
|
||||||
rSize = ((rSize + SectorSize -1) / SectorSize) * SectorSize;
|
|
||||||
for (i=0; i < WRITE_RETRIES; i++) {
|
|
||||||
CHECK_FOR_USER_CANCEL;
|
|
||||||
s = WriteFile(hPhysicalDrive, aligned_buffer, rSize, &wSize, NULL);
|
|
||||||
if ((s) && (wSize == rSize))
|
|
||||||
break;
|
|
||||||
if (s)
|
|
||||||
uprintf("write error: Wrote %d bytes, expected %d bytes\n", wSize, rSize);
|
|
||||||
else
|
|
||||||
uprintf("write error: %s", WindowsErrorString());
|
|
||||||
if (i < WRITE_RETRIES-1) {
|
|
||||||
li.QuadPart = wb;
|
|
||||||
SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN);
|
|
||||||
uprintf(" RETRYING...\n");
|
|
||||||
} else {
|
|
||||||
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i >= WRITE_RETRIES) goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the image contains a partition we might be able to access, try to re-mount it
|
// If the image contains a partition we might be able to access, try to re-mount it
|
||||||
RefreshDriveLayout(hPhysicalDrive);
|
|
||||||
safe_unlockclose(hPhysicalDrive);
|
safe_unlockclose(hPhysicalDrive);
|
||||||
safe_unlockclose(hLogicalVolume);
|
safe_unlockclose(hLogicalVolume);
|
||||||
Sleep(200);
|
Sleep(200);
|
||||||
|
@ -1797,8 +1769,6 @@ DWORD WINAPI FormatThread(void* param)
|
||||||
if ((guid_volume != NULL) && (MountVolume(drive_name, guid_volume)))
|
if ((guid_volume != NULL) && (MountVolume(drive_name, guid_volume)))
|
||||||
uprintf("Remounted %s on %s\n", guid_volume, drive_name);
|
uprintf("Remounted %s on %s\n", guid_volume, drive_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
uprintf("Done");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
10
src/rufus.rc
10
src/rufus.rc
|
@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
IDD_DIALOG DIALOGEX 12, 12, 242, 376
|
IDD_DIALOG DIALOGEX 12, 12, 242, 376
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
EXSTYLE WS_EX_ACCEPTFILES
|
EXSTYLE WS_EX_ACCEPTFILES
|
||||||
CAPTION "Rufus 2.8.877"
|
CAPTION "Rufus 2.8.878"
|
||||||
FONT 8, "Segoe UI Symbol", 400, 0, 0x0
|
FONT 8, "Segoe UI Symbol", 400, 0, 0x0
|
||||||
BEGIN
|
BEGIN
|
||||||
LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8
|
LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8
|
||||||
|
@ -320,8 +320,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 2,8,877,0
|
FILEVERSION 2,8,878,0
|
||||||
PRODUCTVERSION 2,8,877,0
|
PRODUCTVERSION 2,8,878,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -338,13 +338,13 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
|
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
|
||||||
VALUE "FileDescription", "Rufus"
|
VALUE "FileDescription", "Rufus"
|
||||||
VALUE "FileVersion", "2.8.877"
|
VALUE "FileVersion", "2.8.878"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2016 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2016 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", "2.8.877"
|
VALUE "ProductVersion", "2.8.878"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
@ -820,7 +820,8 @@ BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* s
|
||||||
*/
|
*/
|
||||||
BOOL SetThreadAffinity(DWORD_PTR* thread_affinity, size_t num_threads)
|
BOOL SetThreadAffinity(DWORD_PTR* thread_affinity, size_t num_threads)
|
||||||
{
|
{
|
||||||
int i, j, pc;
|
|
||||||
|
size_t i, j, pc;
|
||||||
DWORD_PTR affinity, dummy;
|
DWORD_PTR affinity, dummy;
|
||||||
|
|
||||||
memset(thread_affinity, 0, num_threads * sizeof(DWORD_PTR));
|
memset(thread_affinity, 0, num_threads * sizeof(DWORD_PTR));
|
||||||
|
|
Loading…
Reference in a new issue