This commit is contained in:
恍兮惚兮 2024-03-22 03:03:27 +08:00
parent fbf5390636
commit 52444977a9
2 changed files with 41 additions and 8 deletions

View File

@ -1,4 +1,4 @@
#include"PPSSPP.h" #include"PPSSPP.h"
#include<queue> #include<queue>
/** Artikash 6/7/2019 /** Artikash 6/7/2019
* PPSSPP JIT code has pointers, but they are all added to an offset before being used. * PPSSPP JIT code has pointers, but they are all added to an offset before being used.
@ -72,6 +72,7 @@ public:
struct emfuncinfo{ struct emfuncinfo{
const char* hookname; const char* hookname;
void* hookfunc; void* hookfunc;
void* filterfun;
const wchar_t* _id; const wchar_t* _id;
}; };
std::unordered_map<uintptr_t,emfuncinfo>emfunctionhooks; std::unordered_map<uintptr_t,emfuncinfo>emfunctionhooks;
@ -89,6 +90,10 @@ bool hookPPSSPPDoJit(){
hp.text_fun=[](hook_stack* stack, HookParam* hp, uintptr_t* data, uintptr_t* split, size_t* len){ hp.text_fun=[](hook_stack* stack, HookParam* hp, uintptr_t* data, uintptr_t* split, size_t* len){
auto em_address=stack->ARG2; auto em_address=stack->ARG2;
if(breakpoints.find(em_address)!=breakpoints.end())return;
breakpoints.insert(em_address);
if(emfunctionhooks.find(em_address)==emfunctionhooks.end())return; if(emfunctionhooks.find(em_address)==emfunctionhooks.end())return;
static emfuncinfo op; static emfuncinfo op;
@ -98,14 +103,13 @@ bool hookPPSSPPDoJit(){
hpinternal.text_fun=[](hook_stack* stack, HookParam* hp, uintptr_t* data, uintptr_t* split, size_t* len){ hpinternal.text_fun=[](hook_stack* stack, HookParam* hp, uintptr_t* data, uintptr_t* split, size_t* len){
hp->text_fun=nullptr;hp->type=HOOK_EMPTY; hp->text_fun=nullptr;hp->type=HOOK_EMPTY;
auto ret=stack->rax; auto ret=stack->rax;
if(breakpoints.find(ret)!=breakpoints.end())return;
breakpoints.insert(ret);
DWORD _; DWORD _;
VirtualProtect((LPVOID)ret,0x10,PAGE_EXECUTE_READWRITE,&_); VirtualProtect((LPVOID)ret,0x10,PAGE_EXECUTE_READWRITE,&_);
HookParam hpinternal; HookParam hpinternal;
hpinternal.address=ret; hpinternal.address=ret;
hpinternal.type=CODEC_UTF16|USING_STRING|NO_CONTEXT; hpinternal.type=CODEC_UTF16|USING_STRING|NO_CONTEXT;
hpinternal.text_fun=(decltype(hpinternal.text_fun))op.hookfunc; hpinternal.text_fun=(decltype(hpinternal.text_fun))op.hookfunc;
hpinternal.filter_fun=(decltype(hpinternal.filter_fun))op.filterfun;
NewHook(hpinternal,op.hookname); NewHook(hpinternal,op.hookname);
}; };
NewHook(hpinternal,"DoJitPtrRet"); NewHook(hpinternal,"DoJitPtrRet");
@ -119,7 +123,6 @@ bool PPSSPP::attach_function()
return PPSSPPinithooksearch()| hookPPSSPPDoJit(); return PPSSPPinithooksearch()| hookPPSSPPDoJit();
} }
// ==UserScript==
// @name [ULJS00403] Shinigami to Shoujo // @name [ULJS00403] Shinigami to Shoujo
// @version 0.1 // @version 0.1
// @author [DC] // @author [DC]
@ -135,7 +138,6 @@ void ULJS00403(hook_stack* stack, HookParam* hp, uintptr_t* data, uintptr_t* spl
*len=strlen((char*)address); *len=strlen((char*)address);
} }
// ==UserScript==
// @name [ULJS00339] Amagami // @name [ULJS00339] Amagami
// @version v1.02 // @version v1.02
// @author [DC] // @author [DC]
@ -205,12 +207,44 @@ void ULJS00339(hook_stack* stack, HookParam* hp, uintptr_t* data, uintptr_t* spl
write_string_new(data,len,s); write_string_new(data,len,s);
} }
// @name [NPJH50909] Sekai de Ichiban Dame na Koi
// @version 0.1
// @author [DC]
// @description PPSSPP x64
// *
void NPJH50909(hook_stack* stack, HookParam* hp, uintptr_t* data, uintptr_t* split, size_t* len){
hp->type=USING_STRING|NO_CONTEXT;
hp->codepage=932;
auto address= emu_arg(stack)[0];
*data=address;
*len=strlen((char*)address);
}
bool NPJH50909_filter(void* data, size_t* len, HookParam* hp){
std::string result = std::string((char*)data,*len);
// Remove single line markers
result = std::regex_replace(result, std::regex("(\\%N)+"), " ");
// Remove scale marker
result = std::regex_replace(result, std::regex("\\%\\@\\%\\d+"), "");
// Reformat name
std::smatch match;
if (std::regex_search(result, match, std::regex("(^[^「]+)「"))) {
std::string name = match[1].str();
result = std::regex_replace(result, std::regex("^[^「]+"), "");
result = name + "\n" + result;
}
return write_string_overwrite(data,len,result);
}
namespace{ namespace{
auto _=[](){ auto _=[](){
emfunctionhooks={ emfunctionhooks={
{0x883bf34,{"Shinigami to Shoujo",ULJS00403,L"PCSG01282"}}, {0x883bf34,{"Shinigami to Shoujo",ULJS00403,0,L"PCSG01282"}},
{0x0886775c,{"Amagami",ULJS00339,L"ULJS00339"}}, {0x0886775c,{"Amagami",ULJS00339,0,L"ULJS00339"}},
{0x8814adc,{"Sekai de Ichiban Dame na Koi",NPJH50909,NPJH50909_filter,L"NPJH50909"}},
{0x8850b2c,{"Sekai de Ichiban Dame na Koi",NPJH50909,NPJH50909_filter,L"NPJH50909"}},
}; };
return 1; return 1;
}(); }();

View File

@ -118,7 +118,6 @@ bool yuzusuyu::attach_function()
}; };
return NewHook(hp,"YuzuDoJit"); return NewHook(hp,"YuzuDoJit");
} }
// ==UserScript==
// @name [0100978013276000] Memories Off // @name [0100978013276000] Memories Off
// @version 1.0.0 - 1.0.1 // @version 1.0.0 - 1.0.1
// @author Koukdw // @author Koukdw