17#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
34iomanX_iop_device_t **dev_list;
37static const char *ioman_modname =
"IO/File_Manager";
45 addr = GetLoadcoreInternalData()->image_info;
59 int len = strlen(name) + 1;
65 if (!memcmp(info->name, name, len))
72void fix_imports(iop_library_t *
lib)
80 for(table =
lib->caller; table != NULL; table = table->next)
83 for(stub = (
struct irx_import_stub *) table->stubs; stub->jump != 0; stub++)
86 stub->jump = 0x08000000 | (((u32)
lib->exports[stub->fno] << 4) >> 6);
93static u32 *ioman_exports;
96static u32 Addr_IOMAN_AddDrv = 0;
97static u32 Addr_IOMAN_DelDrv = 0;
103static int sbv_AddDrv(iomanX_iop_device_t *device)
108 res = AddDrv(device);
110 if (Addr_IOMAN_AddDrv)
111 return(((
int (*)(iomanX_iop_device_t *device)) (Addr_IOMAN_AddDrv))(device));
117static int sbv_DelDrv(
const char *name)
123 if (Addr_IOMAN_DelDrv)
124 return(((
int (*)(
const char *name)) (Addr_IOMAN_DelDrv))(name));
135int ioman_open(
const char *name, u32 flags)
137 return(iomanX_open(name, flags, 0644));
140int ioman_mkdir(
const char *name)
142 return(iomanX_mkdir(name, 0755));
146int ioman_format(
const char *dev)
153int mode2modex(
int mode);
154int modex2mode(
int mode);
158 stat->mode = modex2mode(iox_stat->mode);
159 stat->attr = iox_stat->attr;
160 stat->size = iox_stat->size;
161 memcpy(stat->ctime, iox_stat->ctime,
sizeof(iox_stat->ctime));
162 memcpy(stat->atime, iox_stat->atime,
sizeof(iox_stat->atime));
163 memcpy(stat->mtime, iox_stat->mtime,
sizeof(iox_stat->mtime));
164 stat->hisize = iox_stat->hisize;
169 iox_stat->mode = mode2modex(stat->mode);
170 iox_stat->attr = stat->attr;
171 iox_stat->size = stat->size;
172 memcpy(iox_stat->ctime, stat->ctime,
sizeof(stat->ctime));
173 memcpy(iox_stat->atime, stat->atime,
sizeof(stat->atime));
174 memcpy(iox_stat->mtime, stat->mtime,
sizeof(stat->mtime));
175 iox_stat->hisize = stat->hisize;
183 if (f == NULL || !(f->
mode & 8))
191 res = f->
device->ops->dread(f, &iox_dirent);
193 statx2stat(&iox_dirent.stat, &io_dirent->stat);
195 strncpy(io_dirent->name, iox_dirent.name,
sizeof(iox_dirent.name));
200 io_dread_t *io_dread = (io_dread_t*) f->
device->ops->dread;
201 res = io_dread(f, io_dirent);
207int ioman_getstat(
const char *name,
io_stat_t *stat)
210 int res = iomanX_getstat(name, &iox_stat);
212 statx2stat(&iox_stat, stat);
216int ioman_chstat(
const char *name,
io_stat_t *stat,
unsigned int mask)
219 stat2statx(stat, &iox_stat);
220 return iomanX_chstat(name, &iox_stat, mask);
229 iop_library_t ioman_library = { NULL, NULL, 0x102, 0,
"ioman\0\0" };
238 if (!
smod_get_mod_by_name(ioman_modname, &info) || !(ioman_exports = (u32 *)QueryLibraryEntryTable(&ioman_library)))
243 old_version = _exp_ioman.version;
244 _exp_ioman.version |= 0xFF;
245 ret = RegisterLibraryEntries(&_exp_ioman);
246 _exp_ioman.version = old_version;
258 old_version = _exp_ioman.version;
259 _exp_ioman.version |= 0xFF;
260 ret = RegisterLibraryEntries(&_exp_ioman);
261 _exp_ioman.version = old_version;
266 ReleaseLibraryEntries((
struct irx_export_table *) (((uiptr) ioman_exports) - 0x14));
269 Addr_IOMAN_AddDrv = ioman_exports[20];
270 Addr_IOMAN_DelDrv = ioman_exports[21];
272 ioman_exports[20] = (u32) sbv_AddDrv;
273 ioman_exports[21] = (u32) sbv_DelDrv;
276 fix_imports((iop_library_t *)(((uiptr) ioman_exports) - 0x14));
279 dev_list = iomanX_GetDeviceList();
281 memcpy(dev_list, (
void *) (info.text_start + info.text_size + info.data_size + 0x10),
sizeof(iomanX_iop_device_t *) * 16);
284 memset((
void *) (info.text_start + info.text_size + info.data_size + 0x10), 0,
sizeof(iomanX_iop_device_t *) * 16);
288 memcpy(file_table, (
void *) (info.text_start + info.text_size + info.data_size + 0x50),
sizeof(
iomanX_iop_file_t) * 16);
291 memset((
void *) (info.text_start + info.text_size + info.data_size + 0x50), 0,
sizeof(
iomanX_iop_file_t) * 16);
297int unhook_ioman(
void)
302 ReleaseLibraryEntries(&_exp_ioman);
303 RegisterLibraryEntries((
struct irx_export_table *) (((uiptr) ioman_exports) - 0x14));
309 ioman_exports[20] = Addr_IOMAN_AddDrv;
310 ioman_exports[21] = Addr_IOMAN_DelDrv;
313 fix_imports((iop_library_t *) (((uiptr) ioman_exports) - 0x14));
315 ioman_exports = NULL;
ModuleInfo_t * smod_get_next_mod(ModuleInfo_t *cur_mod)
ModuleInfo_t * smod_get_mod_by_name(const char *name)
int iomanX_format(const char *dev, const char *blockdev, void *arg, int arglen)
struct _iomanX_iop_file iomanX_iop_file_t
struct _ModuleInfo ModuleInfo_t
struct _iomanX_iop_device * device