summaryrefslogtreecommitdiff
path: root/crates/windows-kernel-rs/src/error.rs
blob: 075287f7db2ae011a5df89cb9002cd330f94ffd4 (plain) (blame)
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)),
    }
  }
}