Difference between revisions of "SceIofilemgr"

From Vita Development Wiki
Jump to navigation Jump to search
(sceVopGetStateByFdForDriver -> sceVopFgetstat)
 
(43 intermediate revisions by 3 users not shown)
Line 2: Line 2:
  
 
== Module ==
 
== Module ==
 +
 
This module exists only in non-secure world. The SELF can be found in <code>os0:kd/iofilemgr.skprx</code>.
 
This module exists only in non-secure world. The SELF can be found in <code>os0:kd/iofilemgr.skprx</code>.
  
Line 14: Line 15:
  
 
=== Known NIDs ===
 
=== Known NIDs ===
 +
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
Line 23: Line 25:
 
|}
 
|}
  
== Mount Points ==
+
== Debug callback type ==
  
This table is stored in data segment of SceIofilemgr as array of <code>vfs_mount_point_info</code> elements.
+
{| class="wikitable"
 
+
|-
When sceVfsMount is executed it finds vfs_add_data element by filesystem string and then selects appropriate mount scenario by devMinor and devMajor.
+
! Type !! When
 
+
|-
*<code><rnd></code> means random numeric string of length 13
+
| 0x0 || Scheduled sceIoOpen start
 
+
|-
See [[SceSdstor]] for "sdstor0:" Block Device.
+
| 0x1 || Scheduled sceIoOpen end
 
+
|-
{| class="wikitable sortable"
+
| 0x2 || sceVopOpen start
! Unix Mount || Dev Major || Dev Minor || Filesystem || Vita Mount || Block Device || VSH Mount Id
+
|-
 +
| 0x3 || sceVopOpen end
 +
|-
 +
| 0x4 || Scheduled sceIoClose start
 +
|-
 +
| 0x5 || Scheduled sceIoClose end
 +
|-
 +
| 0x6 || sceVopClose start
 +
|-
 +
| 0x7 || sceVopClose end
 +
|-
 +
| 0x8 || Scheduled sceIoRead start
 +
|-
 +
| 0x9 || Scheduled sceIoRead end
 +
|-
 +
| 0xA || sceVopRead start
 +
|-
 +
| 0xB || sceVopRead end
 
|-
 
|-
| /tty || 0x4000020 || 0x6003 || dummy_ttyp_dev_fs || tty || dummy_ttyp_dev_fs || 0x0
+
| 0xC || Scheduled sceIoWrite start
 
|-
 
|-
| /dev || 0x10 || 0x3 || sdstor_dev_fs || sdstor0: || sd || 0x1
+
| 0xD || Scheduled sceIoWrite end
 
|-
 
|-
| /md || 0x10 || 0x2003 || md_dev_fs || md0: || md || 0x2
+
| 0xE || sceVopWrite start
 
|-
 
|-
| /sd/exfat || 0x2030001 || 0x30002 || fat16 / fat32 / exfat || sd0: || sdstor0:ext-pp-act-a, sdstor0:ext-lp-act-entire || 0x100
+
| 0xF || sceVopWrite end
 
|-
 
|-
| /os/exfat || 0x1000001 || 0x1002 || fat16 || os0: || sdstor0:int-lp-act-os || 0x200
+
| 0x10 || Scheduled sceIoPread start
 
|-
 
|-
| /vs/exfat || 0x1000001 || 0x1002 || fat16 || vs0: || sdstor0:int-lp-ign-vsh || 0x300
+
| 0x11 || Scheduled sceIoPread end
 
|-
 
|-
| /vd/exfat || 0x1000001 || 0x10002 || fat16 || vd0: || sdstor0:int-lp-ign-vshdata || 0x400
+
| 0x12 || sceVopPread start
 
|-
 
|-
| /tm/exfat || 0x1000001 || 0x10002 || fat16 || tm0: || sdstor0:int-lp-ign-vtrm || 0x500
+
| 0x13 || sceVopPread end
 
|-
 
|-
| /ur/exfat || 0x1000001 || 0x50002 || exfat || ur0: || sdstor0:int-lp-ign-user || 0x600
+
| 0x14 || Scheduled sceIoPwrite start
 
|-
 
|-
| /ud/exfat || 0x1000001 || 0x10002 || fat16 || ud0: || sdstor0:int-lp-ign-updater || 0x700
+
| 0x15 || Scheduled sceIoPwrite end
 
|-
 
|-
| /ux/exfat || 0x2020001 || 0x30002 || exfat || ux0: || External: sdstor0:xmc-lp-ign-userext<br />Internal: sdstor0:int-lp-ign-userext || 0x800
+
| 0x16 || sceVopPwrite start
 
|-
 
|-
| /gro/exfat || 0x2010001 || 0x21002 || exfat || gro0: || sdstor0:gcd-lp-ign-gamero || 0x900
+
| 0x17 || sceVopPwrite end
 
|-
 
|-
| /grw/exfat || 0x2010001 || 0x20002 || exfat || grw0: || sdstor0:gcd-lp-ign-gamerw || 0xA00
+
| 0x18 || Scheduled sceIoLseek start
 
|-
 
|-
| /sa/exfat || 0x1000001 || 0x1002 || fat16 || sa0: || sdstor0:int-lp-ign-sysdata || 0xB00
+
| 0x19 || Scheduled sceIoLseek end
 
|-
 
|-
| /pd/exfat || 0x1000001 || 0x1002 || exfat || pd0: || sdstor0:int-lp-ign-pidata || 0xC00
+
| 0x1A || sceVopLseek start
 
|-
 
|-
| /imc/exfat || 0x2020001 || 0x30002 || exfat || imc0: || sdstor0:int-lp-ign-userext || 0xD00
+
| 0x1B || sceVopLseek end
 
|-
 
|-
| /xmc/exfat || 0x2020001 || 0x30002 || exfat || xmc0: || sdstor0:xmc-lp-ign-userext || 0xE00
+
| 0x1C || Scheduled sceIoMkdir start
 
|-
 
|-
| /uma/exfat || 0x2030001 || 0x2 || fat32 / exfat || uma0: || sdstor0:uma-pp-act-a, sdstor0:uma-lp-act-entire || 0xF00
+
| 0x1D || Scheduled sceIoMkdir end
 
|-
 
|-
| /lma/exfat || 0x1 || 0x5 || exfat || lma0: || / || 0x10000
+
| 0x1E || sceVopMkdir start
 
|-
 
|-
| /lmb/exfat || 0x1 || 0x5 || exfat || lmb0: || / || 0x20000
+
| 0x1F || sceVopMkdir end
 
|-
 
|-
| /mfa/exfat || 0x1 || 0x5 || exfat || mfa0: || / || 0x50000
+
| 0x20 || Scheduled sceIoRmdir start
 
|-
 
|-
| /mfb/exfat || 0x1 || 0x5 || exfat || mfb0: || / || 0x60000
+
| 0x21 || Scheduled sceIoRmdir end
 
|-
 
|-
| /PD<rnd> || 0x3 || 0x1001 || PFS_GDSD_INF || PD<rnd>0 || || 0x0
+
| 0x22 || sceVopRmdir start
|}
+
|-
 
+
| 0x23 || sceVopRmdir end
== VFS Implementation ==
+
|-
 
+
| 0x24 || Scheduled sceIoGetstat start
Information can be found on separate page [[VFS_Implementation|VFS Implementation]]
+
|-
 
+
| 0x25 || Scheduled sceIoGetstat end
==== note ====
+
|-
 
+
| 0x26 || sceVopGetstat start
Max vfs node number is 0x1000.
+
|-
 
+
| 0x27 || sceVopGetstat end
== Types ==
+
|-
 
+
| 0x28 || Scheduled sceIoRemove start
<source lang="C">
+
|-
 
+
| 0x29 || Scheduled sceIoRemove end
typedef struct vfs_node_info { // size is 0x38
+
|-
  char name[0x20];
+
| 0x2A || sceVopRemove start
  vfs_node* node; // can be zero
+
|-
  uint32_t unk_24; // probably size of vfs_node
+
| 0x2B || sceVopRemove end
  uint32_t unk_28; // probably flags
+
|-
  vfs_node_info* node_info_2C; // can be zero
+
| 0x2C || Scheduled sceIoRename start
  vfs_node_info* node_info_30; // can be zero
+
|-
  vfs_node_info* node_info_34; // can be zero
+
| 0x2D || Scheduled sceIoRename end
} vfs_node_info;
+
|-
 
+
| 0x2E || sceVopRename start
// It looks like this structure is used to get some response into "error" field
+
|-
// when executing sceKernelSignalCondTo calls.
+
| 0x2F || sceVopRename end
// This structure is used by SceIofileDaemon when it monitors mount/unmount async requests
+
|-
// in SceIofilemgrMount thread using SceIofilemgrMount conditional variable.
+
| 0x30 || -
// Upon completion it issues the signal and result of operation is stored in error field.
+
|-
// It looks like operations 1/2 are used for normal filesystems.
+
| 0x31 || -
// Operations 3/4 are used for PFS_GDSD_INF filesystem.
+
|-
typedef struct cond_ctx {
+
| 0x32 || Scheduled sceIoDopen start
  uint32_t op_index; // operation index. 1,3 - mount. 2,4 - unmount
+
|-
  uint32_t unk_4;
+
| 0x33 || Scheduled sceIoDopen end
  uint32_t unk_8;
+
|-
  uint32_t unk_C;
+
| 0x34 || sceVopDopen start
  uint32_t unk_10;
+
|-
  uint32_t unk_14;
+
| 0x35 || sceVopDopen end
  uint32_t unk_18;
+
|-
  uint32_t unk_1C;
+
| 0x36 || Scheduled sceIoDread start
  int error; // either error code or 0
+
|-
  cond_ctx* next; // 0 means end of list
+
| 0x37 || Scheduled sceIoDread end
} cond_ctx;
+
|-
 
+
| 0x38 || sceVopDread start
typedef struct ctx_19D4 {
+
|-
  void* unk_0;
+
| 0x39 || sceVopDread end
  uint32_t unk_4;
+
|-
  vfs_node* offset; // Pool of vfs_nodes with 0x1000 elements.
+
| 0x3A || Scheduled sceIoDclose start
                    // It is used in sceVfsGetNewVnodeForDriver, mount/unmount and node find routines.
+
|-
  uint32_t size;
+
| 0x3B || Scheduled sceIoDclose end
 
+
|-
  uint32_t count;
+
| 0x3C || sceVopDclose start
  uint32_t unk_14;
+
|-
  uint32_t unk_18;
+
| 0x3D || sceVopDclose end
  uint32_t unk_1C;
+
|-
} ctx_19D4;
+
| 0x3E || Scheduled sceIoChstat start
 +
|-
 +
| 0x3F || Scheduled sceIoChstat end
 +
|-
 +
| 0x40 || sceVopChstat start
 +
|-
 +
| 0x41 || sceVopChstat end
 +
|-
 +
| 0x42 || Scheduled sceIoIoctl start
 +
|-
 +
| 0x43 || Scheduled sceIoIoctl end
 +
|-
 +
| 0x44 || sceVopIoctl start
 +
|-
 +
| 0x45 || sceVopIoctl end
 +
|-
 +
| 0x46 || Scheduled sceIoSync start
 +
|-
 +
| 0x47 || Scheduled sceIoSync end
 +
|-
 +
| 0x48 || sceVopSync start
 +
|-
 +
| 0x49 || sceVopSync end
 +
|-
 +
| 0x4A || Scheduled sceIoFgetstat start
 +
|-
 +
| 0x4B || Scheduled sceIoFgetstat end
 +
|-
 +
| 0x4C || sceVopFgetstat start/end
 +
|-
 +
| 0x4D || -
 +
|-
 +
| 0x4E || Scheduled sceIoFchstat start
 +
|-
 +
| 0x4F || Scheduled sceIoFchstat end
 +
|-
 +
| 0x50 || sceVopFchstat start
 +
|-
 +
| 0x51 || sceVopFchstat end
 +
|-
 +
| 0x52 || sceVopLookup start
 +
|-
 +
| 0x53 || sceVopLookup end
 +
|-
 +
| 0x54 || sceVopCreate start
 +
|-
 +
| 0x55 || sceVopCreate end
 +
|-
 +
| 0x56 || sceVopInactive start
 +
|-
 +
| 0x57 || sceVopInactive end
 +
|-
 +
| 0x58 || sceVopWhiteout start
 +
|-
 +
| 0x59 || -
 +
|-
 +
| 0x5A || sceVopWhiteout end
 +
|-
 +
| 0x5B || sceVopCleanup start
 +
|-
 +
| 0x5C || sceVopCleanup end
 +
|-
 +
| 0x5D || sceVfsOpMount start
 +
|-
 +
| 0x5E || sceVfsOpMount end
 +
|-
 +
| 0x5F || sceVfsOpUnmount start
 +
|-
 +
| 0x60 || sceVfsOpUnmount end
 +
|-
 +
| 0x61 || sceVfsOpDevctl start
 +
|-
 +
| 0x62 || sceVfsOpDevctl end
 +
|-
 +
| 0x63 || sceVfsOpSync start
 +
|-
 +
| 0x64 || sceVfsOpSync end
 +
|-
 +
| 0x65 || sceVfsOpDecodePathElem start
 +
|-
 +
| 0x66 || sceVfsOpDecodePathElem end
 +
|}
 +
 
 +
== Mount Points ==
  
