1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
use windows_kernel_sys::base::{
NTSTATUS,
STATUS_ACCESS_VIOLATION,
STATUS_ARRAY_BOUNDS_EXCEEDED,
STATUS_BREAKPOINT,
STATUS_DATATYPE_MISALIGNMENT,
STATUS_END_OF_FILE,
STATUS_FLOAT_DENORMAL_OPERAND,
STATUS_FLOAT_DIVIDE_BY_ZERO,
STATUS_FLOAT_INEXACT_RESULT,
STATUS_FLOAT_INVALID_OPERATION,
STATUS_FLOAT_OVERFLOW,
STATUS_FLOAT_STACK_CHECK,
STATUS_FLOAT_UNDERFLOW,
STATUS_GUARD_PAGE_VIOLATION,
STATUS_ILLEGAL_INSTRUCTION,
STATUS_INSUFFICIENT_RESOURCES,
STATUS_INTEGER_DIVIDE_BY_ZERO,
STATUS_INTEGER_OVERFLOW,
STATUS_INVALID_DISPOSITION,
STATUS_INVALID_HANDLE,
STATUS_INVALID_PARAMETER,
STATUS_INVALID_USER_BUFFER,
STATUS_IN_PAGE_ERROR,
STATUS_NONCONTINUABLE_EXCEPTION,
STATUS_NOT_IMPLEMENTED,
STATUS_NO_MEMORY,
STATUS_PRIVILEGED_INSTRUCTION,
STATUS_SINGLE_STEP,
STATUS_STACK_OVERFLOW,
STATUS_SUCCESS,
STATUS_UNSUCCESSFUL,
STATUS_UNWIND_CONSOLIDATE,
};
#[derive(Clone, Copy, Debug)]
pub struct Error(NTSTATUS);
impl Error {
pub const ACCESS_VIOLATION: Error = Error(STATUS_ACCESS_VIOLATION);
pub const ARRAY_BOUNDS_EXCEEDED: Error = Error(STATUS_ARRAY_BOUNDS_EXCEEDED);
pub const BREAKPOINT: Error = Error(STATUS_BREAKPOINT);
pub const DATATYPE_MISALIGNMENT: Error = Error(STATUS_DATATYPE_MISALIGNMENT);
pub const END_OF_FILE: Error = Error(STATUS_END_OF_FILE);
pub const FLOAT_DENORMAL_OPERAND: Error = Error(STATUS_FLOAT_DENORMAL_OPERAND);
pub const FLOAT_DIVIDE_BY_ZERO: Error = Error(STATUS_FLOAT_DIVIDE_BY_ZERO);
pub const FLOAT_INEXACT_RESULT: Error = Error(STATUS_FLOAT_INEXACT_RESULT);
pub const FLOAT_INVALID_OPERATION: Error = Error(STATUS_FLOAT_INVALID_OPERATION);
pub const FLOAT_OVERFLOW: Error = Error(STATUS_FLOAT_OVERFLOW);
pub const FLOAT_STACK_CHECK: Error = Error(STATUS_FLOAT_STACK_CHECK);
pub const FLOAT_UNDERFLOW: Error = Error(STATUS_FLOAT_UNDERFLOW);
pub const GUARD_PAGE_VIOLATION: Error = Error(STATUS_GUARD_PAGE_VIOLATION);
pub const ILLEGAL_INSTRUCTION: Error = Error(STATUS_ILLEGAL_INSTRUCTION);
pub const INSUFFICIENT_RESOURCES: Error = Error(STATUS_INSUFFICIENT_RESOURCES);
pub const INTEGER_DIVIDE_BY_ZERO: Error = Error(STATUS_INTEGER_DIVIDE_BY_ZERO);
pub const INTEGER_OVERFLOW: Error = Error(STATUS_INTEGER_OVERFLOW);
pub const INVALID_DISPOSITION: Error = Error(STATUS_INVALID_DISPOSITION);
pub const INVALID_HANDLE: Error = Error(STATUS_INVALID_HANDLE);
pub const INVALID_PARAMETER: Error = Error(STATUS_INVALID_PARAMETER);
pub const INVALID_USER_BUFFER: Error = Error(STATUS_INVALID_USER_BUFFER);
pub const IN_PAGE_ERROR: Error = Error(STATUS_IN_PAGE_ERROR);
pub const NONCONTINUABLE_EXCEPTION: Error = Error(STATUS_NONCONTINUABLE_EXCEPTION);
pub const NOT_IMPLEMENTED: Error = Error(STATUS_NOT_IMPLEMENTED);
pub const NO_MEMORY: Error = Error(STATUS_NO_MEMORY);
pub const PRIVILEGED_INSTRUCTION: Error = Error(STATUS_PRIVILEGED_INSTRUCTION);
pub const SINGLE_STEP: Error = Error(STATUS_SINGLE_STEP);
pub const STACK_OVERFLOW: Error = Error(STATUS_STACK_OVERFLOW);
pub const UNSUCCESSFUL: Error = Error(STATUS_UNSUCCESSFUL);
pub const UNWIND_CONSOLIDATE: Error = Error(STATUS_UNWIND_CONSOLIDATE);
pub fn from_ntstatus(status: NTSTATUS) -> Error { Error(status) }
pub fn to_ntstatus(&self) -> NTSTATUS { self.0 }
}
pub trait IntoResult {
fn into_result(self) -> Result<(), Error>;
}
impl IntoResult for NTSTATUS {
fn into_result(self) -> Result<(), Error> {
match self {
STATUS_SUCCESS => Ok(()),
status => Err(Error::from_ntstatus(status)),
}
}
}
|