Replace `process.read_ptr` usage with `ptr.read`

This commit is contained in:
a2x 2024-03-29 16:10:37 +10:00
parent c00ac5dbb7
commit 621ec605c6
7 changed files with 40 additions and 43 deletions

View File

@ -51,8 +51,8 @@ fn read_buttons(
let mut key_ptr = Pointer64::<KeyboardKey>::from(process.read_addr64(list_addr)?); let mut key_ptr = Pointer64::<KeyboardKey>::from(process.read_addr64(list_addr)?);
while !key_ptr.is_null() { while !key_ptr.is_null() {
let key = process.read_ptr(key_ptr)?; let key = key_ptr.read(process)?;
let name = process.read_char_string(key.name.address())?; let name = key.name.read_string(process)?.to_string();
let value = let value =
((key_ptr.address() - module.base) + offset_of!(KeyboardKey.state) as i64) as u32; ((key_ptr.address() - module.base) + offset_of!(KeyboardKey.state) as i64) as u32;

View File

@ -56,8 +56,8 @@ fn read_interfaces(
let mut reg_ptr = Pointer64::<InterfaceReg>::from(process.read_addr64(list_addr)?); let mut reg_ptr = Pointer64::<InterfaceReg>::from(process.read_addr64(list_addr)?);
while !reg_ptr.is_null() { while !reg_ptr.is_null() {
let reg = process.read_ptr(reg_ptr)?; let reg = reg_ptr.read(process)?;
let name = process.read_char_string(reg.name.address())?; let name = reg.name.read_string(process)?.to_string();
let value = (reg.create_fn - module.base) as u32; let value = (reg.create_fn - module.base) as u32;

View File

@ -77,26 +77,22 @@ fn read_class_binding(
process: &mut IntoProcessInstanceArcBox<'_>, process: &mut IntoProcessInstanceArcBox<'_>,
binding_ptr: Pointer64<SchemaClassBinding>, binding_ptr: Pointer64<SchemaClassBinding>,
) -> Result<Class> { ) -> Result<Class> {
let binding = process.read_ptr(binding_ptr)?; let binding = binding_ptr.read(process)?;
let module_name = process let module_name = binding.module_name.read_string(process).map(|s| {
.read_char_string(binding.module_name.address()) let file_ext = match env::consts::OS {
.map(|s| { "linux" => "so",
format!( "windows" => "dll",
"{}.{}", _ => panic!("unsupported os"),
s, };
match env::consts::OS {
"linux" => "so",
"windows" => "dll",
_ => panic!("unsupported os"),
}
)
})?;
let name = process.read_char_string(binding.name.address())?; format!("{}.{}", s, file_ext)
})?;
let name = binding.name.read_string(process)?.to_string();
let parent = binding.base_classes.non_null().and_then(|ptr| { let parent = binding.base_classes.non_null().and_then(|ptr| {
let base_class = process.read_ptr(ptr).ok()?; let base_class = ptr.read(process).ok()?;
read_class_binding(process, base_class.prev) read_class_binding(process, base_class.prev)
.ok() .ok()
@ -137,19 +133,17 @@ fn read_class_binding_fields(
.add(i * mem::size_of::<SchemaClassFieldData>() as u16) .add(i * mem::size_of::<SchemaClassFieldData>() as u16)
.into(); .into();
let field = process.read_ptr(field_ptr)?; let field = field_ptr.read(process)?;
if field.schema_type.is_null() { if field.schema_type.is_null() {
return Err(Error::Other("field schema type is null")); return Err(Error::Other("field schema type is null"));
} }
let name = process.read_char_string(field.name.address())?; let name = field.name.read_string(process)?.to_string();
let schema_type = process.read_ptr(field.schema_type)?; let schema_type = field.schema_type.read(process)?;
// TODO: Parse this properly. // TODO: Parse this properly.
let ty = process let ty = schema_type.name.read_string(process)?.replace(" ", "");
.read_char_string(schema_type.name.address())?
.replace(" ", "");
Ok(ClassField { Ok(ClassField {
name, name,
@ -173,27 +167,30 @@ fn read_class_binding_metadata(
let metadata_ptr: Pointer64<SchemaMetadataEntryData> = let metadata_ptr: Pointer64<SchemaMetadataEntryData> =
binding.static_metadata.offset(i as _).into(); binding.static_metadata.offset(i as _).into();
let metadata = process.read_ptr(metadata_ptr)?; let metadata = metadata_ptr.read(process)?;
if metadata.network_value.is_null() { if metadata.network_value.is_null() {
return Err(Error::Other("class metadata network value is null")); return Err(Error::Other("class metadata network value is null"));
} }
let name = process.read_char_string(metadata.name.address())?; let name = metadata.name.read_string(process)?.to_string();
let network_value = process.read_ptr(metadata.network_value)?; let network_value = metadata.network_value.read(process)?;
let metadata = match name.as_str() { let metadata = match name.as_str() {
"MNetworkChangeCallback" => unsafe { "MNetworkChangeCallback" => unsafe {
let name = let name = network_value
process.read_char_string(network_value.union_data.name_ptr.address())?; .union_data
.name_ptr
.read_string(process)?
.to_string();
ClassMetadata::NetworkChangeCallback { name } ClassMetadata::NetworkChangeCallback { name }
}, },
"MNetworkVarNames" => unsafe { "MNetworkVarNames" => unsafe {
let var_value = network_value.union_data.var_value; let var_value = network_value.union_data.var_value;
let name = process.read_char_string(var_value.name.address())?; let name = var_value.name.read_string(process)?.to_string();
let ty = process.read_char_string(var_value.ty.address())?; let ty = var_value.ty.read_string(process)?.to_string();
ClassMetadata::NetworkVarNames { name, ty } ClassMetadata::NetworkVarNames { name, ty }
}, },
@ -209,8 +206,8 @@ fn read_enum_binding(
process: &mut IntoProcessInstanceArcBox<'_>, process: &mut IntoProcessInstanceArcBox<'_>,
binding_ptr: Pointer64<SchemaEnumBinding>, binding_ptr: Pointer64<SchemaEnumBinding>,
) -> Result<Enum> { ) -> Result<Enum> {
let binding = process.read_ptr(binding_ptr)?; let binding = binding_ptr.read(process)?;
let name = process.read_char_string(binding.name.address())?; let name = binding.name.read_string(process)?.to_string();
let members = read_enum_binding_members(process, &binding)?; let members = read_enum_binding_members(process, &binding)?;
@ -244,8 +241,8 @@ fn read_enum_binding_members(
.add(i * mem::size_of::<SchemaEnumeratorInfoData>() as u16) .add(i * mem::size_of::<SchemaEnumeratorInfoData>() as u16)
.into(); .into();
let enumerator_info = process.read_ptr(enumerator_info_ptr)?; let enumerator_info = enumerator_info_ptr.read(process)?;
let name = process.read_char_string(enumerator_info.name.address())?; let name = enumerator_info.name.read_string(process)?.to_string();
let value = { let value = {
let value = unsafe { enumerator_info.union_data.ulong } as i64; let value = unsafe { enumerator_info.union_data.ulong } as i64;
@ -301,7 +298,7 @@ fn read_type_scopes(
(0..type_scopes.size) (0..type_scopes.size)
.map(|i| { .map(|i| {
let type_scope_ptr = type_scopes.get(process, i as _)?; let type_scope_ptr = type_scopes.get(process, i as _)?;
let type_scope = process.read_ptr(type_scope_ptr)?; let type_scope = type_scope_ptr.read(process)?;
let name = unsafe { CStr::from_ptr(type_scope.name.as_ptr()) } let name = unsafe { CStr::from_ptr(type_scope.name.as_ptr()) }
.to_string_lossy() .to_string_lossy()

View File

@ -212,13 +212,13 @@ impl Results {
} }
pub fn format_module_name(module_name: &String) -> String { pub fn format_module_name(module_name: &String) -> String {
let extension = match env::consts::OS { let file_ext = match env::consts::OS {
"linux" => ".so", "linux" => ".so",
"windows" => ".dll", "windows" => ".dll",
_ => panic!("unsupported os"), _ => panic!("unsupported os"),
}; };
module_name.strip_suffix(extension).unwrap().to_string() module_name.strip_suffix(file_ext).unwrap().to_string()
} }
#[inline] #[inline]

View File

@ -23,7 +23,7 @@ impl<T: Sized + Pod> UtlMemory<T> {
let ptr = Pointer64::from(self.mem.address() + (idx * mem::size_of::<T>())); let ptr = Pointer64::from(self.mem.address() + (idx * mem::size_of::<T>()));
Ok(process.read_ptr(ptr)?) Ok(ptr.read(process)?)
} }
} }

View File

@ -82,7 +82,7 @@ impl<T: HashData, K: HashKey> UtlTsHash<T, K> {
let mut list = Vec::with_capacity(num_blocks); let mut list = Vec::with_capacity(num_blocks);
while !element_ptr.is_null() { while !element_ptr.is_null() {
let element = process.read_ptr(element_ptr)?; let element = element_ptr.read(process)?;
for i in 0..num_blocks { for i in 0..num_blocks {
if i >= block_size || list.len() >= block_size { if i >= block_size || list.len() >= block_size {

View File

@ -22,7 +22,7 @@ impl<T: Sized + Pod> UtlVector<T> {
let ptr = Pointer64::from(self.mem.address() + (idx * mem::size_of::<T>())); let ptr = Pointer64::from(self.mem.address() + (idx * mem::size_of::<T>()));
Ok(process.read_ptr(ptr)?) Ok(ptr.read(process)?)
} }
} }