Implement shared resources fix for HSR
This commit is contained in:
parent
2584898be6
commit
38dbf82f7f
@ -11,12 +11,18 @@ enum game_id {
|
|||||||
GAME_HSR_CN
|
GAME_HSR_CN
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define INVOKE_CALLBACK(callback, ...) if (callback) { callback(__VA_ARGS__); }
|
||||||
|
|
||||||
|
typedef void (*unityplayer_callback_t)(HMODULE unityModule);
|
||||||
|
|
||||||
struct game_data {
|
struct game_data {
|
||||||
enum game_id id; // Temporary
|
enum game_id id; // Temporary
|
||||||
const char *name;
|
const char *name;
|
||||||
const char *assembly_path;
|
const char *assembly_path;
|
||||||
const char *tp6_section_name; // Unused for now
|
const char *tp6_section_name; // Unused for now
|
||||||
const char *tvm_section_name;
|
const char *tvm_section_name;
|
||||||
|
|
||||||
|
unityplayer_callback_t unityplayer_callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
void game_detect(struct game_data *buf);
|
void game_detect(struct game_data *buf);
|
||||||
|
@ -39,4 +39,6 @@ void hi3_fill_data(struct game_data *buf) {
|
|||||||
buf->assembly_path = HI3_ASSEMBLY_PATH;
|
buf->assembly_path = HI3_ASSEMBLY_PATH;
|
||||||
buf->tp6_section_name = HI3_TP6_SECTION_NAME;
|
buf->tp6_section_name = HI3_TP6_SECTION_NAME;
|
||||||
buf->tvm_section_name = HI3_TVM_SECTION_NAME;
|
buf->tvm_section_name = HI3_TVM_SECTION_NAME;
|
||||||
|
|
||||||
|
buf->unityplayer_callback = NULL;
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,21 @@ const struct crc_id_pair HSR_REGIONS[] = {
|
|||||||
{ 0x3e644d26, GAME_HSR_CN } // cn v1.1.0
|
{ 0x3e644d26, GAME_HSR_CN } // cn v1.1.0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void _unityplayer_callback(HMODULE unityModule) {
|
||||||
|
// Disable shared resources
|
||||||
|
|
||||||
|
// Temporarily hardcoded offset
|
||||||
|
// v1.1.0, same for os and cn
|
||||||
|
unsigned char *srAddr = ((unsigned char*)unityModule) + 0x16430;
|
||||||
|
|
||||||
|
DWORD oldProtect;
|
||||||
|
VirtualProtect(srAddr, 1, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||||
|
|
||||||
|
*srAddr = 0xC3; // ret
|
||||||
|
|
||||||
|
VirtualProtect(srAddr, 1, oldProtect, &oldProtect);
|
||||||
|
}
|
||||||
|
|
||||||
void hsr_fill_data(struct game_data *buf) {
|
void hsr_fill_data(struct game_data *buf) {
|
||||||
uint32_t crc = utils_file_crc32c("UnityPlayer.dll");
|
uint32_t crc = utils_file_crc32c("UnityPlayer.dll");
|
||||||
|
|
||||||
@ -39,4 +54,6 @@ void hsr_fill_data(struct game_data *buf) {
|
|||||||
buf->assembly_path = HSR_ASSEMBLY_PATH;
|
buf->assembly_path = HSR_ASSEMBLY_PATH;
|
||||||
buf->tp6_section_name = HSR_TP6_SECTION_NAME;
|
buf->tp6_section_name = HSR_TP6_SECTION_NAME;
|
||||||
buf->tvm_section_name = HSR_TVM_SECTION_NAME;
|
buf->tvm_section_name = HSR_TVM_SECTION_NAME;
|
||||||
|
|
||||||
|
buf->unityplayer_callback = &_unityplayer_callback;
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,9 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) {
|
|||||||
// ...magic
|
// ...magic
|
||||||
tp6_setup_patcher(&game, instance, baseModule);
|
tp6_setup_patcher(&game, instance, baseModule);
|
||||||
|
|
||||||
// Load the UnityPlayer module
|
// Load the UnityPlayer module and invoke the callback
|
||||||
HMODULE unityModule = LoadLibraryA("UnityPlayer.dll");
|
HMODULE unityModule = LoadLibraryA("UnityPlayer.dll");
|
||||||
|
INVOKE_CALLBACK(game.unityplayer_callback, unityModule);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user