Advertisement
Guest User

Untitled

a guest
Aug 16th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.49 KB | None | 0 0
  1. #include <pspkernel.h>
  2. #include <string.h>
  3. #include "libs.h"
  4. #include "misc.h"
  5. #include "nploader.h"
  6. #include "logger.h"
  7.  
  8. PSP_MODULE_INFO("nploader", PSP_MODULE_KERNEL, 0, 5);
  9. PSP_HEAP_SIZE_KB(2);
  10.  
  11. STMOD_HANDLER previous = NULL;
  12. int module_found = 0;
  13. int loader_found = 0;
  14.  
  15. char modname[32];
  16.  
  17. void patch_io(SceModule2 *module) {
  18.      kprintf("Patching IoFileMgrForUser\n");
  19.     const char * base = "IoFileMgrForUser";
  20.     // sceIoOpen
  21.      sceIoOpen_func = NULL;
  22.     if(hook_import_bynid(module, base, 0x109F50BC, np_open, 1) < 0)
  23.           kprintf(">> hook to sceIoOpen failed\n");
  24.      // sceIoOpenAsync
  25.      sceIoOpenAsync_func = NULL;
  26.     if(hook_import_bynid(module, base, 0x89AA9906, np_open_async, 1) < 0)
  27.           kprintf(">> hook to sceIoOpenAsync failed (not critical)\n");
  28. }
  29.  
  30. void patch_load(SceModule2 *module) {
  31.      kprintf("Patching ModuleMgrForUser\n");
  32.     const char * base = "ModuleMgrForUser";
  33.     // sceKernelLoadModule2
  34.      sceKernelLoadModule2_func = NULL;
  35.     if(hook_import_bynid(module, base, 0xF2D8D1B4, np_load, 1) < 0)
  36.           kprintf(">> hook to sceKernelLoadModule2 failed (game without sprx support)\n");
  37. }
  38.  
  39. int patch_drm(SceModule2 *module) {
  40.      kprintf("Patching scePspNpDrm_user\n");
  41.     const char *base = "scePspNpDrm_user";
  42.  
  43.      sceNpDrmEdataSetupKey_func = NULL;
  44.     // sceNpDrmEdataSetupKey
  45.     if(hook_import_bynid(module, base, 0x08D98894, np_setup, 1) < 0) {
  46.           kprintf(">> hook to sceNpDrmEdataSetupKey failed\n");
  47.           return 0;
  48.      }
  49.      sceNpDrmEdataGetDataSize_func = NULL;
  50.     // sceNpDrmEdataGetDataSize
  51.     if(hook_import_bynid(module, base, 0x219EF5CC, np_size, 1) < 0)
  52.           kprintf(">> hook to sceNpDrmEdataGetDataSize failed (not critical)\n");
  53.      sceNpDrmRenameCheck_func = NULL;
  54.     // sceNpDrmRenameCheck
  55.     if(hook_import_bynid(module, base, 0x275987D1, np_rename, 1) < 0)
  56.           kprintf(">> hook to sceNpDrmRenameCheck failed (not critical)\n");
  57.      return 1;
  58. }
  59.  
  60. int module_start_handler(SceModule2 * module) {
  61.      kprintf("> Loaded: %s\n", module->modname);
  62.     if(!module_found && module->text_addr == 0x08804000 && module->entry_addr != 0xFFFFFFFF) {
  63.           //blacklist the Prometheus iso loader
  64.           if(!loader_found && (!strcmp(module->modname, "PLoaderGUI"))) {
  65.                kprintf("Prometheus loader found\n");
  66.                loader_found = 1;
  67.           } else {
  68.                kprintf("Game found: %s\n", module->modname);
  69.                if(patch_drm(module)) {
  70.                     patch_io(module);
  71.                     patch_load(module);
  72.                }
  73.                strcpy(modname, module->modname);
  74.                module_found = 1;
  75.           }
  76.     }
  77.      if(module_found && !strcmp(module->modname, "scePspNpDrm_Driver")) {
  78.           SceModule2 *mod = (SceModule2 *)sceKernelFindModuleByName(modname);
  79.           kprintf("> Late scePspNpDrm load, hooking\n");
  80.           patch_drm(mod);
  81.      }
  82.     return previous ? previous(module) : 0;
  83. }
  84.  
  85. int thread_start(SceSize args, void *argp) {
  86.      kprintf("Making module_handle hook\n");
  87.     previous = sctrlHENSetStartModuleHandler(module_start_handler);
  88.     return 0;
  89. }
  90.  
  91. int module_start(SceSize argc, void *argp) {
  92.      kprintf("------------------\nNPloader starting\n");
  93.      SceUID thid = sceKernelCreateThread("nploader_main", thread_start, 0x22, 0x2000, 0, NULL);
  94.      if(thid >= 0)
  95.           sceKernelStartThread(thid, argc, argp);
  96.      return 0;
  97. }
  98.  
  99. int module_stop(SceSize args, void *argp) {
  100.      return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement