use crate::{
test::{
create_passing_test_assembly, create_test_assembly, create_test_assembly_with_error,
get_testfile_wb, TestAssembly,
},
Error, Result,
};
pub fn raw_heap_validator_file_factory() -> Result<Vec<TestAssembly>> {
let mut assemblies = Vec::new();
let Some(clean_testfile) = get_testfile_wb() else {
return Err(Error::Other(
"WindowsBase.dll not available - test cannot run".to_string(),
));
};
assemblies.push(TestAssembly::new(&clean_testfile, true));
assemblies.push(create_assembly_with_invalid_utf16_userstring()?);
assemblies.push(create_assembly_with_invalid_guid_alignment()?);
assemblies.push(create_assembly_with_valid_guid_content()?);
Ok(assemblies)
}
pub fn create_assembly_with_invalid_utf16_userstring() -> Result<TestAssembly> {
create_test_assembly_with_error(get_testfile_wb, "Malformed", |assembly| {
let mut userstring_heap = vec![0];
userstring_heap.push(0x05); userstring_heap.extend_from_slice(&[0x00, 0xD8]); userstring_heap.extend_from_slice(&[0x41, 0x00]); userstring_heap.push(0x01);
assembly.userstring_add_heap(userstring_heap)?;
Ok(())
})
}
pub fn create_assembly_with_invalid_guid_alignment() -> Result<TestAssembly> {
create_test_assembly_with_error(get_testfile_wb, "GUID heap", |assembly| {
let mut guid_heap = Vec::new();
guid_heap.extend_from_slice(&[0x12; 16]);
guid_heap.extend_from_slice(&[0x34; 10]);
assembly.guid_add_heap(guid_heap)?;
Ok(())
})
}
pub fn create_assembly_with_valid_guid_content() -> Result<TestAssembly> {
create_passing_test_assembly(get_testfile_wb, |assembly| {
let mut guid_heap = Vec::new();
guid_heap.extend_from_slice(&[
0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
0x77, 0x88,
]);
assembly.guid_add_heap(guid_heap)?;
Ok(())
})
}
pub fn create_assembly_with_unaligned_userstring_heap() -> Result<TestAssembly> {
create_test_assembly(get_testfile_wb, |assembly| {
let userstring_heap = vec![0, 0x03, 0x41, 0x00, 0x01]; assembly.userstring_add_heap(userstring_heap)?;
Ok(())
})
}
pub fn create_assembly_with_oversized_individual_userstring() -> Result<TestAssembly> {
create_test_assembly(get_testfile_wb, |assembly| {
let mut userstring_heap = vec![0];
userstring_heap.extend_from_slice(&[
0xFF, 0xFF, 0xFF,
0xFF, 0x41, 0x00, 0x42, 0x00, 0x01, ]);
while !userstring_heap.len().is_multiple_of(4) {
userstring_heap.push(0);
}
assembly.userstring_add_heap(userstring_heap)?;
Ok(())
})
}