mirror of
https://github.com/a2x/cs2-dumper.git
synced 2025-07-07 15:09:43 +08:00
* Updated for memflow 0.2.2 * Replaced periods with underscores in generated file names for easier inclusion * Program execution now continues if analysis fails at any point * Removed custom error type in favor of anyhow * Added logging to cs2-dumper.log * Now compilable on Linux
95 lines
2.0 KiB
Rust
95 lines
2.0 KiB
Rust
pub use buttons::*;
|
|
pub use interfaces::*;
|
|
pub use offsets::*;
|
|
pub use schemas::*;
|
|
|
|
use std::any::type_name;
|
|
|
|
use anyhow::Result;
|
|
|
|
use log::{error, info};
|
|
|
|
use memflow::prelude::v1::*;
|
|
|
|
mod buttons;
|
|
mod interfaces;
|
|
mod offsets;
|
|
mod schemas;
|
|
|
|
#[derive(Debug)]
|
|
pub struct AnalysisResult {
|
|
pub buttons: ButtonMap,
|
|
pub interfaces: InterfaceMap,
|
|
pub offsets: OffsetMap,
|
|
pub schemas: SchemaMap,
|
|
}
|
|
|
|
pub fn analyze_all(process: &mut IntoProcessInstanceArcBox<'_>) -> Result<AnalysisResult> {
|
|
let buttons = analyze(process, buttons);
|
|
|
|
info!("found {} buttons", buttons.len());
|
|
|
|
let interfaces = analyze(process, interfaces);
|
|
|
|
info!(
|
|
"found {} interfaces across {} modules",
|
|
interfaces
|
|
.iter()
|
|
.map(|(_, ifaces)| ifaces.len())
|
|
.sum::<usize>(),
|
|
interfaces.len()
|
|
);
|
|
|
|
let offsets = analyze(process, offsets);
|
|
|
|
info!(
|
|
"found {} offsets across {} modules",
|
|
offsets
|
|
.iter()
|
|
.map(|(_, offsets)| offsets.len())
|
|
.sum::<usize>(),
|
|
offsets.len()
|
|
);
|
|
|
|
let schemas = analyze(process, schemas);
|
|
|
|
let (class_count, enum_count) =
|
|
schemas
|
|
.values()
|
|
.fold((0, 0), |(classes, enums), (class_vec, enum_vec)| {
|
|
(classes + class_vec.len(), enums + enum_vec.len())
|
|
});
|
|
|
|
info!(
|
|
"found {} classes and {} enums across {} modules",
|
|
class_count,
|
|
enum_count,
|
|
schemas.len()
|
|
);
|
|
|
|
Ok(AnalysisResult {
|
|
buttons,
|
|
interfaces,
|
|
offsets,
|
|
schemas,
|
|
})
|
|
}
|
|
|
|
#[inline]
|
|
fn analyze<F, T>(process: &mut IntoProcessInstanceArcBox<'_>, f: F) -> T
|
|
where
|
|
F: FnOnce(&mut IntoProcessInstanceArcBox<'_>) -> Result<T>,
|
|
T: Default,
|
|
{
|
|
let name = type_name::<F>();
|
|
|
|
match f(process) {
|
|
Ok(result) => result,
|
|
Err(err) => {
|
|
error!("failed to read {}: {}", name, err);
|
|
|
|
T::default()
|
|
}
|
|
}
|
|
}
|