diff --git a/source/fs/fsdrive.c b/source/fs/fsdrive.c index cc06e7b..b8c2d7e 100644 --- a/source/fs/fsdrive.c +++ b/source/fs/fsdrive.c @@ -194,7 +194,8 @@ uint64_t GetFreeSpace(const char* path) uint64_t GetTotalSpace(const char* path) { FATFS* fsobj = GetMountedFSObject(path); - return (fsobj) ? ((uint64_t) (fsobj->n_fatent - 2) * fsobj->csize * _MAX_SS) : 0; + return (fsobj) ? ((uint64_t) (fsobj->n_fatent - 2) * fsobj->csize * _MAX_SS) : + GetVirtualDriveSize(path); } uint64_t GetPartitionOffsetSector(const char* path) diff --git a/source/virtual/vcart.c b/source/virtual/vcart.c index 1a7f814..de5baff 100644 --- a/source/virtual/vcart.c +++ b/source/virtual/vcart.c @@ -44,3 +44,7 @@ int ReadVCartFile(const VirtualFile* vfile, u8* buffer, u32 offset, u32 count) { return ReadCartPrivateHeader(buffer, offset, count, cdata); else return ReadCartBytes(buffer, offset, count, cdata); } + +u64 GetVCartDriveSize(void) { + return cart_init ? cdata->cart_size : 0; +} diff --git a/source/virtual/vcart.h b/source/virtual/vcart.h index d9a9012..23c5596 100644 --- a/source/virtual/vcart.h +++ b/source/virtual/vcart.h @@ -7,3 +7,4 @@ u32 InitVCartDrive(void); bool ReadVCartDir(VirtualFile* vfile, VirtualDir* vdir); int ReadVCartFile(const VirtualFile* vfile, u8* buffer, u32 offset, u32 count); // int WriteVCartFile(const VirtualFile* vfile, const u8* buffer, u32 offset, u32 count); // no writes +u64 GetVCartDriveSize(void); diff --git a/source/virtual/vgame.c b/source/virtual/vgame.c index 2ca20ab..6748087 100644 --- a/source/virtual/vgame.c +++ b/source/virtual/vgame.c @@ -743,3 +743,7 @@ bool MatchVGameLv3Filename(const char* name, const VirtualFile* vfile, u32 n_cha if (!GetVGameLv3Filename(lv3_name, vfile, 256)) return false; return (strncasecmp(name, lv3_name, n_chars) == 0); } + +u64 GetVGameDriveSize(void) { + return (vgame_type) ? GetMountSize() : 0; +} diff --git a/source/virtual/vgame.h b/source/virtual/vgame.h index bc6284f..c1c1e3b 100644 --- a/source/virtual/vgame.h +++ b/source/virtual/vgame.h @@ -15,3 +15,5 @@ int ReadVGameFile(const VirtualFile* vfile, u8* buffer, u32 offset, u32 count); bool FindVirtualFileInLv3Dir(VirtualFile* vfile, const VirtualDir* vdir, const char* name); bool GetVGameLv3Filename(char* name, const VirtualFile* vfile, u32 n_chars); bool MatchVGameLv3Filename(const char* name, const VirtualFile* vfile, u32 n_chars); + +u64 GetVGameDriveSize(void); diff --git a/source/virtual/virtual.c b/source/virtual/virtual.c index ef628bf..daaa7ff 100644 --- a/source/virtual/virtual.c +++ b/source/virtual/virtual.c @@ -193,3 +193,14 @@ int WriteVirtualFile(const VirtualFile* vfile, const u8* buffer, u32 offset, u32 return -1; } + +u64 GetVirtualDriveSize(const char* path) { + u32 virtual_src = GetVirtualSource(path); + if (virtual_src & (VRT_SYSNAND|VRT_EMUNAND|VRT_IMGNAND)) + return GetVNandDriveSize(virtual_src); + else if (virtual_src & VRT_GAME) + return GetVGameDriveSize(); + else if (virtual_src & VRT_CART) + return GetVCartDriveSize(); + return 0; +} diff --git a/source/virtual/virtual.h b/source/virtual/virtual.h index c2924cf..1ea52f8 100644 --- a/source/virtual/virtual.h +++ b/source/virtual/virtual.h @@ -59,3 +59,5 @@ bool GetVirtualFilename(char* name, const VirtualFile* vfile, u32 n_chars); int ReadVirtualFile(const VirtualFile* vfile, u8* buffer, u32 offset, u32 count, u32* bytes_read); int WriteVirtualFile(const VirtualFile* vfile, const u8* buffer, u32 offset, u32 count, u32* bytes_written); + +u64 GetVirtualDriveSize(const char* path); diff --git a/source/virtual/vnand.c b/source/virtual/vnand.c index 8c3a8e4..5af88e3 100644 --- a/source/virtual/vnand.c +++ b/source/virtual/vnand.c @@ -97,3 +97,7 @@ int WriteVNandFile(const VirtualFile* vfile, const u8* buffer, u32 offset, u32 c if ((res == 0) && (vfile->flags & VFLAG_GBA_VC)) res = FixAgbSaveCmac(nand_dst); return res; } + +u64 GetVNandDriveSize(u32 nand_src) { + return GetNandSizeSectors(nand_src) * 0x200; +} diff --git a/source/virtual/vnand.h b/source/virtual/vnand.h index 02ca6dd..ae2ac44 100644 --- a/source/virtual/vnand.h +++ b/source/virtual/vnand.h @@ -7,3 +7,4 @@ bool CheckVNandDrive(u32 nand_src); bool ReadVNandDir(VirtualFile* vfile, VirtualDir* vdir); int ReadVNandFile(const VirtualFile* vfile, u8* buffer, u32 offset, u32 count); int WriteVNandFile(const VirtualFile* vfile, const u8* buffer, u32 offset, u32 count); +u64 GetVNandDriveSize(u32 nand_src);