typedef struct ctx_11C { //size is 0x220
+
This table is stored in data segment of SceIofilemgr as array of <code>vfs_mount_point_info</code> elements.
  void* unk_0;
 
  uint32_t unk_4;
 
  void* offset; // pointer to array of byte size 0x10000 with 0x40 elements of size 0x400
 
  uint32_t size;
 
  
  uint32_t count;
+
When [[#sceVfsMountForDriver]] is executed, it finds vfs_add_data element by filesystem string and then selects appropriate mount scenario by devMinor and devMajor.
  
  uint8_t data[0x20C];
+
*<code><rnd></code> means random numeric string of length 13
} ctx_11C;
 
  
typedef struct io_scheduler_dispatcher { //size is 0xB8
+
See [[SceSdstor]] for "sdstor0:" Block Device.
  char unk_0[0x50];
 
  
  io_scheduler* unk_50; // Internal storage
+
{| class="wikitable sortable"
  io_scheduler* unk_54; // Gamecard
+
! Unix Mount || Dev Major || Dev Minor || fsName || assignName || blockdevName || VSH Mount Id || Comment
  io_scheduler* unk_58; // Removable media (memory card)
+
|-
  io_scheduler* unk_5C; // Host File System (host0:)
+
| /PD<rnd> || 0x3 || 0x1001 || PFS_GDSD_INF || PD<rnd>0 || - || 0x0 || -
  io_scheduler* unk_60; // Default
+
|-
 
+
| /sd/exfat || 0x2030001 || 0x30002 || [[SceExfatfs|exfat]] || sd0: || sdstor0:ext-lp-act-entire || 0x100 || -
  uint32_t unk_64; // pointer to unknown module data section
+
|-
  uint32_t unk_68; // SceIoSchedulerDispatcher fast mutex
+
| /os/exfat || 0x1000001 || 0x1002 || [[SceExfatfs|exfat]] || os0: || sdstor0:int-lp-act-os || 0x200 || Formatted as FAT16.
  uint32_t unk_6C;
+
|-
 
+
| /vs/exfat || 0x1000001 || 0x1002 || [[SceExfatfs|exfat]] || vs0: || sdstor0:int-lp-ign-vsh || 0x300 || Formatted as FAT16.
  char unk_70[0x30];
+
|-
 
+
| /vd/exfat || 0x1000001 || 0x10002 || [[SceExfatfs|exfat]] || vd0: || sdstor0:int-lp-ign-vshdata || 0x400 || Formatted as FAT16.
  uint32_t unk_A0;
+
|-
  uint32_t unk_A4;
+
| /tm/exfat || 0x1000001 || 0x10002 || [[SceExfatfs|exfat]] || tm0: || sdstor0:int-lp-ign-vtrm || 0x500 || Formatted as FAT16.
 
+
|-
  SceUID unk_A8; // SceIoSchedulerDispatcher event flag uid
+
| /ur/exfat || 0x1000001 || 0x50002 || [[SceExfatfs|exfat]] || ur0: || sdstor0:int-lp-ign-user || 0x600 || Formatted as exFAT.
  uint32_t unk_AC; // counter
+
|-
  uint32_t unk_B0; // flag
+
| /ud/exfat || 0x1000001 || 0x10002 || [[SceExfatfs|exfat]] || ud0: || sdstor0:int-lp-ign-updater || 0x700 || Formatted as FAT16.
  uint32_t unk_B4; // 0
+
|-
 
+
| /ux/exfat || 0x2020001 || 0x30002 || [[SceExfatfs|exfat]] || ux0: || External: sdstor0:xmc-lp-ign-userext<br />Internal: sdstor0:int-lp-ign-userext || 0x800 || Formatted as exFAT.
} io_scheduler_dispatcher;
+
|-
 +
| /gro/exfat || 0x2010001 || 0x21002 || [[SceExfatfs|exfat]] || gro0: || sdstor0:gcd-lp-ign-gamero || 0x900 || Formatted as exFAT.
 +
|-
 +
| /grw/exfat || 0x2010001 || 0x20002 || [[SceExfatfs|exfat]] || grw0: || sdstor0:gcd-lp-ign-gamerw || 0xA00 || Formatted as exFAT.
 +
|-
 +
| /sa/exfat || 0x1000001 || 0x1002 || [[SceExfatfs|exfat]] || sa0: || sdstor0:int-lp-ign-sysdata || 0xB00 || Formatted as FAT16.
 +
|-
 +
| /pd/exfat || 0x1000001 || 0x1002 || [[SceExfatfs|exfat]] || pd0: || sdstor0:int-lp-ign-pidata || 0xC00 || Formatted as exFAT.
 +
|-
 +
| /imc/exfat || 0x2020001 || 0x30002 || [[SceExfatfs|exfat]] || imc0: || sdstor0:int-lp-ign-userext || 0xD00 || Formatted as exFAT.
 +
|-
 +
| /xmc/exfat || 0x2020001 || 0x30002 || [[SceExfatfs|exfat]] || xmc0: || sdstor0:xmc-lp-ign-userext || 0xE00 || Formatted as exFAT.
 +
|-
 +
| /uma/exfat || 0x2030001 || 0x2 || [[SceExfatfs|exfat]] || uma0: || sdstor0:uma-lp-act-entire || 0xF00 || -
 +
|-
 +
| /tty || 0x4000020 || 0x6003 || dummy_ttyp_dev_fs || tty || dummy_ttyp_dev_fs || 0x0 || -
 +
|-
 +
| /dev || 0x10 || 0x3 || sdstor_dev_fs || sdstor0: || sd || 0x1 || -
 +
|-
 +
| /md || 0x10 || 0x2003 || md_dev_fs || md0: || md || 0x2 || -
 +
|-
 +
| /lma/exfat || 0x1 || 0x5 || [[SceExfatfs|exfat]] || lma0: || / || 0x10000 || -
 +
|-
 +
| /lmb/exfat || 0x1 || 0x5 || [[SceExfatfs|exfat]] || lmb0: || / || 0x20000 || -
 +
|-
 +
| /mfa/exfat || 0x1 || 0x5 || [[SceExfatfs|exfat]] || mfa0: || / || 0x50000 || -
 +
|-
 +
| /mfb/exfat || 0x1 || 0x5 || [[SceExfatfs|exfat]] || mfb0: || / || 0x60000 || -
 +
|-
 +
| /host || 0x3000004 || 0x8006 || - || host0: || deci4p_drfp_dev_fs || - || -
 +
|}
  
typedef struct io_scheduler_item { // size is 0x14 - allocated from SceIoScheduler heap
+
Dev Minor
  io_scheduler* unk_0; // parent
 
  uint32_t unk_4; // 0
 
  uint32_t unk_8; // 0
 
  uint32_t unk_C; // 0
 
  uint32_t unk_10; // pointer to unknown module data section
 
} io_scheduler_item;
 
  
enum io_device_code {
+
{| class="wikitable sortable"
  Internal = 0x100,
+
! Mask || Value || Comment
  Game_Card = 0x201,
+
|-
  Removable = 0x202,
+
| 0xFF || - || type
  Host_File_System = 0x300,
+
|-
  Default = 0x0
+
| 0xFF00 || - || flags
};
+
|-
 +
| 0xFF00 || 0x1000 || Read Only
 +
|-
 +
| 0xFF0000 || 0x10000 || Invalidate fd on susppend/resume within process/system
 +
|-
 +
| 0xFF0000 || 0x20000 || External media
 +
|}
 +
 
 +
== VFS Implementation ==
 +
 
 +
Information can be found on separate page [[VFS_Implementation|VFS Implementation]]
 +
 
 +
==== Note ====
 +
 
 +
Max vfs node number is 0x1000.
 +
 
 +
== Types ==
 +
 
 +
<source lang="C">
 +
typedef struct SceIoMount { // size is 0x34-bytes
 +
void *mnt;
 +
int mntId;
 +
char assignName[0x20];
 +
SceUInt32 openedEntryNum;
 +
SceBool unk_0x2C;
 +
int unk_0x30;
 +
} SceIoMount;
 +
 
 +
typedef struct SceIoMountInfo { // size is 0x54C-bytes
 +
void *mnt;
 +
int mntId;
 +
char assignName[0x20];
 +
SceUInt32 openedEntryNum;
 +
int unk_0x2C;
 +
int unk_0x30;
 +
int unk_0x34;
 +
int unk_0x38;
 +
int unk_0x3C;
 +
int unk_0x40;
 +
int unk_0x44;
 +
int unk_0x48;
 +
int unk_0x4C;
 +
int unk_0x50;
 +
int unk_0x54;
 +
int unk_0x58;
 +
int unk_0x5C;
 +
int unk_0x60;
 +
int unk_0x64;
 +
int unk_0x68;
 +
int unk_0x6C;
 +
int unk_0x70;
 +
int unk_0x74;
 +
int unk_0x78;
 +
int unk_0x7C;
 +
int unk_0x80;
 +
int unk_0x84;
 +
char unk_0x88[0x400];
 +
int unk_0x488;
 +
char unk_0x48C[0x40];
 +
char blockdevName[0x40];
 +
char unk_0x50C[0x40];
 +
} SceIoMountInfo;
  
typedef struct io_scheduler { //size is 0xA8 - allocated from SceIoScheduler heap
+
typedef struct vfs_node_info { // size is 0x38
   io_device_code unk_0;  
+
   char name[0x20];
   io_scheduler_item* unk_4; // item 0
+
   vfs_node* node; // can be zero
   io_scheduler_item* unk_8; // item 1
+
   uint32_t unk_24; // probably size of vfs_node
  io_scheduler_item* unk_C; // item 2
+
   uint32_t unk_28; // probably flags
 
+
   vfs_node_info* node_info_2C; // can be zero
  io_scheduler_item* unk_10; // item 3
+
   vfs_node_info* node_info_30; // can be zero
  io_scheduler_item* unk_14; // item 4
+
   vfs_node_info* node_info_34; // can be zero
  io_scheduler_item* unk_18; // item 5
+
} vfs_node_info;
  io_scheduler_item* unk_1C; // item 6
+
 
 
+
// It looks like this structure is used to get some response into "error" field
  io_scheduler_item* unk_20; // item 7
+
// when executing sceKernelSignalCondTo calls.
  io_scheduler_item* unk_24; // item 8
+
// This structure is used by SceIofileDaemon when it monitors mount/unmount async requests
   io_scheduler_item* unk_28; // item 9
+
// in SceIofilemgrMount thread using SceIofilemgrMount conditional variable.
   io_scheduler_item* unk_2C; // item 10
+
// Upon completion it issues the signal and result of operation is stored in error field.
 
+
// It looks like operations 1/2 are used for normal filesystems.
   io_scheduler_item* unk_30; // item 11
+
// Operations 3/4 are used for PFS_GDSD_INF filesystem.
   io_scheduler_item* unk_34; // item 12
+
typedef struct cond_ctx {
  io_scheduler_item* unk_38; // item 13
+
   uint32_t op_index; // operation index. 1,3 - mount. 2,4 - unmount
  io_scheduler_item* unk_3C; // item 14
+
   uint32_t unk_4;
  io_scheduler_item* unk_40; // item 15
+
   uint32_t unk_8;
 
+
   uint32_t unk_C;
  uint32_t unk_44; // flag1 0x40000 or 0x00
+
   uint32_t unk_10;
  uint32_t unk_48; // flag2 0x40000 or 0x00
+
   uint32_t unk_14;
  io_scheduler_dispatcher* unk_4C; // parent
+
   uint32_t unk_18;
 
+
   uint32_t unk_1C;
  SceUID unk_50; // SceIoScheduler mutex
+
   int error; // either error code or 0
  SceUID unk_54; // SceIoScheduler cond
+
   cond_ctx* next; // 0 means end of list
 
+
} cond_ctx;
  char unk_58; // 0
 
  char unk_59; // 0
 
  char unk_5A; // 0
 
  char unk_5B; // 0
 
 
 
  uint32_t unk_5C; // 0
 
 
 
  // this is probably a separate structure
 
  SceUID unk_60; // SceIoSchedWorker thread id
 
  SceUID unk_64; // SceIoScheduler mutex from self
 
  SceUID unk_68; // SceIoScheduler cond from self
 
  io_scheduler* unk_6C; // pointer to self
 
 
 
   uint32_t unk_70; // 0
 
  uint16_t unk_74; // 0
 
  uint16_t unk_76; // 0
 
   uint32_t unk_78; // 0
 
   uint32_t unk_7C; // 0
 
 
 
   uint32_t unk_80; //
 
   uint32_t unk_84; // some flag
 
 
 
   uint32_t unk_88; //0x80
 
   uint32_t unk_8C; //0x80
 
 
 
   uint32_t unk_90; //0x80
 
   uint32_t unk_94; //0x80
 
   uint32_t unk_98; //0x80
 
  uint32_t unk_9C; //0x80
 
 
 
  uint32_t unk_A0; // 0
 
  uint32_t unk_A4; // 0
 
  
} io_scheduler;
+
typedef struct ctx_19D4 {
 +
  void* unk_0;
 +
  uint32_t unk_4;
 +
  vfs_node* offset; // Pool of vfs_nodes with 0x1000 elements.
 +
                    // It is used in sceVfsGetNewVnodeForDriver, mount/unmount and node find routines.
 +
  uint32_t size;
  
// Context used for dispatching i/o operations
+
  uint32_t count;
typedef struct io_context { // size is 0xB8 on FW 3.60
+
  uint32_t unk_14;
   uint32_t unk_0;
+
  uint32_t unk_18;
 +
  uint32_t unk_1C;
 +
} ctx_19D4;
 +
 
 +
typedef struct ctx_11C { //size is 0x220
 +
   void* unk_0;  
 
   uint32_t unk_4;
 
   uint32_t unk_4;
   uint32_t unk_8;
+
  void* offset; // pointer to array of byte size 0x10000 with 0x40 elements of size 0x400
   uint32_t unk_C;
+
   uint32_t size;
 +
 
 +
   uint32_t count;
 +
 
 +
  uint8_t data[0x20C];
 +
} ctx_11C;
 +
 
 +
typedef struct io_scheduler_dispatcher { //size is 0xB8
 +
  char unk_0[0x50];
 +
 
 +
  io_scheduler* unk_50; // Internal storage
 +
  io_scheduler* unk_54; // Gamecard
 +
  io_scheduler* unk_58; // Removable media (memory card)
 +
  io_scheduler* unk_5C; // Host File System (host0:)
 +
  io_scheduler* unk_60; // Default
 
    
 
    
   uint16_t unk_10;
+
   uint32_t unk_64; // pointer to unknown module data section
   uint16_t unk_12;
+
   uint32_t unk_68; // SceIoSchedulerDispatcher fast mutex
  uint16_t unk_14;
+
   uint32_t unk_6C;
  uint16_t unk_16;
 
  void *data_0; // 0x18
 
   uint32_t unk_1C; // 0x1C
 
 
    
 
    
   SceSize size_0; // 0x20
+
   char unk_70[0x30];
  uint32_t io_op_index; // 0x24
 
  uint32_t ioctlOutdata0; // 0x28
 
  io_device_code device_code; // 0x2C, ioctlOutdata1
 
 
    
 
    
   char async; // 0x30
+
   uint32_t unk_A0;
   char unk_31;
+
   uint32_t unk_A4;
  char unk_32;
 
  char unk_33;
 
  SceUID pid; // 0x34, sceKernelGetProcessIdForDriver
 
  SceUID threadId; // 0x38, sceKernelGetThreadIdForDriver
 
  SceUID tlsPid; // 0x3C, sceKernelGetProcessIdFromTLSForDriver
 
 
    
 
    
   uint32_t unk_40; // 0x40, SceThreadmgrForDriver_332E127C
+
   SceUID unk_A8; // SceIoSchedulerDispatcher event flag uid
   uint32_t cpuMask; // 0x44, sceKernelGetThreadCpuAffinityMaskForDriver
+
   uint32_t unk_AC; // counter
   uint32_t threadPriority; // 0x48, sceKernelGetThreadCurrentPriorityForDriver
+
   uint32_t unk_B0; // flag
   void* list0; // 0x4C, pointer to some linked list with elements of size 0x14
+
   uint32_t unk_B4; // 0
 
    
 
    
   uint32_t listSize; // 0x50, number of items in linst
+
} io_scheduler_dispatcher;
   void* list1; // 0x54, pointer to some linked list with elements of size 0x14
+
 
   uint32_t sizeOfList; // 0x58, size of list in bytes
+
typedef struct io_scheduler_item { // size is 0x14 - allocated from SceIoScheduler heap
   uint16_t state; // 0x5C, bit 16 of state where state = (MRC p15, 0, state, c13, c0, 3)
+
  io_scheduler* unk_0; // parent
  uint16_t unk_5E; // 0x5E
+
   uint32_t unk_4; // 0
    
+
   uint32_t unk_8; // 0
   uint32_t unk_60; // 0x60
+
   uint32_t unk_C; // 0
   SceUID fd; // 0x64
+
   uint32_t unk_10; // pointer to unknown module data section
   void *data_1; // 0x68
+
} io_scheduler_item;
  uint32_t unk_6C;
+
 
 +
enum io_device_code {
 +
  Internal = 0x100,
 +
  Game_Card = 0x201,
 +
  Removable = 0x202,
 +
  Host_File_System = 0x300,
 +
  Default = 0x0
 +
};
 +
 
 +
typedef struct io_scheduler { //size is 0xA8 - allocated from SceIoScheduler heap
 +
   io_device_code unk_0;
 +
   io_scheduler_item* unk_4; // item 0
 +
   io_scheduler_item* unk_8; // item 1
 +
   io_scheduler_item* unk_C; // item 2
 
    
 
    
   SceSize size_1; // 0x70
+
   io_scheduler_item* unk_10; // item 3
   uint32_t unk_74; // 0x74
+
   io_scheduler_item* unk_14; // item 4
   uint32_t unk_78; // 0x78, -1
+
   io_scheduler_item* unk_18; // item 5
   uint32_t unk_7C; // 0x7C, -1
+
   io_scheduler_item* unk_1C; // item 6
 
    
 
    
   uint32_t op_result; // 0x80, result of i/o operation
+
   io_scheduler_item* unk_20; // item 7
   uint32_t unk_84;
+
   io_scheduler_item* unk_24; // item 8
   void* unk_88;
+
   io_scheduler_item* unk_28; // item 9
   uint32_t unk_8C;
+
   io_scheduler_item* unk_2C; // item 10
 
    
 
    
   uint32_t unk_90;
+
  io_scheduler_item* unk_30; // item 11
   uint32_t unk_94;
+
  io_scheduler_item* unk_34; // item 12
   uint32_t unk_98;
+
  io_scheduler_item* unk_38; // item 13
   uint32_t unk_9C;
+
  io_scheduler_item* unk_3C; // item 14
 +
  io_scheduler_item* unk_40; // item 15
 +
 
 +
   uint32_t unk_44; // flag1 0x40000 or 0x00
 +
   uint32_t unk_48; // flag2 0x40000 or 0x00
 +
  io_scheduler_dispatcher* unk_4C; // parent
 +
 
 +
  SceUID unk_50; // SceIoScheduler mutex
 +
   SceUID unk_54; // SceIoScheduler cond
 +
 
 +
  char unk_58; // 0
 +
  char unk_59; // 0
 +
  char unk_5A; // 0
 +
   char unk_5B; // 0
 
    
 
    
   uint32_t unk_A0;
+
   uint32_t unk_5C; // 0
  uint32_t unk_A4;
 
  uint32_t unk_A8;
 
  uint32_t unk_AC;
 
 
    
 
    
   SceUInt64 sytemTimeWide; // 0xB0, sceKernelGetSystemTimeWideForDriver
+
   // this is probably a separate structure
} io_context;
+
  SceUID unk_60; // SceIoSchedWorker thread id
 
+
  SceUID unk_64; // SceIoScheduler mutex from self
typedef struct _SceVfsFileObject_0995 { //SceVfsFileClass object - size is 0x40 on 0.995
+
  SceUID unk_68; // SceIoScheduler cond from self
  /* SceKernelObject header not included in size nor structure */
+
  io_scheduler* unk_6C; // pointer to self
  SceInt32 unk_0x0;
+
 
  SceInt32 unk_0x4;
+
  uint32_t unk_70; // 0
  SceInt64 unk_0x8;
+
  uint16_t unk_74; // 0
  SceInt32 unk_0x10; //Set to 1 during sceVfsAllocateFile
+
  uint16_t unk_76; // 0
  ScePID creator_pid; //Result of sceKernelGetProcessIdFromTLS() during sceVfsAllocateFile
+
  uint32_t unk_78; // 0
  void* unk_0x18; //Pointer provided as a1 to sceVfsAllocateFile
+
  uint32_t unk_7C; // 0
  SceUIDVfsFileObject* next; //Pointer to next file in linked list - list head is in a1
+
 
  SceInt32 unk_0x20;
+
  uint32_t unk_80; //
  SceInt16 unk_0x24;
+
  uint32_t unk_84; // some flag
  char unk_0x26; //unused?
+
 
  SceInt8 unk_0x27;
+
  uint32_t unk_88; //0x80
  SceInt32 unk_0x28; //comes from a1->0x4C->0xC8
+
  uint32_t unk_8C; //0x80
  SceInt32 unk_0x2C; //((a1->0x4C->0x50 & 0x20000) << 1) | (a1->0x4C->0x50 & 0x10000)
+
 
  SceInt32 unk_0x30;
+
  uint32_t unk_90; //0x80
  char unk_0x34; //unused?
+
  uint32_t unk_94; //0x80
  SceInt8 unk_0x35;
+
  uint32_t unk_98; //0x80
  SceInt8 unk_0x36;
+
  uint32_t unk_9C; //0x80
  SceInt8 unk_0x37;
+
 
  SceInt8 unk_0x38;
+
  uint32_t unk_A0; // 0
  SceInt8 unk_0x39;
+
  uint32_t unk_A4; // 0
  SceInt8 unk_0x3A;
+
 
  SceInt8 unk_0x3B;
+
} io_scheduler;
  SceInt8 unk_0x3C;
 
  SceInt8 unk_0x3D;
 
  SceInt8 unk_0x3E;
 
  SceInt8 unk_0x3F;
 
} SceUIDVfsFileObject_0995;
 
 
 
typedef struct _SceUIDVfsFileObject { //SceUIDVfsFileClass object - size is 0x48 on 3.60
 
  /* SceKernelObject header not included in size nor structure */
 
  SceInt32 unk_0x0;
 
  SceInt32 unk_0x4;
 
  SceInt64 unk_0x8;
 
  SceInt32 unk_0x10; //Set to 1 during sceVfsAllocateFile
 
  ScePID creator_pid; //Result of sceKernelGetProcessIdFromTLS() during sceVfsAllocateFile
 
  void* unk_0x18; //Pointer provided as a1 to sceVfsAllocateFile
 
  SceUIDVfsFileObject* next; //Pointer to next file in linked list - list head is in a1
 
  SceInt32 unk_0x20; //Zero'ed in constructor
 
  SceInt16 unk_0x24;
 
  char unk_0x26; //unused?
 
  SceInt8 unk_0x27;
 
  SceInt32 unk_0x28; //comes from a1->0x4C->0xC8
 
  SceInt32 unk_0x2C; //((a1->0x4C->0x50 & 0x20000) << 1) | (a1->0x4C->0x50 & 0x10000)
 
  SceInt32 unk_0x30;
 
  char unk_0x34; //unused?
 
  SceInt8 unk_0x35;
 
  SceInt8 unk_0x36;
 
  SceInt8 unk_0x37;
 
  SceInt8 unk_0x38; //Zero'ed during constructor
 
  SceInt8 unk_0x39; //^ doing *(SceInt32*)(&file->unk_0x38) = 0;
 
  SceInt8 unk_0x3A; //^
 
  SceInt8 unk_0x3B; //^
 
  SceInt8 unk_0x3C;
 
  SceInt8 unk_0x3D;
 
  SceInt8 unk_0x3E;
 
  SceInt8 unk_0x3F;
 
  char unk_0x40[8]; //unknown type - haven't seen this used yet
 
} SceUIDVfsFileObject;
 
  
typedef struct SceVfsPath { //size is 0xC-bytes
+
// Context used for dispatching i/o operations
char *name; // could be `const char *`?
+
typedef struct io_context { // size is 0xB8 on FW 3.60
SceSize name_len;
+
  uint32_t unk_0;
char *path; // could be `const char *`?
+
  uint32_t unk_4;
} SceVfsPath;
+
  uint32_t unk_8;
</source>
+
  uint32_t unk_C;
 
+
 
== Data segment layout ==
+
  uint16_t unk_10;
 
+
  uint16_t unk_12;
{| class="wikitable"
+
  uint16_t unk_14;
|-
+
  uint16_t unk_16;
! Address !! Size !! Description
+
  void *data_0; // 0x18
|-
+
  uint32_t unk_1C; // 0x1C
| 0x0000 || 0x4 || unknown
+
 
|-
+
  SceSize size_0; // 0x20
| 0x0004 || 0x8 || some index returned from initialization function 0xb645c7ef in SceThreadmgrForDriver
+
  uint32_t io_op_index; // 0x24
|-
+
  uint32_t ioctlOutdata0; // 0x28
| 0x0008 || 0x4 || unknown
+
  io_device_code device_code; // 0x2C, ioctlOutdata1
|-
+
 
| 0x000C || 0x4 || flag that enables usage of sceFiosKernel functions (like OverlayResolveSync) in i/o operations in transition from user to kernel
+
  char async; // 0x30
|-
+
  char unk_31;
| 0x00010 || 0x4 || flag that enables usage of sceFiosKernel functions (like OverlayResolveSync) in i/o operations in transition from user to kernel
+
  char unk_32;
|-
+
  char unk_33;
| 0x00014 || 0x4 || flag that enables usage of sceFiosKernel functions (like OverlayResolveSync) in i/o operations in transition from user to kernel
+
  SceUID pid; // 0x34, sceKernelGetProcessIdForDriver
|-
+
  SceUID threadId; // 0x38, sceKernelGetThreadIdForDriver
| 0x00018 || 0x4 || flag that enables usage of sceFiosKernel functions (like OverlayResolveSync) in i/o operations in transition from user to kernel
+
  SceUID tlsPid; // 0x3C, sceKernelGetProcessIdFromTLSForDriver
|-
+
 
| 0x0001C || 0x4 || unknown
+
  uint32_t unk_40; // 0x40, SceThreadmgrForDriver_332E127C
|-
+
  uint32_t cpuMask; // 0x44, sceKernelGetThreadCpuAffinityMaskForDriver
| 0x0020 || 0x4 || <code>SceIofileDevWaitForVC</code> event flag SceUID
+
  uint32_t threadPriority; // 0x48, sceKernelGetThreadCurrentPriorityForDriver
|-
+
  void* list0; // 0x4C, pointer to some linked list with elements of size 0x14
| 0x0024 || 0x4 || unknown
+
 
|-
+
  uint32_t listSize; // 0x50, number of items in linst
| 0x0028 || 0x4 || <code>SceIofileDevWaitForSD</code> event flag SceUID
+
  void* list1; // 0x54, pointer to some linked list with elements of size 0x14
|-
+
  uint32_t sizeOfList; // 0x58, size of list in bytes
| 0x002C || 0x4 || pointed by <code>vfs_mount_cc</code> for <code>SceIofileDevWaitForSD</code>
+
  uint16_t state; // 0x5C, bit 16 of state where state = (MRC p15, 0, state, c13, c0, 3)
|-
+
  uint16_t unk_5E; // 0x5E
| 0x0030 || 0x4 || <code>SceIofileDevWaitForMC</code> event flag SceUID
+
 
|-
+
  uint32_t unk_60; // 0x60
| 0x0034 || 0x4 || unknown
+
  SceUID fd; // 0x64
|-
+
  void *data_1; // 0x68
| 0x0038 || 0x4 || pointed by <code>vfs_mount_cc</code> for <code>SceIofileDevWaitForVC</code>
+
  uint32_t unk_6C;
|-
+
 
| 0x003C || 0x4 || pointed by <code>vfs_mount_cc</code> for <code>SceIofileDevWaitForMC</code>
+
  SceSize size_1; // 0x70
|-
+
  uint32_t unk_74; // 0x74
| 0x0040 || 0x10 || unknown
+
  uint32_t unk_78; // 0x78, -1
|-
+
  uint32_t unk_7C; // 0x7C, -1
| 0x0050 || 0x4 || address of some callback function called in all vfs operations
+
 
|-
+
  uint32_t op_result; // 0x80, result of i/o operation
| 0x0054 || 0x4 || <code>SceIofile</code> heap SceUID
+
  uint32_t unk_84;
|-
+
  void* unk_88;
| 0x0058 || 0x80 || unknown
+
  uint32_t unk_8C;
|-
+
 
| 0x00D8 || 0x4 || <code>SceIoVfsHeap</code> heap SceUID
+
  uint32_t unk_90;
|-
+
  uint32_t unk_94;
| 0x00DC || 0x4 || <code>SceIoFileDebug</code> memblock SceUID
+
  uint32_t unk_98;
|-
+
  uint32_t unk_9C;
| 0x00E0 || 0x3C || unknown
+
 
|-
+
  uint32_t unk_A0;
| 0x011C || 0x4 || ctx_11C* pointer to structure
+
  uint32_t unk_A4;
|-
+
  uint32_t unk_A8;
| 0x0120 || 0x4C || unknown
+
  uint32_t unk_AC;
|-
+
 
| 0x016C || 0x10 || char* static_buffers[4] - static buffers used instead of SceIoVfsHeap
+
  SceUInt64 sytemTimeWide; // 0xB0, sceKernelGetSystemTimeWideForDriver
|-
+
} io_context;
| 0x017C || 0x2C || <code>SceClass</code> for SceVfsFile
+
 
|-
+
typedef struct _SceVfsFileObject_0995 { //SceVfsFileClass object - size is 0x40 on 0.995
| 0x01A8 || 0x1500 || array of 96 elements of vfs_node_info
+
  /* SceKernelObject header not included in size nor structure */
|-
+
  SceInt32 unk_0x0;
| 0x16A8 || 0x4 || <code>SceVfsRfsLock</code> fast mutex
+
  SceInt32 unk_0x4;
|-
+
  SceInt64 unk_0x8;
| 0x16AC || 0x3C || unknown
+
  SceInt32 unk_0x10; //Set to 1 during sceVfsAllocateFile
|-
+
  ScePID creator_pid; //Result of sceKernelGetProcessIdFromTLS() during sceVfsAllocateFile
| 0x16E8 || 0x2C || <code>SceClass</code> for SceIoMountEvent
+
  void* unk_0x18; //Pointer provided as a1 to sceVfsAllocateFile
|-
+
  SceUIDVfsFileObject* next; //Pointer to next file in linked list - list head is in a1
| 0x1714 || 0xC || unknown
+
  SceInt32 unk_0x20;
|-
+
  SceInt16 unk_0x24;
| 0x1720 || 0x04 || cond_ctx* pointer to the linked list
+
  char unk_0x26; //unused?
|-
+
  SceInt8 unk_0x27;
| 0x1724 || 0x4 || <code>SceIoScheduler</code> heap SceUID
+
  SceInt32 unk_0x28; //comes from a1->0x4C->0xC8
|-
+
  SceInt32 unk_0x2C; //((a1->0x4C->0x50 & 0x20000) << 1) | (a1->0x4C->0x50 & 0x10000)
| 0x1728 || 0xB8 || <code>io_scheduler_dispatcher</code> structure
+
  SceInt32 unk_0x30;
|-
+
  char unk_0x34; //unused?
| 0x17E0 || 0x2C || <code>SceClass</code> for SceIoAsyncEvent - used in all async i/o operations
+
  SceInt8 unk_0x35;
|-
+
  SceInt8 unk_0x36;
| 0x180C || 0xC || unknown
+
  SceInt8 unk_0x37;
|-
+
  SceInt8 unk_0x38;
| 0x1818 || 0x2C || <code>SceClass</code> for SceIoErrorEvent
+
  SceInt8 unk_0x39;
|-
+
  SceInt8 unk_0x3A;
| 0x1844 || 0xC || unknown
+
  SceInt8 unk_0x3B;
|-
+
  SceInt8 unk_0x3C;
| 0x1850 || 0x4 || <code>SceIofileDaemonLock</code> fast mutex
+
  SceInt8 unk_0x3D;
|-
+
  SceInt8 unk_0x3E;
| 0x1854 || 0x40 || unknown
+
  SceInt8 unk_0x3F;
|-
+
} SceUIDVfsFileObject_0995;
| 0x1894 || 0x4 || <code>SceIofile</code> fast mutex
+
 
|-
+
typedef struct _SceUIDVfsFileObject { //SceUIDVfsFileClass object - size is 0x48 on 3.60
| 0x1898 || 0x7C || unknown
+
  /* SceKernelObject header not included in size nor structure */
|-
+
  SceInt32 unk_0x0;
| 0x1914 || 0x4 || function pointer t_1914_callback
+
  SceInt32 unk_0x4;
|-
+
  SceInt64 unk_0x8;
| 0x1918 || 0x4 || <code>SceIofileFlock</code> fast mutex
+
  SceInt32 unk_0x10; //Set to 1 during sceVfsAllocateFile
|-
+
  ScePID creator_pid; //Result of sceKernelGetProcessIdFromTLS() during sceVfsAllocateFile
| 0x191C || 0x44 || unknown
+
  void* unk_0x18; //Pointer provided as a1 to sceVfsAllocateFile
|-
+
  SceUIDVfsFileObject* next; //Pointer to next file in linked list - list head is in a1
| 0x1960 || 0x4 || some i/o flag
+
  SceInt32 unk_0x20; //Zero'ed in constructor
|-
+
  SceInt16 unk_0x24;
| 0x1964 || 0x4 || flag that indicates that any i/o operation happened 1/0. changed by each i/o operation. cleared on suspend.
+
  char unk_0x26; //unused?
|-
+
  SceInt8 unk_0x27;
| 0x1968 || 0x18 || unknown
+
  SceInt32 unk_0x28; //comes from a1->0x4C->0xC8
|-
+
  SceInt32 unk_0x2C; //((a1->0x4C->0x50 & 0x20000) << 1) | (a1->0x4C->0x50 & 0x10000)
| 0x1980 || 0x4 || counter of not finished i/o operations. changed by each i/o operation.
+
  SceInt32 unk_0x30;
|-
+
  char unk_0x34; //unused?
| 0x1984 || 0xC || unknown
+
  SceInt8 unk_0x35;
|-
+
  SceInt8 unk_0x36;
| 0x1990 || 0x4 || <code>SceVfsMntlistLock</code> fast mutex
+
  SceInt8 unk_0x37;
|-
+
  SceInt8 unk_0x38; //Zero'ed during constructor
| 0x1994 || 0x3C || unknown
+
  SceInt8 unk_0x39; //^ doing *(SceInt32*)(&file->unk_0x38) = 0;
 +
  SceInt8 unk_0x3A; //^
 +
  SceInt8 unk_0x3B; //^
 +
  SceInt8 unk_0x3C;
 +
  SceInt8 unk_0x3D;
 +
  SceInt8 unk_0x3E;
 +
  SceInt8 unk_0x3F;
 +
  char unk_0x40[8]; //unknown type - haven't seen this used yet
 +
} SceUIDVfsFileObject;
 +
 
 +
typedef struct SceVfsPath { //size is 0xC-bytes
 +
char *name; // could be `const char *`?
 +
SceSize name_len;
 +
char *path; // could be `const char *`?
 +
} SceVfsPath;
 +
</source>
 +
 
 +
== Data segment layout ==
 +
 
 +
{| class="wikitable"
 
|-
 
|-
| 0x19D0 || 0x4 || vfs_mount* singly linked list
+
! Address !! Size !! Description
 
|-
 
|-
| 0x19D4 || 0x1C || structure ctx_19D4
+
| 0x0000 || 0x4 || unknown
 
|-
 
|-
| 0x19F0 || 0x8 || unknown
+
| 0x0004 || 0x8 || some index returned from initialization function 0xb645c7ef in SceThreadmgrForDriver
 
|-
 
|-
| 0x19F8 || 0x4 || address used for sceKernelCpuLockSuspendIntrStoreLRForDriver to lock 016C
+
| 0x0008 || 0x4 || unknown
 
|-
 
|-
| 0x19FC || 0x4 || vfs_mount* pointer
+
| 0x000C || 0x4 || flag that enables usage of sceFiosKernel functions (like OverlayResolveSync) in i/o operations in transition from user to kernel
 
|-
 
|-
| 0x1A00 || 0x4 || <code>SceVfsNcacheLock</code> fast mutex
+
| 0x00010 || 0x4 || flag that enables usage of sceFiosKernel functions (like OverlayResolveSync) in i/o operations in transition from user to kernel
 
|-
 
|-
| 0x1A04 || 0x40 || unknown
+
| 0x00014 || 0x4 || flag that enables usage of sceFiosKernel functions (like OverlayResolveSync) in i/o operations in transition from user to kernel
 
|-
 
|-
| 0x1A44 || 0x4 || address used for sceKernelCpuLockSuspendIntrStoreLRForDriver
+
| 0x00018 || 0x4 || flag that enables usage of sceFiosKernel functions (like OverlayResolveSync) in i/o operations in transition from user to kernel
 
|-
 
|-
| 0x1A48 || 0x4 || unknown
+
| 0x0001C || 0x4 || unknown
 
|-
 
|-
| 0x1A4C || 0x4 || <code>SceVfsLock</code> fast mutex
+
| 0x0020 || 0x4 || <code>SceIofileDevWaitForVC</code> event flag SceUID
 
|-
 
|-
| 0x1A50 || 0x3C || unknown
+
| 0x0024 || 0x4 || unknown
 
|-
 
|-
| 0x1A8C || 0x04 || <code>SceIofilemgrMount</code> thread SceUID
+
| 0x0028 || 0x4 || <code>SceIofileDevWaitForSD</code> event flag SceUID
 
|-
 
|-
| 0x1A90 || 0x700 || array of 32 elements of vfs_mount_point_info
+
| 0x002C || 0x4 || pointed by <code>vfs_mount_cc</code> for <code>SceIofileDevWaitForSD</code>
 
|-
 
|-
| 0x2190 || 0x4 || <code>SceIofilemgrMount</code> cond SceUID
+
| 0x0030 || 0x4 || <code>SceIofileDevWaitForMC</code> event flag SceUID
 
|-
 
|-
| 0x2194 || 0x4 || <code>SceIofilemgrMount</code> SceUID mutexid
+
| 0x0034 || 0x4 || unknown
 
|-
 
|-
| 0x2198 || 0x4 || flag that indicates that IoSchedulerDispatcher functionality is initialized 1/0
+
| 0x0038 || 0x4 || pointed by <code>vfs_mount_cc</code> for <code>SceIofileDevWaitForVC</code>
 
|-
 
|-
| 0x219C || 0x4 || unknown
+
| 0x003C || 0x4 || pointed by <code>vfs_mount_cc</code> for <code>SceIofileDevWaitForMC</code>
 
|-
 
|-
| 0x21A0 || 0x40 || unknown
+
| 0x0040 || 0x10 || unknown
 
|-
 
|-
| 0x21E0 || 0x20 || unknown
+
| 0x0050 || 0x4 || address of some callback function called in all vfs operations
 
|-
 
|-
| 0x2200 || 0x04 || <code>SceIofilemgrDaemon</code> thread SceUID
+
| 0x0054 || 0x4 || <code>SceIofile</code> heap SceUID
 
|-
 
|-
| 0x2204 || 0x8 || unknown
+
| 0x0058 || 0x80 || unknown
 
|-
 
|-
| 0x220C || 0x4 || <code>SceIofilemgrDaemon</code> event flag SceUID
+
| 0x00D8 || 0x4 || <code>SceIoVfsHeap</code> heap SceUID
 
|-
 
|-
| 0x2210 || 0x4 || void* to heap alloc of size 0x100
+
| 0x00DC || 0x4 || <code>SceIoFileDebug</code> memblock SceUID
 
|-
 
|-
| 0x2214 || 0x4 || void* to heap alloc of size 0x100
+
| 0x00E0 || 0x3C || unknown
 
|-
 
|-
| 0x2218 || 0x4 || = 3
+
| 0x011C || 0x4 || ctx_11C* pointer to structure
 
|-
 
|-
| 0x221C || 0x20 || [[SceIofilemgr#sceVfsAddVfsForDriver|vfs_add_data]] <code>dummy_ttyp_dev_fs</code> node
+
| 0x0120 || 0x4C || unknown
 
|-
 
|-
|}
+
| 0x016C || 0x10 || char* static_buffers[4] - static buffers used instead of SceIoVfsHeap
 
 
== SceIofilemgrForDriver ==
 
 
 
=== sceVopLookupForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x017C || 0x2C || <code>SceClass</code> for SceVfsFile
 
|-
 
|-
| 0.931-3.60 || 0xA5A6A55C
+
| 0x01A8 || 0x1500 || array of 96 elements of vfs_node_info
|}
 
 
 
Temp name was sceVfsNodeInitializePartitionForDriver.
 
 
 
<source lang="C">int sceVopLookupForDriver(SceVfsNode *pNode, SceVfsNode **ppNewNode, SceVfsPath *path_info, SceUInt32 flags);</source>
 
 
 
=== sceVopRemoveForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x16A8 || 0x4 || <code>SceVfsRfsLock</code> fast mutex
 
|-
 
|-
| 3.60 || 0xDC1E7EE4
+
| 0x16AC || 0x3C || unknown
|}
 
 
 
=== sceVopInactiveForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x16E8 || 0x2C || <code>SceClass</code> for SceIoMountEvent
 
|-
 
|-
| 0.990-3.60 || 0x8FB94521
+
| 0x1714 || 0xC || unknown
|}
 
 
 
=== sceVopIoctlForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x1720 || 0x04 || cond_ctx* pointer to the linked list
 
|-
 
|-
| 0.990-3.60 || 0x333C904D
+
| 0x1724 || 0x4 || <code>SceIoScheduler</code> heap SceUID
|}
 
 
 
=== sceVopGetstatForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x1728 || 0xB8 || <code>io_scheduler_dispatcher</code> structure
 
|-
 
|-
| 0.990-3.60 || 0x50A63ACF
+
| 0x17E0 || 0x2C || <code>SceClass</code> for SceIoAsyncEvent - used in all async i/o operations
|}
 
 
 
=== sceVopOpenForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x180C || 0xC || unknown
 
|-
 
|-
| 0.990-3.60 || 0x76B79BEC
+
| 0x1818 || 0x2C || <code>SceClass</code> for SceIoErrorEvent
|}
 
 
 
=== sceVopCreateForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x1844 || 0xC || unknown
 
|-
 
|-
| 0.990-3.60 || 0x9E347C7D
+
| 0x1850 || 0x4 || <code>SceIofileDaemonLock</code> fast mutex
|}
 
 
 
=== sceVopCloseForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x1854 || 0x40 || unknown
 
|-
 
|-
| 0.990-3.60 || 0x40944C2E
+
| 0x1894 || 0x4 || <code>SceIofile</code> fast mutex
|}
 
 
 
In logs it is sceVopClsoeForDriver.
 
 
 
=== sceVopReadForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x1898 || 0x7C || unknown
 
|-
 
|-
| 0.990-3.60 || 0x570388A5
+
| 0x1914 || 0x4 || function pointer t_1914_callback
|}
 
 
 
=== sceVopWriteForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x1918 || 0x4 || <code>SceIofileFlock</code> fast mutex
 
|-
 
|-
| 0.990-3.60 || 0x9A68378D
+
| 0x191C || 0x44 || unknown
|}
 
 
 
=== sceVopPreadForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x1960 || 0x4 || some i/o flag
 
|-
 
|-
| 0.990-3.60 || 0xABBC80E3
+
| 0x1964 || 0x4 || flag that indicates that any i/o operation happened 1/0. changed by each i/o operation. cleared on suspend.
|}
 
 
 
=== sceVopPwriteForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x1968 || 0x18 || unknown
 
|-
 
|-
| 0.990-3.60 || 0xA53C040D
+
| 0x1980 || 0x4 || counter of not finished i/o operations. changed by each i/o operation.
|}
+
|-
 
+
| 0x1984 || 0xC || unknown
=== sceVopLseekForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x1990 || 0x4 || <code>SceVfsMntlistLock</code> fast mutex
 
|-
 
|-
| 0.990-3.60 || 0xB2B13818
+
| 0x1994 || 0x3C || unknown
|}
 
 
 
=== sceVopMkdirForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x19D0 || 0x4 || vfs_mount* singly linked list
 
|-
 
|-
| 0.990-3.60 || 0x2F3F8C70
+
| 0x19D4 || 0x1C || structure ctx_19D4
|}
 
 
 
=== sceVopRmdirForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x19F0 || 0x8 || unknown
 
|-
 
|-
| 0.990-3.60 || 0x1D551105
+
| 0x19F8 || 0x4 || address used for sceKernelCpuLockSuspendIntrStoreLRForDriver to lock 016C
|}
 
 
 
=== sceVopDopenForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x19FC || 0x4 || vfs_mount* pointer
 
|-
 
|-
| 0.990-3.60 || 0x00C9C2DD
+
| 0x1A00 || 0x4 || <code>SceVfsNcacheLock</code> fast mutex
|}
+
|-
 
+
| 0x1A04 || 0x40 || unknown
=== sceVopDreadForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x1A44 || 0x4 || address used for sceKernelCpuLockSuspendIntrStoreLRForDriver
 
|-
 
|-
| 0.990-3.60 || 0x77584C8F
+
| 0x1A48 || 0x4 || unknown
|}
 
 
 
=== sceVopDcloseForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x1A4C || 0x4 || <code>SceVfsLock</code> fast mutex
 
|-
 
|-
| 0.990-3.60 || 0x1350F5C7
+
| 0x1A50 || 0x3C || unknown
|}
 
 
 
=== sceVopChstatForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x1A8C || 0x04 || <code>SceIofilemgrMount</code> thread SceUID
 
|-
 
|-
| 0.990-3.60 || 0x1974FA92
+
| 0x1A90 || 0x700 || array of 32 elements of vfs_mount_point_info
|}
 
 
 
=== sceVopRenameForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| 0x2190 || 0x4 || <code>SceIofilemgrMount</code> cond SceUID
 +
|-
 +
| 0x2194 || 0x4 || <code>SceIofilemgrMount</code> SceUID mutexid
 +
|-
 +
| 0x2198 || 0x4 || flag that indicates that IoSchedulerDispatcher functionality is initialized 1/0
 +
|-
 +
| 0x219C || 0x4 || unknown
 +
|-
 +
| 0x21A0 || 0x40 || unknown
 +
|-
 +
| 0x21E0 || 0x20 || unknown
 +
|-
 +
| 0x2200 || 0x04 || <code>SceIofilemgrDaemon</code> thread SceUID
 +
|-
 +
| 0x2204 || 0x8 || unknown
 +
|-
 +
| 0x220C || 0x4 || <code>SceIofilemgrDaemon</code> event flag SceUID
 +
|-
 +
