binaryninja/binary_view/
memory_map.rs1use crate::binary_view::BinaryView;
2use crate::data_buffer::DataBuffer;
3use crate::file_accessor::{Accessor, FileAccessor};
4use crate::rc::Ref;
5use crate::segment::SegmentFlags;
6use crate::string::{BnString, IntoCStr};
7use binaryninjacore_sys::*;
8
9#[derive(PartialEq, Eq, Hash)]
26pub struct MemoryMap {
27 view: Ref<BinaryView>,
28}
29
30impl MemoryMap {
31 pub fn new(view: Ref<BinaryView>) -> Self {
32 Self { view }
33 }
34
35 pub fn base_description(&self) -> String {
39 let desc_raw = unsafe { BNGetBaseMemoryMapDescription(self.view.handle) };
40 unsafe { BnString::into_string(desc_raw) }
41 }
42
43 pub fn description(&self) -> String {
45 let desc_raw = unsafe { BNGetMemoryMapDescription(self.view.handle) };
46 unsafe { BnString::into_string(desc_raw) }
47 }
48
49 pub fn set_logical_enabled(&mut self, enabled: bool) {
56 unsafe { BNSetLogicalMemoryMapEnabled(self.view.handle, enabled) };
57 }
58
59 pub fn is_activated(&self) -> bool {
73 unsafe { BNIsMemoryMapActivated(self.view.handle) }
74 }
75
76 pub fn add_binary_memory_region(
77 &mut self,
78 name: &str,
79 start: u64,
80 view: &BinaryView,
81 segment_flags: Option<SegmentFlags>,
82 ) -> bool {
83 let name_raw = name.to_cstr();
84 unsafe {
85 BNAddBinaryMemoryRegion(
86 self.view.handle,
87 name_raw.as_ptr(),
88 start,
89 view.handle,
90 segment_flags.unwrap_or_default().into_raw(),
91 )
92 }
93 }
94
95 pub fn add_data_memory_region(
99 &mut self,
100 name: &str,
101 start: u64,
102 data: &DataBuffer,
103 segment_flags: Option<SegmentFlags>,
104 ) -> bool {
105 let name_raw = name.to_cstr();
106 unsafe {
107 BNAddDataMemoryRegion(
108 self.view.handle,
109 name_raw.as_ptr(),
110 start,
111 data.as_raw(),
112 segment_flags.unwrap_or_default().into_raw(),
113 )
114 }
115 }
116
117 pub fn add_remote_memory_region<A: Accessor>(
127 &mut self,
128 name: &str,
129 start: u64,
130 accessor: &mut FileAccessor<A>,
131 segment_flags: Option<SegmentFlags>,
132 ) -> bool {
133 let name_raw = name.to_cstr();
134 unsafe {
135 BNAddRemoteMemoryRegion(
136 self.view.handle,
137 name_raw.as_ptr(),
138 start,
139 &mut accessor.raw,
140 segment_flags.unwrap_or_default().into_raw(),
141 )
142 }
143 }
144
145 pub fn add_unbacked_memory_region(
147 &mut self,
148 name: &str,
149 start: u64,
150 length: u64,
151 segment_flags: Option<SegmentFlags>,
152 fill: Option<u8>,
153 ) -> bool {
154 let name_raw = name.to_cstr();
155 unsafe {
156 BNAddUnbackedMemoryRegion(
157 self.view.handle,
158 name_raw.as_ptr(),
159 start,
160 length,
161 segment_flags.unwrap_or_default().into_raw(),
162 fill.unwrap_or_default(),
163 )
164 }
165 }
166
167 pub fn remove_memory_region(&mut self, name: &str) -> bool {
168 let name_raw = name.to_cstr();
169 unsafe { BNRemoveMemoryRegion(self.view.handle, name_raw.as_ptr()) }
170 }
171
172 pub fn active_memory_region_at(&self, addr: u64) -> String {
173 unsafe {
174 let name_raw = BNGetActiveMemoryRegionAt(self.view.handle, addr);
175 BnString::into_string(name_raw)
176 }
177 }
178
179 pub fn memory_region_flags(&self, name: &str) -> SegmentFlags {
180 let name_raw = name.to_cstr();
181 let flags_raw = unsafe { BNGetMemoryRegionFlags(self.view.handle, name_raw.as_ptr()) };
182 SegmentFlags::from_raw(flags_raw)
183 }
184
185 pub fn set_memory_region_flags(&mut self, name: &str, flags: SegmentFlags) -> bool {
186 let name_raw = name.to_cstr();
187 unsafe { BNSetMemoryRegionFlags(self.view.handle, name_raw.as_ptr(), flags.into_raw()) }
188 }
189
190 pub fn is_memory_region_enabled(&self, name: &str) -> bool {
191 let name_raw = name.to_cstr();
192 unsafe { BNIsMemoryRegionEnabled(self.view.handle, name_raw.as_ptr()) }
193 }
194
195 pub fn set_memory_region_enabled(&mut self, name: &str, enabled: bool) -> bool {
196 let name_raw = name.to_cstr();
197 unsafe { BNSetMemoryRegionEnabled(self.view.handle, name_raw.as_ptr(), enabled) }
198 }
199
200 pub fn is_memory_region_rebaseable(&self, name: &str) -> bool {
202 let name_raw = name.to_cstr();
203 unsafe { BNIsMemoryRegionRebaseable(self.view.handle, name_raw.as_ptr()) }
204 }
205
206 pub fn set_memory_region_rebaseable(&mut self, name: &str, enabled: bool) -> bool {
207 let name_raw = name.to_cstr();
208 unsafe { BNSetMemoryRegionRebaseable(self.view.handle, name_raw.as_ptr(), enabled) }
209 }
210
211 pub fn memory_region_fill(&self, name: &str) -> u8 {
212 let name_raw = name.to_cstr();
213 unsafe { BNGetMemoryRegionFill(self.view.handle, name_raw.as_ptr()) }
214 }
215
216 pub fn set_memory_region_fill(&mut self, name: &str, fill: u8) -> bool {
217 let name_raw = name.to_cstr();
218 unsafe { BNSetMemoryRegionFill(self.view.handle, name_raw.as_ptr(), fill) }
219 }
220
221 pub fn reset(&mut self) {
222 unsafe { BNResetMemoryMap(self.view.handle) }
223 }
224}