style: rustfmt pre-existing wrap debt in season_trace/store_entry
Behavior-preserving cargo fmt of two FIFA17 diagnostic modules that carried long unwrapped macro-invocation / argument lines predating this work. Split out of the FIFA23-retirement commit to keep that focused. No logic change.
This commit is contained in:
@@ -137,15 +137,35 @@ macro_rules! season_call_trace {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
season_call_trace!(load_current_native_wrapper, LOAD_CURRENT_NATIVE_TRAMP, "LoadCurrentOfflineSeason_native");
|
season_call_trace!(
|
||||||
season_call_trace!(start_season_native_wrapper, START_SEASON_NATIVE_TRAMP, "StartSeason_native");
|
load_current_native_wrapper,
|
||||||
season_call_trace!(get_info_native_wrapper, GET_INFO_NATIVE_TRAMP, "GetOfflineSeasonInfo_native");
|
LOAD_CURRENT_NATIVE_TRAMP,
|
||||||
|
"LoadCurrentOfflineSeason_native"
|
||||||
|
);
|
||||||
|
season_call_trace!(
|
||||||
|
start_season_native_wrapper,
|
||||||
|
START_SEASON_NATIVE_TRAMP,
|
||||||
|
"StartSeason_native"
|
||||||
|
);
|
||||||
|
season_call_trace!(
|
||||||
|
get_info_native_wrapper,
|
||||||
|
GET_INFO_NATIVE_TRAMP,
|
||||||
|
"GetOfflineSeasonInfo_native"
|
||||||
|
);
|
||||||
// Real LoadOfflineSeasons native (FUN_18004ee10) — what _LoadCurrentSeason
|
// Real LoadOfflineSeasons native (FUN_18004ee10) — what _LoadCurrentSeason
|
||||||
// actually calls; hands the callback name to the manager's async slot 0x80.
|
// actually calls; hands the callback name to the manager's async slot 0x80.
|
||||||
season_call_trace!(load_offline_real_wrapper, LOAD_OFFLINE_REAL_TRAMP, "LoadOfflineSeasons_native(0x4ee10)");
|
season_call_trace!(
|
||||||
|
load_offline_real_wrapper,
|
||||||
|
LOAD_OFFLINE_REAL_TRAMP,
|
||||||
|
"LoadOfflineSeasons_native(0x4ee10)"
|
||||||
|
);
|
||||||
// Async LoadOfflineSeasons impl (mgr slot 0x80, FUN_180057560): reads the season
|
// Async LoadOfflineSeasons impl (mgr slot 0x80, FUN_180057560): reads the season
|
||||||
// count and invokes the LoadSeasons_Complete AS callback.
|
// count and invokes the LoadSeasons_Complete AS callback.
|
||||||
season_call_trace!(load_offline_async_wrapper, LOAD_OFFLINE_ASYNC_TRAMP, "LoadOfflineSeasons_asyncimpl(0x57560)");
|
season_call_trace!(
|
||||||
|
load_offline_async_wrapper,
|
||||||
|
LOAD_OFFLINE_ASYNC_TRAMP,
|
||||||
|
"LoadOfflineSeasons_asyncimpl(0x57560)"
|
||||||
|
);
|
||||||
|
|
||||||
// LoadCurrentOfflineSeason IMPL (manager slot 0x20): registers the load callbacks
|
// LoadCurrentOfflineSeason IMPL (manager slot 0x20): registers the load callbacks
|
||||||
// and starts the async op. param_1=manager, param_2=state byte, param_3=seasonId
|
// and starts the async op. param_1=manager, param_2=state byte, param_3=seasonId
|
||||||
@@ -186,7 +206,12 @@ unsafe extern "system" fn load_current_impl_wrapper(
|
|||||||
// Completion callback FUN_1800578e0 (0x578e0). Kept from the first pass to confirm
|
// Completion callback FUN_1800578e0 (0x578e0). Kept from the first pass to confirm
|
||||||
// whether it ever fires; logs the result fields it branches on.
|
// whether it ever fires; logs the result fields it branches on.
|
||||||
static COMPLETION_TRAMP: AtomicUsize = AtomicUsize::new(0);
|
static COMPLETION_TRAMP: AtomicUsize = AtomicUsize::new(0);
|
||||||
unsafe extern "system" fn completion_wrapper(ctx: usize, result: usize, r8: usize, r9: usize) -> usize {
|
unsafe extern "system" fn completion_wrapper(
|
||||||
|
ctx: usize,
|
||||||
|
result: usize,
|
||||||
|
r8: usize,
|
||||||
|
r9: usize,
|
||||||
|
) -> usize {
|
||||||
let n = REPORTS.fetch_add(1, Ordering::Relaxed);
|
let n = REPORTS.fetch_add(1, Ordering::Relaxed);
|
||||||
if n < 64 {
|
if n < 64 {
|
||||||
let status = rd_i32(result + 0x1c);
|
let status = rd_i32(result + 0x1c);
|
||||||
@@ -212,7 +237,11 @@ unsafe extern "system" fn completion_wrapper(ctx: usize, result: usize, r8: usiz
|
|||||||
// this binding — it is NOT LoadOfflineSeasons). Called from _InitializeScreen for
|
// this binding — it is NOT LoadOfflineSeasons). Called from _InitializeScreen for
|
||||||
// the division display, sync. Its prologue holds a rip-relative `MOV RCX,[rip+disp]`,
|
// the division display, sync. Its prologue holds a rip-relative `MOV RCX,[rip+disp]`,
|
||||||
// so it needs the relocating installer below.
|
// so it needs the relocating installer below.
|
||||||
season_call_trace!(get_users_division_wrapper, GET_USERS_DIVISION_TRAMP, "GetUsersOfflineDivision_native(0x4eb50)");
|
season_call_trace!(
|
||||||
|
get_users_division_wrapper,
|
||||||
|
GET_USERS_DIVISION_TRAMP,
|
||||||
|
"GetUsersOfflineDivision_native(0x4eb50)"
|
||||||
|
);
|
||||||
|
|
||||||
/// Find a free page within ~±1.5 GiB of `base`, so a rip-relative disp32 into
|
/// Find a free page within ~±1.5 GiB of `base`, so a rip-relative disp32 into
|
||||||
/// CardsDLL data still fits after we relocate a copied prologue into it.
|
/// CardsDLL data still fits after we relocate a copied prologue into it.
|
||||||
@@ -266,7 +295,9 @@ unsafe fn install_detour_reloc(
|
|||||||
let jump = absolute_jump(wrapper);
|
let jump = absolute_jump(wrapper);
|
||||||
let tramp_len = copy_len + jump.len();
|
let tramp_len = copy_len + jump.len();
|
||||||
let Some(tramp) = alloc_near(base, tramp_len) else {
|
let Some(tramp) = alloc_near(base, tramp_len) else {
|
||||||
write_log(&format!("SEASON_TRACE: {name}: near trampoline alloc failed\n"));
|
write_log(&format!(
|
||||||
|
"SEASON_TRACE: {name}: near trampoline alloc failed\n"
|
||||||
|
));
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
core::ptr::copy_nonoverlapping(target as *const u8, tramp as *mut u8, copy_len);
|
core::ptr::copy_nonoverlapping(target as *const u8, tramp as *mut u8, copy_len);
|
||||||
@@ -275,7 +306,9 @@ unsafe fn install_detour_reloc(
|
|||||||
let abs_target = target as i64 + insn_end as i64 + orig_disp;
|
let abs_target = target as i64 + insn_end as i64 + orig_disp;
|
||||||
let new_disp = abs_target - (tramp as i64 + insn_end as i64);
|
let new_disp = abs_target - (tramp as i64 + insn_end as i64);
|
||||||
if new_disp < i32::MIN as i64 || new_disp > i32::MAX as i64 {
|
if new_disp < i32::MIN as i64 || new_disp > i32::MAX as i64 {
|
||||||
write_log(&format!("SEASON_TRACE: {name}: reloc out of range ({new_disp:#x})\n"));
|
write_log(&format!(
|
||||||
|
"SEASON_TRACE: {name}: reloc out of range ({new_disp:#x})\n"
|
||||||
|
));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
core::ptr::write_unaligned((tramp + disp_off) as *mut i32, new_disp as i32);
|
core::ptr::write_unaligned((tramp + disp_off) as *mut i32, new_disp as i32);
|
||||||
@@ -283,7 +316,9 @@ unsafe fn install_detour_reloc(
|
|||||||
core::ptr::copy_nonoverlapping(back.as_ptr(), (tramp + copy_len) as *mut u8, back.len());
|
core::ptr::copy_nonoverlapping(back.as_ptr(), (tramp + copy_len) as *mut u8, back.len());
|
||||||
let mut old = 0u32;
|
let mut old = 0u32;
|
||||||
if VirtualProtect(tramp as _, tramp_len, PAGE_EXECUTE_READ, &mut old) == 0 {
|
if VirtualProtect(tramp as _, tramp_len, PAGE_EXECUTE_READ, &mut old) == 0 {
|
||||||
write_log(&format!("SEASON_TRACE: {name}: trampoline protect failed\n"));
|
write_log(&format!(
|
||||||
|
"SEASON_TRACE: {name}: trampoline protect failed\n"
|
||||||
|
));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
FlushInstructionCache(GetCurrentProcess(), tramp as _, tramp_len);
|
FlushInstructionCache(GetCurrentProcess(), tramp as _, tramp_len);
|
||||||
@@ -316,7 +351,12 @@ unsafe fn install_detour_reloc(
|
|||||||
// completion ctx (cbref at +0x18), param_2 = result obj (byte0=ok flag; +8 = error
|
// completion ctx (cbref at +0x18), param_2 = result obj (byte0=ok flag; +8 = error
|
||||||
// string ptr when byte0==0). Logs the EXACT status string delivered. Passive.
|
// string ptr when byte0==0). Logs the EXACT status string delivered. Passive.
|
||||||
static FINAL_COMPLETION_TRAMP: AtomicUsize = AtomicUsize::new(0);
|
static FINAL_COMPLETION_TRAMP: AtomicUsize = AtomicUsize::new(0);
|
||||||
unsafe extern "system" fn final_completion_wrapper(ctx: usize, result: usize, r8: usize, r9: usize) -> usize {
|
unsafe extern "system" fn final_completion_wrapper(
|
||||||
|
ctx: usize,
|
||||||
|
result: usize,
|
||||||
|
r8: usize,
|
||||||
|
r9: usize,
|
||||||
|
) -> usize {
|
||||||
// Read the delivered status: byte0==0 => failure with an error string at +8.
|
// Read the delivered status: byte0==0 => failure with an error string at +8.
|
||||||
let flag = rd_u8(result);
|
let flag = rd_u8(result);
|
||||||
let errstr = if flag == Some(0) {
|
let errstr = if flag == Some(0) {
|
||||||
@@ -341,7 +381,11 @@ unsafe extern "system" fn final_completion_wrapper(ctx: usize, result: usize, r8
|
|||||||
Some(_) => "SUCCESS",
|
Some(_) => "SUCCESS",
|
||||||
None => "??",
|
None => "??",
|
||||||
};
|
};
|
||||||
let shown = if flag == Some(0) { errstr.as_str() } else { "SUCCESS" };
|
let shown = if flag == Some(0) {
|
||||||
|
errstr.as_str()
|
||||||
|
} else {
|
||||||
|
"SUCCESS"
|
||||||
|
};
|
||||||
write_log(&format!(
|
write_log(&format!(
|
||||||
"SEASONS_LOAD_CALLBACK: final kind={kind} result={shown:?} flag={flag:?} ctx={ctx:#x} cbref={cbref:#x}\n"
|
"SEASONS_LOAD_CALLBACK: final kind={kind} result={shown:?} flag={flag:?} ctx={ctx:#x} cbref={cbref:#x}\n"
|
||||||
));
|
));
|
||||||
@@ -371,14 +415,23 @@ unsafe extern "system" fn final_completion_wrapper(ctx: usize, result: usize, r8
|
|||||||
// "CACHE_PACKNAMES_FAILED" when result==0 or *(i32)(result+0x1c)!=0; else chains
|
// "CACHE_PACKNAMES_FAILED" when result==0 or *(i32)(result+0x1c)!=0; else chains
|
||||||
// the next async stage. Logs whether the first async stage succeeded. Passive.
|
// the next async stage. Logs whether the first async stage succeeded. Passive.
|
||||||
static STAGE1_COMPLETION_TRAMP: AtomicUsize = AtomicUsize::new(0);
|
static STAGE1_COMPLETION_TRAMP: AtomicUsize = AtomicUsize::new(0);
|
||||||
unsafe extern "system" fn stage1_completion_wrapper(param1: usize, result: usize, r8: usize, r9: usize) -> usize {
|
unsafe extern "system" fn stage1_completion_wrapper(
|
||||||
|
param1: usize,
|
||||||
|
result: usize,
|
||||||
|
r8: usize,
|
||||||
|
r9: usize,
|
||||||
|
) -> usize {
|
||||||
let n = REPORTS.fetch_add(1, Ordering::Relaxed);
|
let n = REPORTS.fetch_add(1, Ordering::Relaxed);
|
||||||
if n < 64 {
|
if n < 64 {
|
||||||
if result == 0 {
|
if result == 0 {
|
||||||
write_log("SEASONS_STAGE1: result=NULL -> CACHE_PACKNAMES_FAILED\n");
|
write_log("SEASONS_STAGE1: result=NULL -> CACHE_PACKNAMES_FAILED\n");
|
||||||
} else {
|
} else {
|
||||||
let status = rd_i32(result + 0x1c);
|
let status = rd_i32(result + 0x1c);
|
||||||
let verdict = if status == Some(0) { "ok(chain next)" } else { "CACHE_PACKNAMES_FAILED" };
|
let verdict = if status == Some(0) {
|
||||||
|
"ok(chain next)"
|
||||||
|
} else {
|
||||||
|
"CACHE_PACKNAMES_FAILED"
|
||||||
|
};
|
||||||
write_log(&format!(
|
write_log(&format!(
|
||||||
"SEASONS_STAGE1: result={result:#x} status(+0x1c)={} -> {verdict}\n",
|
"SEASONS_STAGE1: result={result:#x} status(+0x1c)={} -> {verdict}\n",
|
||||||
status.map(|x| x.to_string()).unwrap_or_else(|| "??".into()),
|
status.map(|x| x.to_string()).unwrap_or_else(|| "??".into()),
|
||||||
@@ -399,10 +452,18 @@ unsafe extern "system" fn stage1_completion_wrapper(param1: usize, result: usize
|
|||||||
// prologue has a rip-relative `MOV R8,[DAT_1802e6580]`, so it uses the relocating
|
// prologue has a rip-relative `MOV R8,[DAT_1802e6580]`, so it uses the relocating
|
||||||
// installer (disp32 at copied offset 7, instruction end 11).
|
// installer (disp32 at copied offset 7, instruction end 11).
|
||||||
static URL_CAPTURE_TRAMP: AtomicUsize = AtomicUsize::new(0);
|
static URL_CAPTURE_TRAMP: AtomicUsize = AtomicUsize::new(0);
|
||||||
unsafe extern "system" fn url_capture_wrapper(rcx: usize, rdx: usize, r8: usize, r9: usize) -> usize {
|
unsafe extern "system" fn url_capture_wrapper(
|
||||||
|
rcx: usize,
|
||||||
|
rdx: usize,
|
||||||
|
r8: usize,
|
||||||
|
r9: usize,
|
||||||
|
) -> usize {
|
||||||
let n = REPORTS.fetch_add(1, Ordering::Relaxed);
|
let n = REPORTS.fetch_add(1, Ordering::Relaxed);
|
||||||
if n < 64 {
|
if n < 64 {
|
||||||
write_log(&format!("SEASONS_WEBFILE_URL: url={:?}\n", rd_cstr(rcx, 256)));
|
write_log(&format!(
|
||||||
|
"SEASONS_WEBFILE_URL: url={:?}\n",
|
||||||
|
rd_cstr(rcx, 256)
|
||||||
|
));
|
||||||
}
|
}
|
||||||
let t = URL_CAPTURE_TRAMP.load(Ordering::Acquire);
|
let t = URL_CAPTURE_TRAMP.load(Ordering::Acquire);
|
||||||
if t == 0 {
|
if t == 0 {
|
||||||
@@ -428,61 +489,138 @@ unsafe fn worker() {
|
|||||||
}
|
}
|
||||||
// (rva, name, copy_len, signature, wrapper, trampoline slot)
|
// (rva, name, copy_len, signature, wrapper, trampoline slot)
|
||||||
install_detour(
|
install_detour(
|
||||||
base, 0x4eb70, "LoadCurrentOfflineSeason_native", 15,
|
base,
|
||||||
&[0x40, 0x57, 0x48, 0x83, 0xec, 0x60, 0x48, 0xc7, 0x44, 0x24, 0x20, 0xfe, 0xff, 0xff, 0xff],
|
0x4eb70,
|
||||||
load_current_native_wrapper as *const () as usize, &LOAD_CURRENT_NATIVE_TRAMP,
|
"LoadCurrentOfflineSeason_native",
|
||||||
|
15,
|
||||||
|
&[
|
||||||
|
0x40, 0x57, 0x48, 0x83, 0xec, 0x60, 0x48, 0xc7, 0x44, 0x24, 0x20, 0xfe, 0xff, 0xff,
|
||||||
|
0xff,
|
||||||
|
],
|
||||||
|
load_current_native_wrapper as *const () as usize,
|
||||||
|
&LOAD_CURRENT_NATIVE_TRAMP,
|
||||||
);
|
);
|
||||||
install_detour(
|
install_detour(
|
||||||
base, 0x4f340, "StartSeason_native", 15,
|
base,
|
||||||
&[0x40, 0x57, 0x48, 0x83, 0xec, 0x60, 0x48, 0xc7, 0x44, 0x24, 0x20, 0xfe, 0xff, 0xff, 0xff],
|
0x4f340,
|
||||||
start_season_native_wrapper as *const () as usize, &START_SEASON_NATIVE_TRAMP,
|
"StartSeason_native",
|
||||||
|
15,
|
||||||
|
&[
|
||||||
|
0x40, 0x57, 0x48, 0x83, 0xec, 0x60, 0x48, 0xc7, 0x44, 0x24, 0x20, 0xfe, 0xff, 0xff,
|
||||||
|
0xff,
|
||||||
|
],
|
||||||
|
start_season_native_wrapper as *const () as usize,
|
||||||
|
&START_SEASON_NATIVE_TRAMP,
|
||||||
);
|
);
|
||||||
install_detour(
|
install_detour(
|
||||||
base, 0x4e850, "GetOfflineSeasonInfo_native", 15,
|
base,
|
||||||
&[0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18],
|
0x4e850,
|
||||||
get_info_native_wrapper as *const () as usize, &GET_INFO_NATIVE_TRAMP,
|
"GetOfflineSeasonInfo_native",
|
||||||
|
15,
|
||||||
|
&[
|
||||||
|
0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, 0x24, 0x10, 0x48, 0x89, 0x74, 0x24,
|
||||||
|
0x18,
|
||||||
|
],
|
||||||
|
get_info_native_wrapper as *const () as usize,
|
||||||
|
&GET_INFO_NATIVE_TRAMP,
|
||||||
);
|
);
|
||||||
install_detour(
|
install_detour(
|
||||||
base, 0x57230, "LoadCurrentOfflineSeason_impl", 19,
|
base,
|
||||||
&[0x48, 0x8b, 0xc4, 0x57, 0x48, 0x81, 0xec, 0x80, 0x00, 0x00, 0x00, 0x48, 0xc7, 0x40, 0x98, 0xfe, 0xff, 0xff, 0xff],
|
0x57230,
|
||||||
load_current_impl_wrapper as *const () as usize, &LOAD_CURRENT_IMPL_TRAMP,
|
"LoadCurrentOfflineSeason_impl",
|
||||||
|
19,
|
||||||
|
&[
|
||||||
|
0x48, 0x8b, 0xc4, 0x57, 0x48, 0x81, 0xec, 0x80, 0x00, 0x00, 0x00, 0x48, 0xc7, 0x40,
|
||||||
|
0x98, 0xfe, 0xff, 0xff, 0xff,
|
||||||
|
],
|
||||||
|
load_current_impl_wrapper as *const () as usize,
|
||||||
|
&LOAD_CURRENT_IMPL_TRAMP,
|
||||||
);
|
);
|
||||||
install_detour(
|
install_detour(
|
||||||
base, 0x578e0, "LoadCurrentOfflineSeason_completion", 16,
|
base,
|
||||||
&[0x48, 0x8b, 0xc4, 0x57, 0x48, 0x83, 0xec, 0x70, 0x48, 0xc7, 0x40, 0xd0, 0xfe, 0xff, 0xff, 0xff],
|
0x578e0,
|
||||||
completion_wrapper as *const () as usize, &COMPLETION_TRAMP,
|
"LoadCurrentOfflineSeason_completion",
|
||||||
|
16,
|
||||||
|
&[
|
||||||
|
0x48, 0x8b, 0xc4, 0x57, 0x48, 0x83, 0xec, 0x70, 0x48, 0xc7, 0x40, 0xd0, 0xfe, 0xff,
|
||||||
|
0xff, 0xff,
|
||||||
|
],
|
||||||
|
completion_wrapper as *const () as usize,
|
||||||
|
&COMPLETION_TRAMP,
|
||||||
);
|
);
|
||||||
install_detour_reloc(
|
install_detour_reloc(
|
||||||
base, 0x4eb50, "GetUsersOfflineDivision_native", 14,
|
base,
|
||||||
&[0x48, 0x83, 0xec, 0x28, 0x48, 0x8b, 0x0d, 0x75, 0x18, 0x29, 0x00, 0x48, 0x8b, 0x01],
|
0x4eb50,
|
||||||
7, 11,
|
"GetUsersOfflineDivision_native",
|
||||||
get_users_division_wrapper as *const () as usize, &GET_USERS_DIVISION_TRAMP,
|
14,
|
||||||
|
&[
|
||||||
|
0x48, 0x83, 0xec, 0x28, 0x48, 0x8b, 0x0d, 0x75, 0x18, 0x29, 0x00, 0x48, 0x8b, 0x01,
|
||||||
|
],
|
||||||
|
7,
|
||||||
|
11,
|
||||||
|
get_users_division_wrapper as *const () as usize,
|
||||||
|
&GET_USERS_DIVISION_TRAMP,
|
||||||
);
|
);
|
||||||
install_detour(
|
install_detour(
|
||||||
base, 0x4ee10, "LoadOfflineSeasons_native", 15,
|
base,
|
||||||
&[0x40, 0x57, 0x48, 0x83, 0xec, 0x60, 0x48, 0xc7, 0x44, 0x24, 0x20, 0xfe, 0xff, 0xff, 0xff],
|
0x4ee10,
|
||||||
load_offline_real_wrapper as *const () as usize, &LOAD_OFFLINE_REAL_TRAMP,
|
"LoadOfflineSeasons_native",
|
||||||
|
15,
|
||||||
|
&[
|
||||||
|
0x40, 0x57, 0x48, 0x83, 0xec, 0x60, 0x48, 0xc7, 0x44, 0x24, 0x20, 0xfe, 0xff, 0xff,
|
||||||
|
0xff,
|
||||||
|
],
|
||||||
|
load_offline_real_wrapper as *const () as usize,
|
||||||
|
&LOAD_OFFLINE_REAL_TRAMP,
|
||||||
);
|
);
|
||||||
install_detour(
|
install_detour(
|
||||||
base, 0x57560, "LoadOfflineSeasons_asyncimpl", 17,
|
base,
|
||||||
&[0x40, 0x55, 0x56, 0x57, 0x48, 0x83, 0xec, 0x30, 0x48, 0xc7, 0x44, 0x24, 0x20, 0xfe, 0xff, 0xff, 0xff],
|
0x57560,
|
||||||
load_offline_async_wrapper as *const () as usize, &LOAD_OFFLINE_ASYNC_TRAMP,
|
"LoadOfflineSeasons_asyncimpl",
|
||||||
|
17,
|
||||||
|
&[
|
||||||
|
0x40, 0x55, 0x56, 0x57, 0x48, 0x83, 0xec, 0x30, 0x48, 0xc7, 0x44, 0x24, 0x20, 0xfe,
|
||||||
|
0xff, 0xff, 0xff,
|
||||||
|
],
|
||||||
|
load_offline_async_wrapper as *const () as usize,
|
||||||
|
&LOAD_OFFLINE_ASYNC_TRAMP,
|
||||||
);
|
);
|
||||||
install_detour(
|
install_detour(
|
||||||
base, 0xffe90, "LoadOfflineSeasons_final_completion", 16,
|
base,
|
||||||
&[0x48, 0x89, 0x5c, 0x24, 0x08, 0x57, 0x48, 0x83, 0xec, 0x30, 0x80, 0x3a, 0x00, 0x48, 0x8b, 0xda],
|
0xffe90,
|
||||||
final_completion_wrapper as *const () as usize, &FINAL_COMPLETION_TRAMP,
|
"LoadOfflineSeasons_final_completion",
|
||||||
|
16,
|
||||||
|
&[
|
||||||
|
0x48, 0x89, 0x5c, 0x24, 0x08, 0x57, 0x48, 0x83, 0xec, 0x30, 0x80, 0x3a, 0x00, 0x48,
|
||||||
|
0x8b, 0xda,
|
||||||
|
],
|
||||||
|
final_completion_wrapper as *const () as usize,
|
||||||
|
&FINAL_COMPLETION_TRAMP,
|
||||||
);
|
);
|
||||||
install_detour(
|
install_detour(
|
||||||
base, 0x106240, "LoadOfflineSeasons_stage1_completion", 15,
|
base,
|
||||||
&[0x48, 0x8b, 0xc4, 0x55, 0x48, 0x8d, 0x68, 0xa1, 0x48, 0x81, 0xec, 0xc0, 0x00, 0x00, 0x00],
|
0x106240,
|
||||||
stage1_completion_wrapper as *const () as usize, &STAGE1_COMPLETION_TRAMP,
|
"LoadOfflineSeasons_stage1_completion",
|
||||||
|
15,
|
||||||
|
&[
|
||||||
|
0x48, 0x8b, 0xc4, 0x55, 0x48, 0x8d, 0x68, 0xa1, 0x48, 0x81, 0xec, 0xc0, 0x00, 0x00,
|
||||||
|
0x00,
|
||||||
|
],
|
||||||
|
stage1_completion_wrapper as *const () as usize,
|
||||||
|
&STAGE1_COMPLETION_TRAMP,
|
||||||
);
|
);
|
||||||
install_detour_reloc(
|
install_detour_reloc(
|
||||||
base, 0x17ff90, "start_webfile_dl_url", 14,
|
base,
|
||||||
&[0x48, 0x83, 0xec, 0x38, 0x4c, 0x8b, 0x05, 0xe5, 0x65, 0x16, 0x00, 0x4c, 0x8b, 0xd1],
|
0x17ff90,
|
||||||
7, 11,
|
"start_webfile_dl_url",
|
||||||
url_capture_wrapper as *const () as usize, &URL_CAPTURE_TRAMP,
|
14,
|
||||||
|
&[
|
||||||
|
0x48, 0x83, 0xec, 0x38, 0x4c, 0x8b, 0x05, 0xe5, 0x65, 0x16, 0x00, 0x4c, 0x8b, 0xd1,
|
||||||
|
],
|
||||||
|
7,
|
||||||
|
11,
|
||||||
|
url_capture_wrapper as *const () as usize,
|
||||||
|
&URL_CAPTURE_TRAMP,
|
||||||
);
|
);
|
||||||
write_log("SEASON_TRACE: all season-native traces armed\n");
|
write_log("SEASON_TRACE: all season-native traces armed\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -439,7 +439,9 @@ unsafe fn worker() {
|
|||||||
pub(crate) fn install() {
|
pub(crate) fn install() {
|
||||||
// Promoted: armed by the build. No environment variable participates.
|
// Promoted: armed by the build. No environment variable participates.
|
||||||
REPAIR_ENABLED.store(REPAIR_PROMOTED, Ordering::Release);
|
REPAIR_ENABLED.store(REPAIR_PROMOTED, Ordering::Release);
|
||||||
crate::write_log("STORE_TABS: bind sensor + pre-warm ARMED (promoted); strict signature gate\n");
|
crate::write_log(
|
||||||
|
"STORE_TABS: bind sensor + pre-warm ARMED (promoted); strict signature gate\n",
|
||||||
|
);
|
||||||
std::thread::spawn(|| unsafe { worker() });
|
std::thread::spawn(|| unsafe { worker() });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user