| 0x2210 || 0x4 || void* to heap alloc of size 0x100
 +
|-
 +
| 0x2214 || 0x4 || void* to heap alloc of size 0x100
 +
|-
 +
| 0x2218 || 0x4 || = 3
 +
|-
 +
| 0x221C || 0x20 || [[SceIofilemgr#sceVfsAddVfsForDriver|vfs_add_data]] <code>dummy_ttyp_dev_fs</code> node
 
|-
 
|-
| 0.990-3.60 || 0x36A794C7
 
 
|}
 
|}
  
=== sceVopSyncForDriver ===
+
== SceIofilemgrForDriver ==
  
 +
=== sceVfsOpDevctlForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x9CD96406
+
| 0.990-3.60 || 0xB07B307D
 
|}
 
|}
  
=== sceVopWhiteoutForDriver ===
+
=== sceVfsOpDecodePathElemForDriver ===
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.996-3.60 || 0xF53399BC
+
| 0.990-3.60 || 0xF7DAC0F5
 
|}
 
|}
  
Temp name was sceVopTrashForDriver.
+
=== sceVopOpenForDriver ===
 
+
{| class="wikitable"
Move target node entry file/directory to <code>xx0:/SceIoTrash/</code>.
 
 
 
=== sceVopFchstatForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x082AFD7F
+
| 0.990-3.60 || 0x76B79BEC
 
|}
 
|}
  
Temp name was sceVopChstatByFd.
+
=== sceVopCreateForDriver ===
 
 
<source>int sceVopFchstatForDriver(SceVfsNode *pNode, SceVfsFileObject *pObject, SceIoStat *stat, int bit);</source>
 
 
 
=== sceVopFgetstat ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x1DBCBB01
+
| 0.990-3.60 || 0x9E347C7D
 
|}
 
|}
  
Temp name was sceVopGetStateByFdForDriver
+
=== sceVopCloseForDriver ===
<source>int sceVopFgetstat(SceVfsNode *pNode, SceVfsFileObject *pVfsFileObject, SceIoStat *stat);</source>
 
 
 
=== sceVopLinkForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x942AA61F
+
| 0.990-3.60 || 0x40944C2E
 
|}
 
|}
  
This is a guessed name
+
In logs it is sceVopClsoe.
Temp name was sceVop_unk_offset_0x54_ForDriver
 
 
 
=== sceVopUnlinkForDriver ===
 
  
 +
=== sceVopLookupForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x0D8A806E
+
| 0.931-3.60 || 0xA5A6A55C
 
|}
 
|}
  
This is a guessed name.
+
Temp name was sceVfsNodeInitializePartitionForDriver.
Temp name was sceVop_unk_offset_0x58_ForDriver
 
  
=== sceVopCleanupForDriver ===
+
<source lang="C">int sceVopLookupForDriver(SceVfsNode *pNode, SceVfsNode **ppNewNode, SceVfsPath *path_info, SceUInt32 flags);</source>
  
 +
=== sceVopReadForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x0F7E1718
+
| 0.990-3.60 || 0x570388A5
 
|}
 
|}
  
Temp name was sceVop_unk_offset_0x6C_ForDriver
+
=== sceVopWriteForDriver ===
 
 
=== sceVopZerofillForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.996-3.60 || 0xEEAE8B51
+
| 0.990-3.60 || 0x9A68378D
 
|}
 
|}
  
Temp name was sceVop_unk_offset_0x70_ForDriver
+
=== sceVopLseekForDriver ===
 
+
{| class="wikitable"
=== sceVfsOpDevctlForDriver ===
+
|-
 +
! Version !! NID
 +
|-
 +
| 0.990-3.60 || 0xB2B13818
 +
|}
  
 +
=== sceVopIoctlForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xB07B307D
+
| 0.990-3.60 || 0x333C904D
 
|}
 
|}
  
=== sceVfsOpDecodePathElemForDriver ===
+
=== sceVopRemoveForDriver ===
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xF7DAC0F5
+
| 3.60 || 0xDC1E7EE4
 
|}
 
|}
  
<source lang="C">
+
=== sceVopMkdirForDriver ===
 
 
// using for internal callback
 
typedef struct SceVfsPathElem { // size is 0x1C
 
void *data_0x00;
 
char *path;
 
void *data_0x08;
 
void *data_0x0C;
 
void *data_0x10;
 
int data_0x14;
 
void *data_0x18;
 
} SceVfsPathElem;
 
 
 
</source>
 
 
 
=== sceIoMountForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xD070BC48
+
| 0.990-3.60 || 0x2F3F8C70
 
|}
 
|}
  
operation index 1 in <code>cond_ctx</code>
+
=== sceVopRmdirForDriver ===
 
 
<source lang="C">
 
// intermediate function between sceAppMgrGameDataMountForDriver and sceVfsMount
 
int sceIoMountForDriver(int vshMountId, const char *path, int permission, int unk3, int arg_0, int arg_4);
 
</source>
 
 
 
=== sceIoUmountForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x20574100
+
| 0.990-3.60 || 0x1D551105
 
|}
 
|}
  
operation index 2 in <code>cond_ctx</code>
+
=== sceVopDopenForDriver ===
 
 
<source lang="C">
 
// intermediate function between sceAppMgrUmountForDriver and sceVfsUnmount
 
int sceIoUmountForDriver(int vshMountId, int unk1, int unk2, int unk3);
 
</source>
 
 
 
=== scePfsMgrVfsMountForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xFEEE44A9
+
| 0.990-3.60 || 0x00C9C2DD
 
|}
 
|}
  
operation index 3 in <code>cond_ctx</code>
+
=== sceVopDcloseForDriver ===
 
 
<source lang="C">
 
// this function can be used with PFS_GDSD_INF filesystem
 
int scePfsMgrVfsMountForDriver(vfs_mount_point_info_base* mnt, int unk1, int unk2);
 
</source>
 
 
 
=== scePfsMgrVfsUmountForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xD220539D
+
| 0.990-3.60 || 0x1350F5C7
 
|}
 
|}
  
operation index 4 in <code>cond_ctx</code>
+
=== sceVopDreadForDriver ===
 
 
<source lang="C">int scePfsMgrVfsUmountForDriver(vfs_unmount_data* umnt, int unk1, int unk2);</source>
 
 
 
=== sceVfsLockVnodeForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.995-3.60 || 0xAA45010B
+
| 0.990-3.60 || 0x77584C8F
 
|}
 
|}
  
Temp name was sceVfsNodeWaitEventFlagForDriver.
+
=== sceVopGetstatForDriver ===
 
 
calls <code>sceKernelWaitEventFlagForDriver</code> using <code>event_flag_SceVfsVnode</code> from <code>vfs_node</code>
 
 
 
<source lang="C">int sceVfsLockVnodeForDriver(vfs_node* node);</source>
 
 
 
=== sceVfsUnlockVnodeForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x6048F245
+
| 0.990-3.60 || 0x50A63ACF
 
|}
 
|}
  
Temp name was sceVfsNodeSetEventFlagForDriver.
+
=== sceVopChstatForDriver ===
 
+
{| class="wikitable"
calls <code>sceKernelSetEventFlagForDriver</code> using <code>event_flag_SceVfsVnode</code> from <code>vfs_node</code>
 
 
 
<source lang="C">int sceVfsUnlockVnodeForDriver(vfs_node* node);</source>
 
 
 
=== sceVfsUnmountForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x9C7E7B76
+
| 0.990-3.60 || 0x1974FA92
 
|}
 
|}
  
<source lang="C">int sceVfsUnmountForDriver(vfs_unmount_data *data);</source>
+
=== sceVopRenameForDriver ===
 
 
=== sceVfsDeleteVfsForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x9CBFA725
+
| 0.990-3.60 || 0x36A794C7
 
|}
 
|}
  
<source lang="C">int sceVfsDeleteVfsForDriver(const char *name, void **deleted_node);</source>
+
=== sceVopPreadForDriver ===
 
 
=== sceVfsAddVfsForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x673D2FCD
+
| 0.990-3.60 || 0xABBC80E3
 
|}
 
|}
  
Used by SceSdstor, SceTty2uart, SceKernelBlueScreenOfDeath
+
=== sceVopPwriteForDriver ===
 
 
<source lang="C">int sceVfsAddVfsForDriver(vfs_add_data *data);</source>
 
 
 
=== sceVfsMountForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xB62DE9A6
+
| 0.990-3.60 || 0xA53C040D
 
|}
 
|}
  
<source lang="C">int sceVfsMountForDriver(vfs_mount_point_info_base* mnt);</source>
+
=== sceVopInactiveForDriver ===
 
 
=== sceVfsLockMntForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x6B3CA9F7
+
| 0.990-3.60 || 0x8FB94521
 
|}
 
|}
  
=== sceVfsUnlockMntForDriver ===
+
=== sceVopLinkForDriver ===
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xDC2D8BCE
+
| 3.60 || 0x942AA61F
 
|}
 
|}
  
=== sceVfsGetNewVnodeForDriver ===
+
Temp name was sceVop_unk_offset_0x54_ForDriver.
  
 +
=== sceVopUnlinkForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xD60B5C63
+
| 3.60 || 0x0D8A806E
 
|}
 
|}
  
<source lang="C">int sceVfsGetNewVnodeForDriver(vfs_mount* mount, node_ops2 *ops, int unused, vfs_node **node);</source>
+
Temp name was sceVop_unk_offset_0x58_ForDriver.
 
 
=== sceVfsGetVnodeNameForDriver ===
 
  
 +
=== sceVopSyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xAA253B68
+
| 0.990-3.60 || 0x9CD96406
 
|}
 
|}
  
<source lang="C">int sceVfsGetVnodeNameForDriver(SceVfsNode *vp, char *name, SceSize n, SceSize *result);</source>
+
=== sceVopFgetstatForDriver ===
 
 
=== sceVfsFreeVnodeForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x21D57633
+
| 3.60 || 0x1DBCBB01
 
|}
 
|}
  
=== sceVfsAllocateFileForDriver ===
+
Temp name was sceVopGetStateByFdForDriver.
  
 +
<source>int sceVopFgetstatForDriver(SceVfsNode *pNode, SceVfsFileObject *pVfsFileObject, SceIoStat *stat);</source>
 +
 +
=== sceVopFchstatForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.995-3.60 || 0xBBAC1751
+
| 3.60 || 0x082AFD7F
 
|}
 
|}
  
Creates a <code>SceUIDVfsFileClass</code> object and returns UID and pointer to created object.
+
Temp name was sceVopChstatByFdForDriver.
<source lang="C">
 
//type of a1 is unknown for now - at least 0x98 bytes wide
 
  
//0.995
+
<source>int sceVopFchstatForDriver(SceVfsNode *pNode, SceVfsFileObject *pObject, SceIoStat *stat, int bit);</source>
SceUID sceVfsAllocateFileForDriver(void* a1, SceUIDVfsFileObject** ppFile);
 
 
 
//3.60
 
//If name is NULL, default name (same as 0.995, "SceVfsFile") is used as object name
 
//Else, name will be created with snprintf("file %s %s", something_from_a1, name);
 
SceUID sceVfsAllocateFileForDriver(void* a1, SceUIDVfsFileObject** ppFile, char* name);
 
</source>
 
 
 
=== sceVfsFreeFileForDriver ===
 
  
 +
=== sceVopWhiteoutForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xC85E33A2
+
| 0.996-3.60 || 0xF53399BC
 
|}
 
|}
  
Free a file created with [[SceIofilemgr#sceVfsAllocateFileForDriver|sceVfsAllocateFileForDriver]].
+
Temp name was sceVopTrashForDriver.
<source lang="C">
 
//Pass same a1 as call to AllocateFile
 
SceInt32 sceVfsFreeFileForDriver(void* a1, SceUID file_uid);
 
</source>
 
  
=== sceVfsRmdevForDriver ===
+
Move target node entry file/directory to <code>xx0:/SceIoTrash/</code>.
  
 +
=== sceVopCleanupForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x69A7E076
+
| 3.60 || 0x0F7E1718
 
|}
 
|}
  
=== sceVfsOpenForDriver ===
+
Temp name was sceVop_unk_offset_0x6C_ForDriver.
  
 +
=== sceVopZerofillForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x0E518FA9
+
| 0.996-3.60 || 0xEEAE8B51
 
|}
 
|}
  
Temp name was <code>t_sceIoOpenForDriver</code>
+
Temp name was sceVop_unk_offset_0x70_ForDriver.
  
thread callback for <code>sceIoOpenForDriver</code>
+
=== vfsIsLockedMntForDriver ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 3.60 || 0xC468B5EF
 +
|}
  
<source lang="C">
+
some thread op
typedef struct SceVfsOpenArgs {
 
  const char *filename;
 
  int flag;
 
  SceIoMode mode;
 
} SceVfsOpenArgs;
 
 
 
SceUID sceVfsOpenForDriver(SceVfsOpenArgs *argp);
 
</source>
 
 
 
=== sceVfsCloseForDriver ===
 
  
 +
=== vfsBuffCacheCtlForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x1AE14011
+
| 3.60 || 0xA7020B0D
 
|}
 
|}
  
Temp name was <code>t_sceIoCloseForDriver</code>
+
big function
  
thread callback for <code>sceIoCloseForDriver</code>
+
<source>int vfsBuffCacheCtlForDriver(SceVfsNode *vp, int a2, int a3, int a4, int cache_size);</source>
  
<source lang="C">
+
=== vfsBuffCacheFreeForDriver ===
typedef struct SceVfsCloseArgs{
+
{| class="wikitable"
  SceUID fd;
+
|-
} SceVfsCloseArgs;
+
! Version !! NID
 +
|-
 +
| 3.60 || 0xD6AB5E4B
 +
|}
  
int sceVfsCloseForDriver(SceVfsCloseArgs *argp);
+
some node op
</source>
 
 
 
=== sceVfsReadForDriver ===
 
  
 +
=== vfsLockVnodeForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x809892C1
+
| 0.995-3.60 || 0xAA45010B
 
|}
 
|}
  
Temp name was <code>t_sceIoReadForDriver</code>
+
Temp name was sceVfsNodeWaitEventFlagForDriver, sceVfsLockVnodeForDriver.
  
thread callback for <code>sceIoReadForDriver</code>
+
calls <code>sceKernelWaitEventFlagForDriver</code> using <code>event_flag_SceVfsVnode</code> from <code>vfs_node</code>
  
<source lang="C">
+
1. If the ownerId of the locked vnode is -1 (no anyone), set own thread as owner and leave the function.
typedef struct SceVfsReadArgs {
+
 
  SceUID fd;
+
2. If the ownerId is already mine, increment recursiveCount and leave the function.
  void *data;
+
 
  SceSize size;
+
3. If we get here we increment waiter.
} SceVfsReadArgs;
+
 
 +
4. Just to be sure, we do a check for 1 again and if the ownerId is -1, we set the ownerId to ourselves in the thread, then decrement waiter and leave the function.
 +
 
 +
5. If you've come this far, wait for the other owner to unlock the vnode with sceKernelWaitEventFlag.
  
int sceVfsReadForDriver(SceVfsReadArgs *argp);
+
6. Decrement the waiter and set the ownerId to its own thread and leave the function.
</source>
 
  
=== sceVfsWriteForDriver ===
+
<source lang="C">int vfsLockVnodeForDriver(vfs_node *node);</source>
  
 +
=== vfsUnlockVnodeForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x8598ADC3
+
| 0.990-3.60 || 0x6048F245
 
|}
 
|}
  
Temp name was <code>t_sceIoWriteForDriver</code>
+
Temp name was sceVfsNodeSetEventFlagForDriver, sceVfsUnlockVnodeForDriver.
  
thread callback for <code>sceIoWriteForDriver</code>
+
calls <code>sceKernelSetEventFlagForDriver</code> using <code>event_flag_SceVfsVnode</code> from <code>vfs_node</code>
 +
 
 +
1. The function fails if the ownerId is not its own thread.
 +
 
 +
2. If recursiveCount is not 0, decrement recursiveCount and leave the function.
 +
 
 +
3. If recursiveCount is 0, checks waiter value.
 +
 
 +
4. If waiter is not 0, set ownerId to 0xfffffffd, then notify other waiting threads of unlock with sceKernelSetEventFlag and leave the function.
  
<source lang="C">
+
5. Check ownerId and waiter again and execute 4 if there is a discrepancy with the first check.
typedef struct SceVfsWriteArgs {
 
  SceUID fd;
 
  const void *data;
 
  SceSize size;
 
} SceVfsWriteArgs;
 
  
int sceVfsWriteForDriver(SceVfsWriteArgs *argp);
+
6. Set waiter to 0 and ownerId to -1 and leave the function.
</source>
 
  
=== sceVfsIoctlForDriver ===
+
<source lang="C">int vfsUnlockVnodeForDriver(vfs_node* node);</source>
  
 +
=== vfsMountForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xC1DD4317
+
| 0.990-3.60 || 0xB62DE9A6
 
|}
 
|}
  
Temp name was <code>t_sceIoIoctlForDriver</code>
+
This is a guessed name.
  
thread callback for <code>sceIoIoctlForDriver</code>
+
Temp name was sceVfsMountForDriver.
 +
 
 +
<source lang="C">int vfsMountForDriver(vfs_mount_point_info_base *mnt);</source>
  
<source lang="C">
+
=== vfsUmountForDriver ===
typedef struct SceVfsIoctlArgs {
+
{| class="wikitable"
  SceUID fd;
+
|-
  unsigned int cmd;
+
! Version !! NID
  void *indata;
+
|-
  int inlen;
+
| 1.69-3.60 || 0x9C7E7B76
  void *outdata;
+
|}
  int outlen;
 
} SceVfsIoctlArgs;
 
  
int sceVfsIoctlForDriver(SceVfsIoctlArgs *argp);
+
Temp name was sceVfsUnmountForDriver.
</source>
 
  
=== sceVfsChstatForDriver ===
+
<source lang="C">int vfsUmountForDriver(vfs_unmount_data *data);</source>
  
 +
=== sceVfsAddVfsForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xBCE4865B
+
| 0.990-3.60 || 0x673D2FCD
 
|}
 
|}
  
Temp name was <code>t_sceIoChstatForDriver</code>
+
Used by [[SceSdstor]], [[SceTty2uart]], [[SceKernelBlueScreenOfDeath]].
  
thread callback for <code>sceIoChstatForDriver</code>
+
<source lang="C">int sceVfsAddVfsForDriver(vfs_add_data *data);</source>
  
<source lang="C">
+
=== sceVfsDeleteVfsForDriver ===
typedef struct SceVfsChstatArgs {
+
{| class="wikitable"
  const char *path;
+
|-
  const SceIoStat *stat;
+
! Version !! NID
  unsigned int cbit;
+
|-
  uint32_t store_attr;
+
| 1.69-3.60 || 0x9CBFA725
} SceVfsChstatArgs;
+
|}
  
int sceVfsChstatForDriver(SceVfsChstatArgs *argp);
+
<source lang="C">int sceVfsDeleteVfsForDriver(const char *name, void **deleted_node);</source>
</source>
 
 
 
=== sceVfsChstatByFdForDriver ===
 
  
 +
=== vfsMountForPFSForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x7517FE29
+
| 3.60 || 0xFEEE44A9
 
|}
 
|}
  
Temp name was <code>t_sceIoChstatByFdForDriver</code>
+
Temp name was scePfsMgrVfsMountForDriver.
  
thread callback for <code>sceIoChstatByFdForDriver</code>
+
operation index 3 in <code>cond_ctx</code>
  
 
<source lang="C">
 
<source lang="C">
typedef struct SceVfsChstatByFdArgs {
+
// this function can be used with PFS_GDSD_INF filesystem
  SceUID fd;
+
int vfsMountForPFSForDriver(vfs_mount_point_info_base *mnt, int unk1, int unk2);
  const SceIoStat *buf,
 
  unsigned int cbit;
 
} SceVfsChstatByFdArgs;
 
 
 
int sceVfsChstatByFdForDriver(SceVfsChstatByFdArgs *args);
 
 
</source>
 
</source>
  
=== sceVfsPreadForDriver ===
+
=== vfsUmountForPFSForDriver ===
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x0B54F9E0
+
| 3.60 || 0xD220539D
 
|}
 
|}
  
Temp name was <code>t_sceIoPreadForDriver</code>
+
This is a guessed name.
  
thread callback for <code>sceIoPreadForDriver</code>
+
Temp name was scePfsMgrVfsUmountForDriver.
 +
 
 +
operation index 4 in <code>cond_ctx</code>
  
<source lang="C">
+
<source lang="C">int vfsUmountForPFSForDriver(vfs_unmount_data* umnt, int unk1, int unk2);</source>
typedef struct SceVfsPreadArgs {
 
  SceUID uid;
 
  void *data;
 
  SceSize size;
 
  int paddind; // unused
 
  SceOff offset;
 
} SceVfsPreadArgs;
 
  
int sceVfsPreadForDriver(SceVfsPreadArgs *argp);
+
=== vfsLockMntForDriver ===
</source>
+
{| class="wikitable"
 +
! Version !! NID
 +
|-
 +
| 3.60 || 0x6B3CA9F7
 +
|}
  
=== sceVfsPwriteForDriver ===
+
Temp name was sceVfsLockMntForDriver.
  
 +
=== vfsUnlockMntForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Version !! NID
 
|-
 
|-
 +
| 3.60 || 0xDC2D8BCE
 +
|}
 +
 +
Temp name was sceVfsUnlockMntForDriver.
 +
 +
=== vfsGetNewVnodeForDriver ===
 +
{| class="wikitable"
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xE5DEA6B7
+
| 0.990-3.60 || 0xD60B5C63
 
|}
 
|}
  
Temp name was <code>t_sceIoPwriteForDriver</code>
+
Temp name was sceVfsGetNewVnodeForDriver.
  
thread callback for <code>sceIoPwriteForDriver</code>
+
<source lang="C">int vfsGetNewVnodeForDriver(vfs_mount *mnt, node_ops2 *ops, int unused, vfs_node **node);</source>
  
<source lang="C">
+
=== vfsFreeVnodeForDriver ===
typedef struct SceVfsPwriteArgs {
+
{| class="wikitable"
  SceUID uid;
+
! Version !! NID
  const void *data;
+
|-
  SceSize size;
+
| 0.990-3.60 || 0x21D57633
  int padding;
+
|}
  SceOff offset;
 
} SceVfsPwriteArgs;
 
  
int sceVfsPwriteForDriver(SceVfsPwriteArgs *argp);
+
Temp name was sceVfsFreeVnodeForDriver.
</source>
 
 
 
=== sceIoRmdevForDriver ===
 
  
 +
=== vfsIsOwnerForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xA39A9CA7
+
| 3.60 || 0xC3AE93A2
 
|}
 
|}
  
Like sceIoRemove?
+
This is a guessed name.
  
The difference with sceIoRemove is that sceIoRmdev seems to remove the entry to be deleted directly without moving it to SceIoTrash.
+
Temp name was sceIoComparisonCurrentThreadIdForDriver.
  
<source lang="C">int sceIoRmdevForDriver(const char *path, int flags, int a3, int a4);</source>
+
<source lang="C">SceBool vfsIsOwnerForDriver(void *vp);</source>
 
 
=== sceIoDelDrvForDriver ===
 
  
 +
=== vfsGetVnodeNameForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0xD51774E3
+
| 0.990-3.60 || 0xAA253B68
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
Example: "tty"
+
Temp name was sceVfsGetVnodeNameForDriver.
  
<source lang="C">int sceIoDelDrvForDriver(const char *drv);</source>
+
<source lang="C">int vfsGetVnodeNameForDriver(SceVfsNode *vp, char *name, SceSize n, SceSize *result);</source>
 
 
=== sceIoAddDrvForDriver ===
 
  
 +
=== vfsAllocateFileForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0x1D8AC9A7
+
| 0.995-3.60 || 0xBBAC1751
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceIoAddDrvForDriver(const char **drv);</source>
+
Temp name was sceVfsAllocateFileForDriver.
  
=== sceIoDreadForDriver ===
+
Creates a <code>SceUIDVfsFileClass</code> object and returns UID and pointer to created object.
  
{| class="wikitable"
+
<source lang="C">
! Version !! NID
+
// type of a1 is unknown for now - at least 0x98 bytes wide
|-
 
| 1.69-3.60 || 0x20CF5FC7
 
|}
 
  
Call interface is same as <code>sceIoDread</code>.
+
// FW 0.995
 +
SceUID vfsAllocateFileForDriver(void *vp, SceUIDVfsFileObject **ppFile);
  
<source lang="C">int sceIoDreadForDriver(SceUID fd, SceIoDirent *dir);</source>
+
// FW 3.60
 
+
// If name is NULL, default name (same as 0.995, "SceVfsFile") is used as object name
=== sceIoDreadForVshbridgeForDriver ===
+
// Else, name will be created with snprintf("file %s %s", something_from_a1, name);
 +
SceUID vfsAllocateFileForDriver(void *vp, SceVfsFileObject **ppFile, const char *name);
 +
</source>
  
 +
=== vfsAllocateFileDummyForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.995-3.60 || 0x03051B02
+
| 3.60 || 0xCDF3EF52
 
|}
 
|}
  
Temp name was sceIoDreadForDriver_2. Derived from [[SceVshBridge#vshIoDread|_vshIoDread]]
+
This is a guessed name.
 
 
Implementation is completely the same as sceIoDreadForDriver. The only difference is that st_attr in SceIoStat is not set.
 
 
 
<source lang="C">int sceIoDreadForVshbridgeForDriver(SceUID fd, SceIoDirent *dir);</source>
 
  
=== sceIoWriteForDriver ===
+
<source lang="C">SceUID vfsAllocateFileDummyForDriver(int flags, SceBool is_dir, const char *name);</source>
  
 +
=== vfsFreeFileForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x21EE91F0
+
| 0.990-3.60 || 0xC85E33A2
 
|}
 
|}
  
Call interface is same as <code>sceIoWrite</code>
+
Temp name was sceVfsFreeFileForDriver.
  
<source lang="C">int sceIoWriteForDriver(SceUID fd, const void *data, SceSize size);</source>
+
Frees a file created with [[SceIofilemgr#vfsAllocateFileForDriver|vfsAllocateFileForDriver]].
  
=== sceIoDopenForDriver ===
+
<source lang="C">SceInt32 vfsFreeFileForDriver(void *vp, SceUID file_uid);</source>
  
 +
=== vfsRmdevForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x463B25CC
+
| 3.60 || 0x69A7E076
 
|}
 
|}
  
Call interface is same as <code>sceIoDopen</code>
+
Temp name was sceVfsRmdevForDriver.
 
 
<source lang="C">SceUID sceIoDopenForDriver(const char *dirname);</source>
 
 
 
=== sceIoLseekForDriver ===
 
  
 +
=== vfsOpenForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x62090481
+
| 3.60 || 0x0E518FA9
 
|}
 
|}
  
Call interface is same as <code>sceIoLseek</code>
+
Temp name was t_sceIoOpenForDriver, sceVfsOpenForDriver.
  
<source lang="C">SceOff sceIoLseekForDriver(SceUID fd, SceOff offset, int whence);</source>
+
thread callback for <code>sceIoOpenForDriver</code>
  
=== sceIoOpenForDriver ===
+
<source lang="C">
 +
typedef struct SceVfsOpenArgs {
 +
  const char *filename;
 +
  int flag;
 +
  SceIoMode mode;
 +
} SceVfsOpenArgs;
 +
 
 +
SceUID vfsOpenForDriver(SceVfsOpenArgs *argp);
 +
</source>
  
 +
=== vfsCloseForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x75192972
+
| 3.60 || 0x1AE14011
 
|}
 
|}
  
Call interface is same as [[SceLibKernel#sceIoOpen|sceIoOpen]].
+
Temp name was t_sceIoCloseForDriver, sceVfsCloseForDriver.
  
If the process is game or non-game, the `SCE_O_NOBUF` flag will be ignored.
+
thread callback for <code>sceIoCloseForDriver</code>
  
<source lang="C">SceUID sceIoOpenForDriver(const char *filename, int flag, SceIoMode mode);</source>
+
<source lang="C">
 +
typedef struct SceVfsCloseArgs {
 +
  SceUID fd;
 +
} SceVfsCloseArgs;
  
=== sceIoOpenForPidForDriver ===
+
int vfsCloseForDriver(SceVfsCloseArgs *argp);
 +
</source>
  
 +
=== vfsReadForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xC3D34965
+
| 3.60 || 0x809892C1
 
|}
 
|}
  
This is a wrapper for [[SceIofilemgr#sceIoOpenForDriver|sceIoOpenForDriver]].
+
Temp name was t_sceIoReadForDriver, sceVfsReadForDriver.
  
Pid is used for <code>sceFiosKernelOverlayResolveSyncForDriver</code>.
+
thread callback for <code>sceIoReadForDriver</code>
  
<source lang="C">SceUID sceIoOpenForPidForDriver(SceUID pid, const char *filename, int flag, SceIoMode mode);</source>
+
<source lang="C">
 +
typedef struct SceVfsReadArgs {
 +
  SceUID fd;
 +
  void *data;
 +
  SceSize size;
 +
} SceVfsReadArgs;
  
=== sceIoChstatForDriver ===
+
int vfsReadForDriver(SceVfsReadArgs *argp);
 +
</source>
  
 +
=== vfsWriteForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x7D42B8DC
+
| 3.60 || 0x8598ADC3
 
|}
 
|}
  
Call interface is same as <code>sceIoChstat</code>
+
Temp name was t_sceIoWriteForDriver, sceVfsWriteForDriver.
  
<source lang="C">int sceIoChstatForDriver(const char *name, const SceIoStat *buf, unsigned int cbit);</source>
+
thread callback for <code>sceIoWriteForDriver</code>
 +
 
 +
<source lang="C">
 +
typedef struct SceVfsWriteArgs {
 +
  SceUID fd;
 +
  const void *data;
 +
  SceSize size;
 +
} SceVfsWriteArgs;
  
=== sceIoChstatForVshbridgeForDriver ===
+
int vfsWriteForDriver(SceVfsWriteArgs *argp);
 +
</source>
  
 +
=== vfsIoctlForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.995-3.60 || 0x1F98BD50
+
| 3.60 || 0xC1DD4317
 
|}
 
|}
Temp name was sceIoChstatForDriver_2. Derived from [[SceVshBridge#vshIoChstat|_vshIoChstat]]
 
  
Implementation is completely the same as <code>sceIoChstatForDriver</code>. The only difference is that (bits = bits & (~0x10000)) operation is not applied.
+
This is a guessed name.
 +
 
 +
Temp name was t_sceIoIoctlForDriver, sceVfsIoctlForDriver.
 +
 
 +
thread callback for <code>sceIoIoctlForDriver</code>
  
<source lang="C">int sceIoChstatForVshbridgeForDriver(const char *name, const SceIoStat *buf, unsigned int cbit);</source>
+
<source lang="C">
 +
typedef struct SceVfsIoctlArgs {
 +
  SceUID fd;
 +
  unsigned int cmd;
 +
  void *indata;
 +
  int inlen;
 +
  void *outdata;
 +
  int outlen;
 +
} SceVfsIoctlArgs;
  
=== sceIoGetstatForDriver ===
+
int vfsIoctlForDriver(SceVfsIoctlArgs *argp);
 +
</source>
  
 +
=== vfsChstatForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x75C96D25
+
| 3.60 || 0xBCE4865B
 
|}
 
|}
  
Call interface is same as <code>sceIoGetstat</code>.
+
Temp name was t_sceIoChstatForDriver, sceVfsChstatForDriver.
  
<source lang="C">int sceIoGetstatForDriver(const char *name, SceIoStat *buf);</source>
+
thread callback for <code>sceIoChstatForDriver</code>
  
=== sceIoGetstatForVshbridgeForDriver ===
+
<source lang="C">
 +
typedef struct SceVfsChstatArgs {
 +
  const char *path;
 +
  const SceIoStat *stat;
 +
  unsigned int cbit;
 +
  uint32_t store_attr;
 +
} SceVfsChstatArgs;
 +
 
 +
int vfsChstatForDriver(SceVfsChstatArgs *argp);
 +
</source>
  
 +
=== vfsChstatByFdForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.995-3.60 || 0xD6503624
+
| 3.60 || 0x7517FE29
 
|}
 
|}
  
Temp name was sceIoGetstatForDriver_2. Derived from [[SceVshBridge#vshIoGetstat|_vshIoGetstat]]
+
Temp name was t_sceIoChstatByFdForDriver, sceVfsChstatByFdForDriver.
  
Implementation is completely the same as sceIoGetstatForDriver. The only difference is that st_attr in SceIoStat *buf is not set.
+
thread callback for <code>sceIoChstatByFdForDriver</code>
  
<source lang="C">int sceIoGetstatForVshbridgeForDriver(const char *name, SceIoStat *buf);</source>
+
<source lang="C">
 +
typedef struct SceVfsChstatByFdArgs {
 +
  SceUID fd;
 +
  const SceIoStat *buf,
 +
  unsigned int cbit;
 +
} SceVfsChstatByFdArgs;
  
=== sceIoMkdirForDriver ===
+
int vfsChstatByFdForDriver(SceVfsChstatByFdArgs *args);
 +
</source>
  
 +
=== vfsPreadForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x7F710B25
+
| 3.60 || 0x0B54F9E0
 
|}
 
|}
  
Call interface is same as <code>sceIoMkdir</code>
+
Temp name was t_sceIoPreadForDriver, sceVfsPreadForDriver.
 +
 
 +
thread callback for <code>sceIoPreadForDriver</code>
  
<source lang="C">int sceIoMkdirForDriver(const char *dirname, SceIoMode mode);</source>
+
<source lang="C">
 +
typedef struct SceVfsPreadArgs {
 +
  SceUID uid;
 +
  void *data;
 +
  SceSize size;
 +
  int paddind; // unused
 +
  SceOff offset;
 +
} SceVfsPreadArgs;
  
=== sceIoReadForDriver ===
+
int vfsPreadForDriver(SceVfsPreadArgs *argp);
 +
</source>
  
 +
=== vfsPwriteForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xE17EFC03
+
| 3.60 || 0xE5DEA6B7
 
|}
 
|}
  
Call interface is same as <code>sceIoRead</code>
+
Temp name was t_sceIoPwriteForDriver, sceVfsPwriteForDriver.
 +
 
 +
thread callback for <code>sceIoPwriteForDriver</code>
  
<source lang="C">int sceIoReadForDriver(SceUID fd, void *buf, SceSize nbyte);</source>
+
<source lang="C">
 +
typedef struct SceVfsPwriteArgs {
 +
  SceUID uid;
 +
  const void *data;
 +
  SceSize size;
 +
  int padding;
 +
  SceOff offset;
 +
} SceVfsPwriteArgs;
  
=== sceIoCloseForDriver ===
+
int vfsPwriteForDriver(SceVfsPwriteArgs *argp);
 +
</source>
  
 +
=== vfsGetMntInfoForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xF99DD8A3
+
| 3.60 || 0xB987450D
 
|}
 
|}
  
Call interface is same as <code>sceIoClose</code>
+
This is a guessed name.
  
<source lang="C">int sceIoCloseForDriver(SceUID fd);</source>
+
Temp name was sceIoGetMountInfoForDriver.
  
=== sceIoRenameForDriver ===
+
<source lang="C">int vfsGetMntInfoForDriver(void *mnt, SceIoMountInfo *pInfo);</source>
  
 +
=== vfsGetMntListForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xDC0C4997
+
| 3.60 || 0xC20C621C
 
|}
 
|}
  
Call interface is same as <code>sceIoRename</code>
+
This is a guessed name.
  
<source lang="C">int sceIoRenameForDriver(const char *oldname, const char *newname);</source>
+
Temp name was sceIoGetMountVectorForDriver.
  
=== sceIoRemoveForDriver ===
+
<source lang="C">int vfsGetMntList(SceIoMount *pMount, SceUInt32 nMount, SceUInt32 *pnMount);</source>
  
 +
=== sceIoMountForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x0D7BB3E1
+
| 3.60 || 0xD070BC48
 
|}
 
|}
  
Call interface is same as <code>sceIoRemove</code>
+
operation index 1 in <code>cond_ctx</code>
  
<source lang="C">int sceIoRemoveForDriver(const char *filename);</source>
+
<source lang="C">
 
+
// intermediate function between sceAppMgrGameDataMountForDriver and sceVfsMountForDriver
=== sceIoCancelForDriver ===
+
int sceIoMountForDriver(int vshMountId, const char *path, int flags, int unk3, int arg_0, int arg_4);
 +
</source>
  
 +
=== sceIoUmountForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x6D59658D
+
| 3.60 || 0x20574100
 
|}
 
|}
  
Derived from <code>sceIoCancel</code>
+
operation index 2 in <code>cond_ctx</code>
  
=== sceIoChstatAsyncForDriver ===
+
<source lang="C">
 +
// intermediate function between sceAppMgrUmountForDriver and sceVfsUnmountForDriver
 +
int sceIoUmountForDriver(int vshMountId, int unk1, int unk2, int unk3);
 +
</source>
  
 +
=== sceIoRmdevForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x7EC442BF
+
| 0.990-3.60 || 0xA39A9CA7
 
|}
 
|}
  
Derived from <code>_sceIoChstatAsync</code>
+
Like sceIoRemove?
 +
 
 +
The difference with sceIoRemove is that sceIoRmdev seems to remove the entry to be deleted directly without moving it to SceIoTrash.
  
=== sceIoChstatByFdAsyncForDriver ===
+
<source lang="C">int sceIoRmdevForDriver(const char *path, int flags, int a3, int a4);</source>
  
 +
=== sceIoDelDrvForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Version !! NID
 
|-
 
|-
! Version !! NID
+
| 0.931 || 0xD51774E3
 
|-
 
|-
| 3.60 || 0xEC974400
+
| 3.60 || not present
 
|}
 
|}
  
Derived from <code>sceIoChstatByFdAsync</code>
+
Example: "tty"
  
=== sceIoChstatByFdForDriver ===
+
<source lang="C">int sceIoDelDrvForDriver(const char *drv);</source>
  
 +
=== sceIoAddDrvForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Version !! NID
 
|-
 
|-
! Version !! NID
+
| 0.931 || 0x1D8AC9A7
 
|-
 
|-
| 3.60 || 0xDF57A75F
+
| 3.60 || not present
 
|}
 
|}
  
Derived from <code>_sceIoChstatByFd</code>
+
<source lang="C">int sceIoAddDrvForDriver(const char **drv);</source>
  
<source lang="C">int sceIoChstatByFdForDriver(SceUID fd, const SceIoStat *buf, unsigned int cbit);</source>
+
=== sceIoDreadForDriver ===
 
+
{| class="wikitable"
=== sceIoCloseAsyncForDriver ===
 
 
 
{| class="wikitable"
 
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x11C57CC6
+
| 1.69-3.60 || 0x20CF5FC7
 
|}
 
|}
  
Derived from <code>sceIoCloseAsync</code>
+
Call interface is same as <code>sceIoDread</code>.
  
=== sceIoDevctlAsyncForDriver ===
+
<source lang="C">int sceIoDreadForDriver(SceUID fd, SceIoDirent *dir);</source>
  
 +
=== sceIoDreadForVshbridgeForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xA9302946
+
| 0.995-3.60 || 0x03051B02
 
|}
 
|}
  
Derived from <code>_sceIoDevctlAsync</code>
+
Temp name was sceIoDreadForDriver_2. Derived from [[SceVshBridge#vshIoDread|_vshIoDread]].
 +
 
 +
Implementation is completely the same as sceIoDreadForDriver. The only difference is that st_attr in SceIoStat is not set.
  
=== sceIoDevctlForDriver ===
+
<source lang="C">int sceIoDreadForVshbridgeForDriver(SceUID fd, SceIoDirent *dir);</source>
  
 +
=== sceIoWriteForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x16882FC4
+
| 1.69-3.60 || 0x21EE91F0
 
|}
 
|}
  
Derived from <code>_sceIoDevctl</code>
+
Call interface is same as <code>sceIoWrite</code>
  
<source lang="C">
+
<source lang="C">int sceIoWriteForDriver(SceUID fd, const void *data, SceSize size);</source>
// Return: >=0 on success (driver-dependent)
 
int sceIoDevctlForDriver(const char *devname, int cmd, const void *arg, SceSize arglen, void *bufp, SceSize buflen);
 
</source>
 
 
 
=== sceIoDcloseForDriver ===
 
  
 +
=== sceIoDopenForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x19C81DD6
+
| 1.69-3.60 || 0x463B25CC
 
|}
 
|}
  
Derived from <code>sceIoDclose</code>
+
Call interface is same as <code>sceIoDopen</code>
  
<source lang="C">int sceIoDcloseForDriver(SceUID fd);</source>
+
<source lang="C">SceUID sceIoDopenForDriver(const char *dirname);</source>
 
 
=== sceIoFlockForDriver ===
 
  
 +
=== sceIoLseekForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x16336A0D
+
| 0.931-3.60 || 0x62090481
 
|}
 
|}
  
Derived from <code>sceIoFlockForSystem</code>
+
Call interface is same as <code>sceIoLseek</code>
  
=== sceIoGetstatByFdAsyncForDriver ===
+
<source lang="C">SceOff sceIoLseekForDriver(SceUID fd, SceOff offset, int whence);</source>
  
 +
=== sceIoOpenForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x0FEE1238
+
| 0.931-3.60 || 0x75192972
 
|}
 
|}
  
Derived from <code>sceIoGetstatByFdAsync</code>
+
Call interface is same as [[SceLibKernel#sceIoOpen|sceIoOpen]].
 +
 
 +
If the process is game or non-game, the `SCE_O_NOBUF` flag will be ignored.
  
=== sceIoGetstatByFdForDriver ===
+
<source lang="C">SceUID sceIoOpenForDriver(const char *filename, int flag, SceIoMode mode);</source>
  
 +
=== sceIoOpenForPidForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x462F059B
+
| 3.60 || 0xC3D34965
 
|}
 
|}
  
Derived from <code>_sceIoGetstatByFd</code>
+
This is a wrapper for [[SceIofilemgr#sceIoOpenForDriver|sceIoOpenForDriver]].
  
<source lang="C">
+
Pid is used for <code>sceFiosKernelOverlayResolveSyncForDriver</code>.
// Return: 0 on success
 
int sceIoGetstatByFdForDriver(SceUID fd, SceIoStat *buf);
 
</source>
 
  
=== sceIoGetstatAsyncForDriver ===
+
<source lang="C">SceUID sceIoOpenForPidForDriver(SceUID pid, const char *filename, int flag, SceIoMode mode);</source>
  
 +
=== sceIoChstatForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x94A5304A
+
| 1.69-3.60 || 0x7D42B8DC
 
|}
 
|}
  
Derived from <code>_sceIoGetstatAsync</code>
+
Call interface is same as <code>sceIoChstat</code>
  
=== sceIoIoctlAsyncForDriver ===
+
<source lang="C">int sceIoChstatForDriver(const char *name, const SceIoStat *buf, unsigned int cbit);</source>
  
 +
=== sceIoChstatForVshbridgeForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xB761E91B
+
| 0.995-3.60 || 0x1F98BD50
 
|}
 
|}
  
Derived from <code>_sceIoIoctlAsync</code>
+
Temp name was sceIoChstatForDriver_2. Derived from [[SceVshBridge#vshIoChstat|_vshIoChstat]].
  
=== sceIoIoctlForDriver ===
+
Implementation is completely the same as <code>sceIoChstatForDriver</code>. The only difference is that (bits = bits & (~0x10000)) operation is not applied.
 +
 
 +
<source lang="C">int sceIoChstatForVshbridgeForDriver(const char *name, const SceIoStat *buf, unsigned int cbit);</source>
  
 +
=== sceIoGetstatForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x161CD33F
+
| 1.69-3.60 || 0x75C96D25
 
|}
 
|}
  
Derived from <code>_sceIoIoctl</code>
+
Call interface is same as <code>sceIoGetstat</code>.
  
<source lang="C">
+
<source lang="C">int sceIoGetstatForDriver(const char *name, SceIoStat *buf);</source>
// Return: >=0 on success (driver-dependent)
 
int sceIoIoctlForDriver(SceUID fd, int cmd, const void *argp, SceSize arglen, void *bufp, SceSize buflen);
 
</source>
 
 
 
=== sceIoLseekAsyncForDriver ===
 
  
 +
=== sceIoGetstatForVshbridgeForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x541BAABD
+
| 0.995-3.60 || 0xD6503624
 
|}
 
|}
  
Derived from <code>_sceIoLseekAsync</code>
+
Temp name was sceIoGetstatForDriver_2. Derived from [[SceVshBridge#vshIoGetstat|_vshIoGetstat]].
 +
 
 +
Implementation is completely the same as sceIoGetstatForDriver. The only difference is that st_attr in SceIoStat *buf is not set.
  
=== sceIoMkdirAsyncForDriver ===
+
<source lang="C">int sceIoGetstatForVshbridgeForDriver(const char *name, SceIoStat *buf);</source>
  
 +
=== sceIoMkdirForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x27003443
+
| 1.69-3.60 || 0x7F710B25
 
|}
 
|}
  
Derived from <code>_sceIoMkdirAsync</code>
+
Call interface is same as <code>sceIoMkdir</code>
  
=== sceIoOpenAsyncForDriver ===
+
<source lang="C">int sceIoMkdirForDriver(const char *dirname, SceIoMode mode);</source>
  
 +
=== sceIoReadForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x451001DE
+
| 1.69-3.60 || 0xE17EFC03
 
|}
 
|}
  
Derived from <code>_sceIoOpenAsync</code>
+
Call interface is same as <code>sceIoRead</code>
  
=== sceIoPreadAsyncForDriver ===
+
<source lang="C">int sceIoReadForDriver(SceUID fd, void *buf, SceSize nbyte);</source>
  
 +
=== sceIoCloseForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x64A46A2C
+
| 1.69-3.60 || 0xF99DD8A3
 
|}
 
|}
  
Derived from <code>_sceIoPreadAsync</code>
+
Call interface is same as <code>sceIoClose</code>
  
=== sceIoPreadForDriver ===
+
<source lang="C">int sceIoCloseForDriver(SceUID fd);</source>
  
 +
=== sceIoRenameForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x2A17515D
+
| 1.69-3.60 || 0xDC0C4997
 
|}
 
|}
  
Derived from <code>_sceIoPread</code>
+
Call interface is same as <code>sceIoRename</code>
  
<source lang="C">
+
<source lang="C">int sceIoRenameForDriver(const char *oldname, const char *newname);</source>
// Return: Number of bytes actually read
 
int sceIoPreadForDriver(SceUID uid, void *data, int size, SceOff offset);
 
</source>
 
 
 
=== sceIoPwriteAsyncForDriver ===
 
  
 +
=== sceIoRemoveForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x202CDDE3
+
| 1.69-3.60 || 0x0D7BB3E1
 
|}
 
|}
  
Derived from <code>_sceIoPwriteAsync</code>
+
Call interface is same as <code>sceIoRemove</code>
  
=== sceIoPwriteForDriver ===
+
<source lang="C">int sceIoRemoveForDriver(const char *filename);</source>
  
 +
=== sceIoCancelForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x5F1512C8
+
| 3.60 || 0x6D59658D
 
|}
 
|}
  
Derived from <code>_sceIoPwrite</code>
+
Derived from <code>sceIoCancel</code>
  
<source lang="C">
+
=== sceIoChstatAsyncForDriver ===
// Return: Number of bytes actually written
+
{| class="wikitable"
int sceIoPwriteForDriver(SceUID fd, const void *buf, SceSize nbyte, SceOff offset);
+
|-
</source>
+
! Version !! NID
 +
|-
 +
| 3.60 || 0x7EC442BF
 +
|}
  
=== sceIoReadAsyncForDriver ===
+
Derived from <code>_sceIoChstatAsync</code>
  
 +
=== sceIoChstatByFdAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x69047C81
+
| 3.60 || 0xEC974400
 
|}
 
|}
  
Derived from <code>sceIoReadAsync</code>
+
Derived from <code>sceIoChstatByFdAsync</code>
 
 
=== sceIoRemoveAsyncForDriver ===
 
  
 +
=== sceIoChstatByFdForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xF9D6507D
+
| 3.60 || 0xDF57A75F
 
|}
 
|}
  
Derived from <code>_sceIoRemoveAsync</code>
+
Derived from <code>_sceIoChstatByFd</code>
  
=== sceIoRenameAsyncForDriver ===
+
<source lang="C">int sceIoChstatByFdForDriver(SceUID fd, const SceIoStat *buf, unsigned int cbit);</source>
  
 +
=== sceIoCloseAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xAACBC47A
+
| 3.60 || 0x11C57CC6
 
|}
 
|}
  
Derived from <code>_sceIoRenameAsync</code>
+
Derived from <code>sceIoCloseAsync</code>
 
 
=== sceIoRmdirAsyncForDriver ===
 
  
 +
=== sceIoDevctlAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xF5B0B36C
+
| 3.60 || 0xA9302946
 
|}
 
|}
  
Derived from <code>_sceIoRmdirAsync</code>
+
Derived from <code>_sceIoDevctlAsync</code>
 
 
=== sceIoRmdirForDriver ===
 
  
 +
=== sceIoDevctlForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x1CC9C634
+
| 0.990.000-3.740.011 || 0x16882FC4
 
|}
 
|}
  
Derived from <code>_sceIoRmdir</code>
+
cmd list
 
 
<source lang="C">int sceIoRmdirForDriver(const char *dirname);</source>
 
 
 
=== sceIoSyncByFdAsyncForDriver ===
 
  
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Version !! NID
+
! handler !! cmd !! function
 +
|-
 +
| sdstor || 1 || Update ctx info
 +
|-
 +
| sdstor || 2 || Format rm
 +
|-
 +
| sdstor || 3 || Set some intr flag
 +
|-
 +
| sdstor || 4 || remove
 +
|-
 +
| sdstor || 5 || insert
 +
|-
 +
| sdstor || 6 || sceSdErase
 +
|-
 +
| sdstor || 7 || sdctrl_invalidate_partition with check
 +
|-
 +
| sdstor || 8 || sdctrl_invalidate_partition
 +
|-
 +
| exfat || 0x3001 || get_drive_information
 +
|-
 +
| exfat || 0x3004 || set_fake_free
 +
|-
 +
| exfat || 0x3005 || clear_fake_free
 +
|-
 +
| exfat || 0x3802 || set_whiteout_directory
 +
|-
 +
| exfat || 0x3803 || delete_whiteout_entry
 
|-
 
|-
| 3.60 || 0x041209CF
+
| exfat || 0x80000001 || _get_file_size_limit
 
|}
 
|}
  
Derived from <code>sceIoSyncByFdAsync</code>
+
Derived from [[SceIofilemgr#sceIoDevctl|_sceIoDevctl]].
  
=== not_sceIoSyncByFd_maybe_SyncByFd2ForDriver ===
+
This performs device-specific operations. The details of the operations are driver-dependent.
  
{| class="wikitable"
+
It has the same prototype as [[SceLibKernel#sceIoDevctl]].
|-
 
! Version !! NID
 
|-
 
| 3.60 || 0x43170575
 
|}
 
  
This function is not sceIoSyncByFdForDriver.
+
<source lang="C">
 +
/*
 +
Arguments:
 +
devname    Specified device ("<devname><unit>:")
 +
cmd    Command code
 +
arg    Pointer to device-driver-dependent parameter block
 +
arglen    Number of bytes in device-driver-dependent parameter block
 +
bufp    Pointer to return data storage block
 +
buflen    Size of return data storage block
  
Derived from <code>sceIoSyncByFd</code>
+
Return Values:
 +
Non-negative (N>=0) Success (driver-dependent)
 +
<0 Error, e.g. SCE_ERROR_ERRNO_EMFILE, SCE_ERROR_ERRNO_ENODEV, SCE_ERROR_ERRNO_EUNSUP
 +
*/
  
<source lang="C">int not_sceIoSyncByFd_maybe_SyncByFd2ForDriver(SceUID fd, int flag);</source>
+
int sceIoDevctlForDriver(
 
+
    const char *devname,
=== sceIoSyncAsyncForDriver ===
+
    int cmd,
 +
    const void *arg,
 +
    SceSize arglen,
 +
    void *bufp,
 +
    SceSize buflen
 +
);
 +
</source>
  
 +
=== sceIoDcloseForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x4F9EA8B0
+
| 3.60 || 0x19C81DD6
 
|}
 
|}
  
Derived from <code>_sceIoSyncAsync</code>
+
Derived from <code>sceIoDclose</code>
  
=== sceIoSyncForDriver ===
+
<source lang="C">int sceIoDcloseForDriver(SceUID fd);</source>
  
 +
=== sceIoFlockForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xDDF78594
+
| 3.60 || 0x16336A0D
 
|}
 
|}
  
Derived from <code>_sceIoSync</code>
+
Derived from <code>sceIoFlockForSystem</code>
 
 
<source lang="C">int sceIoSyncForDriver(const char *device, unsigned int flag);</source>
 
 
 
=== sceIoWriteAsyncForDriver ===
 
  
 +
=== sceIoGetstatByFdAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xA1BD13D0
+
| 3.60 || 0x0FEE1238
 
|}
 
|}
Derived from <code>sceIoWriteAsync</code>
 
  
=== sceIoGetProcessDefaultPriorityForSystemForDriver ===
+
Derived from <code>sceIoGetstatByFdAsync</code>
  
 +
=== sceIoGetstatByFdForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xCE397158
+
| 3.60 || 0x462F059B
 
|}
 
|}
  
=== sceIoSetProcessDefaultPriorityForSystemForDriver ===
+
Derived from <code>_sceIoGetstatByFd</code>
 +
 
 +
<source lang="C">
 +
// Return: 0 on success
 +
int sceIoGetstatByFdForDriver(SceUID fd, SceIoStat *buf);
 +
</source>
  
 +
=== sceIoGetstatAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xABE65071
+
| 3.60 || 0x94A5304A
 
|}
 
|}
  
=== sceIoDopenAsyncForDriver ===
+
Derived from <code>_sceIoGetstatAsync</code>
  
 +
=== sceIoIoctlAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x72F06BDE
+
| 3.60 || 0xB761E91B
 
|}
 
|}
  
=== sceIoDcloseAsyncForDriver ===
+
Derived from <code>_sceIoIoctlAsync</code>
  
 +
=== sceIoIoctlForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xC08F199F
+
| 3.60 || 0x161CD33F
 
|}
 
|}
  
=== sceIoDreadAsyncForDriver ===
+
Derived from <code>_sceIoIoctl</code>
 +
 
 +
<source lang="C">
 +
// Return: >=0 on success (driver-dependent)
 +
int sceIoIoctlForDriver(SceUID fd, int cmd, const void *argp, SceSize arglen, void *bufp, SceSize buflen);
 +
</source>
  
 +
=== sceIoLseekAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x5982B0E3
+
| 3.60 || 0x541BAABD
 
|}
 
|}
  
=== sceIoCreateMountEventForDriver ===
+
Derived from <code>_sceIoLseekAsync</code>
  
 +
=== sceIoMkdirAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x2DFA192F
+
| 3.60 || 0x27003443
 
|}
 
|}
  
Derived from [[SceVshBridge#vshIoCreateMountEvent|vshIoCreateMountEvent]]
+
Derived from <code>_sceIoMkdirAsync</code>
  
<source lang="C">int sceIoCreateMountEventForDriver(int vshMountId, int flag);</source>
+
=== sceIoOpenAsyncForDriver ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 3.60 || 0x451001DE
 +
|}
  
=== sceIoCreateErrorEventForDriver ===
+
Derived from <code>_sceIoOpenAsync</code>
  
 +
=== sceIoPreadAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x3C0343DB
+
| 3.60 || 0x64A46A2C
 
|}
 
|}
  
Derived from [[SceVshBridge#vshIoCreateErrorEvent|vshIoCreateErrorEvent]]
+
Derived from <code>_sceIoPreadAsync</code>
  
<source lang="C">
+
=== sceIoPreadForDriver ===
typedef struct sceIoCreateErrorEventForDriverOpt {
+
{| class="wikitable"
  uint32_t unk_0;
+
|-
  uint32_t unk_4;
+
! Version !! NID
  uint32_t unk_8;
+
|-
  uint32_t unk_C;
+
| 3.60 || 0x2A17515D
 +
|}
  
  uint32_t unk_10;
+
Derived from <code>_sceIoPread</code>
  uint32_t unk_14;
 
  uint32_t unk_18;
 
} sceIoCreateErrorEventForDriverOpt;
 
  
SceUID sceIoCreateErrorEventForDriver(int vshMountId, int flag, sceIoCreateErrorEventForDriverOpt* opt);
+
<source lang="C">
 +
// Return: Number of bytes actually read
 +
int sceIoPreadForDriver(SceUID uid, void *data, int size, SceOff offset);
 
</source>
 
</source>
  
=== sceIoClearErrorEventForDriver ===
+
=== sceIoPwriteAsyncForDriver ===
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x40B933C7
+
| 3.60 || 0x202CDDE3
 
|}
 
|}
  
Derived from [[SceVshBridge#vshIoClearErrorEvent|vshIoClearErrorEvent]]
+
Derived from <code>_sceIoPwriteAsync</code>
 
 
<source lang="C">int sceIoClearErrorEventForDriver(SceUID uid);</source>
 
 
 
=== sceIoDeleteMountEventForDriver ===
 
  
 +
=== sceIoPwriteForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x43DB0AE4
+
| 3.60 || 0x5F1512C8
 
|}
 
|}
  
Derived from [[SceVshBridge#vshIoDeleteMountEvent|vshIoDeleteMountEvent]]
+
Derived from <code>_sceIoPwrite</code>
  
<source lang="C">int sceIoDeleteMountEventForDriver(SceUID uid);</source>
+
<source lang="C">
 
+
// Return: Number of bytes actually written
=== sceIoDeleteErrorEventForDriver ===
+
int sceIoPwriteForDriver(SceUID fd, const void *buf, SceSize nbyte, SceOff offset);
 +
</source>
  
 +
=== sceIoReadAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xC6158F8D
+
| 3.60 || 0x69047C81
 
|}
 
|}
  
Derived from [[SceVshBridge#vshIoDeleteErrorEvent|vshIoDeleteErrorEvent]]
+
Derived from <code>sceIoReadAsync</code>
 
 
<source lang="C">int sceIoDeleteErrorEventForDriver(SceUID uid);</source>
 
 
 
=== sceIoSetMountEventForDriver ===
 
  
 +
=== sceIoRemoveAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.995-3.60 || 0x39ABDB9E
+
| 3.60 || 0xF9D6507D
 
|}
 
|}
  
Temp name was sceIoInvokeMountEventForDriver.
+
Derived from <code>_sceIoRemoveAsync</code>
 
 
<source lang="C">
 
/*
 
* (flags & 0x100) != 0 -> mount
 
* (flags & 0x200) != 0 -> unmount
 
*/
 
int sceIoSetMountEventForDriver(int mount_id, int flags, int unk2, int unk3);
 
</source>
 
 
 
=== unk_5B7E5AB8 ===
 
  
 +
=== sceIoRenameAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x5B7E5AB8
+
| 3.60 || 0xAACBC47A
 
|}
 
|}
  
<source lang="C">int unk_5B7E5AB8(int vshMountId, int a2);</source>
+
Derived from <code>_sceIoRenameAsync</code>
 
 
=== sceIoSetPathMappingFunctionForDriver ===
 
  
 +
=== sceIoRmdirAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xCFAECF18
+
| 3.60 || 0xF5B0B36C
 
|}
 
|}
  
Used by [[SceAppMgr]].
+
Derived from <code>_sceIoRmdirAsync</code>
  
Sets a callback function that does path mapping:
+
=== sceIoRmdirForDriver ===
 
