mirror of
https://github.com/wiiu-env/wiiu-nanddumper-payload.git
synced 2024-11-18 01:19:17 +01:00
82 lines
1.7 KiB
C
82 lines
1.7 KiB
C
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include "svc.h"
|
||
|
#include "fsa.h"
|
||
|
|
||
|
#define BSP_memcpy ((void *(*)(void*, void*, unsigned int))0xE600EA18)
|
||
|
#define BSP_memset ((void *(*)(void*, int, unsigned int))0xE600EAB4)
|
||
|
#define BSP_strncpy ((char *(*)(char*, const char*, unsigned int))0xE600F4AC)
|
||
|
|
||
|
static void* allocIobuf()
|
||
|
{
|
||
|
void* ptr = svcAlloc(0xCAFF, 0x828);
|
||
|
BSP_memset(ptr, 0x00, 0x828);
|
||
|
|
||
|
return ptr;
|
||
|
}
|
||
|
|
||
|
static void freeIobuf(void* ptr)
|
||
|
{
|
||
|
svcFree(0xCAFF, ptr);
|
||
|
}
|
||
|
|
||
|
int FSA_RawOpen(int fd, const char* device_path, int* outHandle)
|
||
|
{
|
||
|
u8* iobuf = allocIobuf();
|
||
|
u32* inbuf = (u32*)iobuf;
|
||
|
u32* outbuf = (u32*)&iobuf[0x520];
|
||
|
|
||
|
BSP_strncpy((char*)&inbuf[0x01], device_path, 0x27F);
|
||
|
|
||
|
int ret = svcIoctl(fd, 0x6A, inbuf, 0x520, outbuf, 0x293);
|
||
|
|
||
|
if(outHandle) *outHandle = outbuf[1];
|
||
|
|
||
|
freeIobuf(iobuf);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
int FSA_RawClose(int fd, int device_handle)
|
||
|
{
|
||
|
u8* iobuf = allocIobuf();
|
||
|
u32* inbuf = (u32*)iobuf;
|
||
|
u32* outbuf = (u32*)&iobuf[0x520];
|
||
|
|
||
|
inbuf[1] = device_handle;
|
||
|
|
||
|
int ret = svcIoctl(fd, 0x6D, inbuf, 0x520, outbuf, 0x293);
|
||
|
|
||
|
freeIobuf(iobuf);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
int FSA_RawWrite(int fd, void* data, u32 size_bytes, u32 cnt, u64 blocks_offset, int device_handle)
|
||
|
{
|
||
|
u8* iobuf = allocIobuf();
|
||
|
u8* inbuf8 = iobuf;
|
||
|
u8* outbuf8 = &iobuf[0x520];
|
||
|
iovec_s* iovec = (iovec_s*)&iobuf[0x7C0];
|
||
|
u32* inbuf = (u32*)inbuf8;
|
||
|
u32* outbuf = (u32*)outbuf8;
|
||
|
|
||
|
inbuf[0x08 / 4] = (blocks_offset >> 32);
|
||
|
inbuf[0x0C / 4] = (blocks_offset & 0xFFFFFFFF);
|
||
|
inbuf[0x10 / 4] = cnt;
|
||
|
inbuf[0x14 / 4] = size_bytes;
|
||
|
inbuf[0x18 / 4] = device_handle;
|
||
|
|
||
|
iovec[0].ptr = inbuf;
|
||
|
iovec[0].len = 0x520;
|
||
|
|
||
|
iovec[1].ptr = data;
|
||
|
iovec[1].len = size_bytes * cnt;
|
||
|
|
||
|
iovec[2].ptr = outbuf;
|
||
|
iovec[2].len = 0x293;
|
||
|
|
||
|
int ret = svcIoctlv(fd, 0x6C, 2, 1, iovec);
|
||
|
|
||
|
freeIobuf(iobuf);
|
||
|
return ret;
|
||
|
}
|