1#![allow(clippy::too_many_arguments)]
18
19pub mod core;
20pub mod cpu;
21pub mod memo;
22pub mod techniques;
23pub mod types;
24pub mod util;
25
26#[cfg(all(windows, target_arch = "x86_64"))]
31pub mod syscall;
32
33pub use types::{Flagset, HyperXState, Technique, VMBrand};
34
35pub fn detect(flags: Option<Flagset>) -> bool {
42 let fs = flags.unwrap_or_else(Flagset::all);
43 core::detect(fs)
44}
45
46pub fn brand(flags: Option<Flagset>) -> VMBrand {
48 let fs = flags.unwrap_or_else(Flagset::all);
49 core::get_brand(fs)
50}
51
52pub fn percentage(flags: Option<Flagset>) -> u8 {
54 let fs = flags.unwrap_or_else(Flagset::all);
55 core::get_percentage(fs)
56}
57
58pub fn detected_count(flags: Option<Flagset>) -> usize {
60 let fs = flags.unwrap_or_else(Flagset::all);
61 core::detected_technique_count(fs)
62}
63
64pub fn multi_brand(flags: Option<Flagset>) -> Vec<VMBrand> {
66 let fs = flags.unwrap_or_else(Flagset::all);
67 core::get_detected_brands(fs)
68}
69
70pub fn check(technique: Technique) -> bool {
72 let mut fs = Flagset::new();
73 fs.set(technique);
74 core::run_all(fs, false) > 0
75}
76
77pub fn hyperx() -> HyperXState {
79 util::hyper_x()
80}
81
82pub fn conclusion(flags: Option<Flagset>) -> String {
84 let is_vm = detect(flags);
85 let b = brand(flags);
86 let pct = percentage(flags);
87
88 if is_vm {
89 if b != VMBrand::Invalid {
90 format!(
91 "This environment is detected as a virtual machine ({}). \
92 VM confidence: {}%.",
93 b.as_str(),
94 pct
95 )
96 } else {
97 format!(
98 "This environment is detected as a virtual machine (unknown brand). \
99 VM confidence: {}%.",
100 pct
101 )
102 }
103 } else {
104 format!(
105 "No virtual machine detected. VM confidence: {}%.",
106 pct
107 )
108 }
109}