For the last three days i have tried to get this to work but no luck
(ignore the really bad coding and layout)
Code:main.c #include <tamtypes.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <kernel.h> #include <sifrpc.h> #include <iopcontrol.h> #include <loadfile.h> #include <fileio.h> #include <debug.h> #include "libpad.h" #include "malloc.h" #include "libcdvd.h" #include "r5900_regs.h" #define _RESIDENT_ __attribute__((section(".resident"))) #define DEBUG char *bootFileName; #define ERROR_HAX0R -4 #define ERROR_CDVDFSV_INIT -5 #define ERROR_SYSTEMCNF_PARSE -6 #define ERROR_SYSTEMCNF_FILEIO -7 #define ERROR_SYSTEMCNF_MEMORY -8 //PAD VARIABLES //check for multiple definitions #if !defined(ROM_PADMAN) && !defined(NEW_PADMAN) #define ROM_PADMAN #endif #if defined(ROM_PADMAN) && defined(NEW_PADMAN) #error Only one of ROM_PADMAN & NEW_PADMAN should be defined! #endif #if !defined(ROM_PADMAN) && !defined(NEW_PADMAN) #error ROM_PADMAN or NEW_PADMAN must be defined! #endif //pad buffer static char padBuf[256] __attribute__((aligned(64))); //rumblers static char actAlign[6]; static int actuators; //button status struct padButtonStatus buttons; u32 paddata; u32 old_pad; u32 new_pad; int port, slot; #define MAKE_J(addr) (u32)(0x08000000 | (0x03FFFFFF & ((u32)addr >> 2))) #define MAKE_JAL(addr) (u32)(0x0C000000 | (0x03FFFFFF & ((u32)addr >> 2))) #define KSEG0(x) ((void*)(((u32)(x)) | 0x80000000)) static u32 vector; static u32 *p_vtbl; _RESIDENT_ u32 jal_cheats; extern void systemHook(void); extern void readPad(void); extern int j_defhandler; void breakPoint(void); //FUNCTIONS ///////////////////////////////////////////////////////////////////// //loadModules ///////////////////////////////////////////////////////////////////// static void loadModules(void) { int ret; #ifdef ROM_PADMAN ret = SifLoadModule("rom0:SIO2MAN", 0, NULL); #else ret = SifLoadModule("rom0:XSIO2MAN", 0, NULL); #endif if (ret < 0) { SleepThread(); } ret = SifLoadModule("rom0:CDVDMAN", 0, NULL); if(ret < 0) { SleepThread(); } #ifdef ROM_PADMAN ret = SifLoadModule("rom0:PADMAN", 0, NULL); #else ret = SifLoadModule("rom0:XPADMAN", 0, NULL); #endif if (ret < 0) { SleepThread(); } } /////////////////////////////////////////////////////////////////// //initalise ///////////////////////////////////////////////////////////////////// void initalise(void) { int ret; SifInitRpc(0); // init debug screen init_scr(); // load all modules loadModules(); // init pad padInit(0); if((ret = padPortOpen(0, 0, padBuf)) == 0) { #if defined DEBUG scr_printf("padOpenPort failed: %d\n", ret); #endif SleepThread(); } if(!initializePad(0, 0)) { #if defined DEBUG scr_printf("pad initalization failed!\n"); #endif SleepThread(); } } ///////////////////////////////////////////////////////////////////// //waitPadReady ///////////////////////////////////////////////////////////////////// static int waitPadReady(int port, int slot) { int state; int lastState; char stateString[16]; state = padGetState(port, slot); lastState = -1; while((state != PAD_STATE_STABLE) && (state != PAD_STATE_FINDCTP1)) { if (state != lastState) { padStateInt2String(state, stateString); } lastState = state; state=padGetState(port, slot); } // Were the pad ever 'out of sync'? if (lastState != -1) { } return 0; } ///////////////////////////////////////////////////////////////////// //initalizePad ///////////////////////////////////////////////////////////////////// static int initializePad(int port, int slot) { int ret; int modes; int i; waitPadReady(port, slot); modes = padInfoMode(port, slot, PAD_MODETABLE, -1); if (modes > 0) { for (i = 0; i < modes; i++) { } } if (modes == 0) { return 1; } i = 0; do { if (padInfoMode(port, slot, PAD_MODETABLE, i) == PAD_TYPE_DUALSHOCK) break; i++; } while (i < modes); if (i >= modes) { return 1; } ret = padInfoMode(port, slot, PAD_MODECUREXID, 0); if (ret == 0) { return 1; } padSetMainMode(port, slot, PAD_MMODE_DUALSHOCK, PAD_MMODE_LOCK); waitPadReady(port, slot); padInfoPressMode(port, slot); waitPadReady(port, slot); padEnterPressMode(port, slot); waitPadReady(port, slot); actuators = padInfoAct(port, slot, -1, 0); if (actuators != 0) { actAlign[0] = 0; actAlign[1] = 1; actAlign[2] = 0xff; actAlign[3] = 0xff; actAlign[4] = 0xff; actAlign[5] = 0xff; waitPadReady(port, slot); padSetActAlign(port, slot, actAlign); } else { //printf("Did not find any actuators.\n"); } return 1; } ///////////////////////////////////////////////////////////////////// //buttonStatts ///////////////////////////////////////////////////////////////////// static void buttonStatts(int port, int slot) { int ret; ret = padRead(port, slot, &buttons); if (ret != 0) { paddata = 0xffff ^ buttons.btns; new_pad = paddata & ~old_pad; old_pad = paddata; } } ///////////////////////////////////////////////////////////////////// //checkPadConnected ///////////////////////////////////////////////////////////////////// void checkPadConnected(void) { int ret, i; ret=padGetState(0, 0); while((ret != PAD_STATE_STABLE) && (ret != PAD_STATE_FINDCTP1)) { if(ret==PAD_STATE_DISCONN) { #if defined DEBUG scr_printf(" Pad(%d, %d) is disconnected\n", 0, 0); #endif } ret=padGetState(0, 0); } if(i==1) { //scr_printf(" Pad: OK!\n"); } } ///////////////////////////////////////////////////////////////////// //pad_wat_button ///////////////////////////////////////////////////////////////////// void pad_wait_button(u32 button) { while(1) { buttonStatts(0, 0); if(new_pad & button) return; } } ///////////////////////////////////////////////////////////////////// //getSyscallVTblAddr ///////////////////////////////////////////////////////////////////// u32 getSyscallVTblAddr(void) { const s32 syscall_num[2] = { 0xFE, 0xFF }; const u32 magic[2] = { 0x1337C0DE, 0xB16B00B5 }; u32 addr = -1; u32 i; SetSyscall(syscall_num[0], (void*)magic[0]); SetSyscall(syscall_num[1], (void*)magic[1]); ee_kmode_enter(); for (i = 0x80000000; i < 0x80080000; i += 4) { if (!memcmp((u32*)i, magic, sizeof(magic))) { addr = i - syscall_num[0] * 4; break; } } ee_kmode_exit(); SetSyscall(syscall_num[0], (void*)0); SetSyscall(syscall_num[1], (void*)0); return addr; } ///////////////////////////////////////////////////////////////////// //getVTblAddr ///////////////////////////////////////////////////////////////////// int getVTblAddr(void) { //GET SYSCALL VECTOR ADDRESS p_vtbl = getSyscallVTblAddr(); //check for errors if(p_vtbl == NULL || p_vtbl == 0){ scr_printf(" ERROR! Could not get vector address!! Cheat device will not run!\n"); return -1; } #if defined DEBUG printf("vector table: %0x\n", p_vtbl); //scr_printf(" vector table: %0x\n", p_vtbl); #endif return 0; } ///////////////////////////////////////////////////////////////////// //KernelRead ///////////////////////////////////////////////////////////////////// u32 KernelRead(void *addr, void *buf, u32 size) { DI(); // Disable interrupts ee_kmode_enter(); // Enter kernel mode memcpy(buf, addr, size); ee_kmode_exit(); // Leave kernel mode EI(); // Enable interrupts return size; } ///////////////////////////////////////////////////////////////////// //HookSyscall ///////////////////////////////////////////////////////////////////// void HookSyscall(int syscall_num, void *myhandler, u32 *j_defhandler) { u32 vector; // Read origional handler from syscall vector table KernelRead(p_vtbl + syscall_num, &vector, sizeof(vector)); // Insert jump to the syscall's default handler *j_defhandler = MAKE_J(vector); // Patch default vector to call my handler first SetSyscall(syscall_num, KSEG0(myhandler)); #if defined DEBUG printf("Hooked syscall 0x%02X (old vector: 0x%08X, current: 0x%08X)\n", syscall_num, vector, (u32)KSEG0(myhandler)); #endif } ///////////////////////////////////////////////////////////////////// //Dump_memory ///////////////////////////////////////////////////////////////////// void dump_memory(void) { //int i; //for(i = 0; i<10; i++) //{ // init_scr(); // scr_printf(" Hello world!! %i\n", i); //} //while(1); //u32 *memory; //int fd; //fd = fioOpen("mc0:dump.bin", O_RDONLY); //if(fd < 0) return; //memcpy(memory, 0x00100000, 0x20000); //fioWrite(fd, memory, sizeof(memory)); //fioClose(fd); //free(memory); } ///////////////////////////////////////////////////////////////////// //Print_regs ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// //Set_break ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// //Breakpoint ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// //WaitCdReady ///////////////////////////////////////////////////////////////////// void waitCdReady() { // Block until the dvdrom is ready to take commands cdDiskReady(0); // Spin up the cd/dvd cdStandby(); } ///////////////////////////////////////////////////////////////////// //ParseSystemCnf ///////////////////////////////////////////////////////////////////// char *parseSystemCnf() { char *buffer; int fd, fdSize; int i; // Open SYSTEM.CNF on the cdrom, allocate memory for it, terminate the array fd = fioOpen("cdrom0:\\SYSTEM.CNF;1", O_RDONLY); if(fd < 0) return (char *)ERROR_SYSTEMCNF_FILEIO; fdSize = fioLseek(fd, 0, SEEK_END); fioLseek(fd, 0, SEEK_SET); buffer = malloc(fdSize + 1); if(!buffer) return (char *)ERROR_SYSTEMCNF_MEMORY; if(fioRead(fd, buffer, fdSize) != fdSize) return (char *)ERROR_SYSTEMCNF_FILEIO; fioClose(fd); buffer[fdSize] = '\0'; // Find boot file substring buffer = strstr(buffer, "BOOT2"); buffer += 5; while((*buffer == ' ') || (*buffer == '\t')) buffer++; buffer++; // bypass '=' character while((*buffer == ' ') || (*buffer == '\t')) buffer++; i = 0; while((buffer[i] != '\n') && (buffer[i] != '\r')) i++; // Terminate string at end of boot elf filename buffer[i] = '\0'; // Return pointer to boot elf filename string return buffer; } int main(void) { initalise(); scr_printf(" Welcome to cYs Cora Memory Dumper! writen by cYs Driver\n\n"); if(getVTblAddr() !=0){ scr_printf(" == Fatal Error ==\n"); SleepThread(); } while(1) { //check to see if the pad is still connected checkPadConnected(); //read pad 1 buttonStatts(0, 0); if(new_pad & PAD_CROSS){ __asm("cross:"); jal_cheats = MAKE_JAL(&readPad); #if defined DEBUG printf("jal_cheats: %0x\n",jal_cheats); #endif //hook the syscall - systemcall number, write_cheat address where it places jal on padread - location at the end of my function HookSyscall(0x10, &systemHook, &j_defhandler); scr_printf(" Done\n\n"); } if(new_pad & PAD_SQUARE){ __asm("square:"); cdStop(); scr_printf(" Swap CD/DVD's now and close tray\n Press X to start game\n\n"); cdTrayReq(0,0x00490000); pad_wait_button(PAD_CROSS); scr_printf(" Loading...\n"); //wait for CD to spin up waitCdReady(); if(strlen(bootFileName = parseSystemCnf()) <= 0) { scr_printf(" == Fatal Error ==\n"); SleepThread(); } scr_printf(" Loaded Game!"); // Shutdown padPortClose(0, 0); SifExitRpc(); LoadExecPS2((const char *)bootFileName, 0, NULL); // Should never get here SleepThread(); return 0; } } //SifExitRpc(); return 0; }Code:.include "r5900_regs.h" .set noreorder .global j_defhandler .extern dump_memory .extern jal_cheat .section .resident, "a" # really gay that i have to compile this specific part at 0x00080000!! .global systemHook .ent systemHook systemHook: addiu $sp, $sp, -240 sq $ra, 0($sp) sq $s0, 16($sp) sq $s1, 32($sp) sq $s2, 48($sp) sq $s3, 64($sp) sq $s4, 80($sp) sq $s5, 96($sp) sq $s6, 112($sp) sq $s7, 128($sp) sq $a0, 144($sp) sq $a1, 160($sp) sq $a2, 176($sp) sq $v0, 192($sp) sq $v1, 208($sp) # --- FOR CHEATING --- li $v0, 0x001bfa68 li $v1, 0x0c0655f4 sw $v1, _orig_jal lw $v1, jal_cheats sw $v1, 0($v0) # --- FOR CHEATING --- lq $v1, 208($sp) lq $v0, 192($sp) lq $a2, 176($sp) lq $a1, 160($sp) lq $a0, 144($sp) lq $s7, 128($sp) lq $s6, 112($sp) lq $s5, 96($sp) lq $s4, 80($sp) lq $s3, 64($sp) lq $s2, 48($sp) lq $s1, 32($sp) lq $s0, 16($sp) lq $ra, 0($sp) addiu $sp, $sp, 240 j_defhandler: nop nop jr $ra nop .end systemHook .global readPad .ent readPad readPad: addiu $sp, $sp, -240 sq $ra, 0($sp) sq $s0, 16($sp) sq $s1, 32($sp) sq $s2, 48($sp) sq $s3, 64($sp) sq $s4, 80($sp) sq $s5, 96($sp) sq $s6, 112($sp) sq $s7, 128($sp) sq $a0, 144($sp) sq $a1, 160($sp) sq $a2, 176($sp) sq $v0, 192($sp) sq $v1, 208($sp) # -- read joker -- lui $t7, 0x0044 lh $t8, 0xd81c($t7) # -- read joker -- # L2 + RIGHT addiu $t7, $zero, 0xFEDF bne $t7, $t8, end nop # DI mfc0 $v1, $12 lui $v0, 0x0001 and $v1, $v1, $v0 daddu $a0, $zero, $zero beq $v1, $zero, end sltu $a1, $zero, $v1 lui $v0, 0x0001 nop loop: di sync.p mfc0 $v1, $12 nop and $v1, $v1, $v0 nop bne $v1, $zero, loop nop daddu $a0, $a1, $zero #jal dump_memory nop # EI mfc0 $v0, $12 lui $v1, 0x0001 and $v0, $v0, $v1 ei end: lq $v1, 208($sp) lq $v0, 192($sp) lq $a2, 176($sp) lq $a1, 160($sp) lq $a0, 144($sp) lq $s7, 128($sp) lq $s6, 112($sp) lq $s5, 96($sp) lq $s4, 80($sp) lq $s3, 64($sp) lq $s2, 48($sp) lq $s1, 32($sp) lq $s0, 16($sp) _orig_jal: nop nop lq $ra, 0($sp) jr $ra addiu $sp, $sp, 240 .end readPad




)
Reply With Quote