+
{| class="wikitable"
* function tries to OverlayResolveSync input path
 
* checks that it is not a PD path (Pseudo Drive mount point aquired by [[ScePfsMgr]])
 
* takes beginning of path until symbol ":"
 
* tries to do a lookup by that path copy in data segment [[SceAppMgr#Data_segment_layout|global 0x3470C]] <code>mount_point_data_entry</code> item array
 
* if item is found then <code>path</code> from <code>mount_point_data_entry</code> item is copied to <code>result_path</code>
 
* in any other case OverlayResolveSync result path is copied to <code>result_path</code>
 
 
 
<source lang="C">
 
typedef int ( SceIoPathMappingFunc)(const char *path, SceUID pid, char *result_path, SceSize size);
 
 
 
int sceIoSetPathMappingFunctionForDriver(SceIoPathMappingFunc *func);
 
</source>
 
 
 
=== sceIoGetMediaTypeForDriver ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x9C220246
+
| 3.60 || 0x1CC9C634
 
|}
 
|}
  
Was wrongly named sceIoGetPathIdExForDriver.
+
Derived from <code>_sceIoRmdir</code>
  
May also call callback function set by [[SceIofilemgr#sceIoSetPathMappingFunctionForDriver|sceIoSetPathMappingFunctionForDriver]].
+
<source lang="C">int sceIoRmdirForDriver(const char *dirname);</source>
 
 
This callback function does path mapping since result in result_path is passed to [[SceSblACMgr#sceSblACMgrGetMediaTypeForKernel|sceSblACMgrGetMediaTypeForKernel]].
 
 
 
<source lang="C">int sceIoGetMediaTypeForDriver(SceUID pid, const char *path, int ignored, int *media_type);</source>
 
 
 
=== create_SceUIDVfsFileClass ===
 
  
 +
=== sceIoSyncByFdAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xCDF3EF52
+
| 3.60 || 0x041209CF
 
|}
 
|}
  
creates instance of SceUIDVfsFileClass using <code>sceKernelCreateUidObjForKernel</code>
+
Derived from <code>sceIoSyncByFdAsync</code>
 
 
<source lang="C">SceUID create_SceUIDVfsFileClass(int unk0, int unk1, const char *unk2);</source>
 
 
 
=== sceIoGetThreadDefaultPriorityForSystemForDriver ===
 
  
 +
=== not_sceIoSyncByFd_maybe_SyncByFd2ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x6D0FEDB6
+
| 3.60 || 0x43170575
 
|}
 
|}
  
<source lang="C">int sceIoGetThreadDefaultPriorityForSystemForDriver(void);</source>
+
This function is not sceIoSyncByFdForDriver.
 +
 
 +
Derived from <code>sceIoSyncByFd</code>
  
=== sceIoSetThreadDefaultPriorityForSystemForDriver ===
+
<source lang="C">int not_sceIoSyncByFd_maybe_SyncByFd2ForDriver(SceUID fd, int flag);</source>
  
 +
=== sceIoSyncAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x3F0FF9D5
+
| 3.60 || 0x4F9EA8B0
 
|}
 
|}
  
=== sceIoGetRemoteKPLSDataForDriver ===
+
Derived from <code>_sceIoSyncAsync</code>
  
 +
=== sceIoSyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x44EDCE57
+
| 3.60 || 0xDDF78594
 
|}
 
|}
  
This function is temp name.
+
Derived from <code>_sceIoSync</code>
  
<source lang="C">int sceIoGetRemoteKPLSDataForDriver(SceUID pid, void *dst);</source>
+
<source lang="C">int sceIoSyncForDriver(const char *device, unsigned int flag);</source>
 
 
=== sceIoSetProcessFileOpenMaxNumberForDriver ===
 
  
 +
=== sceIoWriteAsyncForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xAC0E9AAA
+
| 3.60 || 0xA1BD13D0
 
|}
 
|}
  
<source lang="C">int sceIoSetProcessFileOpenMaxNumberForDriver(SceUID pid, SceSize number);</source>
+
Derived from <code>sceIoWriteAsync</code>
 
 
=== sceIoSetProcessDirOpenMaxLevelForDriver ===
 
  
 +
=== sceIoGetProcessDefaultPriorityForSystemForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x03F6A684
+
| 0.990-3.60 || 0xCE397158
 
|}
 
|}
  
<source lang="C">int sceIoSetProcessDirOpenMaxLevelForDriver(SceUID pid, SceSize level);</source>
+
=== sceIoSetProcessDefaultPriorityForSystemForDriver ===
 
 
=== sceIoCloseInternalForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x1AE14011
+
| 0.990-3.60 || 0xABE65071
 
|}
 
|}
  
<source lang="C">
+
=== sceIoDopenAsyncForDriver ===
typedef struct SceIoCloseArgs {
+
{| class="wikitable"
SceUID fd;
+
|-
} SceIoCloseArgs;
 
 
 
int sceIoCloseInternalForDriver(SceIoCloseArgs *args);
 
</source>
 
 
 
=== sceIoPreadInternalForDriver ===
 
 
 
{| class="wikitable"
 
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x0B54F9E0
+
| 3.60 || 0x72F06BDE
 
|}
 
|}
  
<source lang="C">
+
=== sceIoDcloseAsyncForDriver ===
typedef struct SceIoPreadArgs {
 
SceUID fd;
 
void *data;
 
SceSize size;
 
int dummy; // ?aligment?
 
SceOff offset;
 
} SceIoPreadArgs;
 
 
 
int sceIoPreadInternalForDriver(SceIoPreadArgs *args);
 
</source>
 
 
 
=== sceIoCompleteForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x8F0DE34D
+
| 3.60 || 0xC08F199F
 
|}
 
|}
  
<source lang="C">int sceIoCompleteForDriver(SceUID fd);</source>
+
=== sceIoDreadAsyncForDriver ===
 
 
=== sceIoGetPriorityForSystemForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x9FCDCE62
+
| 3.60 || 0x5982B0E3
 
|}
 
|}
  
<source lang="C">int sceIoGetPriorityForSystemForDriver(SceUID a1);</source>
+
=== sceIoCreateMountEventForDriver ===
 
 
=== sceIoSetPriorityForSystemForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xCCE94599
+
| 3.60 || 0x2DFA192F
 
|}
 
|}
  
<source lang="C">int sceIoSetPriorityForSystemForDriver(SceUID a1, int a2);</source>
+
Derived from [[SceVshBridge#vshIoCreateMountEvent|vshIoCreateMountEvent]]
  
=== sceIoComparisonCurrentThreadIdForDriver ===
+
<source lang="C">int sceIoCreateMountEventForDriver(int vshMountId, int flag);</source>
  
 +
=== sceIoCreateErrorEventForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xC3AE93A2
+
| 3.60 || 0x3C0343DB
 
|}
 
|}
  
<source lang="C">int sceIoComparisonCurrentThreadIdForDriver(void *ctx);</source>
+
Derived from [[SceVshBridge#vshIoCreateErrorEvent|vshIoCreateErrorEvent]]
  
=== sceIoSetErrorEventForDriver ===
+
<source lang="C">
 +
typedef struct sceIoCreateErrorEventForDriverOpt {
 +
  uint32_t unk_0;
 +
  uint32_t unk_4;
 +
  uint32_t unk_8;
 +
  uint32_t unk_C;
 +
 
 +
  uint32_t unk_10;
 +
  uint32_t unk_14;
 +
  uint32_t unk_18;
 +
} sceIoCreateErrorEventForDriverOpt;
 +
 
 +
SceUID sceIoCreateErrorEventForDriver(int vshMountId, int flag, sceIoCreateErrorEventForDriverOpt* opt);
 +
</source>
  
 +
=== sceIoClearErrorEventForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.995-3.60 || 0xDD46CD63
+
| 3.60 || 0x40B933C7
 
|}
 
|}
  
Previously (wrongfully) called sceIoGetGUIDErrorEventListForDriver.
+
Derived from [[SceVshBridge#vshIoClearErrorEvent|vshIoClearErrorEvent]]
  
=== sceIoSetDebuggerCallbackForDriver ===
+
<source lang="C">int sceIoClearErrorEventForDriver(SceUID uid);</source>
  
 +
=== sceIoDeleteMountEventForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xF4F8C59A
+
| 3.60 || 0x43DB0AE4
 
|}
 
|}
  
=== sceIoGetGUIDFdListForDebuggerForDriver ===
+
Derived from [[SceVshBridge#vshIoDeleteMountEvent|vshIoDeleteMountEvent]]
 +
 
 +
<source lang="C">int sceIoDeleteMountEventForDriver(SceUID uid);</source>
  
 +
=== sceIoDeleteErrorEventForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xdcf75f6d
+
| 3.60 || 0xC6158F8D
 
|}
 
|}
  
=== sceIoGetPUIDFdListForDebuggerForDriver ===
+
Derived from [[SceVshBridge#vshIoDeleteErrorEvent|vshIoDeleteErrorEvent]]
 +
 
 +
<source lang="C">int sceIoDeleteErrorEventForDriver(SceUID uid);</source>
  
 +
=== sceIoSetMountEventForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xd493274
+
| 0.995-3.60 || 0x39ABDB9E
 
|}
 
|}
  
=== sceIoGetFileInfoForDriver ===
+
Temp name was sceIoInvokeMountEventForDriver.
 +
 
 +
<source lang="C">
 +
/*
 +
* (flags & 0x100) != 0 -> mount
 +
* (flags & 0x200) != 0 -> unmount
 +
*/
 +
int sceIoSetMountEventForDriver(int vshMountId, int flags, int unk2, int unk3);
 +
</source>
  
 +
=== vfsUnlockMntByMntIdForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xa1ef2648
+
| 3.60 || 0x5B7E5AB8
 
|}
 
|}
  
=== SceIofilemgrForDriver_12F8D58E ===
+
This is a guessed name.
 +
 
 +
Temp name was sceIoUmount2ForDriver.
 +
 
 +
<source lang="C">int vfsUnlockMntByMntIdForDriver(int vshMountId);</source>
  
 +
=== sceIoSetPathMappingFunctionForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x12F8D58E
+
| 3.60 || 0xCFAECF18
 
|}
 
|}
  
get some value
+
Used by [[SceAppMgr]].
 +
 
 +
Sets a callback function that does path mapping:
 +
 
 +
* function tries to OverlayResolveSync input path
 +
* checks that it is not a PD path (Pseudo Drive mount point aquired by [[ScePfsMgr]])
 +
* takes beginning of path until symbol ":"
 +
* tries to do a lookup by that path copy in data segment [[SceAppMgr#Data_segment_layout|global 0x3470C]] <code>mount_point_data_entry</code> item array
 +
* if item is found then <code>path</code> from <code>mount_point_data_entry</code> item is copied to <code>result_path</code>
 +
* in any other case OverlayResolveSync result path is copied to <code>result_path</code>
 +
 
 +
<source lang="C">
 +
typedef int ( SceIoPathMappingFunc)(const char *path, SceUID pid, char *result_path, SceSize size);
  
=== SceIofilemgrForDriver_15C17487 ===
+
int sceIoSetPathMappingFunctionForDriver(SceIoPathMappingFunc *func);
 +
</source>
  
 +
=== sceIoGetMediaTypeForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x15C17487
+
| 0.990-3.60 || 0x9C220246
 
|}
 
|}
  
tell some
+
Was wrongly named sceIoGetPathIdExForDriver.
  
<source>int SceIofilemgrForDriver_15C17487(int a1 /* io_device_code */);</source>
+
May also call callback function set by [[SceIofilemgr#sceIoSetPathMappingFunctionForDriver|sceIoSetPathMappingFunctionForDriver]].
  
=== SceIofilemgrForDriver_2EFDFA12 ===
+
This callback function does path mapping since result in result_path is passed to [[SceSblACMgr#sceSblACMgrGetMediaTypeForKernel|sceSblACMgrGetMediaTypeForKernel]].
 +
 
 +
<source lang="C">int sceIoGetMediaTypeForDriver(SceUID pid, const char *path, int ignored, int *media_type);</source>
  
 +
=== sceIoGetThreadDefaultPriorityForSystemForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x2EFDFA12
+
| 3.60 || 0x6D0FEDB6
 
|}
 
|}
  
set path by flags?
+
<source lang="C">int sceIoGetThreadDefaultPriorityForSystemForDriver(void);</source>
 
 
<source>int SceIofilemgrForDriver_2EFDFA12(SceUID fd, char *path);</source>
 
 
 
=== SceIofilemgrForDriver_3675ECB9 ===
 
  
 +
=== sceIoSetThreadDefaultPriorityForSystemForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x3675ECB9
+
| 3.60 || 0x3F0FF9D5
 
|}
 
|}
  
some node op. dec ctr.
+
=== sceIoGetRemoteKPLSDataForDriver ===
 
 
=== SceIofilemgrForDriver_3A79FAC9 ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x3A79FAC9
+
| 3.60 || 0x44EDCE57
 
|}
 
|}
  
delete fd by flags
+
This is a guessed name.
  
<source>int SceIofilemgrForDriver_3A79FAC9(SceUID fd);</source>
+
<source lang="C">int sceIoGetRemoteKPLSDataForDriver(SceUID pid, void *dst);</source>
 
 
=== SceIofilemgrForDriver_6BEEDDB4 ===
 
  
 +
=== sceIoSetProcessFileOpenMaxNumberForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x6BEEDDB4
+
| 3.60 || 0xAC0E9AAA
 
|}
 
|}
  
setting some to fd of dir entry
+
<source lang="C">int sceIoSetProcessFileOpenMaxNumberForDriver(SceUID pid, SceSize number);</source>
  
<source>int SceIofilemgrForDriver_6BEEDDB4(SceUID fd, int a2);</source>
+
=== sceIoSetProcessDirOpenMaxLevelForDriver ===
 
+
{| class="wikitable"
=== SceIofilemgrForDriver_A7020B0D ===
 
 
 
{| class="wikitable"
 
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xA7020B0D
+
| 3.60 || 0x03F6A684
 
|}
 
|}
  
big function
+
<source lang="C">int sceIoSetProcessDirOpenMaxLevelForDriver(SceUID pid, SceSize level);</source>
 
 
<source>int SceIofilemgrForDriver_A7020B0D(SceVfsNode *vp, int a2, int a3, int a4, int cache_size);</source>
 
 
 
=== SceIofilemgrForDriver_B499287E ===
 
  
 +
=== sceIoCompleteForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xB499287E
+
| 3.60 || 0x8F0DE34D
 
|}
 
|}
  
delete some puid from a1
+
<source lang="C">int sceIoCompleteForDriver(SceUID fd);</source>
 
 
<source>int SceIofilemgrForDriver_B499287E(void *a1, int n, int *num);</source>
 
 
 
=== sceIoGetMountInfoForDriver ===
 
  
 +
=== sceIoGetPriorityForSystemForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xB987450D
+
| 3.60 || 0x9FCDCE62
 
|}
 
|}
  
This is guessed name
+
<source lang="C">int sceIoGetPriorityForSystemForDriver(SceUID a1);</source>
 
 
<source>int sceIoGetMountInfoForDriver(void *mnt, void *info);</source>
 
 
 
=== sceIoGetMountVectorForDriver ===
 
  
 +
=== sceIoSetPriorityForSystemForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xC20C621C
+
| 3.60 || 0xCCE94599
 
|}
 
|}
  
This is guessed name
+
<source lang="C">int sceIoSetPriorityForSystemForDriver(SceUID a1, int a2);</source>
 
 
<source>int sceIoGetMountVectorForDriver(void *dst, int n, SceSize *num);</source>
 
 
 
=== SceIofilemgrForDriver_C468B5EF ===
 
  
 +
=== sceIoSetErrorEventForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xC468B5EF
+
| 0.995-3.60 || 0xDD46CD63
 
|}
 
|}
  
some thread op
+
Previously (wrongfully) called sceIoGetGUIDErrorEventListForDriver.
 
 
=== SceIofilemgrForDriver_C722DF35 ===
 
  
 +
=== sceIoSetDebuggerCallbackForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xC722DF35
+
| 3.60 || 0xF4F8C59A
 
|}
 
|}
  
some node op. inc ctr.
+
=== sceIoGetGUIDFdListForDebuggerForDriver ===
 
 
=== SceIofilemgrForDriver_D6AB5E4B ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xD6AB5E4B
+
| 3.60 || 0xdcf75f6d
 
|}
 
|}
  
some node op
+
=== sceIoGetPUIDFdListForDebuggerForDriver ===
 
 
=== sceIoSyncByFdForDriver ===
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x338dcd68
+
| 3.60 || 0xd493274
 
|}
 
|}
  
== SceIofilemgr ==
+
=== sceIoGetFileInfoForDriver ===
 
 
=== _sceIoDcloseAsync ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0x00B13031
+
| 3.60 || 0xa1ef2648
|-
 
| 3.60 || different NID or not present
 
 
|}
 
|}
  
=== _sceIoOpenAsync ===
+
This is a guessed name.
 +
 
 +
=== SceIofilemgrForDriver_12F8D58E ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x09CD0FC8
+
| 3.60 || 0x12F8D58E
 
|}
 
|}
  
=== sceIoGetProcessDefaultPriority ===
+
get some value
 +
 
 +
=== SceIofilemgrForDriver_15C17487 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x0DC4F1BB
+
| 0.996.090-3.740.011 || 0x15C17487
 
|}
 
|}
  
=== _sceIoRmdirAsync ===
+
A possible name is sceIoSchedulerIssueAnotherIoRequestForDriver.
 +
 
 +
<source lang="C">int SceIofilemgrForDriver_15C17487(int io_device_code);</source>
 +
 
 +
=== SceIofilemgrForDriver_2EFDFA12 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x13DC3244
+
| 3.60 || 0x2EFDFA12
 
|}
 
|}
  
=== sceIoSetPriority ===
+
set path by flags?
 +
 
 +
<source>int SceIofilemgrForDriver_2EFDFA12(SceUID fd, char *path);</source>
 +
 
 +
=== SceIofilemgrForDriver_3675ECB9 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x14B2D56C
+
| 3.60 || 0x3675ECB9
 
|}
 
|}
  
=== sceIoSyncByFd ===
+
could be sceIoSchedDispatcherFsResourceUnavailableForDriver.
 +
 
 +
some node op. dec ctr.
 +
 
 +
=== SceIofilemgrForDriver_3A79FAC9 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x16512F59
+
| 3.60 || 0x3A79FAC9
 
|}
 
|}
  
<source lang="C">int sceIoSyncByFd(SceUID fd, unsigned int unk);</source>
+
delete fd by flags
 +
 
 +
<source>int SceIofilemgrForDriver_3A79FAC9(SceUID fd);</source>
  
=== _sceIoIoctl ===
+
=== SceIofilemgrForDriver_6BEEDDB4 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x1D2988F1
+
| 3.60 || 0x6BEEDDB4
 
|}
 
|}
  
=== _sceIoLseekAsync ===
+
setting some to fd of dir entry
 +
 
 +
<source>int SceIofilemgrForDriver_6BEEDDB4(SceUID fd, int a2);</source>
 +
 
 +
=== SceIofilemgrForDriver_B499287E ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x2300858E
+
| 3.60 || 0xB499287E
 
|}
 
|}
  
=== sceIoSetPriorityForSystem ===
+
delete some puid from a1
{| class="wikitable"
+
 
|-
+
<source>int SceIofilemgrForDriver_B499287E(void *a1, int n, int *num);</source>
! Version !! NID
 
|-
 
| 1.69-3.60 || 0x27373135
 
|}
 
  
=== _sceIoComplete ===
+
=== SceIofilemgrForDriver_C722DF35 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0x34E6A06E
+
| 3.60 || 0xC722DF35
|-
 
| 3.60 || different NID or not present
 
 
|}
 
|}
  
=== sceIoWrite ===
+
some node op. inc ctr.
 +
 
 +
=== sceIoSyncByFdForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x34EFD876
+
| 3.60 || 0x338dcd68
 
|}
 
|}
  
<source lang="C">int sceIoWrite(SceUID fd, const void *data, SceSize size);</source>
+
== SceIofilemgr ==
  
=== _sceIoGetThreadDefaultPriorityForSystem ===
+
=== _sceIoDcloseAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0x36CAF911
+
| 1.69 || 0x00B13031
 
|-
 
|-
 
| 3.60 || different NID or not present
 
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoSetThreadDefaultPriorityForSystem ===
+
=== _sceIoOpenAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-1.69 || 0x38FE853B
+
| 1.69-3.60 || 0x09CD0FC8
|-
 
| 3.60 || different NID or not present
 
 
|}
 
|}
  
=== sceIoFlockForSystem ===
+
=== sceIoGetProcessDefaultPriority ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x3E98E422
+
| 1.69-3.60 || 0x0DC4F1BB
 
|}
 
|}
  
=== _sceIoDevctlAsync ===
+
=== _sceIoRmdirAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x3EE3F66E
+
| 1.69-3.60 || 0x13DC3244
 
|}
 
|}
  
=== sceIoDclose ===
+
=== sceIoSetPriority ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x422A221A
+
| 1.69-3.60 || 0x14B2D56C
 
|}
 
|}
  
<source lang="C">int sceIoDclose(SceUID fd);</source>
+
=== sceIoSyncByFd ===
 
 
=== _sceIoRename ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x4912F748
+
| 1.69-3.60 || 0x16512F59
 
|}
 
|}
  
<source lang="C">
+
<source lang="C">int sceIoSyncByFd(SceUID fd, unsigned int unk);</source>
typedef struct sceIoRenameOpt {
 
  uint32_t unk_0;
 
  uint32_t unk_4;
 
  uint32_t unk_8;
 
  uint32_t unk_C;
 
} sceIoRenameOpt;
 
  
int _sceIoRename(const char *oldname, const char *newname, sceIoRenameOpt *opt);
+
=== _sceIoIoctl ===
</source>
 
 
 
=== sceIoLseek32 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x49252B9B
+
| 1.69-3.60 || 0x1D2988F1
 
|}
 
|}
  
<source lang="C">int sceIoLseek32(SceUID fd, int offset, int whence);</source>
+
=== _sceIoLseekAsync ===
 
 
=== sceIoSetThreadDefaultPriority ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x49312108
+
| 1.69-3.60 || 0x2300858E
 
|}
 
|}
  
=== _sceIoDevctl ===
+
=== sceIoSetPriorityForSystem ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x515AC017
+
| 1.69-3.60 || 0x27373135
 
|}
 
|}
  
<source lang="C">
+
=== _sceIoComplete ===
typedef struct sceIoDevctlOpt {
+
{| class="wikitable"
  uint32_t unk_0;
+
|-
  uint32_t unk_4;
+
! Version !! NID
  uint32_t unk_8;
+
|-
  uint32_t unk_C;
+
| 1.69 || 0x34E6A06E
  uint32_t unk_10;
+
|-
  uint32_t unk_14;
+
| 3.60 || different NID or not present
} sceIoDevctlOpt;
+
|}
 +
 
 +
=== sceIoWrite ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0x34EFD876
 +
|}
  
int _sceIoDevctl(const char *dev, unsigned int cmd, void *indata, sceIoDevctlOpt *args, int inlen, void *outdata, int outlen);
+
<source lang="C">int sceIoWrite(SceUID fd, const void *data, SceSize size);</source>
</source>
 
  
=== sceIoGetstatByFdAsync ===
+
=== _sceIoGetThreadDefaultPriorityForSystem ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x5167AC1E
+
| 1.69 || 0x36CAF911
 +
|-
 +
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoPread ===
+
=== _sceIoSetThreadDefaultPriorityForSystem ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x539FD5C4
+
| 0.990-1.69 || 0x38FE853B
 +
|-
 +
| 3.60 || different NID or not present
 
|}
 
|}
  
<source lang="C">
+
=== sceIoFlockForSystem ===
typedef struct sceIoPreadOpt {
+
{| class="wikitable"
   SceOff offset;
+
|-
   uint32_t unk_8;
+
! Version !! NID
   uint32_t unk_C;
+
|-
} sceIoPreadOpt;
+
| 1.69-3.60 || 0x3E98E422
 +
|}
 +
 
 +
=== _sceIoDevctlAsync ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0x3EE3F66E
 +
|}
 +
 
 +
=== sceIoDclose ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0x422A221A
 +
|}
 +
 
 +
<source lang="C">int sceIoDclose(SceUID fd);</source>
 +
 
 +
=== _sceIoRename ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0x4912F748
 +
|}
 +
 
 +
<source lang="C">
 +
typedef struct sceIoRenameOpt {
 +
  uint32_t unk_0;
 +
  uint32_t unk_4;
 +
  uint32_t unk_8;
 +
  uint32_t unk_C;
 +
} sceIoRenameOpt;
 +
 
 +
int _sceIoRename(const char *oldname, const char *newname, sceIoRenameOpt *opt);
 +
</source>
 +
 
 +
=== sceIoLseek32 ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0x49252B9B
 +
|}
 +
 
 +
<source lang="C">int sceIoLseek32(SceUID fd, int offset, int whence);</source>
 +
 
 +
=== sceIoSetThreadDefaultPriority ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0x49312108
 +
|}
 +
 
 +
=== _sceIoDevctl ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.000.071-3.740.011 || 0x515AC017
 +
|}
 +
 
 +
This performs device-specific operations. The details of the operations are driver-dependent.
 +
 
 +
This is a wrapper for [[#sceIoDevctlForDriver|sceIoDevctlForDriver]].
 +
 
 +
<source lang="C">
 +
/*
 +
Arguments:
 +
devname    Specified device ("<devname><unit>:")
 +
cmd    Command code
 +
arg    Pointer to device-driver-dependent parameter block
 +
arglen    Number of bytes in device-driver-dependent parameter block
 +
bufp    Pointer to return data storage block
 +
buflen    Size of return data storage block
 +
 
 +
Return Values:
 +
Non-negative (N>=0) Success (driver-dependent)
 +
<0 Error, e.g. SCE_ERROR_ERRNO_EMFILE, SCE_ERROR_ERRNO_ENODEV, SCE_ERROR_ERRNO_EUNSUP
 +
*/
 +
 
 +
typedef struct SceIoDevctlOpt { // size is 0x18
 +
    SceSize arglen; // Number of bytes in device-driver-dependent parameter block
 +
    void *bufp; // Pointer to return data storage block
 +
    SceSize buflen; // Size of return data storage block
 +
    char reserved[0xC];
 +
} SceIoDevctlOpt;
 +
 
 +
int _sceIoDevctl(
 +
    const char *devname,
 +
    int cmd,
 +
    const void *arg,
 +
    const SceIoDevctlOpt *pOpt
 +
);
 +
</source>
 +
 
 +
=== sceIoGetstatByFdAsync ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0x5167AC1E
 +
|}
 +
 
 +
=== _sceIoPread ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0x539FD5C4
 +
|}
 +
 
 +
<source lang="C">
 +
typedef struct sceIoPreadOpt {
 +
   SceOff offset;
 +
   uint32_t unk_8;
 +
   uint32_t unk_C;
 +
} sceIoPreadOpt;
 +
 
 +
int _sceIoPread(SceUID uid, void *buffer, SceSize size, sceIoPreadOpt *opt);
 +
 
 +
// 3.60
 +
typedef struct SceIoPreadSyscallArgs {
 +
void *buf;
 +
SceSize nbyte;
 +
SceOff offset;
 +
} SceIoPreadSyscallArgs;
 +
 
 +
SceSSize _sceIoPread(SceUID fd, SceIoPreadSyscallArgs *args);
 +
</source>
 +
 
 +
=== _sceIoGetstatByFdAsync ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69 || 0x554292F0
 +
|-
 +
| 3.60 || different NID or not present
 +
|}
 +
 
 +
=== _sceIoChstatByFdAsync ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69 || 0x58010F40
 +
|-
 +
| 3.60 || different NID or not present
 +
|}
 +
 
 +
=== _sceIoGetThreadDefaultPriority ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69 || 0x5DC29460
 +
|-
 +
| 3.60 || different NID or not present
 +
|}
 +
 
 +
=== _sceIoSync ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0x5DD867F7
 +
|}
 +
 
 +
<source lang="C">
 +
typedef struct sceIoSyncOpt {
 +
  uint32_t unk_0;
 +
  uint32_t unk_4;
 +
} sceIoSyncOpt;
 +
 
 +
int _sceIoSync(const char* device, unsigned int unk, sceIoSyncOpt* opt);
 +
</source>
 +
 
 +
=== _sceIoRemoveAsync ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0x5FFA47E2
 +
|}
 +
 
 +
=== _sceIoDreadAsync ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69 || 0x64B233B8
 +
|-
 +
| 3.60 || different NID or not present
 +
|}
  
int _sceIoPread(SceUID uid, void *buffer, SceSize size, sceIoPreadOpt *opt);
+
=== _sceIoSetThreadDefaultPriority ===
 
 
// 3.60
 
typedef struct SceIoPreadSyscallArgs {
 
void *buf;
 
SceSize nbyte;
 
SceOff offset;
 
} SceIoPreadSyscallArgs;
 
 
 
SceSSize _sceIoPread(SceUID fd, SceIoPreadSyscallArgs *args);
 
</source>
 
 
 
=== _sceIoGetstatByFdAsync ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0x554292F0
+
| 0.990-1.69 || 0x654E27B1
 
|-
 
|-
 
| 3.60 || different NID or not present
 
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoChstatByFdAsync ===
+
=== _sceIoSyncByFdAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0x58010F40
+
| 1.69 || 0x6F78FAFE
 
|-
 
|-
 
| 3.60 || different NID or not present
 
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoGetThreadDefaultPriority ===
+
=== _sceIoGetPriorityForSystem ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0x5DC29460
+
| 1.69 || 0x70B7BB52
 
|-
 
|-
 
| 3.60 || different NID or not present
 
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoSync ===
+
=== sceIoReadAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x5DD867F7
+
| 1.69-3.60 || 0x773EBD45
 +
|}
 +
 
 +
=== _sceIoRemove ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0x78955C65
 
|}
 
|}
  
 
<source lang="C">
 
<source lang="C">
typedef struct sceIoSyncOpt {
+
typedef struct sceIoRemoveOpt {
 
   uint32_t unk_0;
 
   uint32_t unk_0;
 
   uint32_t unk_4;
 
   uint32_t unk_4;
} sceIoSyncOpt;
+
} sceIoRemoveOpt;
  
int _sceIoSync(const char* device, unsigned int unk, sceIoSyncOpt* opt);
+
int _sceIoRemove(const char *filename, sceIoRemoveOpt* opt);
 
