2016-03-21 18:29:55 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "common.h"
|
2016-12-10 15:32:03 +01:00
|
|
|
#include "fsdir.h"
|
2016-03-21 18:29:55 +01:00
|
|
|
#include "nand.h"
|
|
|
|
|
2016-04-04 22:45:49 +02:00
|
|
|
#define VRT_SYSNAND NAND_SYSNAND
|
|
|
|
#define VRT_EMUNAND NAND_EMUNAND
|
|
|
|
#define VRT_IMGNAND NAND_IMGNAND
|
2016-12-02 15:42:05 +01:00
|
|
|
#define VRT_XORPAD NAND_ZERONAND
|
2017-02-17 15:54:37 +01:00
|
|
|
#define VRT_MEMORY (1UL<<10)
|
|
|
|
#define VRT_GAME (1UL<<11)
|
|
|
|
#define VRT_TICKDB (1UL<<12)
|
|
|
|
#define VRT_CART (1UL<<13)
|
2016-03-22 14:30:11 +01:00
|
|
|
|
2017-02-11 16:52:36 +01:00
|
|
|
#define VRT_SOURCE (VRT_SYSNAND|VRT_EMUNAND|VRT_IMGNAND|VRT_XORPAD|VRT_MEMORY|VRT_GAME|VRT_TICKDB|VRT_CART)
|
2016-11-28 16:30:49 +01:00
|
|
|
|
2017-02-17 15:54:37 +01:00
|
|
|
#define VFLAG_DIR (1UL<<16)
|
|
|
|
#define VFLAG_ROOT (1UL<<17)
|
|
|
|
#define VFLAG_LV3 (1UL<<18)
|
2016-04-22 15:48:57 +02:00
|
|
|
|
2017-01-13 14:20:42 +01:00
|
|
|
#define VRT_DRIVES {'S', VRT_SYSNAND}, {'E', VRT_EMUNAND}, {'I', VRT_IMGNAND}, {'X', VRT_XORPAD }, \
|
2017-02-11 16:52:36 +01:00
|
|
|
{'M', VRT_MEMORY}, {'G', VRT_GAME}, {'T', VRT_TICKDB}, {'C', VRT_CART}
|
2016-12-20 14:41:03 +01:00
|
|
|
|
2016-11-14 22:24:20 +01:00
|
|
|
// virtual file flag (subject to change):
|
|
|
|
// bits 0...9 : reserved for NAND virtual sources and info
|
2016-11-25 18:30:01 +01:00
|
|
|
// bits 10...15: reserved for other virtual sources
|
2016-12-22 19:00:03 +01:00
|
|
|
// bits 16...21: reserved for external flags
|
|
|
|
// bits 22...31: reserved for internal flags (different per source)
|
2016-03-21 18:29:55 +01:00
|
|
|
typedef struct {
|
2016-11-25 18:30:01 +01:00
|
|
|
char name[32];
|
2016-11-28 16:30:49 +01:00
|
|
|
u64 offset; // must be a multiple of 0x200 (for NAND access)
|
|
|
|
u64 size;
|
2016-03-21 18:29:55 +01:00
|
|
|
u32 keyslot;
|
|
|
|
u32 flags;
|
|
|
|
} __attribute__((packed)) VirtualFile;
|
|
|
|
|
2016-11-28 16:30:49 +01:00
|
|
|
// virtual dirs are only relevant for virtual game drives
|
|
|
|
typedef struct {
|
|
|
|
int index;
|
|
|
|
u64 offset;
|
|
|
|
u64 size;
|
|
|
|
u32 flags;
|
|
|
|
} __attribute__((packed)) VirtualDir;
|
|
|
|
|
2016-04-09 21:56:42 +02:00
|
|
|
u32 GetVirtualSource(const char* path);
|
2016-12-20 14:41:03 +01:00
|
|
|
bool InitVirtualImageDrive(void);
|
2016-04-09 21:56:42 +02:00
|
|
|
bool CheckVirtualDrive(const char* path);
|
2016-11-28 21:21:42 +01:00
|
|
|
|
|
|
|
bool ReadVirtualDir(VirtualFile* vfile, VirtualDir* vdir);
|
|
|
|
bool OpenVirtualRoot(VirtualDir* vdir, u32 virtual_src);
|
|
|
|
bool OpenVirtualDir(VirtualDir* vdir, VirtualFile* ventry);
|
|
|
|
|
2016-11-15 23:34:21 +01:00
|
|
|
bool GetVirtualFile(VirtualFile* vfile, const char* path);
|
2016-11-28 21:21:42 +01:00
|
|
|
bool GetVirtualDir(VirtualDir* vdir, const char* path);
|
2016-12-01 02:13:13 +01:00
|
|
|
bool GetVirtualDirContents(DirStruct* contents, char* fpath, int fnsize, const char* pattern, bool recursive);
|
2016-11-28 21:21:42 +01:00
|
|
|
|
2016-12-02 12:45:23 +01:00
|
|
|
bool GetVirtualFilename(char* name, const VirtualFile* vfile, u32 n_chars);
|
|
|
|
|
2017-02-17 04:01:25 +01:00
|
|
|
int ReadVirtualFile(const VirtualFile* vfile, u8* buffer, u64 offset, u64 count, u32* bytes_read);
|
|
|
|
int WriteVirtualFile(const VirtualFile* vfile, const u8* buffer, u64 offset, u64 count, u32* bytes_written);
|
2017-01-17 23:24:46 +01:00
|
|
|
|
|
|
|
u64 GetVirtualDriveSize(const char* path);
|