Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 44 additions & 14 deletions src/infrastructure/native/process_architecture.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,10 +111,10 @@ fn classify_machines(
let process_machine = match reported_machine {
Some(machine) => machine,
None if wow_machine != IMAGE_FILE_MACHINE_UNKNOWN => wow_machine,
// On ARM64, both native ARM64 and x86-64/ARM64EC can report UNKNOWN. The old API
// alone cannot distinguish them, including on Windows 10 preview builds.
None if native_machine == IMAGE_FILE_MACHINE_ARM64 => return Err(ERROR_NOT_SUPPORTED),
None => native_machine,
// IsWow64Process2 reports IMAGE_FILE_MACHINE_UNKNOWN for every non-WOW64
// process. That value was not observed. On ARM64 it cannot separate native
// ARM64 from x64/ARM64EC, and on every other host it is still not native.
None => return Err(ERROR_NOT_SUPPORTED),
};
let process_is_32_bit = machine_is_32_bit(process_machine)?;
let mode = match (native_machine, process_machine) {
Expand Down Expand Up @@ -417,31 +417,61 @@ mod tests {
}

#[test]
fn old_api_keeps_known_bitness_but_never_guesses_arm64_native() {
assert_eq!(
classify_machines(0, IMAGE_FILE_MACHINE_ARM64, None),
Err(ERROR_NOT_SUPPORTED)
);
fn unknown_process_machine_is_an_error_and_reported_native_stays_native() {
for host in [
IMAGE_FILE_MACHINE_ARM64,
IMAGE_FILE_MACHINE_AMD64,
IMAGE_FILE_MACHINE_I386,
] {
assert_eq!(
classify_machines(IMAGE_FILE_MACHINE_UNKNOWN, host, None),
Err(ERROR_NOT_SUPPORTED)
);
}
assert_eq!(
classify_machines(IMAGE_FILE_MACHINE_I386, IMAGE_FILE_MACHINE_ARM64, None)
.unwrap()
.mode,
ExecutionMode::EmulatedX86
);
assert_eq!(
classify_machines(0, IMAGE_FILE_MACHINE_I386, None)
classify_machines(IMAGE_FILE_MACHINE_I386, IMAGE_FILE_MACHINE_AMD64, None)
.unwrap()
.mode,
ExecutionMode::Native
ExecutionMode::Compatibility32
);
assert_eq!(
classify_machines(IMAGE_FILE_MACHINE_I386, IMAGE_FILE_MACHINE_AMD64, None)
classify_machines(IMAGE_FILE_MACHINE_AMD64, IMAGE_FILE_MACHINE_AMD64, None)
.unwrap()
.mode,
ExecutionMode::Compatibility32
ExecutionMode::Native
);
assert_eq!(
classify_machines(
IMAGE_FILE_MACHINE_UNKNOWN,
IMAGE_FILE_MACHINE_AMD64,
Some(IMAGE_FILE_MACHINE_AMD64),
)
.unwrap()
.mode,
ExecutionMode::Native
);
assert_eq!(
classify_machines(0, IMAGE_FILE_MACHINE_ARM64, Some(0)),
classify_machines(
IMAGE_FILE_MACHINE_UNKNOWN,
IMAGE_FILE_MACHINE_ARM64,
Some(IMAGE_FILE_MACHINE_ARM64),
)
.unwrap()
.mode,
ExecutionMode::Native
);
assert_eq!(
classify_machines(
IMAGE_FILE_MACHINE_UNKNOWN,
IMAGE_FILE_MACHINE_ARM64,
Some(0)
),
Err(ERROR_INVALID_DATA)
);
assert_eq!(
Expand Down