kernel/object/
introspection.rs1#[repr(C)]
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub struct KernelObjectInfo {
10 pub object_type: KernelObjectType,
12 pub capabilities: ObjectCapabilities,
14 pub handle_role: HandleRole,
16 pub access_mode: u32,
18}
19
20#[repr(u32)]
22#[derive(Debug, Clone, Copy, PartialEq, Eq)]
23pub enum KernelObjectType {
24 File = 1,
26 Pipe = 2,
28 CharDevice = 3,
30 BlockDevice = 4,
32 Socket = 5,
34 Unknown = 0,
36}
37
38#[repr(C)]
40#[derive(Debug, Clone, Copy, PartialEq, Eq)]
41pub struct ObjectCapabilities {
42 pub stream_ops: bool,
44 pub file_ops: bool,
46 pub pipe_ops: bool,
48 pub clone_ops: bool,
50 pub reserved: [bool; 4],
52}
53
54#[repr(u32)]
56#[derive(Debug, Clone, Copy, PartialEq, Eq)]
57pub enum HandleRole {
58 StandardInputOutput = 1,
60 IpcChannel = 2,
62 Regular = 3,
64}
65
66impl KernelObjectInfo {
67 pub fn for_file(handle_role: HandleRole, readable: bool, writable: bool) -> Self {
69 Self {
70 object_type: KernelObjectType::File,
71 capabilities: ObjectCapabilities {
72 stream_ops: true,
73 file_ops: true,
74 pipe_ops: false,
75 clone_ops: false,
76 reserved: [false; 4],
77 },
78 handle_role,
79 access_mode: Self::encode_access_mode(readable, writable),
80 }
81 }
82
83 pub fn for_pipe(handle_role: HandleRole, readable: bool, writable: bool) -> Self {
85 Self {
86 object_type: KernelObjectType::Pipe,
87 capabilities: ObjectCapabilities {
88 stream_ops: true,
89 file_ops: false,
90 pipe_ops: true,
91 clone_ops: true,
92 reserved: [false; 4],
93 },
94 handle_role,
95 access_mode: Self::encode_access_mode(readable, writable),
96 }
97 }
98
99 pub fn unknown() -> Self {
101 Self {
102 object_type: KernelObjectType::Unknown,
103 capabilities: ObjectCapabilities {
104 stream_ops: false,
105 file_ops: false,
106 pipe_ops: false,
107 clone_ops: false,
108 reserved: [false; 4],
109 },
110 handle_role: HandleRole::Regular,
111 access_mode: 0,
112 }
113 }
114
115 fn encode_access_mode(readable: bool, writable: bool) -> u32 {
116 let mut mode = 0;
117 if readable { mode |= 0x1; }
118 if writable { mode |= 0x2; }
119 mode
120 }
121}
122
123impl From<crate::object::handle::HandleType> for HandleRole {
125 fn from(handle_type: crate::object::handle::HandleType) -> Self {
126 match handle_type {
127 crate::object::handle::HandleType::StandardInputOutput(_) => HandleRole::StandardInputOutput,
128 crate::object::handle::HandleType::IpcChannel => HandleRole::IpcChannel,
129 crate::object::handle::HandleType::Regular => HandleRole::Regular,
130 }
131 }
132}
133
134impl From<crate::object::handle::AccessMode> for (bool, bool) {
136 fn from(access_mode: crate::object::handle::AccessMode) -> Self {
137 match access_mode {
138 crate::object::handle::AccessMode::ReadOnly => (true, false),
139 crate::object::handle::AccessMode::WriteOnly => (false, true),
140 crate::object::handle::AccessMode::ReadWrite => (true, true),
141 }
142 }
143}