forked from Popn_Tools/popnhax
fav working
This commit is contained in:
parent
e838d88269
commit
5e57926b58
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
uint32_t g_playerdata_ptr_addr; //pointer to the playerdata memory zone (offset 0x08 is popn friend ID as ascii (12 char long), offset 0x1A5 is "is logged in" flag)
|
uint32_t g_playerdata_ptr_addr; //pointer to the playerdata memory zone (offset 0x08 is popn friend ID as ascii (12 char long), offset 0x1A5 is "is logged in" flag)
|
||||||
char *g_current_friendid;
|
char *g_current_friendid;
|
||||||
|
uint32_t g_current_songid;
|
||||||
|
|
||||||
void (*add_song_in_list)();
|
void (*add_song_in_list)();
|
||||||
//game code takes array start address from offset 0xC and the address after the list end from offset 0x10
|
//game code takes array start address from offset 0xC and the address after the list end from offset 0x10
|
||||||
@ -51,6 +52,29 @@ uint32_t favorites_count = 0;
|
|||||||
songlist_t favorites_struct;
|
songlist_t favorites_struct;
|
||||||
uint32_t favorites_struct_addr = (uint32_t)&favorites_struct;
|
uint32_t favorites_struct_addr = (uint32_t)&favorites_struct;
|
||||||
|
|
||||||
|
void add_song_to_favorites()
|
||||||
|
{
|
||||||
|
favorites = (uint32_t *) realloc(favorites, sizeof(uint32_t)*(favorites_count+5));
|
||||||
|
favorites[favorites_count++] = g_current_songid | 0x00060000; // game wants this otherwise only easy difficulty will appear
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void remove_song_from_favorites()
|
||||||
|
{
|
||||||
|
for (uint32_t i = 0; i < favorites_count; i++)
|
||||||
|
{
|
||||||
|
if ( g_current_songid == (favorites[i] & 0x0000FFFF) )
|
||||||
|
{
|
||||||
|
for (uint32_t j = i+1; j < favorites_count; j++)
|
||||||
|
{
|
||||||
|
favorites[j-1] = favorites[j];
|
||||||
|
}
|
||||||
|
favorites_count--;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
void prepare_favorite_list(){
|
void prepare_favorite_list(){
|
||||||
|
|
||||||
char fav_filepath[64];
|
char fav_filepath[64];
|
||||||
@ -77,8 +101,8 @@ void prepare_favorite_list(){
|
|||||||
int songid = strtol(line, NULL, 10);
|
int songid = strtol(line, NULL, 10);
|
||||||
if ( songid != 0 )
|
if ( songid != 0 )
|
||||||
{
|
{
|
||||||
favorites = (uint32_t *) realloc(favorites, sizeof(uint32_t)*(favorites_count+5));
|
g_current_songid = songid;
|
||||||
favorites[favorites_count++] = songid | 0x00060000; // game wants this otherwise only easy difficulty will appear
|
add_song_to_favorites();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(file);
|
fclose(file);
|
||||||
@ -86,6 +110,93 @@ void prepare_favorite_list(){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void commit_favorites()
|
||||||
|
{
|
||||||
|
if ( favorites_count == 0 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
char fav_filepath[64];
|
||||||
|
sprintf(fav_filepath, "data_mods\\%s.fav", g_current_friendid);
|
||||||
|
FILE *file = fopen(fav_filepath, "w");
|
||||||
|
|
||||||
|
if ( file == NULL )
|
||||||
|
{
|
||||||
|
file = fopen("data_mods\\default.fav", "w");
|
||||||
|
|
||||||
|
if (file == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < favorites_count; i++)
|
||||||
|
{
|
||||||
|
fprintf(file, "%d\n", (favorites[i] & 0x0000FFFF));
|
||||||
|
}
|
||||||
|
fclose(file);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void (*real_song_is_in_favorite)();
|
||||||
|
void hook_song_is_in_favorite()
|
||||||
|
{
|
||||||
|
__asm("push ecx\n");
|
||||||
|
__asm("push edx\n");
|
||||||
|
//dx contains songid
|
||||||
|
__asm("mov _g_current_songid, dx\n");
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < favorites_count; i++)
|
||||||
|
{
|
||||||
|
if ( g_current_songid == (favorites[i] & 0x0000FFFF) )
|
||||||
|
{
|
||||||
|
__asm("pop edx\n");
|
||||||
|
__asm("pop ecx\n");
|
||||||
|
__asm("pop ebx\n");
|
||||||
|
__asm("mov eax, 0x01\n");
|
||||||
|
__asm("ret\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
__asm("pop edx\n");
|
||||||
|
__asm("pop ecx\n");
|
||||||
|
__asm("pop ebx\n");
|
||||||
|
__asm("mov eax, 0x00\n");
|
||||||
|
__asm("ret\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void (*real_add_to_favorite)();
|
||||||
|
void hook_add_to_favorite()
|
||||||
|
{
|
||||||
|
__asm("push ecx\n");
|
||||||
|
//dx contains songid
|
||||||
|
__asm("mov _g_current_songid, dx\n");
|
||||||
|
|
||||||
|
add_song_to_favorites();
|
||||||
|
commit_favorites();
|
||||||
|
|
||||||
|
__asm("mov eax, [_favorites_count]\n");
|
||||||
|
__asm("mov edx, _g_current_songid\n");
|
||||||
|
__asm("pop ecx\n");
|
||||||
|
real_add_to_favorite();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void (*real_remove_from_favorite)();
|
||||||
|
void hook_remove_from_favorite()
|
||||||
|
{
|
||||||
|
//code pushes edi, esi and ebx as well
|
||||||
|
__asm("push ecx\n");
|
||||||
|
__asm("push edx\n");
|
||||||
|
//dx contains songid
|
||||||
|
__asm("mov _g_current_songid, cx\n");
|
||||||
|
|
||||||
|
remove_song_from_favorites();
|
||||||
|
commit_favorites();
|
||||||
|
|
||||||
|
__asm("pop edx\n");
|
||||||
|
__asm("pop ecx\n");
|
||||||
|
real_remove_from_favorite();
|
||||||
|
}
|
||||||
|
|
||||||
//this replaces the category handling function ( add_song_in_list is a subroutine called by the game )
|
//this replaces the category handling function ( add_song_in_list is a subroutine called by the game )
|
||||||
void (*real_categ_favorite)();
|
void (*real_categ_favorite)();
|
||||||
void categ_inject_favorites()
|
void categ_inject_favorites()
|
||||||
@ -575,10 +686,6 @@ static bool patch_favorite_categ(const char *game_dll_fn) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//uint64_t patch_addr = (int64_t)data + pattern_offset + 0x05 + 0x5A; //call to function when categ is favorites
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint64_t function_call_addr = (int64_t)(data + pattern_offset + 0x05 + 0x5A);
|
uint64_t function_call_addr = (int64_t)(data + pattern_offset + 0x05 + 0x5A);
|
||||||
uint32_t function_offset = *((uint32_t*)(function_call_addr +0x01));
|
uint32_t function_offset = *((uint32_t*)(function_call_addr +0x01));
|
||||||
uint64_t function_addr = function_call_addr+5+function_offset;
|
uint64_t function_addr = function_call_addr+5+function_offset;
|
||||||
@ -598,6 +705,36 @@ static bool patch_favorite_categ(const char *game_dll_fn) {
|
|||||||
g_playerdata_ptr_addr = (*(uint32_t *)(data + pattern_offset + 0x25));
|
g_playerdata_ptr_addr = (*(uint32_t *)(data + pattern_offset + 0x25));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//hook result screen to replace 3 functions
|
||||||
|
{
|
||||||
|
int64_t pattern_offset = search(data, dllSize, "\xBF\x07\x00\x00\x00\xC6\x85\x61\xD3", 9, 0);
|
||||||
|
if (pattern_offset == -1) {
|
||||||
|
LOG("popnhax: custom_favorites: cannot find result screen function\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//song is in favorite
|
||||||
|
uint64_t function_call_addr = (int64_t)(data + pattern_offset + 0x5F);
|
||||||
|
uint32_t function_offset = *((uint32_t*)(function_call_addr +0x01));
|
||||||
|
uint64_t function_addr = function_call_addr+5+function_offset;
|
||||||
|
MH_CreateHook((LPVOID)function_addr, (LPVOID)hook_song_is_in_favorite,
|
||||||
|
(void **)&real_song_is_in_favorite);
|
||||||
|
|
||||||
|
//add to favorites
|
||||||
|
uint64_t function2_call_addr = (int64_t)(data + pattern_offset + 0xBA);
|
||||||
|
uint32_t function2_offset = *((uint32_t*)(function2_call_addr +0x01));
|
||||||
|
uint64_t function2_addr = function2_call_addr+5+function2_offset;
|
||||||
|
MH_CreateHook((LPVOID)function2_addr, (LPVOID)hook_add_to_favorite,
|
||||||
|
(void **)&real_add_to_favorite);
|
||||||
|
|
||||||
|
//remove from favorites
|
||||||
|
uint64_t function3_call_addr = (int64_t)(data + pattern_offset + 0x89);
|
||||||
|
uint32_t function3_offset = *((uint32_t*)(function3_call_addr +0x01));
|
||||||
|
uint64_t function3_addr = function3_call_addr+5+function3_offset;
|
||||||
|
MH_CreateHook((LPVOID)function3_addr, (LPVOID)hook_remove_from_favorite,
|
||||||
|
(void **)&real_remove_from_favorite);
|
||||||
|
|
||||||
|
}
|
||||||
LOG("popnhax: custom_favorites: favorite category handling replaced\n");
|
LOG("popnhax: custom_favorites: favorite category handling replaced\n");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user