diff options
| author | Fuwn <[email protected]> | 2022-01-03 03:20:12 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2022-01-03 03:20:12 -0800 |
| commit | 85db2b507f3f69b32811c54a89d9ac7bbbc46121 (patch) | |
| tree | 2efd66da452f8a6a2cc6c91584c925f237506ddf /crates/windows-kernel-rs/src/error.rs | |
| download | driver-85db2b507f3f69b32811c54a89d9ac7bbbc46121.tar.xz driver-85db2b507f3f69b32811c54a89d9ac7bbbc46121.zip | |
feat(driver): commit primer
Diffstat (limited to 'crates/windows-kernel-rs/src/error.rs')
| -rw-r--r-- | crates/windows-kernel-rs/src/error.rs | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/crates/windows-kernel-rs/src/error.rs b/crates/windows-kernel-rs/src/error.rs new file mode 100644 index 0000000..075287f --- /dev/null +++ b/crates/windows-kernel-rs/src/error.rs @@ -0,0 +1,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)), + } + } +} |