summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/internal/pe_os.h1
-rw-r--r--src/ldso/pe_load_framework_loader.c27
2 files changed, 15 insertions, 13 deletions
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<cap && src[idx]==dst[idx]; )
- idx++;
+ for (; idx<cap && src[idx]==dst[idx]; )
+ idx++;
- if (idx==cap && dst[idx]=='\\') {
- zw_close(hdevice);
- *letter = letters[sigh];
+ if (idx==cap) {
+ zw_close(hdevice);
+ *letter = letters[sigh];
- return OS_STATUS_SUCCESS;
+ return OS_STATUS_SUCCESS;
+ }
}
}