Merge pull request #4261 from CraftSpider/windows-rtl-to-dos
Implement RtlNtStatusToDosError and shim test for it
This commit is contained in:
commit
72841001f1
2 changed files with 29 additions and 1 deletions
|
|
@ -396,6 +396,25 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||
let last_error = this.get_last_error()?;
|
||||
this.write_scalar(last_error, dest)?;
|
||||
}
|
||||
"RtlNtStatusToDosError" => {
|
||||
let [status] = this.check_shim(abi, sys_conv, link_name, args)?;
|
||||
let status = this.read_scalar(status)?.to_u32()?;
|
||||
let err = match status {
|
||||
// STATUS_MEDIA_WRITE_PROTECTED => ERROR_WRITE_PROTECT
|
||||
0xC00000A2 => 19,
|
||||
// STATUS_FILE_INVALID => ERROR_FILE_INVALID
|
||||
0xC0000098 => 1006,
|
||||
// STATUS_DISK_FULL => ERROR_DISK_FULL
|
||||
0xC000007F => 112,
|
||||
// STATUS_IO_DEVICE_ERROR => ERROR_IO_DEVICE
|
||||
0xC0000185 => 1117,
|
||||
// STATUS_ACCESS_DENIED => ERROR_ACCESS_DENIED
|
||||
0xC0000022 => 5,
|
||||
// Anything without an error code => ERROR_MR_MID_NOT_FOUND
|
||||
_ => 317,
|
||||
};
|
||||
this.write_scalar(Scalar::from_i32(err), dest)?;
|
||||
}
|
||||
|
||||
// Querying system information
|
||||
"GetSystemInfo" => {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,9 @@ use std::ptr;
|
|||
mod utils;
|
||||
|
||||
use windows_sys::Win32::Foundation::{
|
||||
CloseHandle, ERROR_ALREADY_EXISTS, GENERIC_READ, GENERIC_WRITE, GetLastError,
|
||||
CloseHandle, ERROR_ACCESS_DENIED, ERROR_ALREADY_EXISTS, ERROR_IO_DEVICE, GENERIC_READ,
|
||||
GENERIC_WRITE, GetLastError, RtlNtStatusToDosError, STATUS_ACCESS_DENIED,
|
||||
STATUS_IO_DEVICE_ERROR,
|
||||
};
|
||||
use windows_sys::Win32::Storage::FileSystem::{
|
||||
BY_HANDLE_FILE_INFORMATION, CREATE_ALWAYS, CREATE_NEW, CreateFileW, FILE_ATTRIBUTE_DIRECTORY,
|
||||
|
|
@ -26,6 +28,7 @@ fn main() {
|
|||
test_create_always_twice();
|
||||
test_open_always_twice();
|
||||
test_open_dir_reparse();
|
||||
test_ntstatus_to_dos();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -191,6 +194,12 @@ unsafe fn test_open_dir_reparse() {
|
|||
};
|
||||
}
|
||||
|
||||
unsafe fn test_ntstatus_to_dos() {
|
||||
// We won't test all combinations, just a couple common ones
|
||||
assert_eq!(RtlNtStatusToDosError(STATUS_IO_DEVICE_ERROR), ERROR_IO_DEVICE);
|
||||
assert_eq!(RtlNtStatusToDosError(STATUS_ACCESS_DENIED), ERROR_ACCESS_DENIED);
|
||||
}
|
||||
|
||||
fn to_wide_cstr(path: &Path) -> Vec<u16> {
|
||||
let mut raw_path = path.as_os_str().encode_wide().collect::<Vec<_>>();
|
||||
raw_path.extend([0, 0]);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue