#[cfg(test)]
pub mod tests {
use crate::tests::util::local_debug;
use wdext::{
PointerWidth, ReadStringStatus, TObject, TargetContext,
object::traits::string::{AnsiString, UnicodeString},
};
mod x64 {
pub use wdext::object::win_25h2::x64::*;
}
mod x86 {
pub use wdext::object::win_25h2::x86::*;
}
mod util;
fn assert_strings<AS: AnsiString, US: UnicodeString>(ctx: &TargetContext) {
let addr_us: US::Ptr =
ctx.evaluate_pointer("String!us").unwrap().into();
let addr_as: AS::Ptr =
ctx.evaluate_pointer("String!as").unwrap().into();
let tobj_us =
TObject::read_pointer(addr_us, ctx, ctx.memory()).unwrap();
let tobj_as =
TObject::read_pointer(addr_as, ctx, ctx.memory()).unwrap();
assert_eq!(tobj_us.object().length(), 4);
assert_eq!(tobj_us.object().maximum_length(), 4);
assert_eq!(
tobj_us
.object()
.read_string(ctx, ctx.memory(), None)
.unwrap(),
("Te".to_string(), ReadStringStatus::MaxBytesReached)
);
assert_eq!(
tobj_us.object().read_string(ctx, ctx.memory(), 2).unwrap(),
("T".to_string(), ReadStringStatus::MaxBytesReached)
);
assert_eq!(
tobj_us
.object()
.read_string(ctx, ctx.memory(), 10000)
.unwrap(),
(
"Test UNICODE_STRING".to_string(),
ReadStringStatus::NulTerminated
)
);
assert_eq!(tobj_as.object().length(), 4);
assert_eq!(tobj_as.object().maximum_length(), 4);
assert_eq!(
tobj_as
.object()
.read_string(ctx, ctx.memory(), None, 932)
.unwrap(),
("Test".to_string(), ReadStringStatus::MaxBytesReached)
);
assert_eq!(
tobj_as
.object()
.read_string(ctx, ctx.memory(), 2, 932)
.unwrap(),
("Te".to_string(), ReadStringStatus::MaxBytesReached)
);
assert_eq!(
tobj_as
.object()
.read_string(ctx, ctx.memory(), 10000, 932)
.unwrap(),
(
"Test ANSI_STRING".to_string(),
ReadStringStatus::NulTerminated,
)
);
}
#[test]
fn test_strings() {
#[cfg(target_arch = "x86")]
let exe_path = r#"./tests/bin/x86/String.exe"#;
#[cfg(target_arch = "x86_64")]
let exe_path = r#"./tests/bin/x64/String.exe"#;
let ctx = local_debug(exe_path);
match ctx.pointer_width() {
PointerWidth::Ptr32 => {
assert_strings::<
x86::string::_ANSI_STRING,
x86::string::_UNICODE_STRING,
>(&ctx);
}
PointerWidth::Ptr64 => {
assert_strings::<
x64::string::_ANSI_STRING,
x64::string::_UNICODE_STRING,
>(&ctx);
}
}
}
}