Advertisement
Yosh

kermit_msfs.c

Aug 15th, 2012
311
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.22 KB | None | 0 0
  1.  
  2. // Authors : freddy_156, Yosh
  3.  
  4.  
  5. #include <pspiofilemgr.h>
  6. #include <pspsysclib.h>
  7. #include <pspsysevent.h>
  8. #include <pspthreadman_kernel.h>
  9. #include <psputilsforkernel.h>
  10. #include <pspkdebug.h>
  11. #include <pspkernel.h>
  12. #include <pspintrman_kernel.h>
  13.  
  14. #define SCE_ERROR_ERRNO_OPERATION_NOT_PERMITTED 0x80010001
  15. #define SCE_ERROR_ERRNO_TOO_MANY_OPEN_SYSTEM_FILES 0x80010018
  16. #define MAX_OPENED_FILES 32
  17.  
  18.  
  19. PSP_MODULE_INFO("sceKermitMsfs_driver", 0x1007, 1, 0);
  20.  
  21.  
  22. typedef struct FileInfo_
  23. {
  24.     // 00
  25.     struct SceIoIob_ *fileIob;
  26.     // 04
  27.     int mutex;
  28.     int kermitFileId;
  29.     int fileFlags;
  30.     u32 unk16;  // size ?
  31.     u32 unk20;  // nb errors ?
  32. } FileInfo;
  33.  
  34. typedef struct SceIoIob_
  35. {
  36.     int unk000; // some ID
  37.     int fsNum; // 4
  38.     SceIoDeviceArg *dev; // 8
  39.     int dev_type; // 12
  40.     struct FileInfo_ *fileInfo; // 16
  41.     int unk020; // 20
  42.     int unk024; // 24
  43.     int unk028; // 28
  44.     int unk032; // 32
  45.     int unk036; // 36
  46.     int unk040; // 40
  47.     SceUID curThread; // 44
  48.     char userMode; // 48
  49.     char powerLocked; // 49
  50.     char unk050;
  51.     char asyncPrio; // 51
  52.     SceUID asyncThread; // 52
  53.     SceUID asyncSema; // 56
  54.     SceUID asyncEvFlag; // 60
  55.     SceUID asyncCb; // 64
  56.     void *asyncCbArgp; // 68
  57.     int unused72; // 72
  58.     int k1; // 76
  59.     s64 asyncRet; // 80
  60.     int asyncArgs[6]; // 88
  61.     int asyncCmd; // 112
  62.     int userLevel; // 116
  63.     SceIoHook hook; // 120
  64.     int unk132; // 132
  65.     char *newPath; // 136
  66.     int retAddr; // 140
  67. } SceIoIob;
  68.  
  69. int sub_0228(SceIoIob *iob, int cmd); // do_close
  70. int sub_27B0(void); // ThreadMsfsClose
  71. int sub_2860(void);
  72. int sub_2518(void);
  73. void sub_260C(void);
  74. int sub_0108(int ev_id, char *ev_name, void *param, int *result);
  75. int sub_1C20(PspIoDrvArg *arg); //IoInit
  76. int sub_1CB4(PspIoDrvArg *arg); //IoExit
  77. int sub_1D44(SceIoIob *iob, char *file, int flags, SceMode mode); //IoOpen
  78. int sub_1D60(SceIoIob *iob); //IoClose
  79. int sub_032C(SceIoIob *iob, char *data, int len); //IoRead
  80. int sub_0718(SceIoIob *iob, const char *data, int len); //IoWrite
  81. SceOff sub_0918(SceIoIob *iob, SceOff ofs, int whence); //IoLseek
  82. int sub_0A90(SceIoIob *iob, unsigned int cmd, void *indata, int inlen, void *outdata, int outlen); //IoIoctl
  83. int sub_0CA4(SceIoIob *iob, const char *name); //IoRemove
  84. int sub_0DB4(SceIoIob *iob, const char *name, SceMode mode); //IoMkdir
  85. int sub_0ED4(SceIoIob *iob, const char *name); //IoRmdir
  86. int sub_1D7C(SceIoIob *iob, const char *dirname); //IoDopen
  87. int sub_1DA0(SceIoIob *iob); //IoDclose
  88. int sub_0FE4(SceIoIob *iob, SceIoDirent *dir); //IoDread
  89. int sub_1260(SceIoIob *iob, const char *file, SceIoStat *stat); //IoGetstat
  90. int sub_140C(SceIoIob *iob, const char *file, SceIoStat *stat, int bits); //IoChstat
  91. int sub_1594(SceIoIob *iob, const char *oldname, const char *newname); //IoRename
  92. int sub_1714(SceIoIob *iob, const char *dir); //IoChdir
  93. int sub_1DBC(SceIoIob *iob); //IoMount
  94. int sub_1DC4(SceIoIob *iob); //IoUmount
  95. int sub_1A20(SceIoIob *iob, const char *devname, unsigned int cmd, void *indata, int inlen, void *outdata, int outlen); //IoDevctl
  96.  
  97. FileInfo openedFiles[MAX_OPENED_FILES]; // 2F48
  98.  
  99. u32 g_msfs_mutex;   // 2F38
  100. u32 g_2F3C;
  101. u8 *g_msfs_buf; // 2F40
  102. u32 g_msfs_bufsize; // 2F44
  103. SceUID g_2F20 = -1;
  104. SceUID g_2F24 = -1;
  105. SceUID g_2F28 = -1;
  106. SceUID g_2F2C = -1;
  107.  
  108. PspIoDrvFuncs g_2E04 = {
  109.     .IoInit = &sub_1C20,
  110.     .IoExit = &sub_1CB4,
  111.     .IoOpen = &sub_1D44,
  112.     .IoClose = &sub_1D60,
  113.     .IoRead = &sub_032C,
  114.     .IoWrite = &sub_0718,
  115.     .IoLseek = &sub_0918,
  116.     .IoIoctl = &sub_0A90,
  117.     .IoRemove = &sub_0CA4,
  118.     .IoMkdir = &sub_0DB4,
  119.     .IoRmdir = &sub_0ED4,
  120.     .IoDopen = &sub_1D7C,
  121.     .IoDclose = &sub_1DA0,
  122.     .IoDread = &sub_0FE4,
  123.     .IoGetstat = &sub_1260,
  124.     .IoChstat = &sub_140C,
  125.     .IoRename = &sub_1594,
  126.     .IoChdir = &sub_1714,
  127.     .IoMount = &sub_1DBC,
  128.     .IoUmount = &sub_1DC4,
  129.     .IoDevctl = &sub_1A20,
  130.     .IoUnk21 = NULL,
  131. };
  132.  
  133. PspIoDrvFuncs g_2E5C = {
  134.     .IoInit = &sub_1C20,
  135.     .IoExit = &sub_1CB4,
  136.     .IoOpen = &sub_1D44,
  137.     .IoClose = &sub_1D60,
  138.     .IoRead = &sub_032C,
  139.     .IoWrite = &sub_0718,
  140.     .IoLseek = &sub_0918,
  141.     .IoIoctl = &sub_0A90,
  142.     .IoRemove = &sub_0CA4,
  143.     .IoMkdir = &sub_0DB4,
  144.     .IoRmdir = &sub_0ED4,
  145.     .IoDopen = &sub_1D7C,
  146.     .IoDclose = &sub_1DA0,
  147.     .IoDread = &sub_0FE4,
  148.     .IoGetstat = &sub_1260,
  149.     .IoChstat = &sub_140C,
  150.     .IoRename = &sub_1594,
  151.     .IoChdir = &sub_1714,
  152.     .IoMount = &sub_1DBC,
  153.     .IoUmount = &sub_1DC4,
  154.     .IoDevctl = &sub_1A20,
  155.     .IoUnk21 = NULL,
  156. }; //same pointers?
  157.  
  158. PspIoDrv g_2EB4 = { "ms", 0x10, 0x01, "Memory Stick File", &g_2E04 }; //0x01?
  159. PspIoDrv g_2EC8 = { "fatms", 0x10, 0x01, "fatms emulation", &g_2E5C };
  160.  
  161. PspSysEventHandler g_2EE0 = {
  162.     .size = 0x04,
  163.     .name = "sceMsFs",
  164.     .type_mask = 0x00FFFF00,
  165.     .handler = &sub_0108;
  166.     .r28 = 0,
  167.     .busy = 0,
  168.     .next = NULL,
  169. };
  170.  
  171. int module_bootstart(void)
  172. {
  173.     sceKernelMemset(0xAA118000, 0, 0x8000);
  174.     g_msfs_bufsize = 0x4000;
  175.     g_msfs_buf = 0xAA11C000;
  176.     g_2F3C = 0xAA118000;
  177.    
  178.     if((g_msfs_mutex = sceKernelCreateMutex("SceKermitMsfsFile", 0x100, 0, NULL)) <= 0)
  179.     {
  180.         return 1;
  181.     }
  182.    
  183.     if(sub_2518() < 0)
  184.     {
  185.         sceKernelDeleteMutex(g_msfs_mutex);
  186.         return 1;
  187.     }
  188.    
  189.     sceIoDelDrv("ms");
  190.    
  191.     if(sceIoAddDrv(&g_2EB4) >= 0)
  192.     {
  193.         sceIoDelDrv("fatms");
  194.         if(sceIoAddDrv(&g_2EC8) >= 0)
  195.         {
  196.             if(sub_2860() >= 0)
  197.             {
  198.                 sceKernelRegisterSysEventHandler(&g_2EE0);
  199.                 return 0;
  200.             }
  201.         }
  202.     }
  203.    
  204.     sub_260C();
  205.     sceKernelDeleteMutex(g_msfs_mutex);
  206.    
  207.     return 1;
  208. }
  209.  
  210. int sub_1C20(PspIoDrvArg *arg) //IoInit
  211. {
  212.     u8 buf[128];
  213.     u32 resp[2];
  214.     u32 argc;
  215.     u32 size = 0xC;
  216.     void *alignedBuf = ALIGN_64(buf + 63);
  217.    
  218.     sceKernelDcacheInvalidateRange(alignedBuf, 0x40);
  219.    
  220.     KermitPacket *packet = KERMIT_PACKET(alignedBuf);
  221.    
  222.    
  223.     argc = 0;
  224.     sceKermitMemory_driver_AAF047AC(packet, argc, arg, size, KERMIT_OUTPUT_MODE | KERMIT_INPUT_MODE);
  225.    
  226.     argc = 1;
  227.     sceKermit_driver_4F75AA05(packet, KERMIT_MODE_MSFS, KERMIT_CMD_INIT_FS, argc, KERMIT_CALLBACK_DISABLE, resp);
  228.    
  229.     // Receive Vita data
  230.     sceKermitMemory_driver_90B662D0(arg, size);
  231.    
  232.    
  233.     return resp[0];
  234. }
  235.  
  236. int sub_2518(void)
  237. {
  238.     if((g_2F20 = sceKernelCreateThread("SceKermitMsfsClose", &sub_27B0, 0x10, 0x1000, 0x00100000 | 1, NULL)) < 0)
  239.     {
  240.         sub_260C();
  241.         return g_2F20;
  242.     }
  243.     if((g_2F24 = sceKernelCreateMutex("SceKermitMsfsClose", 0x100, 0, NULL)) < 0)
  244.     {
  245.         sub_260C();
  246.         return g_2F24;
  247.     }
  248.     if((g_2F28 = sceKernelCreateMsgPipe("SceCompatMsfsCloseRequest", 1, 0, 0x10, NULL)) < 0)
  249.     {
  250.         sub_260C();
  251.         return g_2F28;
  252.     }
  253.     if((g_2F2C = sceKernelCreateMsgPipe("SceKermitMsfsCloseResult", 1, 0, 0x8, NULL)) < 0)
  254.     {
  255.         sub_260C();
  256.         return g_2F2C;
  257.     }
  258.     return 0;
  259. }
  260.  
  261. int sub_00002860()
  262. {
  263.     if ( g_2F20 > 0 )   return MIN( sceKernelStartThread(g_2F20, 0, NULL), 0 );
  264.     else    return SCE_ERROR_ERRNO_OPERATION_NOT_PERMITTED;
  265. }
  266.  
  267. //  IoOpen
  268. int sub_1D44(SceIoIob *iob, char *file, int flags, SceMode mode)
  269. {
  270.     return sub_00001F64(iob, file, flags, mode, KERMIT_CMD_OPEN_FS);
  271. }
  272.  
  273. //  IoDopen
  274. int sub_1D7C(SceIoIob *iob, const char *dirname)
  275. {
  276.     return sub_00001F64(iob, dirname, 0, 0, KERMIT_CMD_DOPEN_FS);
  277. }
  278.  
  279. int sub_00001F64(SceIoIob *iob, char *path, int flags, SceMode mode, int cmd)
  280. {
  281.     u8 buf[128];
  282.     u32 resp[2];
  283.     int errCode = 0;
  284.     void *alignedBuf = ALIGN_64(buf + 63);
  285.    
  286.     sceKernelDcacheInvalidateRange(alignedBuf, 0x40);
  287.    
  288.     KermitPacket *packet = KERMIT_PACKET(alignedBuf);
  289.    
  290.    
  291.     if ( iob->fsNum < 5 )
  292.     {
  293.         int intr = sceKernelCpuSuspendIntr();
  294.         int nbFilesOpen;
  295.        
  296.         nbFilesOpen = 0;
  297.        
  298.         if ( openedFiles[0].fileIob != NULL )
  299.         {
  300.             FileInfo *curFileInfo = openedFiles;
  301.            
  302.             do
  303.             {
  304.                 nbFilesOpen++;
  305.                 curFileInfo += sizeof(FileInfo);
  306.             } while ( nbFilesOpen < MAX_OPENED_FILES && curFileInfo->fileIob != NULL );
  307.            
  308.            
  309.             if ( nbFilesOpen >= MAX_OPENED_FILES )  errCode = SCE_ERROR_ERRNO_TOO_MANY_OPEN_SYSTEM_FILES;
  310.         }
  311.        
  312.         if ( errCode >= 0 )
  313.         {
  314.             FileInfo *curFileInfo = nbFilesOpen * sizeof(FileInfo);
  315.            
  316.             curFileInfo->unk16 = NULL;
  317.             curFileInfo->unk20 = NULL;
  318.             iob->fileInfo = curFileInfo;
  319.             curFileInfo->fileIob = iob;
  320.             curFileInfo->fileFlags = flags;
  321.         }
  322.        
  323.         sceKernelCpuResumeIntr(intr);
  324.        
  325.        
  326.         if ( errCode >= 0 )
  327.         {
  328.             int ret;
  329.            
  330.             curFileInfo->mutex = sceKernelCreateMutex("SceMsfs", 0x100, 1, NULL);
  331.            
  332.             ret = sceKernelLockMutex(g_msfs_mutex, 1, NULL);
  333.            
  334.             if ( !ret )
  335.             {
  336.                 u32 maxSize = g_msfs_bufsize/2;
  337.                 strncpy(g_msfs_buf, path, maxSize);
  338.                
  339.                 *((char*)(g_msfs_buf + maxSize - 1)) = '\0';
  340.                
  341.                 u32 argc = 0;
  342.                 sceKermitMemory_driver_AAF047AC(packet, argc, g_msfs_buf, strlen(g_msfs_buf)+1, KERMIT_INPUT_MODE);
  343.                
  344.                 // 2nd arg
  345.                 *(packet+0x18) = flags;
  346.                 // 3rd arg
  347.                 *(packet+0x20) = mode;
  348.                
  349.                
  350.                 argc = 3;
  351.                 sceKermit_driver_4F75AA05(packet, KERMIT_MODE_MSFS, cmd, argc, KERMIT_CALLBACK_DISABLE, resp);
  352.                
  353.                 curFileInfo->kermitFileId = resp[0];
  354.                 ret = sceKernelUnlockMutex(g_msfs_mutex, 1);
  355.                
  356.                 if ( !ret )
  357.                 {
  358.                     sceKernelUnlockMutex(curFileInfo->mutex, 1);
  359.                    
  360.                     if ( resp[0] < 0 )
  361.                     {
  362.                         sceKernelDeleteMutex(curFileInfo->mutex);
  363.                        
  364.                         intr = sceKernelCpuSuspendIntr();
  365.                        
  366.                         iob->fileInfo = NULL;
  367.                        
  368.                         sceKernelCpuResumeIntr(intr);
  369.                     }
  370.                    
  371.                     errCode = resp[0];
  372.                 }
  373.                 else    errCode = ret;
  374.             }
  375.             else    errCode = ret;
  376.         }
  377.     }
  378.     else    errCode = SCE_ERROR_ERRNO_DEVICE_NOT_FOUND;
  379.    
  380.    
  381.    
  382.     return errCode;
  383. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement