Advertisement
xerpi

psp stuff STUBS

Aug 10th, 2012
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.93 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. //0x3A622550,sceCtrlPeekBufferPositive
  4. /*
  5. sceCtrl
  6. Stub Entry:
  7.     Library name pointer:0896E964
  8.     Import flags:0011
  9.     Library version: 4001
  10.     Import stubs: 0005
  11.     Number of imports: 0003
  12.     Pointer to NIDs:08971060
  13.     Pointer to stubs:0896E58C
  14.  
  15. */
  16. /*
  17. Memory Regions:
  18.     Region  0: Base 0x00010000 - Size 0x00004000 - Scratchpad
  19.     Region  1: Base 0x40010000 - Size 0x00004000 - Scratchpad (uncached)
  20.     Region  2: Base 0x04000000 - Size 0x00200000 - VRAM
  21.     Region  3: Base 0x44000000 - Size 0x00200000 - VRAM (uncached)
  22.     Region  4: Base 0x08800000 - Size 0x01800000 - User memory
  23.     Region  5: Base 0x48800000 - Size 0x01800000 - User memory (uncached)
  24.     Region  6: Base 0x88000000 - Size 0x00400000 - Kernel memory (low)
  25.     Region  7: Base 0xA8000000 - Size 0x00400000 - Kernel memory (low uncached)
  26.     Region 10: Base 0x88800000 - Size 0x01800000 - Kernel memory (high)
  27.     Region 11: Base 0xA8800000 - Size 0x01800000 - Kernel memory (high uncached)
  28.     Region 12: Base 0xBFC00000 - Size 0x00100000 - Internal RAM
  29. */
  30.  
  31. void _sw(unsigned int value, unsigned int *addr)
  32. {
  33.     *addr = value;
  34. }
  35.  
  36. unsigned int _lw(unsigned int *addr)
  37. {
  38.     return *addr;
  39. }
  40.  
  41.  
  42. #define USER_ADDRESS        (0x08800000)
  43. #define FUNCTION_ADDRESS    (0x08804000)
  44.  
  45. //J target  Jump    pc=pc_upper|(target<<2) 000010  target
  46. //JR rs Jump Register   pc=rs   000000  rs  000000000000000 001000
  47.  
  48. #define MIPS_J          (0x08000000)        //0b000010 0000000000000000000000000
  49. #define MIPS_JR         (0x8)               //0b001000 0000000000000000000000000
  50. #define MIPS_NOP        (0x00000000)
  51.  
  52. #define MIPS_REG_RA     (31)
  53. #define MIPS_REG_T8     (24)
  54.  
  55. #define GET_INSTRUCTION(x)      (_lw(x))
  56. #define GET_OPCODE(x)           ((GET_INSTRUCTION(x) >> 26) & 0x3F)
  57.  
  58. #define MAKE_JUMP(a, b)             _sw( MIPS_J  | ((b >> 2) & 0x3FFFFFF), a) //(address, address to jump)
  59. #define MAKE_JUMP_REGISTER(a, reg)  _sw( ((reg<<21) & 0x3FFFFFF) | MIPS_JR, a)
  60. #define MAKE_NOP(a)                 _sw( MIPS_NOP, a)
  61.  
  62. int main(int argc, char **argv)
  63. {
  64.     unsigned int lol;
  65.     MAKE_JUMP_REGISTER(&lol, MIPS_REG_T8);
  66.     printf("0x%X", lol);
  67.     getchar();
  68.     return 0;
  69. }
  70.  
  71. //SceModule *myModule = sceKernelFindModuleByName(module_name);
  72.  
  73. unsigned int *findStubByNID(SceModule *module, PspNid NID)
  74. {
  75.     if(module == NULL)
  76.     {
  77.         printf("Error module '%s'", module->modname);
  78.         return NULL;
  79.     }
  80.     unsigned int stub_size = myModule->stub_size;
  81.     unsigned int stub_top = myModule->stub_top;
  82.     unsigned int stub_end = stub_top + (stub_size/4); //32 bits, 4 bytes = 1 instr
  83.    
  84.     SceLibraryStubTable *stubTable;
  85.     int i, stubTableSize;
  86.    
  87.     while(stub_top < stub_end)
  88.     {
  89.         stubTable = (SceLibraryStubTable *)stub_top;
  90.         stubTableSize = stubTable->stubcount;
  91.        
  92.         for(i = 0; i < stubTableSize; i++)
  93.         {
  94.             if(stubTable->nidtable[i] == NID)
  95.             {
  96.                 printf("Found NID %u at address: %u", NID, (stubTable + i*2)); //*2 since each stub is 2 instructions long (64 bits)
  97.                 return (stubTable + i*2); // &stubTable[i*2]
  98.             }
  99.         }
  100.        
  101.         stub_top += stubTable->len;
  102.     }
  103.  
  104.     return NULL;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement