Fix SSDT entry
SSDT entries can be negative, so signed int is used
This commit is contained in:
parent
2d7576b1e2
commit
967684f140
@ -27,7 +27,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
// }
|
// }
|
||||||
println!("=============================================");
|
println!("=============================================");
|
||||||
for r in unloaded.iter() {
|
for r in unloaded.iter() {
|
||||||
println!("{:#}", r.to_string());
|
println!("{:#}", r);
|
||||||
}
|
}
|
||||||
println!("=============================================");
|
println!("=============================================");
|
||||||
for (idx, func) in ssdt.iter().enumerate() {
|
for (idx, func) in ssdt.iter().enumerate() {
|
||||||
@ -65,7 +65,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
println!("\towned by nt!{}", funcname);
|
println!("\towned by nt!{}", funcname);
|
||||||
}
|
}
|
||||||
else if let Some(owner_) = owner {
|
else if let Some(owner_) = owner {
|
||||||
println!("\towned by {}", owner_);
|
println!("\\thooked by {}", owner_);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
println!("\tmissing owner");
|
println!("\tmissing owner");
|
||||||
|
@ -573,12 +573,15 @@ pub fn ssdt_table(driver: &DriverState) -> BoxResult<Vec<u64>> {
|
|||||||
let servicetable = ntosbase.clone() + driver.pdb_store.get_offset_r("KiServiceTable")?;
|
let servicetable = ntosbase.clone() + driver.pdb_store.get_offset_r("KiServiceTable")?;
|
||||||
let servicelimit_ptr = ntosbase.clone() + driver.pdb_store.get_offset_r("KiServiceLimit")?;
|
let servicelimit_ptr = ntosbase.clone() + driver.pdb_store.get_offset_r("KiServiceLimit")?;
|
||||||
|
|
||||||
// TODO: Shifting is wrong, Rust seems to do arithmetic shift
|
|
||||||
let servicelimit = driver.deref_addr_new::<u32>(servicelimit_ptr.address()) as u64;
|
let servicelimit = driver.deref_addr_new::<u32>(servicelimit_ptr.address()) as u64;
|
||||||
let ssdt: Vec<u64> = driver
|
let ssdt: Vec<u64> = driver
|
||||||
.deref_array::<u32>(&servicetable, servicelimit)
|
.deref_array::<i32>(&servicetable, servicelimit)
|
||||||
.iter()
|
.iter()
|
||||||
.map(|entry| servicetable.address() + ((*entry as u64) >> 4))
|
.map(|entry| {
|
||||||
|
// the entry can be negative, we need to do calculation using signed int
|
||||||
|
// and convert back to unsigned int for address
|
||||||
|
((servicetable.address() as i64) + ((*entry >> 4) as i64)) as u64
|
||||||
|
})
|
||||||
.collect();
|
.collect();
|
||||||
Ok(ssdt)
|
Ok(ssdt)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user