use core::ffi::c_void;
use wdk::println;
use wdk_sys::ntddk::{memcpy, MmIsAddressValid};
use crate::slib::distorm35::DisassembleInstruction;
#[derive(Debug)]
pub struct AssemblyError {}
pub fn search_4bit_on_5bit_insrtuction(
target_address: *mut c_void,
p1: u8,
max_length: u32,
index: usize,
) -> Result<u64, AssemblyError> {
let binary_code = 0u32;
let mut address: *mut u8 = target_address as _;
let end = unsafe { target_address.add(max_length as _) as _ };
let mut i = 1;
while address < end {
if unsafe { MmIsAddressValid(address as _) == 0 } {
return Err(AssemblyError {});
}
let ins_length = unsafe { DisassembleInstruction(address as _) };
if ins_length <= 0 {
println!("search_4bit_on_5bit_insrtuction ins_length < 0");
return Err(AssemblyError {});
}
if ins_length == 5 {
unsafe {
if *address == p1 {
if i < index {
i += 1;
} else {
memcpy(&binary_code as *const _ as _, address.add(1) as _, 4);
let r = calc_address(address as _, binary_code) + 5;
return Ok(r);
}
}
}
}
address = unsafe { address.add(ins_length as _) };
}
println!("search_4bit_on_5bit_insrtuction not find");
Err(AssemblyError {})
}
pub fn search_4bit_on_7bit_insrtuction(
target_address: *mut c_void,
p1: u8,
p2: u8,
p3: u8,
max_length: u32,
) -> Result<u64, AssemblyError> {
let binary_code = 0u32;
let mut address: *mut u8 = target_address as _;
let end = unsafe { target_address.add(max_length as _) as _ };
while address < end {
let ins_length = unsafe { DisassembleInstruction(address as _) };
if ins_length <= 0 {
return Err(AssemblyError {});
}
if ins_length == 7 {
unsafe {
if *address == p1 && *address.add(1) == p2 && *address.add(2) == p3 {
memcpy(&binary_code as *const _ as _, address.add(3) as _, 4);
let r = calc_address(address as _, binary_code) + 7;
return Ok(r);
}
}
}
address = unsafe { address.add(ins_length as _) };
}
Err(AssemblyError {})
}
pub fn calc_address(ins_address: *mut c_void, binary_code: u32) -> u64 {
let address = ins_address as u64;
let hight = address & 0xffffffff00000000;
let lower = address as u32;
let lower = (lower as u64 + binary_code as u64) as u32;
let r = hight + lower as u64;
r
}