</source>
 
</source>
  
=== _sceIoRemoveAsync ===
+
=== sceIoSyncByFdAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x5FFA47E2
+
| 1.69-3.60 || 0x7E1367CB
 
|}
 
|}
  
=== _sceIoDreadAsync ===
+
=== sceIoSetProcessDefaultPriority ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0x64B233B8
+
| 1.69-3.60 || 0x7F2ABBAF
|-
 
| 3.60 || different NID or not present
 
 
|}
 
|}
  
=== _sceIoSetThreadDefaultPriority ===
+
=== _sceIoRenameAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-1.69 || 0x654E27B1
+
| 1.69-3.60 || 0x81794921
|-
 
| 3.60 || different NID or not present
 
 
|}
 
|}
  
=== _sceIoSyncByFdAsync ===
+
=== _sceIoSyncAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0x6F78FAFE
+
| 1.69-3.60 || 0x86DB0C0E
|-
 
| 3.60 || different NID or not present
 
 
|}
 
|}
  
=== _sceIoGetPriorityForSystem ===
+
=== _sceIoDread ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0x70B7BB52
+
| 1.69-3.60 || 0x8713D662
|-
 
| 3.60 || different NID or not present
 
 
|}
 
|}
  
=== sceIoReadAsync ===
+
<source lang="C">int _sceIoDread(SceUID fd, SceIoDirent *dir);</source>
 +
 
 +
=== _sceIoWrite ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x773EBD45
+
| 1.69 || 0x8C319CF0
 +
|-
 +
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoRemove ===
+
=== _sceIoGetstat ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x78955C65
+
| 1.69-3.60 || 0x8E7E11F2
 
|}
 
|}
  
 
<source lang="C">
 
<source lang="C">
typedef struct sceIoRemoveOpt {
+
typedef struct sceIoGetstatOpt {
 
   uint32_t unk_0;
 
   uint32_t unk_0;
 
   uint32_t unk_4;
 
   uint32_t unk_4;
} sceIoRemoveOpt;
+
} sceIoGetstatOpt;
  
int _sceIoRemove(const char *filename, sceIoRemoveOpt* opt);
+
int _sceIoGetstat(const char *name, SceIoStat *buf, sceIoGetstatOpt *opt);
 
</source>
 
</source>
  
=== sceIoSyncByFdAsync ===
+
=== sceIoCloseAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x7E1367CB
+
| 1.69-3.60 || 0x8EA3616A
 
|}
 
|}
  
=== sceIoSetProcessDefaultPriority ===
+
=== _sceIoMkdir ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x7F2ABBAF
+
| 1.69-3.60 || 0x8F1ACC32
 
|}
 
|}
  
=== _sceIoRenameAsync ===
+
<source lang="C">
{| class="wikitable"
+
typedef struct sceIoMkdirOpt {
|-
+
  uint32_t unk_0;
! Version !! NID
+
  uint32_t unk_4;
|-
+
} sceIoMkdirOpt;
| 1.69-3.60 || 0x81794921
 
|}
 
  
=== _sceIoSyncAsync ===
+
int _sceIoMkdir(const char *dirname, SceIoMode mode, sceIoMkdirOpt opt);
{| class="wikitable"
+
</source>
|-
 
! Version !! NID
 
|-
 
| 1.69-3.60 || 0x86DB0C0E
 
|}
 
  
=== _sceIoDread ===
+
=== _sceIoCompleteMultiple ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x8713D662
+
| 1.69-3.60 || 0x9111D004
 
|}
 
|}
  
<source lang="C">int _sceIoDread(SceUID fd, SceIoDirent *dir);</source>
+
=== _sceIoLseek32 ===
 
 
=== _sceIoWrite ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0x8C319CF0
+
| 1.69 || 0x92BDA6DA
 
|-
 
|-
 
| 3.60 || different NID or not present
 
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoGetstat ===
+
=== _sceIoPwrite ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x8E7E11F2
+
| 1.69-3.60 || 0x9654094B
 
|}
 
|}
  
 
<source lang="C">
 
<source lang="C">
typedef struct sceIoGetstatOpt {
+
typedef struct sceIoPwriteOpt {
  uint32_t unk_0;
+
  SceOff offset;
  uint32_t unk_4;
+
  uint32_t unk_8;
} sceIoGetstatOpt;
+
  uint32_t unk_C;
 +
} sceIoPwriteOpt;
  
int _sceIoGetstat(const char *name, SceIoStat *buf, sceIoGetstatOpt *opt);
+
int _sceIoPwrite(SceUID uid, const void *data, int size, sceIoPwriteOpt *opt);
 +
 
 +
// 3.60
 +
typedef struct SceIoPwriteSyscallArgs {
 +
const void *buf;
 +
SceSize nbyte;
 +
SceOff offset;
 +
} SceIoPwriteSyscallArgs;
 +
 
 +
SceSSize _sceIoPwrite(SceUID fd, SceIoPwriteSyscallArgs *args);
 
</source>
 
</source>
  
=== sceIoCloseAsync ===
+
=== _sceIoGetPriority ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x8EA3616A
+
| 1.69 || 0x9E3F880D
 +
|-
 +
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoMkdir ===
+
=== sceIoGetThreadDefaultPriority ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x8F1ACC32
+
| 1.69-3.60 || 0xA176CD03
 
|}
 
|}
  
<source lang="C">
+
=== _sceIoLseek ===
typedef struct sceIoMkdirOpt {
 
  uint32_t unk_0;
 
  uint32_t unk_4;
 
} sceIoMkdirOpt;
 
 
 
int _sceIoMkdir(const char *dirname, SceIoMode mode, sceIoMkdirOpt opt);
 
</source>
 
 
 
=== _sceIoCompleteMultiple ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x9111D004
+
| 1.69-3.60 || 0xA604764A
 
|}
 
|}
  
=== _sceIoLseek32 ===
+
<source lang="C">
{| class="wikitable"
+
typedef struct _sceIoLseekOpt { // size is 0x10
|-
+
  SceOff offset;
 +
  int whence;
 +
  uint32_t unk;
 +
} _sceIoLseekOpt;
 +
 
 +
SceOff _sceIoLseek(SceUID fd, _sceIoLseekOpt* opt);
 +
 
 +
// 3.60
 +
typedef struct SceIoLseekSyscallArgs {
 +
SceOff offset;
 +
int whence;
 +
int padding;
 +
} SceIoLseekSyscallArgs;
 +
 
 +
SceOff _sceIoLseek(SceUID fd, SceIoLseekSyscallArgs *args);
 +
</source>
 +
 
 +
=== sceIoChstatByFdAsync ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0xA9F89275
 +
|}
 +
 
 +
=== _sceIoGetProcessDefaultPriority ===
 +
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0x92BDA6DA
+
| 1.69 || 0xB0486482
 
|-
 
|-
 
| 3.60 || different NID or not present
 
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoPwrite ===
+
=== _sceIoSetPriority ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x9654094B
+
| 0.990-1.69 || 0xB14192F0
 +
|-
 +
| 3.60 || different NID or not present
 
|}
 
|}
  
<source lang="C">
+
=== _sceIoReadAsync ===
typedef struct sceIoPwriteOpt {
+
{| class="wikitable"
  SceOff offset;
 
  uint32_t unk_8;
 
  uint32_t unk_C;
 
} sceIoPwriteOpt;
 
 
 
int _sceIoPwrite(SceUID uid, const void *data, int size, sceIoPwriteOpt *opt);
 
 
 
// 3.60
 
typedef struct SceIoPwriteSyscallArgs {
 
const void *buf;
 
SceSize nbyte;
 
SceOff offset;
 
} SceIoPwriteSyscallArgs;
 
 
 
SceSSize _sceIoPwrite(SceUID fd, SceIoPwriteSyscallArgs *args);
 
</source>
 
 
 
=== _sceIoGetPriority ===
 
{| class="wikitable"
 
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0x9E3F880D
+
| 1.69 || 0xB2B891E6
 
|-
 
|-
 
| 3.60 || different NID or not present
 
| 3.60 || different NID or not present
 
|}
 
|}
  
=== sceIoGetThreadDefaultPriority ===
+
=== _sceIoPwriteAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xA176CD03
+
| 1.69-3.60 || 0xB2D0B2F4
 
|}
 
|}
  
=== _sceIoLseek ===
+
=== _sceIoChstatAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xA604764A
+
| 1.69-3.60 || 0xB4B021D9
 
|}
 
|}
  
<source lang="C">
+
=== sceIoSetThreadDefaultPriorityForSystem ===
typedef struct _sceIoLseekOpt { // size is 0x10
+
{| class="wikitable"
  SceOff offset;
+
|-
  int whence;
+
! Version !! NID
  uint32_t unk;
+
|-
} _sceIoLseekOpt;
+
| 1.69-3.60 || 0xB9C9C9CF
 +
|}
  
SceOff _sceIoLseek(SceUID fd, _sceIoLseekOpt* opt);
+
=== _sceIoPreadAsync ===
 
 
// 3.60
 
typedef struct SceIoLseekSyscallArgs {
 
SceOff offset;
 
int whence;
 
int padding;
 
} SceIoLseekSyscallArgs;
 
 
 
SceOff _sceIoLseek(SceUID fd, SceIoLseekSyscallArgs *args);
 
</source>
 
 
 
=== sceIoChstatByFdAsync ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xA9F89275
+
| 1.69-3.60 || 0xBCF5684D
 
|}
 
|}
  
=== _sceIoGetProcessDefaultPriority ===
+
=== sceIoDopenAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0xB0486482
+
| 1.69-3.60 || 0xC49C312F
|-
 
| 3.60 || different NID or not present
 
 
|}
 
|}
  
=== _sceIoSetPriority ===
+
=== sceIoClose ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-1.69 || 0xB14192F0
+
| 1.69-3.60 || 0xC70B8886
|-
 
| 3.60 || different NID or not present
 
 
|}
 
|}
  
=== _sceIoReadAsync ===
+
<source lang="C">int sceIoClose(SceUID fd);</source>
 +
 
 +
=== _sceIoWriteAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0xB2B891E6
+
| 1.69 || 0xC92AF88F
 
|-
 
|-
 
| 3.60 || different NID or not present
 
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoPwriteAsync ===
+
=== _sceIoOpen ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xB2D0B2F4
+
| 1.69-3.60 || 0xCC67B6FD
 
|}
 
|}
  
=== _sceIoChstatAsync ===
+
<source lang="C">
 +
typedef struct sceIoOpenOpt {
 +
  uint32_t unk_0;
 +
  uint32_t unk_4;
 +
} sceIoOpenOpt;
 +
 
 +
SceUID _sceIoOpen(const char *filename, int flag, SceIoMode mode, sceIoOpenOpt *opt);
 +
</source>
 +
 
 +
=== sceIoCancel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xB4B021D9
+
| 1.69-3.60 || 0xCEF48835
 
|}
 
|}
  
=== sceIoSetThreadDefaultPriorityForSystem ===
+
=== sceIoComplete ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xB9C9C9CF
+
| 1.69-3.60 || 0xD1C49D2F
 
|}
 
|}
  
=== _sceIoPreadAsync ===
+
=== _sceIoChstat ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xBCF5684D
+
| 1.69-3.60 || 0xD2EE455F
 
|}
 
|}
  
=== sceIoDopenAsync ===
+
<source lang="C">
 +
typedef struct sceIoChstatOpt {
 +
  uint32_t unk_0;
 +
  uint32_t unk_4;
 +
} sceIoChstatOpt;
 +
 
 +
int _sceIoChstat(const char *name, const SceIoStat *stat, unsigned int cbit, sceIoChstatOpt *opt);
 +
</source>
 +
 
 +
=== _sceIoSetProcessDefaultPriority ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xC49C312F
+
| 0.990-1.69 || 0xD302DCB9
 +
|-
 +
| 3.60 || different NID or not present
 
|}
 
|}
  
=== sceIoClose ===
+
=== _sceIoGetstatAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xC70B8886
+
| 1.69-3.60 || 0xD414C89F
 
|}
 
|}
  
<source lang="C">int sceIoClose(SceUID fd);</source>
+
=== sceIoDcloseAsync ===
 
 
=== _sceIoWriteAsync ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69 || 0xC92AF88F
+
| 1.69-3.60 || 0xDC2D7D38
|-
 
| 3.60 || different NID or not present
 
 
|}
 
|}
  
=== _sceIoOpen ===
+
=== _sceIoIoctlAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xCC67B6FD
+
| 1.69-3.60 || 0xE00DC256
 
|}
 
|}
  
<source lang="C">
+
=== _sceIoChstatByFd ===
typedef struct sceIoOpenOpt {
 
  uint32_t unk_0;
 
  uint32_t unk_4;
 
} sceIoOpenOpt;
 
 
 
SceUID _sceIoOpen(const char *filename, int flag, SceIoMode mode, sceIoOpenOpt *opt);
 
</source>
 
 
 
=== sceIoCancel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xCEF48835
+
| 1.69-3.60 || 0xE0BE2A30
 
|}
 
|}
  
=== sceIoComplete ===
+
<source lang="C">int _sceIoChstatByFd(SceUID fd, const SceIoStat *buf, unsigned int cbit);</source>
 +
 
 +
=== sceIoWriteAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xD1C49D2F
+
| 1.69-3.60 || 0xE0D63D2A
 
|}
 
|}
  
=== _sceIoChstat ===
+
=== _sceIoGetstatByFd ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xD2EE455F
+
| 1.69-3.60 || 0xE6C53567
 
|}
 
|}
  
<source lang="C">
+
<source lang="C">int _sceIoGetstatByFd(SceUID fd, SceIoStat *stat);</source>
typedef struct sceIoChstatOpt {
 
  uint32_t unk_0;
 
  uint32_t unk_4;
 
} sceIoChstatOpt;
 
  
int _sceIoChstat(const char *name, const SceIoStat *stat, unsigned int cbit, sceIoChstatOpt *opt);
+
=== _sceIoSetPriorityForSystem ===
</source>
 
 
 
=== _sceIoSetProcessDefaultPriority ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-1.69 || 0xD302DCB9
+
| 0.990-1.69 || 0xE6C923B3
 
|-
 
|-
 
| 3.60 || different NID or not present
 
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoGetstatAsync ===
+
=== _sceIoDopen ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xD414C89F
+
| 1.69-3.60 || 0xE6E614B5
 
|}
 
|}
  
=== sceIoDcloseAsync ===
+
<source lang="C">
 +
typedef struct sceIoDopenOpt {
 +
  uint32_t unk_0;
 +
  uint32_t unk_4;
 +
} sceIoDopenOpt;
 +
 
 +
SceUID _sceIoDopen(const char *dirname, sceIoDopenOpt *opt);
 +
</source>
 +
 
 +
=== sceIoGetPriorityForSystem ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xDC2D7D38
+
| 1.69-3.60 || 0xEF5432ED
 
|}
 
|}
  
=== _sceIoIoctlAsync ===
+
=== sceIoGetPriority ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xE00DC256
+
| 1.69-3.60 || 0xF2A472A1
 
|}
 
|}
  
=== _sceIoChstatByFd ===
+
=== _sceIoRead ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xE0BE2A30
+
| 1.69-3.60 || different NID or not present
 
|}
 
|}
  
<source lang="C">int _sceIoChstatByFd(SceUID fd, const SceIoStat *buf, unsigned int cbit);</source>
+
=== _sceIoSyncByFd ===
 
 
=== sceIoWriteAsync ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xE0D63D2A
+
| 1.69-3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoGetstatByFd ===
+
=== _sceIoCloseAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xE6C53567
+
| 1.69-3.60 || different NID or not present
 
|}
 
|}
  
<source lang="C">int _sceIoGetstatByFd(SceUID fd, SceIoStat *stat);</source>
+
=== _sceIoDopenAsync ===
 
 
=== _sceIoSetPriorityForSystem ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-1.69 || 0xE6C923B3
+
| 1.69-3.60 || different NID or not present
|-
 
| 3.60 || different NID or not present
 
 
|}
 
|}
  
=== _sceIoDopen ===
+
=== sceIoDreadAsync ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xE6E614B5
+
| 1.69-3.60 || 0xF59F37B0
 
|}
 
|}
  
<source lang="C">
+
=== _sceIoMkdirAsync ===
typedef struct sceIoDopenOpt {
 
  uint32_t unk_0;
 
  uint32_t unk_4;
 
} sceIoDopenOpt;
 
 
 
SceUID _sceIoDopen(const char *dirname, sceIoDopenOpt *opt);
 
</source>
 
 
 
=== sceIoGetPriorityForSystem ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xEF5432ED
+
| 1.69-3.60 || 0xF5C58B21
 
|}
 
|}
  
=== sceIoGetPriority ===
+
=== _sceIoCancel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xF2A472A1
+
| 1.69 || 0xF5DEEA19
 +
|-
 +
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoRead ===
+
=== _sceIoClose ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || different NID or not present
+
| 1.69 || 0xF69FB394
 +
|-
 +
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoSyncByFd ===
+
=== _sceIoDclose ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || different NID or not present
+
| 0.990-1.69 || 0xFAFF0002
 +
|-
 +
| 3.60 || different NID or not present
 
|}
 
|}
  
=== _sceIoCloseAsync ===
+
=== sceIoGetThreadDefaultPriorityForSystem ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || different NID or not present
+
| 1.69-3.60 || 0xFCBCEAED
 
|}
 
|}
  
=== _sceIoDopenAsync ===
+
=== sceIoRead ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || different NID or not present
+
| 1.69-3.60 || 0xFDB32293
 
|}
 
|}
  
=== sceIoDreadAsync ===
+
<source lang="C">sceIoRead(SceUID fd, void *data, SceSize size);</source>
{| class="wikitable"
 
|-
 
! Version !! NID
 
|-
 
| 1.69-3.60 || 0xF59F37B0
 
|}
 
  
=== _sceIoMkdirAsync ===
+
=== _sceIoRmdir ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xF5C58B21
+
| 1.69-3.60 || 0xFFFB4D76
 
|}
 
|}
  
=== _sceIoCancel ===
+
<source lang="C">
{| class="wikitable"
+
typedef struct sceIoRmdirOpt {
|-
+
  uint32_t unk_0;
! Version !! NID
+
  uint32_t unk_4;
|-
+
} sceIoRmdirOpt;
| 1.69 || 0xF5DEEA19
 
|-
 
| 3.60 || different NID or not present
 
|}
 
  
=== _sceIoClose ===
+
int _sceIoRmdir(const char *dirname, sceIoRmdirOpt* opt);
{| class="wikitable"
+
</source>
|-
 
! Version !! NID
 
|-
 
| 1.69 || 0xF69FB394
 
|-
 
| 3.60 || different NID or not present
 
|}
 
 
 
=== _sceIoDclose ===
 
{| class="wikitable"
 
|-
 
! Version !! NID
 
|-
 
| 0.990-1.69 || 0xFAFF0002
 
|-
 
| 3.60 || different NID or not present
 
|}
 
 
 
=== sceIoGetThreadDefaultPriorityForSystem ===
 
{| class="wikitable"
 
|-
 
! Version !! NID
 
|-
 
| 1.69-3.60 || 0xFCBCEAED
 
|}
 
 
 
=== sceIoRead ===
 
{| class="wikitable"
 
|-
 
! Version !! NID
 
|-
 
| 1.69-3.60 || 0xFDB32293
 
|}
 
 
 
<source lang="C">sceIoRead(SceUID fd, void *data, SceSize size);</source>
 
 
 
=== _sceIoRmdir ===
 
{| class="wikitable"
 
|-
 
! Version !! NID
 
|-
 
| 1.69-3.60 || 0xFFFB4D76
 
|}
 
 
 
<source lang="C">
 
typedef struct sceIoRmdirOpt {
 
  uint32_t unk_0;
 
  uint32_t unk_4;
 
} sceIoRmdirOpt;
 
 
 
int _sceIoRmdir(const char *dirname, sceIoRmdirOpt* opt);
 
</source>
 
 
 
== Device Drivers ==
 
  
 +
== Device Drivers ==
  
 +
[[Category:ARM]]
 +
[[Category:Kernel]]
 
[[Category:Modules]]
 
[[Category:Modules]]
[[Category:Kernel]]
+
[[Category:Library]]

Latest revision as of 13:51, 13 November 2023

SceIofilemgr is the primary interface for file IO. Read File Management for more information on file IO.

Module

This module exists only in non-secure world. The SELF can be found in os0:kd/iofilemgr.skprx.

Version World Privilege
0.990-3.60 Non-secure Kernel

Libraries

Known NIDs

Version Name World Visibility NID
1.69-3.60 SceIofilemgrForDriver Non-secure Kernel 0x40FD29C7
1.69-3.60 SceIofilemgr Non-secure User 0xF2FF276E

Debug callback type

Type When
0x0 Scheduled sceIoOpen start
0x1 Scheduled sceIoOpen end
0x2 sceVopOpen start
0x3 sceVopOpen end
0x4 Scheduled sceIoClose start
0x5 Scheduled sceIoClose end
0x6 sceVopClose start
0x7 sceVopClose end
0x8 Scheduled sceIoRead start
0x9 Scheduled sceIoRead end
0xA sceVopRead start
0xB sceVopRead end
0xC Scheduled sceIoWrite start
0xD Scheduled sceIoWrite end
0xE sceVopWrite start
0xF sceVopWrite end
0x10 Scheduled sceIoPread start
0x11 Scheduled sceIoPread end
0x12 sceVopPread start
0x13 sceVopPread end
0x14 Scheduled sceIoPwrite start
0x15 Scheduled sceIoPwrite end
0x16 sceVopPwrite start
0x17 sceVopPwrite end
0x18 Scheduled sceIoLseek start
0x19 Scheduled sceIoLseek end
0x1A sceVopLseek start
0x1B sceVopLseek end
0x1C Scheduled sceIoMkdir start
0x1D Scheduled sceIoMkdir end
0x1E sceVopMkdir start
0x1F sceVopMkdir end
0x20 Scheduled sceIoRmdir start
0x21 Scheduled sceIoRmdir end
0x22 sceVopRmdir start
0x23 sceVopRmdir end
0x24 Scheduled sceIoGetstat start
0x25 Scheduled sceIoGetstat end
0x26 sceVopGetstat start
0x27 sceVopGetstat end
0x28 Scheduled sceIoRemove start
0x29 Scheduled sceIoRemove end
0x2A sceVopRemove start
0x2B sceVopRemove end
0x2C Scheduled sceIoRename start
0x2D Scheduled sceIoRename end
0x2E sceVopRename start
0x2F sceVopRename end
0x30 -
0x31 -
0x32 Scheduled sceIoDopen start
0x33 Scheduled sceIoDopen end
0x34 sceVopDopen start
0x35 sceVopDopen end
0x36 Scheduled sceIoDread start
0x37 Scheduled sceIoDread end
0x38 sceVopDread start
0x39 sceVopDread end
0x3A Scheduled sceIoDclose start
0x3B Scheduled sceIoDclose end
0x3C sceVopDclose start
0x3D sceVopDclose end
0x3E Scheduled sceIoChstat start
0x3F Scheduled sceIoChstat end
0x40 sceVopChstat start
0x41 sceVopChstat end
0x42 Scheduled sceIoIoctl start
0x43 Scheduled sceIoIoctl end
0x44 sceVopIoctl start
0x45 sceVopIoctl end
0x46 Scheduled sceIoSync start
0x47 Scheduled sceIoSync end
0x48 sceVopSync start
0x49 sceVopSync end
0x4A Scheduled sceIoFgetstat start
0x4B Scheduled sceIoFgetstat end
0x4C sceVopFgetstat start/end
0x4D -
0x4E Scheduled sceIoFchstat start
0x4F Scheduled sceIoFchstat end
0x50 sceVopFchstat start
0x51 sceVopFchstat end
0x52 sceVopLookup start
0x53 sceVopLookup end
0x54 sceVopCreate start
0x55 sceVopCreate end
0x56 sceVopInactive start
0x57 sceVopInactive end
0x58 sceVopWhiteout start
0x59 -
0x5A sceVopWhiteout end
0x5B sceVopCleanup start
0x5C sceVopCleanup end
0x5D sceVfsOpMount start
0x5E sceVfsOpMount end
0x5F sceVfsOpUnmount start
0x60 sceVfsOpUnmount end
0x61 sceVfsOpDevctl start
0x62 sceVfsOpDevctl end
0x63 sceVfsOpSync start
0x64 sceVfsOpSync end
0x65 sceVfsOpDecodePathElem start
0x66 sceVfsOpDecodePathElem end

Mount Points

This table is stored in data segment of SceIofilemgr as array of vfs_mount_point_info elements.

When #sceVfsMountForDriver is executed, it finds vfs_add_data element by filesystem string and then selects appropriate mount scenario by devMinor and devMajor.

  • <rnd> means random numeric string of length 13

See SceSdstor for "sdstor0:" Block Device.

Unix Mount Dev Major Dev Minor fsName assignName blockdevName VSH Mount Id Comment
/PD<rnd> 0x3 0x1001 PFS_GDSD_INF PD<rnd>0 - 0x0 -
/sd/exfat 0x2030001 0x30002 exfat sd0: sdstor0:ext-lp-act-entire 0x100 -
/os/exfat 0x1000001 0x1002 exfat os0: sdstor0:int-lp-act-os 0x200 Formatted as FAT16.
/vs/exfat 0x1000001 0x1002 exfat vs0: sdstor0:int-lp-ign-vsh 0x300 Formatted as FAT16.
/vd/exfat 0x1000001 0x10002 exfat vd0: sdstor0:int-lp-ign-vshdata 0x400 Formatted as FAT16.
/tm/exfat 0x1000001 0x10002 exfat tm0: sdstor0:int-lp-ign-vtrm 0x500 Formatted as FAT16.
/ur/exfat 0x1000001 0x50002 exfat ur0: sdstor0:int-lp-ign-user 0x600 Formatted as exFAT.
/ud/exfat 0x1000001 0x10002 exfat ud0: sdstor0:int-lp-ign-updater 0x700 Formatted as FAT16.
/ux/exfat 0x2020001 0x30002 exfat ux0: External: sdstor0:xmc-lp-ign-userext
Internal: sdstor0:int-lp-ign-userext
0x800 Formatted as exFAT.
/gro/exfat 0x2010001 0x21002 exfat gro0: sdstor0:gcd-lp-ign-gamero 0x900 Formatted as exFAT.
/grw/exfat 0x2010001 0x20002 exfat grw0: sdstor0:gcd-lp-ign-gamerw 0xA00 Formatted as exFAT.
/sa/exfat 0x1000001 0x1002 exfat sa0: sdstor0:int-lp-ign-sysdata 0xB00 Formatted as FAT16.
/pd/exfat 0x1000001 0x1002 exfat pd0: sdstor0:int-lp-ign-pidata 0xC00 Formatted as exFAT.
/imc/exfat 0x2020001 0x30002 exfat imc0: sdstor0:int-lp-ign-userext 0xD00 Formatted as exFAT.
/xmc/exfat 0x2020001 0x30002 exfat xmc0: sdstor0:xmc-lp-ign-userext 0xE00 Formatted as exFAT.
/uma/exfat 0x2030001 0x2 exfat uma0: sdstor0:uma-lp-act-entire 0xF00 -
/tty 0x4000020 0x6003 dummy_ttyp_dev_fs tty dummy_ttyp_dev_fs 0x0 -
/dev 0x10 0x3 sdstor_dev_fs sdstor0: sd 0x1 -
/md 0x10 0x2003 md_dev_fs md0: md 0x2 -
/lma/exfat 0x1 0x5 exfat lma0: / 0x10000 -
/lmb/exfat 0x1 0x5 exfat lmb0: / 0x20000 -
/mfa/exfat 0x1 0x5 exfat mfa0: / 0x50000 -
/mfb/exfat 0x1 0x5 exfat mfb0: / 0x60000 -
/host 0x3000004 0x8006 - host0: deci4p_drfp_dev_fs - -

Dev Minor

Mask Value Comment
0xFF - type
0xFF00 - flags
0xFF00 0x1000 Read Only
0xFF0000 0x10000 Invalidate fd on susppend/resume within process/system
0xFF0000 0x20000 External media

VFS Implementation

Information can be found on separate page VFS Implementation

Note

Max vfs node number is 0x1000.

Types

typedef struct SceIoMount { // size is 0x34-bytes
	void *mnt;
	int mntId;
	char assignName[0x20];
	SceUInt32 openedEntryNum;
	SceBool unk_0x2C;
	int unk_0x30;
} SceIoMount;

typedef struct SceIoMountInfo { // size is 0x54C-bytes
	void *mnt;
	int mntId;
	char assignName[0x20];
	SceUInt32 openedEntryNum;
	int unk_0x2C;
	int unk_0x30;
	int unk_0x34;
	int unk_0x38;
	int unk_0x3C;
	int unk_0x40;
	int unk_0x44;
	int unk_0x48;
	int unk_0x4C;
	int unk_0x50;
	int unk_0x54;
	int unk_0x58;
	int unk_0x5C;
	int unk_0x60;
	int unk_0x64;
	int unk_0x68;
	int unk_0x6C;
	int unk_0x70;
	int unk_0x74;
	int unk_0x78;
	int unk_0x7C;
	int unk_0x80;
	int unk_0x84;
	char unk_0x88[0x400];
	int unk_0x488;
	char unk_0x48C[0x40];
	char blockdevName[0x40];
	char unk_0x50C[0x40];
} SceIoMountInfo;

typedef struct vfs_node_info { // size is 0x38
   char name[0x20];
   vfs_node* node; // can be zero
   uint32_t unk_24; // probably size of vfs_node
   uint32_t unk_28; // probably flags
   vfs_node_info* node_info_2C; // can be zero
   vfs_node_info* node_info_30; // can be zero
   vfs_node_info* node_info_34; // can be zero
} vfs_node_info;

