From 0443ad2b6ed839e8480e250a655001f7d403c9cb Mon Sep 17 00:00:00 2001 From: midipix Date: May 09 2020 23:04:43 +0000 Subject: pe_get_device_dos_drive_letter(): open the drive, not the volume. Opening the drive rather than the volume's top-level directory requires reduced permissions, and so should always be preferred for as long as it is sufficient. This change, however, is also motivated by annoying media-drive driver behavior of popping up a dialog (how awful) window whenever an allegedly interactive application (that is, interactive by its subsystem) attempts to access a directory (or a file) in the drive while it is empty. --- diff --git a/src/internal/pe_os.h b/src/internal/pe_os.h index 11e334b..6963613 100644 --- a/src/internal/pe_os.h +++ b/src/internal/pe_os.h @@ -29,6 +29,7 @@ #define OS_FILE_DIRECTORY_FILE 0x00000001 #define OS_FILE_NON_DIRECTORY_FILE 0x00000040 +#define OS_FILE_SYNCHRONOUS_IO_ALERT 0x00000010 #define OS_FILE_SHARE_READ 0x00000001 #define OS_FILE_SHARE_WRITE 0x00000002 diff --git a/src/ldso/pe_load_framework_loader.c b/src/ldso/pe_load_framework_loader.c index 347d3ab..4595b99 100644 --- a/src/ldso/pe_load_framework_loader.c +++ b/src/ldso/pe_load_framework_loader.c @@ -34,7 +34,7 @@ static int32_t pe_get_device_dos_drive_letter( wchar16_t namebuf[8] = { '\\','?','?','\\', - 'X',':','\\',0}; + 'X',':',0}; unsigned char letters[26] = { 'C','Z','Y','X','W','V', @@ -54,7 +54,7 @@ static int32_t pe_get_device_dos_drive_letter( /* path */ path.buffer = namebuf; - path.strlen = 7 * sizeof(wchar16_t); + path.strlen = 6 * sizeof(wchar16_t); path.maxlen = 0; /* oa */ @@ -72,13 +72,12 @@ static int32_t pe_get_device_dos_drive_letter( status = zw_open_file( &hdevice, OS_SEC_SYNCHRONIZE - | OS_FILE_READ_ATTRIBUTES - | OS_FILE_READ_ACCESS, + | OS_FILE_READ_ATTRIBUTES, &oa,&iosb, OS_FILE_SHARE_READ | OS_FILE_SHARE_WRITE | OS_FILE_SHARE_DELETE, - OS_FILE_DIRECTORY_FILE); + OS_FILE_SYNCHRONOUS_IO_ALERT); if (status == OS_STATUS_SUCCESS) { status = zw_query_object( @@ -92,17 +91,19 @@ static int32_t pe_get_device_dos_drive_letter( src = devname; dst = dpath->buffer; - idx = 0; - cap = devnamelen / sizeof(wchar16_t); + if (devnamelen == dpath->strlen) { + idx = 0; + cap = devnamelen / sizeof(wchar16_t); - for (; idx