feat: add datecode detection

This commit is contained in:
Adamaq01 2023-07-16 05:38:39 +02:00
parent 72b947c75a
commit 6ca06aaa82
3 changed files with 65 additions and 3 deletions

View File

@ -1,3 +1,4 @@
use crate::sys::{property_node_refer, NodeType};
use crate::CONFIGURATION;
use anyhow::Result;
use log::debug;
@ -61,3 +62,23 @@ where
Ok(response)
}
pub fn read_node_str(node: *const (), path: *const u8, length: usize) -> Option<String> {
let mut buffer = [0u8; 32];
let result = unsafe {
property_node_refer(
node,
node,
path,
NodeType::NodeStr,
buffer.as_mut_ptr() as *mut (),
32,
)
};
if result < 0 {
return None;
}
Some(String::from_utf8_lossy(&buffer[..length]).to_string())
}

View File

@ -92,6 +92,15 @@ fn init_logger() {
.init();
}
#[crochet::hook("avs2-ea3.dll", "XEmdwapa000024")]
unsafe fn avs_ea3_boot_startup_hook(node: *const ()) -> i32 {
if let Err(err) = hook_init(node) {
error!("{:#}", err);
}
call_original!(node)
}
#[no_mangle]
#[allow(non_snake_case, unused_variables)]
extern "system" fn DllMain(dll_module: HINSTANCE, call_reason: DWORD, reserved: LPVOID) -> BOOL {
@ -99,11 +108,16 @@ extern "system" fn DllMain(dll_module: HINSTANCE, call_reason: DWORD, reserved:
DLL_PROCESS_ATTACH => {
unsafe { AllocConsole() };
init_logger();
if let Err(err) = hook_init() {
if let Err(err) = crochet::enable!(avs_ea3_boot_startup_hook) {
error!("{:#}", err);
}
}
DLL_PROCESS_DETACH => {
if let Err(err) = crochet::disable!(avs_ea3_boot_startup_hook) {
error!("{:#}", err);
}
if let Err(err) = hook_release() {
error!("{:#}", err);
}

View File

@ -9,16 +9,43 @@ use crate::{helpers, CONFIGURATION, TACHI_STATUS_URL};
use anyhow::Result;
use bytes::Bytes;
use kbinxml::{CompressionType, Node, Options, Value};
use log::{debug, error, info};
use log::{debug, error, info, warn};
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
static USER: AtomicU64 = AtomicU64::new(0);
pub fn hook_init() -> Result<()> {
pub fn hook_init(ea3_node: *const ()) -> Result<()> {
if !CONFIGURATION.general.enable {
return Ok(());
}
if let Some((model, dest, spec, revision, ext)) =
helpers::read_node_str(ea3_node, b"/soft/model\0".as_ptr(), 3).and_then(|model| {
let dest = helpers::read_node_str(ea3_node, b"/soft/dest\0".as_ptr(), 1)?;
let spec = helpers::read_node_str(ea3_node, b"/soft/spec\0".as_ptr(), 1)?;
let revision = helpers::read_node_str(ea3_node, b"/soft/rev\0".as_ptr(), 1)?;
let ext = helpers::read_node_str(ea3_node, b"/soft/ext\0".as_ptr(), 10)?
.parse::<u64>()
.unwrap_or(0);
Some((model, dest, spec, revision, ext))
})
{
if model != "KFC" || revision == "O" || revision == "X" || ext < 2022083000 {
error!(
"Unsupported model/revision/ext '{}:{}:{}:{}:{}', hook will not be enabled",
model, dest, spec, revision, ext
);
return Ok(());
} else {
info!(
"Detected game software '{}:{}:{}:{}:{}'",
model, dest, spec, revision, ext
);
}
} else {
warn!("Could not read game version, hook might not work properly");
}
// Trying to reach Tachi API
let response: serde_json::Value =
helpers::request_tachi("GET", TACHI_STATUS_URL.as_str(), None::<()>)?;