mirror of
https://github.com/Thesola10/umd-livepatch.git
synced 2025-04-19 22:13:22 +00:00
95 lines
2.6 KiB
C
95 lines
2.6 KiB
C
#include "io_funcs.h"
|
|
#include <string.h>
|
|
|
|
extern PspIoDrvFuncs reserveUmdFuncs;
|
|
|
|
static char umd_id[11] = {0};
|
|
|
|
static char first_read = 1;
|
|
|
|
static char hdr[ISO_SECTOR_SIZE];
|
|
|
|
static inline u32
|
|
_impl_lp_lbaToAddr(struct LbaParams *param)
|
|
{
|
|
u32 offset;
|
|
|
|
if (!param->byte_size_start) {
|
|
offset = param->lba_top * ISO_SECTOR_SIZE;
|
|
} else if (param->byte_size_centre) {
|
|
offset = param->lba_top * ISO_SECTOR_SIZE - param->byte_size_start + ISO_SECTOR_SIZE;
|
|
} else if (!param->byte_size_last) {
|
|
offset = param->lba_top * ISO_SECTOR_SIZE + param->byte_size_start;
|
|
} else {
|
|
offset = param->lba_top * ISO_SECTOR_SIZE - param->byte_size_start + ISO_SECTOR_SIZE;
|
|
}
|
|
|
|
return offset;
|
|
}
|
|
|
|
static inline int
|
|
_impl_lp_readDiscHeader(PspIoDrvFileArg *arg, const char *devname, void *outdata)
|
|
{
|
|
int ret;
|
|
|
|
struct LbaParams param = {
|
|
.unknown1 = 0,
|
|
.cmd = 0, /* read */
|
|
.lba_top = 0x8000 / ISO_SECTOR_SIZE,
|
|
.lba_size = 1,
|
|
.byte_size_total = ISO_SECTOR_SIZE,
|
|
.byte_size_centre = ISO_SECTOR_SIZE,
|
|
.byte_size_start = 0,
|
|
.byte_size_last = 0
|
|
};
|
|
|
|
ret = reserveUmdFuncs.IoDevctl(arg, devname, lp_UmdIoctl_READ_SECTORS,
|
|
¶m, sizeof param, outdata, ISO_SECTOR_SIZE);
|
|
return ret;
|
|
}
|
|
|
|
|
|
static int
|
|
_impl_lp_devctlRead(PspIoDrvFileArg *arg, const char *devname,
|
|
unsigned int cmd, struct LbaParams *param, int inlen,
|
|
void *outdata, int outlen)
|
|
{
|
|
u32 offset = _impl_lp_lbaToAddr(param);
|
|
int ret;
|
|
|
|
if (first_read) {
|
|
ret = reserveUmdFuncs.IoDevctl(arg, devname, cmd, param, inlen, outdata, outlen);
|
|
|
|
_impl_lp_readDiscHeader(arg, devname, &hdr);
|
|
strncpy(umd_id, hdr + 0x373, 10);
|
|
umd_id[10] = 0;
|
|
Kprintf("Disc ID obtained: '%s'\n", umd_id);
|
|
|
|
first_read = 0;
|
|
|
|
return ret;
|
|
}
|
|
|
|
passthru:
|
|
return reserveUmdFuncs.IoDevctl(arg, devname, cmd, param, inlen, outdata, outlen);
|
|
}
|
|
|
|
int
|
|
patched_IoDevctl(PspIoDrvFileArg *arg, const char *devname,
|
|
unsigned int cmd, void *indata, int inlen,
|
|
void *outdata, int outlen)
|
|
{
|
|
switch ((lp_UmdIoctl) cmd) {
|
|
case lp_UmdIoctl_READ_GENERAL:
|
|
case lp_UmdIoctl_READ_CACHE:
|
|
case lp_UmdIoctl_READ_SECTORS:
|
|
return _impl_lp_devctlRead(arg, devname, cmd, (struct LbaParams *) indata,
|
|
inlen, outdata, outlen);
|
|
default:
|
|
goto passthru;
|
|
}
|
|
|
|
passthru:
|
|
return reserveUmdFuncs.IoDevctl(arg, devname, cmd, indata, inlen, outdata, outlen);
|
|
}
|