Xbox 360, функция PPC Крюк падает, когда я вызываю функцию в ловушке. PowerPC
Я сталкиваюсь с проблемой, которую не могу решить, поэтому мне нужно обратиться к сообществу, чтобы помочь мне. Проблема связана с перехватом функции PPC.
Это место, где я ловлю.
.text:8220D810 mflr r12
.text:8220D814 bl __savegprlr_20
.text:8220D818 stfd f31, var_70(r1)
.text:8220D81C stwu r1, -0x100(r1)
.text:8220D820 lis r11, off_82A9CCC0@ha // => This is where i am hooking the function
.text:8220D824 lis r22, dword_82BBAE68@ha // These 4 instructions are overwritt
.text:8220D828 lis r10, 8 # 0x87700 //Patched
.text:8220D82C mr r26, r3 //Patched
.text:8220D830 li r20, 0
.text:8220D834 lwz r9, off_82A9CCC0@l(r11)
.text:8220D838 ori r23, r10, 0x7700 # 0x87700
.text:8220D83C lwz r11, dword_82BBAE68@l(r22)
.text:8220D840 cmplwi cr6, r11, 0
.text:8220D844 stw r9, 0x100+var_7C(r1)
.text:8220D848 bne cr6, loc_8220D854
.text:8220D84C mr r30, r20
.text:8220D850 b loc_8220D85C
Здесь он переходит к моей пещере кода, которая упоминается ниже. Исправленные инструкции правильно написаны в функции PredictPlayerHook и не являются проблемой.
Проблема здесь в том, что если я вызываю функцию в хуке, например, здесь я вызываю "GetCurrentCmdNumber(0);" это приводит к сбою игры. Теперь без вызова каких-либо функций игра не вылетает, а кодовая пещера работает без проблем. но если я пытаюсь вызвать какую-либо функцию в кодовой пещере (PredictPlayerHook), она просто падает. Я не могу отладить его, поэтому я не знаю, где он падает.
void __declspec(naked) PredictPlayerHook(){
DWORD R11,Return,cmdNumber;
__asm lis r11, 0x82AA //patched instructions
__asm lis r22, 0x82BC //patched instructions
__asm lis r10, 0x8 //patched instructions
__asm mr r26, r3 //patched instructions
__asm mflr r0 ; //mflr grabs the link register, and stores it into the first operand. r0 is now the link register
__asm stw r0, -0x14(r1) ; //Save the link register inside the stack frame
__asm stwu r1, -0x90(r1) ;// This is pushing the stack (hence push)
// cmdNumber = GetCurrentCmdNumber(0);
__asm addi r1, r1, 0x90 ;//popping the stack frame
__asm lwz r0,-0x14(r1) ; //Reading the link register from the sack
__asm mtlr r0
__asm stw r11,R11
//Return = 0x82200230;
__asm lis r11,0x8220 //Return Address is correct. The difference is in IDA segment, it is +0xD600 ahead of the original address.
__asm ori r11,r11,0x0230
__asm mtctr r11
__asm lwz r11,R11
__asm bctr
}
Вот сама функция и ее правильная. Я могу использовать его в ловушке, расположенной в другом месте игры, чтобы у него не было проблем.
typedef int (__cdecl* CL_GetCurrentCmdNumber)(int localClientNum);
CL_GetCurrentCmdNumber GetCurrentCmdNumber = (CL_GetCurrentCmdNumber)0x82261F90;