mirror of
https://github.com/adamaq01/mikado.git
synced 2025-02-17 10:38:33 +01:00
feat: add datecode detection
This commit is contained in:
parent
72b947c75a
commit
6ca06aaa82
@ -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())
|
||||
}
|
||||
|
16
src/lib.rs
16
src/lib.rs
@ -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);
|
||||
}
|
||||
|
@ -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::<()>)?;
|
||||
|
Loading…
x
Reference in New Issue
Block a user