// It looks like this structure is used to get some response into "error" field
// when executing sceKernelSignalCondTo calls.
// This structure is used by SceIofileDaemon when it monitors mount/unmount async requests
// in SceIofilemgrMount thread using SceIofilemgrMount conditional variable.
// Upon completion it issues the signal and result of operation is stored in error field.
// It looks like operations 1/2 are used for normal filesystems.
// Operations 3/4 are used for PFS_GDSD_INF filesystem.
typedef struct cond_ctx {
   uint32_t op_index; // operation index. 1,3 - mount. 2,4 - unmount
   uint32_t unk_4;
   uint32_t unk_8;
   uint32_t unk_C;
   uint32_t unk_10;
   uint32_t unk_14;
   uint32_t unk_18;
   uint32_t unk_1C;
   int error; // either error code or 0
   cond_ctx* next; // 0 means end of list
} cond_ctx;

typedef struct ctx_19D4 {
   void* unk_0; 
   uint32_t unk_4;
   vfs_node* offset; // Pool of vfs_nodes with 0x1000 elements.
                     // It is used in sceVfsGetNewVnodeForDriver, mount/unmount and node find routines.
   uint32_t size;

   uint32_t count;
   uint32_t unk_14;
   uint32_t unk_18;
   uint32_t unk_1C;
} ctx_19D4;

typedef struct ctx_11C { //size is 0x220
   void* unk_0; 
   uint32_t unk_4;
   void* offset; // pointer to array of byte size 0x10000 with 0x40 elements of size 0x400
   uint32_t size;

   uint32_t count;

   uint8_t data[0x20C];
} ctx_11C;

typedef struct io_scheduler_dispatcher { //size is 0xB8
   char unk_0[0x50];

   io_scheduler* unk_50; // Internal storage
   io_scheduler* unk_54; // Gamecard
   io_scheduler* unk_58; // Removable media (memory card)
   io_scheduler* unk_5C; // Host File System (host0:)
   io_scheduler* unk_60; // Default
   
   uint32_t unk_64; // pointer to unknown module data section
   uint32_t unk_68; // SceIoSchedulerDispatcher fast mutex
   uint32_t unk_6C;
   
   char unk_70[0x30];
   
   uint32_t unk_A0;
   uint32_t unk_A4;
   
   SceUID unk_A8; // SceIoSchedulerDispatcher event flag uid
   uint32_t unk_AC; // counter
   uint32_t unk_B0; // flag
   uint32_t unk_B4; // 0
   
} io_scheduler_dispatcher;

typedef struct io_scheduler_item { // size is 0x14 - allocated from SceIoScheduler heap
   io_scheduler* unk_0; // parent
   uint32_t unk_4; // 0
   uint32_t unk_8; // 0
   uint32_t unk_C; // 0
   uint32_t unk_10; // pointer to unknown module data section
} io_scheduler_item;

enum io_device_code {
  Internal = 0x100,
  Game_Card = 0x201,
  Removable = 0x202,
  Host_File_System = 0x300,
  Default = 0x0
};

typedef struct io_scheduler { //size is 0xA8 - allocated from SceIoScheduler heap
   io_device_code unk_0; 
   io_scheduler_item* unk_4; // item 0
   io_scheduler_item* unk_8; // item 1
   io_scheduler_item* unk_C; // item 2
   
   io_scheduler_item* unk_10; // item 3
   io_scheduler_item* unk_14; // item 4
   io_scheduler_item* unk_18; // item 5
   io_scheduler_item* unk_1C; // item 6
   
   io_scheduler_item* unk_20; // item 7
   io_scheduler_item* unk_24; // item 8
   io_scheduler_item* unk_28; // item 9
   io_scheduler_item* unk_2C; // item 10
   
   io_scheduler_item* unk_30; // item 11
   io_scheduler_item* unk_34; // item 12
   io_scheduler_item* unk_38; // item 13
   io_scheduler_item* unk_3C; // item 14
   io_scheduler_item* unk_40; // item 15
   
   uint32_t unk_44; // flag1 0x40000 or 0x00
   uint32_t unk_48; // flag2 0x40000 or 0x00
   io_scheduler_dispatcher* unk_4C; // parent
   
   SceUID unk_50; // SceIoScheduler mutex
   SceUID unk_54; // SceIoScheduler cond
   
   char unk_58; // 0
   char unk_59; // 0
   char unk_5A; // 0
   char unk_5B; // 0
   
   uint32_t unk_5C; // 0
   
   // this is probably a separate structure
   SceUID unk_60; // SceIoSchedWorker thread id
   SceUID unk_64; // SceIoScheduler mutex from self
   SceUID unk_68; // SceIoScheduler cond from self
   io_scheduler* unk_6C; // pointer to self
   
   uint32_t unk_70; // 0
   uint16_t unk_74; // 0
   uint16_t unk_76; // 0
   uint32_t unk_78; // 0
   uint32_t unk_7C; // 0
   
   uint32_t unk_80; //
   uint32_t unk_84; // some flag
   
   uint32_t unk_88; //0x80
   uint32_t unk_8C; //0x80
   
   uint32_t unk_90; //0x80
   uint32_t unk_94; //0x80
   uint32_t unk_98; //0x80
   uint32_t unk_9C; //0x80
   
   uint32_t unk_A0; // 0
   uint32_t unk_A4; // 0

} io_scheduler;

// Context used for dispatching i/o operations
typedef struct io_context { // size is 0xB8 on FW 3.60
   uint32_t unk_0;
   uint32_t unk_4;
   uint32_t unk_8;
   uint32_t unk_C;
   
   uint16_t unk_10;
   uint16_t unk_12;
   uint16_t unk_14;
   uint16_t unk_16;
   void *data_0; // 0x18
   uint32_t unk_1C; // 0x1C
   
   SceSize size_0; // 0x20
   uint32_t io_op_index; // 0x24
   uint32_t ioctlOutdata0; // 0x28
   io_device_code device_code; // 0x2C, ioctlOutdata1
   
   char async; // 0x30
   char unk_31;
   char unk_32;
   char unk_33;
   SceUID pid; // 0x34, sceKernelGetProcessIdForDriver
   SceUID threadId; // 0x38, sceKernelGetThreadIdForDriver
   SceUID tlsPid; // 0x3C, sceKernelGetProcessIdFromTLSForDriver
   
   uint32_t unk_40; // 0x40, SceThreadmgrForDriver_332E127C
   uint32_t cpuMask; // 0x44, sceKernelGetThreadCpuAffinityMaskForDriver
   uint32_t threadPriority; // 0x48, sceKernelGetThreadCurrentPriorityForDriver
   void* list0; // 0x4C, pointer to some linked list with elements of size 0x14
   
   uint32_t listSize; // 0x50, number of items in linst
   void* list1; // 0x54, pointer to some linked list with elements of size 0x14 
   uint32_t sizeOfList; // 0x58, size of list in bytes
   uint16_t state; // 0x5C, bit 16 of state where state = (MRC p15, 0, state, c13, c0, 3)
   uint16_t unk_5E; // 0x5E
   
   uint32_t unk_60; // 0x60
   SceUID fd; // 0x64
   void *data_1; // 0x68
   uint32_t unk_6C;
   
   SceSize size_1; // 0x70
   uint32_t unk_74; // 0x74
   uint32_t unk_78; // 0x78, -1
   uint32_t unk_7C; // 0x7C, -1
   
   uint32_t op_result; // 0x80, result of i/o operation
   uint32_t unk_84;
   void* unk_88;
   uint32_t unk_8C;
   
   uint32_t unk_90;
   uint32_t unk_94;
   uint32_t unk_98;
   uint32_t unk_9C;
   
   uint32_t unk_A0;
   uint32_t unk_A4;
   uint32_t unk_A8;
   uint32_t unk_AC;
   
   SceUInt64 sytemTimeWide; // 0xB0, sceKernelGetSystemTimeWideForDriver
} io_context;

typedef struct _SceVfsFileObject_0995 { //SceVfsFileClass object - size is 0x40 on 0.995
  /* SceKernelObject header not included in size nor structure */
  SceInt32 unk_0x0;
  SceInt32 unk_0x4;
  SceInt64 unk_0x8;
  SceInt32 unk_0x10; //Set to 1 during sceVfsAllocateFile
  ScePID creator_pid; //Result of sceKernelGetProcessIdFromTLS() during sceVfsAllocateFile
  void* unk_0x18; //Pointer provided as a1 to sceVfsAllocateFile
  SceUIDVfsFileObject* next; //Pointer to next file in linked list - list head is in a1
  SceInt32 unk_0x20;
  SceInt16 unk_0x24;
  char unk_0x26; //unused?
  SceInt8 unk_0x27;
  SceInt32 unk_0x28; //comes from a1->0x4C->0xC8
  SceInt32 unk_0x2C; //((a1->0x4C->0x50 & 0x20000) << 1) | (a1->0x4C->0x50 & 0x10000)
  SceInt32 unk_0x30;
  char unk_0x34; //unused?
  SceInt8 unk_0x35;
  SceInt8 unk_0x36;
  SceInt8 unk_0x37;
  SceInt8 unk_0x38;
  SceInt8 unk_0x39;
  SceInt8 unk_0x3A;
  SceInt8 unk_0x3B;
  SceInt8 unk_0x3C;
  SceInt8 unk_0x3D;
  SceInt8 unk_0x3E;
  SceInt8 unk_0x3F;
} SceUIDVfsFileObject_0995;

typedef struct _SceUIDVfsFileObject { //SceUIDVfsFileClass object - size is 0x48 on 3.60
  /* SceKernelObject header not included in size nor structure */
  SceInt32 unk_0x0;
  SceInt32 unk_0x4;
  SceInt64 unk_0x8;
  SceInt32 unk_0x10; //Set to 1 during sceVfsAllocateFile
  ScePID creator_pid; //Result of sceKernelGetProcessIdFromTLS() during sceVfsAllocateFile
  void* unk_0x18; //Pointer provided as a1 to sceVfsAllocateFile
  SceUIDVfsFileObject* next; //Pointer to next file in linked list - list head is in a1
  SceInt32 unk_0x20; //Zero'ed in constructor
  SceInt16 unk_0x24;
  char unk_0x26; //unused?
  SceInt8 unk_0x27;
  SceInt32 unk_0x28; //comes from a1->0x4C->0xC8
  SceInt32 unk_0x2C; //((a1->0x4C->0x50 & 0x20000) << 1) | (a1->0x4C->0x50 & 0x10000)
  SceInt32 unk_0x30;
  char unk_0x34; //unused?
  SceInt8 unk_0x35;
  SceInt8 unk_0x36;
  SceInt8 unk_0x37;
  SceInt8 unk_0x38; //Zero'ed during constructor
  SceInt8 unk_0x39; //^ doing *(SceInt32*)(&file->unk_0x38) = 0;
  SceInt8 unk_0x3A; //^
  SceInt8 unk_0x3B; //^
  SceInt8 unk_0x3C;
  SceInt8 unk_0x3D;
  SceInt8 unk_0x3E;
  SceInt8 unk_0x3F;
  char unk_0x40[8]; //unknown type - haven't seen this used yet
} SceUIDVfsFileObject;

typedef struct SceVfsPath { //size is 0xC-bytes
	char *name; // could be `const char *`?
	SceSize name_len;
	char *path; // could be `const char *`?
} SceVfsPath;

Data segment layout

Address Size Description
0x0000 0x4 unknown
0x0004 0x8 some index returned from initialization function 0xb645c7ef in SceThreadmgrForDriver
0x0008 0x4 unknown
0x000C 0x4 flag that enables usage of sceFiosKernel functions (like OverlayResolveSync) in i/o operations in transition from user to kernel
0x00010 0x4 flag that enables usage of sceFiosKernel functions (like OverlayResolveSync) in i/o operations in transition from user to kernel
0x00014 0x4 flag that enables usage of sceFiosKernel functions (like OverlayResolveSync) in i/o operations in transition from user to kernel
0x00018 0x4 flag that enables usage of sceFiosKernel functions (like OverlayResolveSync) in i/o operations in transition from user to kernel
0x0001C 0x4 unknown
0x0020 0x4 SceIofileDevWaitForVC event flag SceUID
0x0024 0x4 unknown
0x0028 0x4 SceIofileDevWaitForSD event flag SceUID
0x002C 0x4 pointed by vfs_mount_cc for SceIofileDevWaitForSD
0x0030 0x4 SceIofileDevWaitForMC event flag SceUID
0x0034 0x4 unknown
0x0038 0x4 pointed by vfs_mount_cc for SceIofileDevWaitForVC
0x003C 0x4 pointed by vfs_mount_cc for SceIofileDevWaitForMC
0x0040 0x10 unknown
0x0050 0x4 address of some callback function called in all vfs operations
0x0054 0x4 SceIofile heap SceUID
0x0058 0x80 unknown
0x00D8 0x4 SceIoVfsHeap heap SceUID
0x00DC 0x4 SceIoFileDebug memblock SceUID
0x00E0 0x3C unknown
0x011C 0x4 ctx_11C* pointer to structure
0x0120 0x4C unknown
0x016C 0x10 char* static_buffers[4] - static buffers used instead of SceIoVfsHeap
0x017C 0x2C SceClass for SceVfsFile
0x01A8 0x1500 array of 96 elements of vfs_node_info
0x16A8 0x4 SceVfsRfsLock fast mutex
0x16AC 0x3C unknown
0x16E8 0x2C SceClass for SceIoMountEvent
0x1714 0xC unknown
0x1720 0x04 cond_ctx* pointer to the linked list
0x1724 0x4 SceIoScheduler heap SceUID
0x1728 0xB8 io_scheduler_dispatcher structure
0x17E0 0x2C SceClass for SceIoAsyncEvent - used in all async i/o operations
0x180C 0xC unknown
0x1818 0x2C SceClass for SceIoErrorEvent
0x1844 0xC unknown
0x1850 0x4 SceIofileDaemonLock fast mutex
0x1854 0x40 unknown
0x1894 0x4 SceIofile fast mutex
0x1898 0x7C unknown
0x1914 0x4 function pointer t_1914_callback
0x1918 0x4 SceIofileFlock fast mutex
0x191C 0x44 unknown
0x1960 0x4 some i/o flag
0x1964 0x4 flag that indicates that any i/o operation happened 1/0. changed by each i/o operation. cleared on suspend.
0x1968 0x18 unknown
0x1980 0x4 counter of not finished i/o operations. changed by each i/o operation.
0x1984 0xC unknown
0x1990 0x4 SceVfsMntlistLock fast mutex
0x1994 0x3C unknown
0x19D0 0x4 vfs_mount* singly linked list
0x19D4 0x1C structure ctx_19D4
0x19F0 0x8 unknown
0x19F8 0x4 address used for sceKernelCpuLockSuspendIntrStoreLRForDriver to lock 016C
0x19FC 0x4 vfs_mount* pointer
0x1A00 0x4 SceVfsNcacheLock fast mutex
0x1A04 0x40 unknown
0x1A44 0x4 address used for sceKernelCpuLockSuspendIntrStoreLRForDriver
0x1A48 0x4 unknown
0x1A4C 0x4 SceVfsLock fast mutex
0x1A50 0x3C unknown
0x1A8C 0x04 SceIofilemgrMount thread SceUID
0x1A90 0x700 array of 32 elements of vfs_mount_point_info
0x2190 0x4 SceIofilemgrMount cond SceUID
0x2194 0x4 SceIofilemgrMount SceUID mutexid
0x2198 0x4 flag that indicates that IoSchedulerDispatcher functionality is initialized 1/0
0x219C 0x4 unknown
0x21A0 0x40 unknown
0x21E0 0x20 unknown
0x2200 0x04 SceIofilemgrDaemon thread SceUID
0x2204 0x8 unknown
0x220C 0x4 SceIofilemgrDaemon event flag SceUID
0x2210 0x4 void* to heap alloc of size 0x100
0x2214 0x4 void* to heap alloc of size 0x100
0x2218 0x4 = 3
0x221C 0x20 vfs_add_data dummy_ttyp_dev_fs node

SceIofilemgrForDriver

sceVfsOpDevctlForDriver

Version NID
0.990-3.60 0xB07B307D

sceVfsOpDecodePathElemForDriver

Version NID
0.990-3.60 0xF7DAC0F5

sceVopOpenForDriver

Version NID
0.990-3.60 0x76B79BEC

sceVopCreateForDriver

Version NID
0.990-3.60 0x9E347C7D

sceVopCloseForDriver

Version NID
0.990-3.60 0x40944C2E

In logs it is sceVopClsoe.

sceVopLookupForDriver

Version NID
0.931-3.60 0xA5A6A55C

Temp name was sceVfsNodeInitializePartitionForDriver.

int sceVopLookupForDriver(SceVfsNode *pNode, SceVfsNode **ppNewNode, SceVfsPath *path_info, SceUInt32 flags);

sceVopReadForDriver

Version NID
0.990-3.60 0x570388A5

sceVopWriteForDriver

Version NID
0.990-3.60 0x9A68378D

sceVopLseekForDriver

Version NID
0.990-3.60 0xB2B13818

sceVopIoctlForDriver

Version NID
0.990-3.60 0x333C904D

sceVopRemoveForDriver

Version NID
3.60 0xDC1E7EE4

sceVopMkdirForDriver

Version NID
0.990-3.60 0x2F3F8C70

sceVopRmdirForDriver

Version NID
0.990-3.60 0x1D551105

sceVopDopenForDriver

Version NID
0.990-3.60 0x00C9C2DD

sceVopDcloseForDriver

Version NID
0.990-3.60 0x1350F5C7

sceVopDreadForDriver

Version NID
0.990-3.60 0x77584C8F

sceVopGetstatForDriver

Version NID
0.990-3.60 0x50A63ACF

sceVopChstatForDriver

Version NID
0.990-3.60 0x1974FA92

sceVopRenameForDriver

Version NID
0.990-3.60 0x36A794C7

sceVopPreadForDriver

Version NID
0.990-3.60 0xABBC80E3

sceVopPwriteForDriver

Version NID
0.990-3.60 0xA53C040D

sceVopInactiveForDriver

Version NID
0.990-3.60 0x8FB94521

sceVopLinkForDriver

Version NID
3.60 0x942AA61F

Temp name was sceVop_unk_offset_0x54_ForDriver.

sceVopUnlinkForDriver

Version NID
3.60 0x0D8A806E

Temp name was sceVop_unk_offset_0x58_ForDriver.

sceVopSyncForDriver

Version NID
0.990-3.60 0x9CD96406

sceVopFgetstatForDriver

Version NID
3.60 0x1DBCBB01

Temp name was sceVopGetStateByFdForDriver.

int sceVopFgetstatForDriver(SceVfsNode *pNode, SceVfsFileObject *pVfsFileObject, SceIoStat *stat);

sceVopFchstatForDriver

Version NID
3.60 0x082AFD7F

Temp name was sceVopChstatByFdForDriver.

int sceVopFchstatForDriver(SceVfsNode *pNode, SceVfsFileObject *pObject, SceIoStat *stat, int bit);

sceVopWhiteoutForDriver

Version NID
0.996-3.60 0xF53399BC

Temp name was sceVopTrashForDriver.

Move target node entry file/directory to xx0:/SceIoTrash/.

sceVopCleanupForDriver

Version NID
3.60 0x0F7E1718

Temp name was sceVop_unk_offset_0x6C_ForDriver.

sceVopZerofillForDriver

Version NID
0.996-3.60 0xEEAE8B51

Temp name was sceVop_unk_offset_0x70_ForDriver.

vfsIsLockedMntForDriver

Version NID
3.60 0xC468B5EF

some thread op

vfsBuffCacheCtlForDriver

Version NID
3.60 0xA7020B0D

big function

int vfsBuffCacheCtlForDriver(SceVfsNode *vp, int a2, int a3, int a4, int cache_size);

vfsBuffCacheFreeForDriver

Version NID
3.60 0xD6AB5E4B

some node op

vfsLockVnodeForDriver

Version NID
0.995-3.60 0xAA45010B

Temp name was sceVfsNodeWaitEventFlagForDriver, sceVfsLockVnodeForDriver.

calls sceKernelWaitEventFlagForDriver using event_flag_SceVfsVnode from vfs_node

1. If the ownerId of the locked vnode is -1 (no anyone), set own thread as owner and leave the function.

2. If the ownerId is already mine, increment recursiveCount and leave the function.

3. If we get here we increment waiter.

4. Just to be sure, we do a check for 1 again and if the ownerId is -1, we set the ownerId to ourselves in the thread, then decrement waiter and leave the function.

5. If you've come this far, wait for the other owner to unlock the vnode with sceKernelWaitEventFlag.

6. Decrement the waiter and set the ownerId to its own thread and leave the function.

int vfsLockVnodeForDriver(vfs_node *node);

vfsUnlockVnodeForDriver

Version NID
0.990-3.60 0x6048F245

Temp name was sceVfsNodeSetEventFlagForDriver, sceVfsUnlockVnodeForDriver.

calls sceKernelSetEventFlagForDriver using event_flag_SceVfsVnode from vfs_node

1. The function fails if the ownerId is not its own thread.

2. If recursiveCount is not 0, decrement recursiveCount and leave the function.

3. If recursiveCount is 0, checks waiter value.

4. If waiter is not 0, set ownerId to 0xfffffffd, then notify other waiting threads of unlock with sceKernelSetEventFlag and leave the function.

5. Check ownerId and waiter again and execute 4 if there is a discrepancy with the first check.

6. Set waiter to 0 and ownerId to -1 and leave the function.

int vfsUnlockVnodeForDriver(vfs_node* node);

vfsMountForDriver

Version NID
0.990-3.60 0xB62DE9A6

This is a guessed name.

Temp name was sceVfsMountForDriver.

int vfsMountForDriver(vfs_mount_point_info_base *mnt);

vfsUmountForDriver

Version NID
1.69-3.60 0x9C7E7B76

Temp name was sceVfsUnmountForDriver.

int vfsUmountForDriver(vfs_unmount_data *data);

sceVfsAddVfsForDriver

Version NID
0.990-3.60 0x673D2FCD

Used by SceSdstor, SceTty2uart, SceKernelBlueScreenOfDeath.

int sceVfsAddVfsForDriver(vfs_add_data *data);

sceVfsDeleteVfsForDriver

Version NID
1.69-3.60 0x9CBFA725
int sceVfsDeleteVfsForDriver(const char *name, void **deleted_node);

vfsMountForPFSForDriver

Version NID
3.60 0xFEEE44A9

Temp name was scePfsMgrVfsMountForDriver.

operation index 3 in cond_ctx

// this function can be used with PFS_GDSD_INF filesystem
int vfsMountForPFSForDriver(vfs_mount_point_info_base *mnt, int unk1, int unk2);

vfsUmountForPFSForDriver

Version NID
3.60 0xD220539D

This is a guessed name.

Temp name was scePfsMgrVfsUmountForDriver.

operation index 4 in cond_ctx

int vfsUmountForPFSForDriver(vfs_unmount_data* umnt, int unk1, int unk2);

vfsLockMntForDriver

Version NID
3.60 0x6B3CA9F7

Temp name was sceVfsLockMntForDriver.

vfsUnlockMntForDriver

Version NID
3.60 0xDC2D8BCE

Temp name was sceVfsUnlockMntForDriver.

vfsGetNewVnodeForDriver

Version NID
0.990-3.60 0xD60B5C63

Temp name was sceVfsGetNewVnodeForDriver.

int vfsGetNewVnodeForDriver(vfs_mount *mnt, node_ops2 *ops, int unused, vfs_node **node);

vfsFreeVnodeForDriver

Version NID
0.990-3.60 0x21D57633

Temp name was sceVfsFreeVnodeForDriver.

vfsIsOwnerForDriver

Version NID
3.60 0xC3AE93A2

This is a guessed name.

Temp name was sceIoComparisonCurrentThreadIdForDriver.

SceBool vfsIsOwnerForDriver(void *vp);

vfsGetVnodeNameForDriver

Version NID
0.990-3.60 0xAA253B68

Temp name was sceVfsGetVnodeNameForDriver.

int vfsGetVnodeNameForDriver(SceVfsNode *vp, char *name, SceSize n, SceSize *result);

vfsAllocateFileForDriver

Version NID
0.995-3.60 0xBBAC1751

Temp name was sceVfsAllocateFileForDriver.

Creates a SceUIDVfsFileClass object and returns UID and pointer to created object.

// type of a1 is unknown for now - at least 0x98 bytes wide

// FW 0.995
SceUID vfsAllocateFileForDriver(void *vp, SceUIDVfsFileObject **ppFile);

// FW 3.60
// If name is NULL, default name (same as 0.995, "SceVfsFile") is used as object name
// Else, name will be created with snprintf("file %s %s", something_from_a1, name);
SceUID vfsAllocateFileForDriver(void *vp, SceVfsFileObject **ppFile, const char *name);

vfsAllocateFileDummyForDriver

Version NID
3.60 0xCDF3EF52

This is a guessed name.

SceUID vfsAllocateFileDummyForDriver(int flags, SceBool is_dir, const char *name);

vfsFreeFileForDriver

Version NID
0.990-3.60 0xC85E33A2

Temp name was sceVfsFreeFileForDriver.

Frees a file created with vfsAllocateFileForDriver.

SceInt32 vfsFreeFileForDriver(void *vp, SceUID file_uid);

vfsRmdevForDriver

Version NID
3.60 0x69A7E076

Temp name was sceVfsRmdevForDriver.

vfsOpenForDriver

Version NID
3.60 0x0E518FA9

Temp name was t_sceIoOpenForDriver, sceVfsOpenForDriver.

thread callback for sceIoOpenForDriver

typedef struct SceVfsOpenArgs {
  const char *filename;
  int flag;
  SceIoMode mode;
} SceVfsOpenArgs;

SceUID vfsOpenForDriver(SceVfsOpenArgs *argp);

vfsCloseForDriver

Version NID
3.60 0x1AE14011

Temp name was t_sceIoCloseForDriver, sceVfsCloseForDriver.

thread callback for sceIoCloseForDriver

typedef struct SceVfsCloseArgs {
  SceUID fd;
} SceVfsCloseArgs;

int vfsCloseForDriver(SceVfsCloseArgs *argp);

vfsReadForDriver

Version NID
3.60 0x809892C1

Temp name was t_sceIoReadForDriver, sceVfsReadForDriver.

thread callback for sceIoReadForDriver

typedef struct SceVfsReadArgs {
  SceUID fd;
  void *data;
  SceSize size;
} SceVfsReadArgs;

int vfsReadForDriver(SceVfsReadArgs *argp);

vfsWriteForDriver

Version NID
3.60 0x8598ADC3

Temp name was t_sceIoWriteForDriver, sceVfsWriteForDriver.

thread callback for sceIoWriteForDriver

typedef struct SceVfsWriteArgs {
  SceUID fd;
  const void *data;
  SceSize size;
} SceVfsWriteArgs;

int vfsWriteForDriver(SceVfsWriteArgs *argp);

vfsIoctlForDriver

Version NID
3.60 0xC1DD4317

This is a guessed name.

Temp name was t_sceIoIoctlForDriver, sceVfsIoctlForDriver.

thread callback for sceIoIoctlForDriver

typedef struct SceVfsIoctlArgs {
  SceUID fd;
  unsigned int cmd;
  void *indata;
  int inlen;
  void *outdata;
  int outlen;
} SceVfsIoctlArgs;

int vfsIoctlForDriver(SceVfsIoctlArgs *argp);

vfsChstatForDriver

Version NID
3.60 0xBCE4865B

Temp name was t_sceIoChstatForDriver, sceVfsChstatForDriver.

thread callback for sceIoChstatForDriver

typedef struct SceVfsChstatArgs {
   const char *path;
   const SceIoStat *stat;
   unsigned int cbit;
   uint32_t store_attr;
} SceVfsChstatArgs;

int vfsChstatForDriver(SceVfsChstatArgs *argp);

vfsChstatByFdForDriver

Version NID
3.60 0x7517FE29

Temp name was t_sceIoChstatByFdForDriver, sceVfsChstatByFdForDriver.

thread callback for sceIoChstatByFdForDriver

typedef struct SceVfsChstatByFdArgs {
  SceUID fd;
  const SceIoStat *buf,
  unsigned int cbit;
} SceVfsChstatByFdArgs;

int vfsChstatByFdForDriver(SceVfsChstatByFdArgs *args);

vfsPreadForDriver

Version NID
3.60 0x0B54F9E0

Temp name was t_sceIoPreadForDriver, sceVfsPreadForDriver.

thread callback for sceIoPreadForDriver

typedef struct SceVfsPreadArgs {
   SceUID uid;
   void *data;
   SceSize size;
   int paddind; // unused
   SceOff offset;
} SceVfsPreadArgs;

int vfsPreadForDriver(SceVfsPreadArgs *argp);

vfsPwriteForDriver

Version NID
3.60 0xE5DEA6B7

Temp name was t_sceIoPwriteForDriver, sceVfsPwriteForDriver.

thread callback for sceIoPwriteForDriver

typedef struct SceVfsPwriteArgs {
   SceUID uid;
   const void *data;
   SceSize size;
   int padding;
   SceOff offset;
} SceVfsPwriteArgs;

int vfsPwriteForDriver(SceVfsPwriteArgs *argp);

vfsGetMntInfoForDriver

Version NID
3.60 0xB987450D

This is a guessed name.

Temp name was sceIoGetMountInfoForDriver.

int vfsGetMntInfoForDriver(void *mnt, SceIoMountInfo *pInfo);

vfsGetMntListForDriver

Version NID
3.60 0xC20C621C

This is a guessed name.

Temp name was sceIoGetMountVectorForDriver.

int vfsGetMntList(SceIoMount *pMount, SceUInt32 nMount, SceUInt32 *pnMount);

sceIoMountForDriver

Version NID
3.60 0xD070BC48

operation index 1 in cond_ctx

// intermediate function between sceAppMgrGameDataMountForDriver and sceVfsMountForDriver
int sceIoMountForDriver(int vshMountId, const char *path, int flags, int unk3, int arg_0, int arg_4);

sceIoUmountForDriver

Version NID
3.60 0x20574100

operation index 2 in cond_ctx

// intermediate function between sceAppMgrUmountForDriver and sceVfsUnmountForDriver
int sceIoUmountForDriver(int vshMountId, int unk1, int unk2, int unk3);

sceIoRmdevForDriver

Version NID
0.990-3.60 0xA39A9CA7

Like sceIoRemove?

The difference with sceIoRemove is that sceIoRmdev seems to remove the entry to be deleted directly without moving it to SceIoTrash.

int sceIoRmdevForDriver(const char *path, int flags, int a3, int a4);

