Windows io::Error: also format NTSTATUS error codes
This commit is contained in:
parent
526d39948a
commit
70c267fc91
2 changed files with 24 additions and 3 deletions
|
@ -198,7 +198,10 @@ pub const ERROR_TIMEOUT: DWORD = 0x5B4;
|
||||||
|
|
||||||
pub const INVALID_HANDLE_VALUE: HANDLE = !0 as HANDLE;
|
pub const INVALID_HANDLE_VALUE: HANDLE = !0 as HANDLE;
|
||||||
|
|
||||||
|
pub const FACILITY_NT_BIT: DWORD = 0x1000_0000;
|
||||||
|
|
||||||
pub const FORMAT_MESSAGE_FROM_SYSTEM: DWORD = 0x00001000;
|
pub const FORMAT_MESSAGE_FROM_SYSTEM: DWORD = 0x00001000;
|
||||||
|
pub const FORMAT_MESSAGE_FROM_HMODULE: DWORD = 0x00000800;
|
||||||
pub const FORMAT_MESSAGE_IGNORE_INSERTS: DWORD = 0x00000200;
|
pub const FORMAT_MESSAGE_IGNORE_INSERTS: DWORD = 0x00000200;
|
||||||
|
|
||||||
pub const TLS_OUT_OF_INDEXES: DWORD = 0xFFFFFFFF;
|
pub const TLS_OUT_OF_INDEXES: DWORD = 0xFFFFFFFF;
|
||||||
|
|
|
@ -32,7 +32,7 @@ pub fn errno() -> i32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets a detailed string description for the given error number.
|
/// Gets a detailed string description for the given error number.
|
||||||
pub fn error_string(errnum: i32) -> String {
|
pub fn error_string(mut errnum: i32) -> String {
|
||||||
// This value is calculated from the macro
|
// This value is calculated from the macro
|
||||||
// MAKELANGID(LANG_SYSTEM_DEFAULT, SUBLANG_SYS_DEFAULT)
|
// MAKELANGID(LANG_SYSTEM_DEFAULT, SUBLANG_SYS_DEFAULT)
|
||||||
let langId = 0x0800 as c::DWORD;
|
let langId = 0x0800 as c::DWORD;
|
||||||
|
@ -40,9 +40,27 @@ pub fn error_string(errnum: i32) -> String {
|
||||||
let mut buf = [0 as c::WCHAR; 2048];
|
let mut buf = [0 as c::WCHAR; 2048];
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let res = c::FormatMessageW(c::FORMAT_MESSAGE_FROM_SYSTEM |
|
let mut module = ptr::null_mut();
|
||||||
|
let mut flags = 0;
|
||||||
|
|
||||||
|
// NTSTATUS errors may be encoded as HRESULT, which may returned from
|
||||||
|
// GetLastError. For more information about Windows error codes, see
|
||||||
|
// `[MS-ERREF]`: https://msdn.microsoft.com/en-us/library/cc231198.aspx
|
||||||
|
if (errnum & c::FACILITY_NT_BIT as i32) != 0 {
|
||||||
|
// format according to https://support.microsoft.com/en-us/help/259693
|
||||||
|
const NTDLL_DLL: &'static [u16] = &['N' as _, 'T' as _, 'D' as _, 'L' as _, 'L' as _,
|
||||||
|
'.' as _, 'D' as _, 'L' as _, 'L' as _, 0];
|
||||||
|
module = c::GetModuleHandleW(NTDLL_DLL.as_ptr());
|
||||||
|
|
||||||
|
if module != ptr::null_mut() {
|
||||||
|
errnum ^= c::FACILITY_NT_BIT as i32;
|
||||||
|
flags = c::FORMAT_MESSAGE_FROM_HMODULE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let res = c::FormatMessageW(flags | c::FORMAT_MESSAGE_FROM_SYSTEM |
|
||||||
c::FORMAT_MESSAGE_IGNORE_INSERTS,
|
c::FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
ptr::null_mut(),
|
module,
|
||||||
errnum as c::DWORD,
|
errnum as c::DWORD,
|
||||||
langId,
|
langId,
|
||||||
buf.as_mut_ptr(),
|
buf.as_mut_ptr(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue