Advertisement
Yosh

kermit fs minimal working api

Aug 14th, 2012
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.96 KB | None | 0 0
  1.  
  2. // path : absolute for flash (like "flash0:/XXXXXXX"), without device for ms (like "/PSP/GAME/XXXX")
  3. // cmd_mode : either KERMIT_MODE_MSFS or KERMIT_MODE_FLASHFS
  4. u64 KermitIo_open( char *path, int flags, SceMode mode, int cmd_mode, int cmd )
  5. {
  6.     u8 buf[128];
  7.     u64 resp;
  8.     void *alignedBuf = ALIGN_64(buf + 63);
  9.    
  10.     sceKernelDcacheInvalidateRange(alignedBuf, 0x40);
  11.    
  12.     KermitPacket *packet = KERMIT_PACKET(alignedBuf);
  13.    
  14.    
  15.     u32 argc = 0;
  16.    
  17.     // Prepare to receive and set path as 1st arg
  18.     sceKermitMemory_driver_AAF047AC(packet, argc, path, strlen(path)+1, KERMIT_INPUT_MODE);
  19.    
  20.     // 2nd arg
  21.     *((u32*)((u32)packet+0x18)) = flags;
  22.     // 3rd arg
  23.     *((u32*)((u32)packet+0x20)) = mode;
  24.    
  25.    
  26.     argc = 3;
  27.     sceKermit_driver_4F75AA05(packet, cmd_mode, cmd, argc, KERMIT_CALLBACK_DISABLE, &resp);
  28.    
  29.    
  30.     return resp;
  31. }
  32.  
  33. u64 KermitIoOpen( char *path, int flags, SceMode mode, int cmd_mode )
  34. {
  35.     return KermitIo_open(path, flags, mode, cmd_mode, KERMIT_CMD_OPEN_FS );
  36. }
  37.  
  38. u64 KermitIoDopen( char *dirName, int cmd_mode )
  39. {
  40.     return KermitIo_open(dirName, 0, 0, cmd_mode, KERMIT_CMD_DOPEN_FS );
  41. }
  42.  
  43. u64 KermitIoWrite(u32 kermitFileId, const char *data, int len, int cmd_mode )
  44. {
  45.     u8 buf[128];
  46.     u64 resp;
  47.     void *alignedBuf = ALIGN_64(buf + 63);
  48.    
  49.     sceKernelDcacheInvalidateRange(alignedBuf, 0x40);
  50.    
  51.     KermitPacket *packet = KERMIT_PACKET(alignedBuf);
  52.    
  53.    
  54.     int ret;
  55.     u32 argc;
  56.     const void *addr = (void*)((u32)data - ((u32)data % 64));
  57.     ret = sceKernelDcacheWritebackRange(addr, ALIGN_64(((u32)data % 64) + len + 63) );
  58.     if ( ret != 0 ) PRTSTR2("Failed data cache write back (addr 0x%08lX) %08lX\n", addr, ret);
  59.    
  60.     // 1st arg
  61.     *((u32*)((u32)packet+0x10)) = kermitFileId;
  62.    
  63.     argc = 1;
  64.    
  65.     // Prepare to receive and set data as 2nd arg
  66.     sceKermitMemory_driver_AAF047AC(packet, argc, data, len, KERMIT_INPUT_MODE);
  67.    
  68.    
  69.    
  70.     // 3rd arg
  71.     *((u32*)((u32)packet+0x20)) = len;
  72.    
  73.     argc = 3;
  74.     sceKermit_driver_4F75AA05(packet, cmd_mode, KERMIT_CMD_WRITE_FS, argc, KERMIT_CALLBACK_DISABLE, &resp);
  75.    
  76.    
  77.     return resp;
  78. }
  79.  
  80. u64 KermitIoRead(u32 kermitFileId, char *data, int len, int cmd_mode )
  81. {
  82.     u8 buf[128];
  83.     u64 resp;
  84.     void *alignedBuf = ALIGN_64(buf + 63);
  85.     sceKernelDcacheInvalidateRange(alignedBuf, 0x40);
  86.    
  87.     KermitPacket *packet = KERMIT_PACKET(alignedBuf);
  88.    
  89.     u8 *buf_ = (u8*)0xAA124000; // using flashfs kermit read buffer
  90.    
  91.     u32 argc = 1;
  92.    
  93.     // 1st arg
  94.     *((u32*)((u32)packet+0x10)) = kermitFileId;
  95.    
  96.     // Prepare to receive and set buf as 2nd arg
  97.     sceKermitMemory_driver_AAF047AC(packet, argc, buf_, len, KERMIT_OUTPUT_MODE);
  98.    
  99.    
  100.    
  101.     // 3rd arg
  102.     *((u32*)((u32)packet+0x20)) = len;
  103.    
  104.     argc = 3;
  105.     sceKermit_driver_4F75AA05(packet, cmd_mode, KERMIT_CMD_READ_FS, argc, KERMIT_CALLBACK_DISABLE, &resp);
  106.    
  107.    
  108.     // Receive data
  109.     sceKermitMemory_driver_90B662D0(buf_, (u32)resp);
  110.    
  111.     memcpy(data, buf_, (u32)resp);
  112.    
  113.    
  114.     return resp;
  115. }
  116.  
  117. u64 KermitIo_close(u32 kermitFileId, int cmd_mode, int cmd )
  118. {
  119.     u8 buf[128];
  120.     u64 resp;
  121.     void *alignedBuf = ALIGN_64(buf + 63);
  122.     sceKernelDcacheInvalidateRange(alignedBuf, 0x40);
  123.    
  124.     KermitPacket *packet = KERMIT_PACKET(alignedBuf);
  125.    
  126.    
  127.     u32 argc = 1;
  128.    
  129.     // 1st arg
  130.     *((u32*)((u32)packet+0x10)) = kermitFileId;
  131.    
  132.     sceKermit_driver_4F75AA05(packet, cmd_mode, cmd, argc, KERMIT_CALLBACK_DISABLE, &resp);
  133.    
  134.    
  135.     return resp;
  136. }
  137.  
  138. u64 KermitIoClose(u32 kermitFileId, int cmd_mode )
  139. {
  140.     return KermitIo_close(kermitFileId, cmd_mode, KERMIT_CMD_CLOSE_FS );
  141. }
  142.  
  143. u64 KermitIoDclose(u32 kermitFileId, int cmd_mode )
  144. {
  145.     return KermitIo_close(kermitFileId, cmd_mode, KERMIT_CMD_DCLOSE_FS );
  146. }
  147.  
  148. u64 KermitIoLseek(u32 kermitFileId, SceOff ofs, int whence, int cmd_mode )
  149. {
  150.     u8 buf[128];
  151.     u64 resp;
  152.     void *alignedBuf = ALIGN_64(buf + 63);
  153.     sceKernelDcacheInvalidateRange(alignedBuf, 0x40);
  154.    
  155.     KermitPacket *packet = KERMIT_PACKET(alignedBuf);
  156.    
  157.    
  158.     u32 argc = 3;
  159.    
  160.     // 1st arg
  161.     *((u32*)((u32)packet+0x10)) = kermitFileId;
  162.     // 2nd arg
  163.     *((u32*)((u32)packet+0x18)) = (u32)ofs;
  164.     // 2nd arg
  165.     *((u32*)((u32)packet+0x1C)) = (u32)(ofs >> 32);
  166.     // 3rd arg
  167.     *((u32*)((u32)packet+0x20)) = whence;
  168.    
  169.     sceKermit_driver_4F75AA05(packet, cmd_mode, KERMIT_CMD_SEEK_FS, argc, KERMIT_CALLBACK_DISABLE, &resp);
  170.    
  171.    
  172.     return resp;
  173. }
  174.  
  175. u64 KermitIoDread(u32 kermitDirId, SceIoDirent *dir, int cmd_mode )
  176. {
  177.     u8 buf[128];
  178.     u64 resp;
  179.     void *alignedBuf = ALIGN_64(buf + 63);
  180.     sceKernelDcacheInvalidateRange(alignedBuf, 0x40);
  181.    
  182.     KermitPacket *packet = KERMIT_PACKET(alignedBuf);
  183.    
  184.     u8 *buf_ = (u8*)0xAA124000; // using flashfs kermit read buffer
  185.    
  186.     u32 argc = 1;
  187.    
  188.     // 1st arg
  189.     *((u32*)((u32)packet+0x10)) = kermitDirId;
  190.    
  191.     // Prepare to receive and set buf as 2nd arg
  192.     sceKermitMemory_driver_AAF047AC(packet, argc, buf_, sizeof(SceIoDirent), KERMIT_OUTPUT_MODE);
  193.    
  194.    
  195.    
  196.     argc = 2;
  197.     sceKermit_driver_4F75AA05(packet, cmd_mode, KERMIT_CMD_DREAD_FS, argc, KERMIT_CALLBACK_DISABLE, &resp);
  198.    
  199.    
  200.     // Receive data
  201.     sceKermitMemory_driver_90B662D0(buf_, sizeof(SceIoDirent));
  202.    
  203.     memcpy(dir, buf_, sizeof(SceIoDirent));
  204.    
  205.    
  206.     return resp;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement