use crate::maps::Maps;
use super::unicode_string64::UnicodeString64;
pub const RTL_USER_PROCESS_PARAMETERS_NORMALIZED: u32 = 0x0001;
pub const RTL_USER_PROCESS_PARAMETERS_APP_MANIFEST: u32 = 0x2000;
pub const RTL_USER_PROCESS_PARAMETERS_IMAGE_KEY_MISSING: u32 = 0x4000;
#[derive(Debug)]
pub struct RtlUserProcessParameters64 {
pub maximum_length: u32,
pub length: u32,
pub flags: u32,
pub debug_flags: u32,
pub reserved2: [u64; 8],
pub dll_path: UnicodeString64,
pub image_path_name: UnicodeString64,
pub command_line: UnicodeString64,
}
impl Default for RtlUserProcessParameters64 {
fn default() -> Self {
Self::new()
}
}
impl RtlUserProcessParameters64 {
pub fn new() -> Self {
Self {
maximum_length: Self::size() as u32,
length: Self::size() as u32,
flags: RTL_USER_PROCESS_PARAMETERS_NORMALIZED
| RTL_USER_PROCESS_PARAMETERS_APP_MANIFEST
| RTL_USER_PROCESS_PARAMETERS_IMAGE_KEY_MISSING,
debug_flags: 0,
reserved2: [0; 8],
dll_path: UnicodeString64::new(),
image_path_name: UnicodeString64::new(),
command_line: UnicodeString64::new(),
}
}
pub fn size() -> usize {
0x480
}
pub fn save(&mut self, addr: u64, maps: &mut Maps) {
maps.write_dword(addr, self.maximum_length);
maps.write_dword(addr + 4, self.length);
maps.write_dword(addr + 8, self.flags);
maps.write_dword(addr + 12, self.debug_flags);
for (i, val) in self.reserved2.iter().enumerate() {
maps.write_qword(addr + 16 + (i * 8) as u64, *val);
}
self.dll_path.save(addr + 0x50, maps);
self.image_path_name.save(addr + 0x60, maps);
self.command_line.save(addr + 0x70, maps)
}
}