WiiFlow_Lite/source/channel/nand.hpp
overjoy.psm 1cb8a493d9 * Enabled nand extract features for full nand and game saves
* Made nand emulation kind of noob prove
* Wiiflow will search for a valid FAT32 partition if nand emu is enabled, but no partition is selected
* Wiiflow will now offer to extract the nand if nand emu is enabled, and no nand for nand emulation is available
* Wiiflow will now offer to extract a game save if nand emulation is enabled, a save is found on real nand and no save is found on emu nand.cpp
* Illegal chars for FAT are now escaped the 'd2x' way in the nand file extractor

TODO:

* Add nand extract functions to game config menu's
* Add feature to flash a save back to real nand
2012-05-02 23:08:11 +00:00

127 lines
3.3 KiB
C++

#ifndef _NAND_H_
#define _NAND_H_
#include <gccore.h>
#include <malloc.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <iostream>
#include <string>
#define REAL_NAND 0
#define EMU_SD 1
#define EMU_USB 2
#define DOWNLOADED_CHANNELS 0x00010001
#define SYSTEM_CHANNELS 0x00010002
#define RF_NEWS_CHANNEL 0x48414741
#define RF_FORECAST_CHANNEL 0x48414641
#define SYSCONFPATH "/shared2/sys/SYSCONF"
#define TXTPATH "/title/00000001/00000002/data/setting.txt"
#define BLOCK 2048
typedef void (*dump_callback_t)(int dumpstat, int dumpprog, int filestat, int fileprog, int files, int folders, char *tmess, void *user_data);
/* 'NAND Device' structure */
typedef struct nandDevice
{
const char *Name;
u32 Mode;
u32 Mount;
u32 Unmount;
} NandDevice;
typedef struct _config_header
{
u8 magic[4];
u16 ncnt;
u16 noff[];
} config_header;
typedef struct _namelist
{
char name[ISFS_MAXPATH];
int type;
} namelist;
using namespace std;
class Nand
{
public:
static Nand * Instance();
static void DestroyInstance();
/* Prototypes */
void Init(string path, u32 partition, bool disable = false);
s32 Enable_Emu();
s32 Disable_Emu();
void Set_Partition(u32 partition) { Partition = partition; };
void Set_FullMode(bool fullmode) { FullMode = fullmode ? 0x100 : 0; };
void Set_RCMode(bool rcmode) { FullMode = rcmode ? 0x40 : 0; };
const char * Get_NandPath(void) { return NandPath; };
u32 Get_Partition(void) { return Partition; };
void Set_NandPath(string path);
void CreatePath(const char *path, ...);
s32 CreateConfig(const char *path);
s32 Do_Region_Change(string id);
s32 DoNandDump(const char *source, const char *dest, bool dumpwgs, dump_callback_t i_dumper, void *i_data);
s32 CalcDumpSpace(const char *source, bool dumpwgs, dump_callback_t i_dumper, void *i_data);
void ResetCounters(void);
private:
Nand() : MountedDevice(0), EmuDevice(REAL_NAND), Disabled(true), Partition(0), FullMode(0x100), NandPath() {}
~Nand(void){}
/* Prototypes */
s32 Nand_Mount(NandDevice *Device);
s32 Nand_Unmount(NandDevice *Device);
s32 Nand_Enable(NandDevice *Device);
s32 Nand_Disable(void);
void __Dec_Enc_TB(void);
void __configshifttxt(char *str);
void __GetNameList(const char *source, namelist **entries, int *count);
s32 __configread(void);
s32 __configwrite(void);
u32 __configsetbyte(const char *item, u8 val);
u32 __configsetbigarray(const char *item, void *val, u32 size);
u32 __configsetsetting(const char *item, const char *val);
bool __FileExists(const char *path, ...);
void __FATify(char *dst, const char *src);
s32 __Unescaped2x(const char *path);
s32 __FlashNandFile(const char *source, const char *dest);
s32 __DumpNandFile(const char *source, const char *dest);
s32 __DumpNandFolder(const char *source, const char *dest);
u32 MountedDevice;
u32 EmuDevice;
u32 NandSize;
u32 NandDone;
u32 FileDone;
u32 FilesDone;
u32 FoldersDone;
bool Disabled;
bool n_dumpwgs;
bool fake;
bool showprogress;
void *data;
dump_callback_t dumper;
u32 Partition ATTRIBUTE_ALIGN(32);
u32 FullMode ATTRIBUTE_ALIGN(32);
char NandPath[32] ATTRIBUTE_ALIGN(32);
char cfgpath[1024];
char settxtpath[1024];
static Nand * instance;
};
#endif