#include #include #include const char *HI3_BASE_MODULE_NAME = "BH3Base.dll"; const char *HI3_ASSEMBLY_NAME = "UserAssembly.dll"; const char *HI3_TVM_SECTION_NAME = ".tvm0"; struct crc_id_pair { uint32_t crc; enum game_id id; }; const struct crc_id_pair HI3_REGIONS[] = { // It may be possible to get rid of region-specific data altogether in the future { 0xcb8041ff, GAME_HI3_GLB }, // glb v6.8.0 { 0x104cbfc5, GAME_HI3_SEA }, // sea v6.8.0 { 0x2efd9099, GAME_HI3_CN }, // cn v6.8.0 { 0x30fa5b0f, GAME_HI3_TW }, // tw v6.8.0 { 0xe47327fb, GAME_HI3_KR }, // kr v6.8.0 { 0x992b6b63, GAME_HI3_JP } // jp v6.8.0 }; void hi3_fill_data(struct game_data *buf) { uint32_t crc = utils_file_crc32c(L"UnityPlayer.dll"); enum game_id id = GAME_INVALID; for (size_t i = 0; i < sizeof(HI3_REGIONS) / sizeof(struct crc_id_pair); i++) { if (HI3_REGIONS[i].crc == crc) { id = HI3_REGIONS[i].id; } } if (id == GAME_INVALID) { msg_err_a("Invalid UnityPlayer.dll checksum: %x", crc); } buf->id = id; buf->base_module_name = HI3_BASE_MODULE_NAME; buf->assembly_name = HI3_ASSEMBLY_NAME; buf->tvm_section_name = HI3_TVM_SECTION_NAME; buf->unityplayer_callback = NULL; }