diff options
-rw-r--r-- | src/internal/pe_os.h | 1 | ||||
-rw-r--r-- | src/ldso/pe_load_framework_loader.c | 27 |
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; + } } } |