summaryrefslogtreecommitdiff
path: root/crates/windows-kernel-rs/src/error.rs
diff options
context:
space:
mode:
authorFuwn <[email protected]>2022-01-03 03:20:12 -0800
committerFuwn <[email protected]>2022-01-03 03:20:12 -0800
commit85db2b507f3f69b32811c54a89d9ac7bbbc46121 (patch)
tree2efd66da452f8a6a2cc6c91584c925f237506ddf /crates/windows-kernel-rs/src/error.rs
downloaddriver-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.rs87
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)),
+ }
+ }
+}