sceIoDelDrvForDriver

Version NID
0.931 0xD51774E3
3.60 not present

Example: "tty"

int sceIoDelDrvForDriver(const char *drv);

sceIoAddDrvForDriver

Version NID
0.931 0x1D8AC9A7
3.60 not present
int sceIoAddDrvForDriver(const char **drv);

sceIoDreadForDriver

Version NID
1.69-3.60 0x20CF5FC7

Call interface is same as sceIoDread.

int sceIoDreadForDriver(SceUID fd, SceIoDirent *dir);

sceIoDreadForVshbridgeForDriver

Version NID
0.995-3.60 0x03051B02

Temp name was sceIoDreadForDriver_2. Derived from _vshIoDread.

Implementation is completely the same as sceIoDreadForDriver. The only difference is that st_attr in SceIoStat is not set.

int sceIoDreadForVshbridgeForDriver(SceUID fd, SceIoDirent *dir);

sceIoWriteForDriver

Version NID
1.69-3.60 0x21EE91F0

Call interface is same as sceIoWrite

int sceIoWriteForDriver(SceUID fd, const void *data, SceSize size);

sceIoDopenForDriver

Version NID
1.69-3.60 0x463B25CC

Call interface is same as sceIoDopen

SceUID sceIoDopenForDriver(const char *dirname);

sceIoLseekForDriver

Version NID
0.931-3.60 0x62090481

Call interface is same as sceIoLseek

SceOff sceIoLseekForDriver(SceUID fd, SceOff offset, int whence);

sceIoOpenForDriver

Version NID
0.931-3.60 0x75192972

Call interface is same as sceIoOpen.

If the process is game or non-game, the `SCE_O_NOBUF` flag will be ignored.

SceUID sceIoOpenForDriver(const char *filename, int flag, SceIoMode mode);

sceIoOpenForPidForDriver

Version NID
3.60 0xC3D34965

This is a wrapper for sceIoOpenForDriver.

Pid is used for sceFiosKernelOverlayResolveSyncForDriver.

SceUID sceIoOpenForPidForDriver(SceUID pid, const char *filename, int flag, SceIoMode mode);

sceIoChstatForDriver

Version NID
1.69-3.60 0x7D42B8DC

Call interface is same as sceIoChstat

int sceIoChstatForDriver(const char *name, const SceIoStat *buf, unsigned int cbit);

sceIoChstatForVshbridgeForDriver

Version NID
0.995-3.60 0x1F98BD50

Temp name was sceIoChstatForDriver_2. Derived from _vshIoChstat.

Implementation is completely the same as sceIoChstatForDriver. The only difference is that (bits = bits & (~0x10000)) operation is not applied.

int sceIoChstatForVshbridgeForDriver(const char *name, const SceIoStat *buf, unsigned int cbit);

sceIoGetstatForDriver

Version NID
1.69-3.60 0x75C96D25

Call interface is same as sceIoGetstat.

int sceIoGetstatForDriver(const char *name, SceIoStat *buf);

sceIoGetstatForVshbridgeForDriver

Version NID
0.995-3.60 0xD6503624

Temp name was sceIoGetstatForDriver_2. Derived from _vshIoGetstat.

Implementation is completely the same as sceIoGetstatForDriver. The only difference is that st_attr in SceIoStat *buf is not set.

int sceIoGetstatForVshbridgeForDriver(const char *name, SceIoStat *buf);

sceIoMkdirForDriver

Version NID
1.69-3.60 0x7F710B25

Call interface is same as sceIoMkdir

int sceIoMkdirForDriver(const char *dirname, SceIoMode mode);

sceIoReadForDriver

Version NID
1.69-3.60 0xE17EFC03

Call interface is same as sceIoRead

int sceIoReadForDriver(SceUID fd, void *buf, SceSize nbyte);

sceIoCloseForDriver

Version NID
1.69-3.60 0xF99DD8A3

Call interface is same as sceIoClose

int sceIoCloseForDriver(SceUID fd);

sceIoRenameForDriver

Version NID
1.69-3.60 0xDC0C4997

Call interface is same as sceIoRename

int sceIoRenameForDriver(const char *oldname, const char *newname);

sceIoRemoveForDriver

Version NID
1.69-3.60 0x0D7BB3E1

Call interface is same as sceIoRemove

int sceIoRemoveForDriver(const char *filename);

sceIoCancelForDriver

Version NID
3.60 0x6D59658D

Derived from sceIoCancel

sceIoChstatAsyncForDriver

Version NID
3.60 0x7EC442BF

Derived from _sceIoChstatAsync

sceIoChstatByFdAsyncForDriver

Version NID
3.60 0xEC974400

Derived from sceIoChstatByFdAsync

sceIoChstatByFdForDriver

Version NID
3.60 0xDF57A75F

Derived from _sceIoChstatByFd

int sceIoChstatByFdForDriver(SceUID fd, const SceIoStat *buf, unsigned int cbit);

sceIoCloseAsyncForDriver

Version NID
3.60 0x11C57CC6

Derived from sceIoCloseAsync

sceIoDevctlAsyncForDriver

Version NID
3.60 0xA9302946

Derived from _sceIoDevctlAsync

sceIoDevctlForDriver

Version NID
0.990.000-3.740.011 0x16882FC4

cmd list

handler cmd function
sdstor 1 Update ctx info
sdstor 2 Format rm
sdstor 3 Set some intr flag
sdstor 4 remove
sdstor 5 insert
sdstor 6 sceSdErase
sdstor 7 sdctrl_invalidate_partition with check
sdstor 8 sdctrl_invalidate_partition
exfat 0x3001 get_drive_information
exfat 0x3004 set_fake_free
exfat 0x3005 clear_fake_free
exfat 0x3802 set_whiteout_directory
exfat 0x3803 delete_whiteout_entry
exfat 0x80000001 _get_file_size_limit

Derived from _sceIoDevctl.

This performs device-specific operations. The details of the operations are driver-dependent.

It has the same prototype as SceLibKernel#sceIoDevctl.

/*
Arguments:
devname     Specified device ("<devname><unit>:")
cmd     Command code
arg     Pointer to device-driver-dependent parameter block
arglen     Number of bytes in device-driver-dependent parameter block
bufp     Pointer to return data storage block
buflen     Size of return data storage block

Return Values:
Non-negative (N>=0) Success (driver-dependent) 
<0 Error, e.g. SCE_ERROR_ERRNO_EMFILE, SCE_ERROR_ERRNO_ENODEV, SCE_ERROR_ERRNO_EUNSUP
*/

int sceIoDevctlForDriver(
    const char *devname,
    int cmd,
    const void *arg,
    SceSize arglen,
    void *bufp,
    SceSize buflen
);

sceIoDcloseForDriver

Version NID
3.60 0x19C81DD6

Derived from sceIoDclose

int sceIoDcloseForDriver(SceUID fd);

sceIoFlockForDriver

Version NID
3.60 0x16336A0D

Derived from sceIoFlockForSystem

sceIoGetstatByFdAsyncForDriver

Version NID
3.60 0x0FEE1238

Derived from sceIoGetstatByFdAsync

sceIoGetstatByFdForDriver

Version NID
3.60 0x462F059B

Derived from _sceIoGetstatByFd

// Return: 0 on success
int sceIoGetstatByFdForDriver(SceUID fd, SceIoStat *buf);

sceIoGetstatAsyncForDriver

Version NID
3.60 0x94A5304A

Derived from _sceIoGetstatAsync

sceIoIoctlAsyncForDriver

Version NID
3.60 0xB761E91B

Derived from _sceIoIoctlAsync

sceIoIoctlForDriver

Version NID
3.60 0x161CD33F

Derived from _sceIoIoctl

// Return: >=0 on success (driver-dependent)
int sceIoIoctlForDriver(SceUID fd, int cmd, const void *argp, SceSize arglen, void *bufp, SceSize buflen);

sceIoLseekAsyncForDriver

Version NID
3.60 0x541BAABD

Derived from _sceIoLseekAsync

sceIoMkdirAsyncForDriver

Version NID
3.60 0x27003443

Derived from _sceIoMkdirAsync

sceIoOpenAsyncForDriver

Version NID
3.60 0x451001DE

Derived from _sceIoOpenAsync

sceIoPreadAsyncForDriver

Version NID
3.60 0x64A46A2C

Derived from _sceIoPreadAsync

sceIoPreadForDriver

Version NID
3.60 0x2A17515D

Derived from _sceIoPread

// Return: Number of bytes actually read
int sceIoPreadForDriver(SceUID uid, void *data, int size, SceOff offset);

sceIoPwriteAsyncForDriver

Version NID
3.60 0x202CDDE3

Derived from _sceIoPwriteAsync

sceIoPwriteForDriver

Version NID
3.60 0x5F1512C8

Derived from _sceIoPwrite

// Return: Number of bytes actually written
int sceIoPwriteForDriver(SceUID fd, const void *buf, SceSize nbyte, SceOff offset);

sceIoReadAsyncForDriver

Version NID
3.60 0x69047C81

Derived from sceIoReadAsync

sceIoRemoveAsyncForDriver

Version NID
3.60 0xF9D6507D

Derived from _sceIoRemoveAsync

sceIoRenameAsyncForDriver

Version NID
3.60 0xAACBC47A

Derived from _sceIoRenameAsync

sceIoRmdirAsyncForDriver

Version NID
3.60 0xF5B0B36C

Derived from _sceIoRmdirAsync

sceIoRmdirForDriver

Version NID
3.60 0x1CC9C634

Derived from _sceIoRmdir

int sceIoRmdirForDriver(const char *dirname);

sceIoSyncByFdAsyncForDriver

Version NID
3.60 0x041209CF

Derived from sceIoSyncByFdAsync

not_sceIoSyncByFd_maybe_SyncByFd2ForDriver

Version NID
3.60 0x43170575

This function is not sceIoSyncByFdForDriver.

Derived from sceIoSyncByFd

int not_sceIoSyncByFd_maybe_SyncByFd2ForDriver(SceUID fd, int flag);

sceIoSyncAsyncForDriver

Version NID
3.60 0x4F9EA8B0

Derived from _sceIoSyncAsync

sceIoSyncForDriver

Version NID
3.60 0xDDF78594

Derived from _sceIoSync

int sceIoSyncForDriver(const char *device, unsigned int flag);

sceIoWriteAsyncForDriver

Version NID
3.60 0xA1BD13D0

Derived from sceIoWriteAsync

sceIoGetProcessDefaultPriorityForSystemForDriver

Version NID
0.990-3.60 0xCE397158

sceIoSetProcessDefaultPriorityForSystemForDriver

Version NID
0.990-3.60 0xABE65071

sceIoDopenAsyncForDriver

Version NID
3.60 0x72F06BDE

sceIoDcloseAsyncForDriver

Version NID
3.60 0xC08F199F

sceIoDreadAsyncForDriver

Version NID
3.60 0x5982B0E3

sceIoCreateMountEventForDriver

Version NID
3.60 0x2DFA192F

Derived from vshIoCreateMountEvent

int sceIoCreateMountEventForDriver(int vshMountId, int flag);

sceIoCreateErrorEventForDriver

Version NID
3.60 0x3C0343DB

Derived from vshIoCreateErrorEvent

typedef struct sceIoCreateErrorEventForDriverOpt {
  uint32_t unk_0;
  uint32_t unk_4;
  uint32_t unk_8;
  uint32_t unk_C;

  uint32_t unk_10;
  uint32_t unk_14;
  uint32_t unk_18;
} sceIoCreateErrorEventForDriverOpt;

SceUID sceIoCreateErrorEventForDriver(int vshMountId, int flag, sceIoCreateErrorEventForDriverOpt* opt);

sceIoClearErrorEventForDriver

Version NID
3.60 0x40B933C7

Derived from vshIoClearErrorEvent

int sceIoClearErrorEventForDriver(SceUID uid);

sceIoDeleteMountEventForDriver

Version NID
3.60 0x43DB0AE4

Derived from vshIoDeleteMountEvent

int sceIoDeleteMountEventForDriver(SceUID uid);

sceIoDeleteErrorEventForDriver

Version NID
3.60 0xC6158F8D

Derived from vshIoDeleteErrorEvent

int sceIoDeleteErrorEventForDriver(SceUID uid);

sceIoSetMountEventForDriver

Version NID
0.995-3.60 0x39ABDB9E

Temp name was sceIoInvokeMountEventForDriver.

/*
 * (flags & 0x100) != 0 -> mount
 * (flags & 0x200) != 0 -> unmount
 */
int sceIoSetMountEventForDriver(int vshMountId, int flags, int unk2, int unk3);

vfsUnlockMntByMntIdForDriver

Version NID
3.60 0x5B7E5AB8

This is a guessed name.

Temp name was sceIoUmount2ForDriver.

int vfsUnlockMntByMntIdForDriver(int vshMountId);

sceIoSetPathMappingFunctionForDriver

Version NID
3.60 0xCFAECF18

Used by SceAppMgr.

Sets a callback function that does path mapping:

  • function tries to OverlayResolveSync input path
  • checks that it is not a PD path (Pseudo Drive mount point aquired by ScePfsMgr)
  • takes beginning of path until symbol ":"
  • tries to do a lookup by that path copy in data segment global 0x3470C mount_point_data_entry item array
  • if item is found then path from mount_point_data_entry item is copied to result_path
  • in any other case OverlayResolveSync result path is copied to result_path
typedef int ( SceIoPathMappingFunc)(const char *path, SceUID pid, char *result_path, SceSize size);

int sceIoSetPathMappingFunctionForDriver(SceIoPathMappingFunc *func);

sceIoGetMediaTypeForDriver

Version NID
0.990-3.60 0x9C220246

Was wrongly named sceIoGetPathIdExForDriver.

May also call callback function set by sceIoSetPathMappingFunctionForDriver.

This callback function does path mapping since result in result_path is passed to sceSblACMgrGetMediaTypeForKernel.

int sceIoGetMediaTypeForDriver(SceUID pid, const char *path, int ignored, int *media_type);

sceIoGetThreadDefaultPriorityForSystemForDriver

Version NID
3.60 0x6D0FEDB6
int sceIoGetThreadDefaultPriorityForSystemForDriver(void);

sceIoSetThreadDefaultPriorityForSystemForDriver

Version NID
3.60 0x3F0FF9D5

sceIoGetRemoteKPLSDataForDriver

Version NID
3.60 0x44EDCE57

This is a guessed name.

int sceIoGetRemoteKPLSDataForDriver(SceUID pid, void *dst);

sceIoSetProcessFileOpenMaxNumberForDriver

Version NID
3.60 0xAC0E9AAA
int sceIoSetProcessFileOpenMaxNumberForDriver(SceUID pid, SceSize number);

sceIoSetProcessDirOpenMaxLevelForDriver

Version NID
3.60 0x03F6A684
int sceIoSetProcessDirOpenMaxLevelForDriver(SceUID pid, SceSize level);

sceIoCompleteForDriver

Version NID
3.60 0x8F0DE34D
int sceIoCompleteForDriver(SceUID fd);

sceIoGetPriorityForSystemForDriver

Version NID
3.60 0x9FCDCE62
int sceIoGetPriorityForSystemForDriver(SceUID a1);

sceIoSetPriorityForSystemForDriver

Version NID
3.60 0xCCE94599
int sceIoSetPriorityForSystemForDriver(SceUID a1, int a2);

sceIoSetErrorEventForDriver

Version NID
0.995-3.60 0xDD46CD63

Previously (wrongfully) called sceIoGetGUIDErrorEventListForDriver.

sceIoSetDebuggerCallbackForDriver

Version NID
3.60 0xF4F8C59A

sceIoGetGUIDFdListForDebuggerForDriver

Version NID
3.60 0xdcf75f6d

sceIoGetPUIDFdListForDebuggerForDriver

Version NID
3.60 0xd493274

sceIoGetFileInfoForDriver

Version NID
3.60 0xa1ef2648

This is a guessed name.

SceIofilemgrForDriver_12F8D58E

Version NID
3.60 0x12F8D58E

get some value

SceIofilemgrForDriver_15C17487

Version NID
0.996.090-3.740.011 0x15C17487

A possible name is sceIoSchedulerIssueAnotherIoRequestForDriver.

int SceIofilemgrForDriver_15C17487(int io_device_code);

SceIofilemgrForDriver_2EFDFA12

Version NID
3.60 0x2EFDFA12

set path by flags?

int SceIofilemgrForDriver_2EFDFA12(SceUID fd, char *path);

SceIofilemgrForDriver_3675ECB9

Version NID
3.60 0x3675ECB9

could be sceIoSchedDispatcherFsResourceUnavailableForDriver.

some node op. dec ctr.

SceIofilemgrForDriver_3A79FAC9

Version NID
3.60 0x3A79FAC9

delete fd by flags

int SceIofilemgrForDriver_3A79FAC9(SceUID fd);

SceIofilemgrForDriver_6BEEDDB4

Version NID
3.60 0x6BEEDDB4

setting some to fd of dir entry

int SceIofilemgrForDriver_6BEEDDB4(SceUID fd, int a2);

SceIofilemgrForDriver_B499287E

Version NID
3.60 0xB499287E

delete some puid from a1

int SceIofilemgrForDriver_B499287E(void *a1, int n, int *num);

SceIofilemgrForDriver_C722DF35

Version NID
3.60 0xC722DF35

some node op. inc ctr.

sceIoSyncByFdForDriver

Version NID
3.60 0x338dcd68

SceIofilemgr

_sceIoDcloseAsync

Version NID
1.69 0x00B13031
3.60 different NID or not present

_sceIoOpenAsync

Version NID
1.69-3.60 0x09CD0FC8

sceIoGetProcessDefaultPriority

Version NID
1.69-3.60 0x0DC4F1BB

_sceIoRmdirAsync

Version NID
1.69-3.60 0x13DC3244

sceIoSetPriority

Version NID
1.69-3.60 0x14B2D56C

sceIoSyncByFd

Version NID
1.69-3.60 0x16512F59
int sceIoSyncByFd(SceUID fd, unsigned int unk);

_sceIoIoctl

Version NID
1.69-3.60 0x1D2988F1

_sceIoLseekAsync

Version NID
1.69-3.60 0x2300858E

sceIoSetPriorityForSystem

Version NID
1.69-3.60 0x27373135

_sceIoComplete

Version NID
1.69 0x34E6A06E
3.60 different NID or not present

sceIoWrite

Version NID
1.69-3.60 0x34EFD876
int sceIoWrite(SceUID fd, const void *data, SceSize size);

_sceIoGetThreadDefaultPriorityForSystem

Version NID
1.69 0x36CAF911
3.60 different NID or not present

_sceIoSetThreadDefaultPriorityForSystem

Version NID
0.990-1.69 0x38FE853B
3.60 different NID or not present

sceIoFlockForSystem

Version NID
1.69-3.60 0x3E98E422

_sceIoDevctlAsync

Version NID
1.69-3.60 0x3EE3F66E

sceIoDclose

Version NID
1.69-3.60 0x422A221A
int sceIoDclose(SceUID fd);

_sceIoRename

Version NID
1.69-3.60 0x4912F748
typedef struct sceIoRenameOpt {
  uint32_t unk_0;
  uint32_t unk_4;
  uint32_t unk_8;
  uint32_t unk_C;
} sceIoRenameOpt;

int _sceIoRename(const char *oldname, const char *newname, sceIoRenameOpt *opt);

sceIoLseek32

Version NID
1.69-3.60 0x49252B9B
int sceIoLseek32(SceUID fd, int offset, int whence);

sceIoSetThreadDefaultPriority

Version NID
1.69-3.60 0x49312108

_sceIoDevctl

Version NID
1.000.071-3.740.011 0x515AC017

This performs device-specific operations. The details of the operations are driver-dependent.

This is a wrapper for sceIoDevctlForDriver.

/*
Arguments:
devname     Specified device ("<devname><unit>:")
cmd     Command code
arg     Pointer to device-driver-dependent parameter block
arglen     Number of bytes in device-driver-dependent parameter block
bufp     Pointer to return data storage block
buflen     Size of return data storage block

Return Values:
Non-negative (N>=0) Success (driver-dependent) 
<0 Error, e.g. SCE_ERROR_ERRNO_EMFILE, SCE_ERROR_ERRNO_ENODEV, SCE_ERROR_ERRNO_EUNSUP
*/

typedef struct SceIoDevctlOpt { // size is 0x18
    SceSize arglen; // Number of bytes in device-driver-dependent parameter block
    void *bufp; // Pointer to return data storage block
    SceSize buflen; // Size of return data storage block
    char reserved[0xC];
} SceIoDevctlOpt;

int _sceIoDevctl(
    const char *devname,
    int cmd,
    const void *arg,
    const SceIoDevctlOpt *pOpt
);

sceIoGetstatByFdAsync

Version NID
1.69-3.60 0x5167AC1E

_sceIoPread

Version NID
1.69-3.60 0x539FD5C4
typedef struct sceIoPreadOpt {
   SceOff offset;
   uint32_t unk_8;
   uint32_t unk_C;
} sceIoPreadOpt;

int _sceIoPread(SceUID uid, void *buffer, SceSize size, sceIoPreadOpt *opt);

// 3.60
typedef struct SceIoPreadSyscallArgs {
	void *buf;
	SceSize nbyte;
	SceOff offset;
} SceIoPreadSyscallArgs;

SceSSize _sceIoPread(SceUID fd, SceIoPreadSyscallArgs *args);

_sceIoGetstatByFdAsync

Version NID
1.69 0x554292F0
3.60 different NID or not present

_sceIoChstatByFdAsync

Version NID
1.69 0x58010F40
3.60 different NID or not present

_sceIoGetThreadDefaultPriority

Version NID
1.69 0x5DC29460
3.60 different NID or not present

_sceIoSync

Version NID
1.69-3.60 0x5DD867F7
typedef struct sceIoSyncOpt {
  uint32_t unk_0;
  uint32_t unk_4;
} sceIoSyncOpt;

int _sceIoSync(const char* device, unsigned int unk, sceIoSyncOpt* opt);

_sceIoRemoveAsync

Version NID
1.69-3.60 0x5FFA47E2

_sceIoDreadAsync

Version NID
1.69 0x64B233B8
3.60 different NID or not present

_sceIoSetThreadDefaultPriority

Version NID
0.990-1.69 0x654E27B1
3.60 different NID or not present

_sceIoSyncByFdAsync

Version NID
1.69 0x6F78FAFE
3.60 different NID or not present

_sceIoGetPriorityForSystem

Version NID
1.69 0x70B7BB52
3.60 different NID or not present

sceIoReadAsync

Version NID
1.69-3.60 0x773EBD45

_sceIoRemove

Version NID
1.69-3.60 0x78955C65
typedef struct sceIoRemoveOpt {
  uint32_t unk_0;
  uint32_t unk_4;
} sceIoRemoveOpt;

int _sceIoRemove(const char *filename, sceIoRemoveOpt* opt);

sceIoSyncByFdAsync

Version NID
1.69-3.60 0x7E1367CB

sceIoSetProcessDefaultPriority

Version NID
1.69-3.60 0x7F2ABBAF

_sceIoRenameAsync

Version NID
1.69-3.60 0x81794921

_sceIoSyncAsync

Version NID
1.69-3.60 0x86DB0C0E

_sceIoDread

Version NID
1.69-3.60 0x8713D662
int _sceIoDread(SceUID fd, SceIoDirent *dir);

_sceIoWrite

Version NID
1.69 0x8C319CF0
3.60 different NID or not present

_sceIoGetstat

Version NID
1.69-3.60 0x8E7E11F2
typedef struct sceIoGetstatOpt {
  uint32_t unk_0;
  uint32_t unk_4;
} sceIoGetstatOpt;

int _sceIoGetstat(const char *name, SceIoStat *buf, sceIoGetstatOpt *opt);

sceIoCloseAsync

Version NID
1.69-3.60 0x8EA3616A

_sceIoMkdir

Version NID
1.69-3.60 0x8F1ACC32
typedef struct sceIoMkdirOpt {
  uint32_t unk_0;
  uint32_t unk_4;
} sceIoMkdirOpt;

int _sceIoMkdir(const char *dirname, SceIoMode mode, sceIoMkdirOpt opt);

_sceIoCompleteMultiple

Version NID
1.69-3.60 0x9111D004

_sceIoLseek32

Version NID
1.69 0x92BDA6DA
3.60 different NID or not present

_sceIoPwrite

Version NID
1.69-3.60 0x9654094B
typedef struct sceIoPwriteOpt {
   SceOff offset;
   uint32_t unk_8;
   uint32_t unk_C;
} sceIoPwriteOpt;

int _sceIoPwrite(SceUID uid, const void *data, int size, sceIoPwriteOpt *opt);

// 3.60
typedef struct SceIoPwriteSyscallArgs {
	const void *buf;
	SceSize nbyte;
	SceOff offset;
} SceIoPwriteSyscallArgs;

SceSSize _sceIoPwrite(SceUID fd, SceIoPwriteSyscallArgs *args);

_sceIoGetPriority

Version NID
1.69 0x9E3F880D
3.60 different NID or not present

sceIoGetThreadDefaultPriority

Version NID
1.69-3.60 0xA176CD03

_sceIoLseek

Version NID
1.69-3.60 0xA604764A
typedef struct _sceIoLseekOpt { // size is 0x10
  SceOff offset;
  int whence;
  uint32_t unk;
} _sceIoLseekOpt;

SceOff _sceIoLseek(SceUID fd, _sceIoLseekOpt* opt);

// 3.60
typedef struct SceIoLseekSyscallArgs {
	SceOff offset;
	int whence;
	int padding;
} SceIoLseekSyscallArgs;

SceOff _sceIoLseek(SceUID fd, SceIoLseekSyscallArgs *args);

sceIoChstatByFdAsync

Version NID
1.69-3.60 0xA9F89275

_sceIoGetProcessDefaultPriority

Version NID
1.69 0xB0486482
3.60 different NID or not present

_sceIoSetPriority

Version NID
0.990-1.69 0xB14192F0
3.60 different NID or not present

_sceIoReadAsync

Version NID
1.69 0xB2B891E6
3.60 different NID or not present

_sceIoPwriteAsync

Version NID
1.69-3.60 0xB2D0B2F4

_sceIoChstatAsync

Version NID
1.69-3.60 0xB4B021D9

sceIoSetThreadDefaultPriorityForSystem

Version NID
1.69-3.60 0xB9C9C9CF

_sceIoPreadAsync

Version NID
1.69-3.60 0xBCF5684D

sceIoDopenAsync

Version NID
1.69-3.60 0xC49C312F

sceIoClose

Version NID
1.69-3.60 0xC70B8886
int sceIoClose(SceUID fd);

_sceIoWriteAsync

Version NID
1.69 0xC92AF88F
3.60 different NID or not present

_sceIoOpen

Version NID
1.69-3.60 0xCC67B6FD
typedef struct sceIoOpenOpt {
  uint32_t unk_0;
  uint32_t unk_4;
} sceIoOpenOpt;

SceUID _sceIoOpen(const char *filename, int flag, SceIoMode mode, sceIoOpenOpt *opt);

sceIoCancel

Version NID
1.69-3.60 0xCEF48835

sceIoComplete

Version NID
1.69-3.60 0xD1C49D2F

_sceIoChstat

Version NID
1.69-3.60 0xD2EE455F
typedef struct sceIoChstatOpt {
  uint32_t unk_0;
  uint32_t unk_4;
} sceIoChstatOpt;

int _sceIoChstat(const char *name, const SceIoStat *stat, unsigned int cbit, sceIoChstatOpt *opt);

_sceIoSetProcessDefaultPriority

Version NID
0.990-1.69 0xD302DCB9
3.60 different NID or not present

_sceIoGetstatAsync

Version NID
1.69-3.60 0xD414C89F

sceIoDcloseAsync

Version NID
1.69-3.60 0xDC2D7D38

_sceIoIoctlAsync

Version NID
1.69-3.60 0xE00DC256

_sceIoChstatByFd

Version NID
1.69-3.60 0xE0BE2A30
int _sceIoChstatByFd(SceUID fd, const SceIoStat *buf, unsigned int cbit);

sceIoWriteAsync

Version NID
1.69-3.60 0xE0D63D2A

_sceIoGetstatByFd

Version NID
1.69-3.60 0xE6C53567
int _sceIoGetstatByFd(SceUID fd, SceIoStat *stat);

_sceIoSetPriorityForSystem

Version NID
0.990-1.69 0xE6C923B3
3.60 different NID or not present

_sceIoDopen

Version NID
1.69-3.60 0xE6E614B5
typedef struct sceIoDopenOpt {
  uint32_t unk_0;
  uint32_t unk_4;
} sceIoDopenOpt;

SceUID _sceIoDopen(const char *dirname, sceIoDopenOpt *opt);

sceIoGetPriorityForSystem

Version NID
1.69-3.60 0xEF5432ED

sceIoGetPriority

Version NID
1.69-3.60 0xF2A472A1

_sceIoRead

Version NID
1.69-3.60 different NID or not present

_sceIoSyncByFd

Version NID
1.69-3.60 different NID or not present

_sceIoCloseAsync

Version NID
1.69-3.60 different NID or not present

_sceIoDopenAsync

Version NID
1.69-3.60 different NID or not present

sceIoDreadAsync

Version NID
1.69-3.60 0xF59F37B0

_sceIoMkdirAsync

Version NID
1.69-3.60 0xF5C58B21

_sceIoCancel

Version NID
1.69 0xF5DEEA19
3.60 different NID or not present

_sceIoClose

Version NID
1.69 0xF69FB394
3.60 different NID or not present

_sceIoDclose

Version NID
0.990-1.69 0xFAFF0002
3.60 different NID or not present

sceIoGetThreadDefaultPriorityForSystem

Version NID
1.69-3.60 0xFCBCEAED

sceIoRead

Version NID
1.69-3.60 0xFDB32293
sceIoRead(SceUID fd, void *data, SceSize size);

_sceIoRmdir

Version NID
1.69-3.60 0xFFFB4D76
typedef struct sceIoRmdirOpt {
  uint32_t unk_0;
  uint32_t unk_4;
} sceIoRmdirOpt;

int _sceIoRmdir(const char *dirname, sceIoRmdirOpt* opt);

Device Drivers