mirror of
https://github.com/pbatard/rufus.git
synced 2025-05-29 05:55:30 -04:00
[vhd] fix truncated write operation when using a VHDX image as source
* The legacy code we used for writing disk images used the size of the source image as the maximum number of bytes we should copy, which is fine for uncompressed DD or VHD images, but not so much for compressed VHDX ones. So we now make sure to use the actual size of the virtual disk, which we obtain when mounting the VHD/VHDX. * Also fix log progress update as well as a MinGW warning.
This commit is contained in:
parent
026afa7e3d
commit
8738e7a7de
4 changed files with 42 additions and 23 deletions
25
src/vhd.c
25
src/vhd.c
|
@ -908,18 +908,19 @@ PF_TYPE_DECL(WINAPI, DWORD, AttachVirtualDisk, (HANDLE, PSECURITY_DESCRIPTOR,
|
|||
ATTACH_VIRTUAL_DISK_FLAG, ULONG, PATTACH_VIRTUAL_DISK_PARAMETERS, LPOVERLAPPED));
|
||||
PF_TYPE_DECL(WINAPI, DWORD, DetachVirtualDisk, (HANDLE, DETACH_VIRTUAL_DISK_FLAG, ULONG));
|
||||
PF_TYPE_DECL(WINAPI, DWORD, GetVirtualDiskPhysicalPath, (HANDLE, PULONG, PWSTR));
|
||||
PF_TYPE_DECL(WINAPI, DWORD, GetVirtualDiskOperationProgress, (HANDLE, LPOVERLAPPED,
|
||||
PVIRTUAL_DISK_PROGRESS));
|
||||
PF_TYPE_DECL(WINAPI, DWORD, GetVirtualDiskOperationProgress, (HANDLE, LPOVERLAPPED, PVIRTUAL_DISK_PROGRESS));
|
||||
PF_TYPE_DECL(WINAPI, DWORD, GetVirtualDiskInformation, (HANDLE, PULONG, PGET_VIRTUAL_DISK_INFO, PULONG));
|
||||
|
||||
static char physical_path[128] = "";
|
||||
static HANDLE mounted_handle = INVALID_HANDLE_VALUE;
|
||||
|
||||
// Mount an ISO or a VHD/VHDX image
|
||||
// Mount an ISO or a VHD/VHDX image and provide its size
|
||||
// Returns the physical path of the mounted image or NULL on error.
|
||||
char* VhdMountImage(const char* path)
|
||||
char* VhdMountImageAndGetSize(const char* path, uint64_t* disk_size)
|
||||
{
|
||||
VIRTUAL_STORAGE_TYPE vtype = { VIRTUAL_STORAGE_TYPE_DEVICE_ISO, VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT };
|
||||
ATTACH_VIRTUAL_DISK_PARAMETERS vparams = { 0 };
|
||||
GET_VIRTUAL_DISK_INFO disk_info = { 0 };
|
||||
DWORD r;
|
||||
wchar_t wtmp[128];
|
||||
ULONG size = ARRAYSIZE(wtmp);
|
||||
|
@ -929,6 +930,8 @@ char* VhdMountImage(const char* path)
|
|||
PF_INIT_OR_OUT(OpenVirtualDisk, VirtDisk);
|
||||
PF_INIT_OR_OUT(AttachVirtualDisk, VirtDisk);
|
||||
PF_INIT_OR_OUT(GetVirtualDiskPhysicalPath, VirtDisk);
|
||||
if (disk_size != NULL)
|
||||
PF_INIT_OR_OUT(GetVirtualDiskInformation, VirtDisk);
|
||||
|
||||
if (wpath == NULL)
|
||||
return NULL;
|
||||
|
@ -967,6 +970,20 @@ char* VhdMountImage(const char* path)
|
|||
goto out;
|
||||
}
|
||||
wchar_to_utf8_no_alloc(wtmp, physical_path, sizeof(physical_path));
|
||||
|
||||
if (disk_size != NULL) {
|
||||
*disk_size = 0;
|
||||
disk_info.Version = GET_VIRTUAL_DISK_INFO_SIZE;
|
||||
size = sizeof(disk_info);
|
||||
r = pfGetVirtualDiskInformation(mounted_handle, &size, &disk_info, NULL);
|
||||
if (r != ERROR_SUCCESS) {
|
||||
SetLastError(r);
|
||||
uprintf("Could not obtain virtual size of mounted image '%s': %s", path, WindowsErrorString());
|
||||
goto out;
|
||||
}
|
||||
*disk_size = disk_info.Size.VirtualSize;
|
||||
}
|
||||
|
||||
ret = physical_path;
|
||||
|
||||
out:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue