mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[core] relax the FILE_SHARE_WRITE rules during enumeration
* Should allow enumeration of drives, that other process have open with RW access, back again (looking at you, Paragon!!!)
This commit is contained in:
parent
3b4b742772
commit
23390bf911
5 changed files with 18 additions and 19 deletions
|
@ -654,8 +654,8 @@ BOOL GetDevices(DWORD devnum)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
hDrive = CreateFileA(devint_detail_data->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ,
|
hDrive = CreateFileA(devint_detail_data->DevicePath, GENERIC_READ|GENERIC_WRITE,
|
||||||
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if(hDrive == INVALID_HANDLE_VALUE) {
|
if(hDrive == INVALID_HANDLE_VALUE) {
|
||||||
uprintf("Could not open '%s': %s\n", devint_detail_data->DevicePath, WindowsErrorString());
|
uprintf("Could not open '%s': %s\n", devint_detail_data->DevicePath, WindowsErrorString());
|
||||||
continue;
|
continue;
|
||||||
|
|
17
src/drive.c
17
src/drive.c
|
@ -138,7 +138,7 @@ static HANDLE GetHandle(char* Path, BOOL bLockDrive, BOOL bWriteAccess, BOOL bWr
|
||||||
// We keep FILE_SHARE_READ though, as this shouldn't hurt us any, and is
|
// We keep FILE_SHARE_READ though, as this shouldn't hurt us any, and is
|
||||||
// required for enumeration.
|
// required for enumeration.
|
||||||
hDrive = CreateFileA(Path, GENERIC_READ|(bWriteAccess?GENERIC_WRITE:0),
|
hDrive = CreateFileA(Path, GENERIC_READ|(bWriteAccess?GENERIC_WRITE:0),
|
||||||
FILE_SHARE_READ|((bWriteAccess && bWriteShare)?FILE_SHARE_WRITE:0),
|
FILE_SHARE_READ|(bWriteShare?FILE_SHARE_WRITE:0),
|
||||||
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if (hDrive != INVALID_HANDLE_VALUE)
|
if (hDrive != INVALID_HANDLE_VALUE)
|
||||||
break;
|
break;
|
||||||
|
@ -146,11 +146,10 @@ static HANDLE GetHandle(char* Path, BOOL bLockDrive, BOOL bWriteAccess, BOOL bWr
|
||||||
break;
|
break;
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
uprintf("Waiting for access...");
|
uprintf("Waiting for access...");
|
||||||
} else if (bWriteAccess && !bWriteShare && (i > DRIVE_ACCESS_RETRIES/3)) {
|
} else if (!bWriteShare && (i > DRIVE_ACCESS_RETRIES/3)) {
|
||||||
// If we can't seem to get a hold of the drive for some time,
|
// If we can't seem to get a hold of the drive for some time,
|
||||||
// try to enable FILE_SHARE_WRITE...
|
// try to enable FILE_SHARE_WRITE...
|
||||||
uprintf("Warning: Could not obtain exclusive rights. Retrying with write sharing enabled...");
|
uprintf("Warning: Could not obtain exclusive rights. Retrying with write sharing enabled...");
|
||||||
SearchProcess(DevPath, TRUE, TRUE);
|
|
||||||
bWriteShare = TRUE;
|
bWriteShare = TRUE;
|
||||||
}
|
}
|
||||||
Sleep(DRIVE_ACCESS_TIMEOUT / DRIVE_ACCESS_RETRIES);
|
Sleep(DRIVE_ACCESS_TIMEOUT / DRIVE_ACCESS_RETRIES);
|
||||||
|
@ -207,11 +206,11 @@ out:
|
||||||
/*
|
/*
|
||||||
* Return a handle to the physical drive identified by DriveIndex
|
* Return a handle to the physical drive identified by DriveIndex
|
||||||
*/
|
*/
|
||||||
HANDLE GetPhysicalHandle(DWORD DriveIndex, BOOL bLockDrive, BOOL bWriteAccess)
|
HANDLE GetPhysicalHandle(DWORD DriveIndex, BOOL bLockDrive, BOOL bWriteAccess, BOOL bWriteShare)
|
||||||
{
|
{
|
||||||
HANDLE hPhysical = INVALID_HANDLE_VALUE;
|
HANDLE hPhysical = INVALID_HANDLE_VALUE;
|
||||||
char* PhysicalPath = GetPhysicalName(DriveIndex);
|
char* PhysicalPath = GetPhysicalName(DriveIndex);
|
||||||
hPhysical = GetHandle(PhysicalPath, bLockDrive, bWriteAccess, FALSE);
|
hPhysical = GetHandle(PhysicalPath, bLockDrive, bWriteAccess, bWriteShare);
|
||||||
safe_free(PhysicalPath);
|
safe_free(PhysicalPath);
|
||||||
return hPhysical;
|
return hPhysical;
|
||||||
}
|
}
|
||||||
|
@ -537,7 +536,7 @@ BOOL GetDriveLabel(DWORD DriveIndex, char* letters, char** label)
|
||||||
// Try to read an extended label from autorun first. Fallback to regular label if not found.
|
// Try to read an extended label from autorun first. Fallback to regular label if not found.
|
||||||
// In the case of card readers with no card, users can get an annoying popup asking them
|
// In the case of card readers with no card, users can get an annoying popup asking them
|
||||||
// to insert media. Use IOCTL_STORAGE_CHECK_VERIFY to prevent this
|
// to insert media. Use IOCTL_STORAGE_CHECK_VERIFY to prevent this
|
||||||
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE);
|
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE, TRUE);
|
||||||
if (DeviceIoControl(hPhysical, IOCTL_STORAGE_CHECK_VERIFY, NULL, 0, NULL, 0, &size, NULL))
|
if (DeviceIoControl(hPhysical, IOCTL_STORAGE_CHECK_VERIFY, NULL, 0, NULL, 0, &size, NULL))
|
||||||
AutorunLabel = get_token_data_file("label", AutorunPath);
|
AutorunLabel = get_token_data_file("label", AutorunPath);
|
||||||
else if (GetLastError() == ERROR_NOT_READY)
|
else if (GetLastError() == ERROR_NOT_READY)
|
||||||
|
@ -570,7 +569,7 @@ uint64_t GetDriveSize(DWORD DriveIndex)
|
||||||
BYTE geometry[256];
|
BYTE geometry[256];
|
||||||
PDISK_GEOMETRY_EX DiskGeometry = (PDISK_GEOMETRY_EX)(void*)geometry;
|
PDISK_GEOMETRY_EX DiskGeometry = (PDISK_GEOMETRY_EX)(void*)geometry;
|
||||||
|
|
||||||
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE);
|
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE, TRUE);
|
||||||
if (hPhysical == INVALID_HANDLE_VALUE)
|
if (hPhysical == INVALID_HANDLE_VALUE)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -592,7 +591,7 @@ BOOL IsMediaPresent(DWORD DriveIndex)
|
||||||
DWORD size;
|
DWORD size;
|
||||||
BYTE geometry[128];
|
BYTE geometry[128];
|
||||||
|
|
||||||
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE);
|
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE, TRUE);
|
||||||
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
|
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
|
||||||
NULL, 0, geometry, sizeof(geometry), &size, NULL) && (size > 0);
|
NULL, 0, geometry, sizeof(geometry), &size, NULL) && (size > 0);
|
||||||
safe_closehandle(hPhysical);
|
safe_closehandle(hPhysical);
|
||||||
|
@ -711,7 +710,7 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys
|
||||||
}
|
}
|
||||||
safe_free(volume_name);
|
safe_free(volume_name);
|
||||||
|
|
||||||
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE);
|
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE, TRUE);
|
||||||
if (hPhysical == INVALID_HANDLE_VALUE)
|
if (hPhysical == INVALID_HANDLE_VALUE)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ extern RUFUS_DRIVE_INFO SelectedDrive;
|
||||||
BOOL SetAutoMount(BOOL enable);
|
BOOL SetAutoMount(BOOL enable);
|
||||||
BOOL GetAutoMount(BOOL* enabled);
|
BOOL GetAutoMount(BOOL* enabled);
|
||||||
char* GetPhysicalName(DWORD DriveIndex);
|
char* GetPhysicalName(DWORD DriveIndex);
|
||||||
HANDLE GetPhysicalHandle(DWORD DriveIndex, BOOL bLockDrive, BOOL bWriteAccess);
|
HANDLE GetPhysicalHandle(DWORD DriveIndex, BOOL bLockDrive, BOOL bWriteAccess, BOOL bWriteShare);
|
||||||
char* GetLogicalName(DWORD DriveIndex, BOOL bKeepTrailingBackslash, BOOL bSilent);
|
char* GetLogicalName(DWORD DriveIndex, BOOL bKeepTrailingBackslash, BOOL bSilent);
|
||||||
BOOL WaitForLogical(DWORD DriveIndex);
|
BOOL WaitForLogical(DWORD DriveIndex);
|
||||||
HANDLE GetLogicalHandle(DWORD DriveIndex, BOOL bLockDrive, BOOL bWriteAccess, BOOL bWriteShare);
|
HANDLE GetLogicalHandle(DWORD DriveIndex, BOOL bLockDrive, BOOL bWriteAccess, BOOL bWriteShare);
|
||||||
|
|
|
@ -1663,7 +1663,7 @@ DWORD WINAPI FormatThread(void* param)
|
||||||
extra_partitions = XP_COMPAT;
|
extra_partitions = XP_COMPAT;
|
||||||
|
|
||||||
PrintInfoDebug(0, MSG_225);
|
PrintInfoDebug(0, MSG_225);
|
||||||
hPhysicalDrive = GetPhysicalHandle(DriveIndex, lock_drive, TRUE);
|
hPhysicalDrive = GetPhysicalHandle(DriveIndex, lock_drive, TRUE, FALSE);
|
||||||
if (hPhysicalDrive == INVALID_HANDLE_VALUE) {
|
if (hPhysicalDrive == INVALID_HANDLE_VALUE) {
|
||||||
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OPEN_FAILED;
|
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OPEN_FAILED;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -2096,7 +2096,7 @@ DWORD WINAPI SaveImageThread(void* param)
|
||||||
LastRefresh = 0;
|
LastRefresh = 0;
|
||||||
switch (img_save->Type) {
|
switch (img_save->Type) {
|
||||||
case IMG_SAVE_TYPE_VHD:
|
case IMG_SAVE_TYPE_VHD:
|
||||||
hPhysicalDrive = GetPhysicalHandle(img_save->DeviceNum, TRUE, FALSE);
|
hPhysicalDrive = GetPhysicalHandle(img_save->DeviceNum, TRUE, FALSE, FALSE);
|
||||||
break;
|
break;
|
||||||
case IMG_SAVE_TYPE_ISO:
|
case IMG_SAVE_TYPE_ISO:
|
||||||
hPhysicalDrive = CreateFileA(img_save->DevicePath, GENERIC_READ, FILE_SHARE_READ,
|
hPhysicalDrive = CreateFileA(img_save->DevicePath, GENERIC_READ, FILE_SHARE_READ,
|
||||||
|
|
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.15.1103"
|
CAPTION "Rufus 2.15.1104"
|
||||||
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
|
||||||
|
@ -334,8 +334,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 2,15,1103,0
|
FILEVERSION 2,15,1104,0
|
||||||
PRODUCTVERSION 2,15,1103,0
|
PRODUCTVERSION 2,15,1104,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -352,13 +352,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.15.1103"
|
VALUE "FileVersion", "2.15.1104"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2017 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2017 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.15.1103"
|
VALUE "ProductVersion", "2.15.1104"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
Loading…
Reference in a new issue