| 
									
										
										
										
											2013-04-17 23:09:55 -04:00
										 |  |  | // Copyright 2013 Dolphin Emulator Project
 | 
					
						
							|  |  |  | // Licensed under GPLv2
 | 
					
						
							|  |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <map>
 | 
					
						
							| 
									
										
										
										
											2014-08-25 23:40:05 -04:00
										 |  |  | #include <memory>
 | 
					
						
							| 
									
										
										
										
											2013-10-18 03:32:56 -04:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2014-02-21 01:47:53 +01:00
										 |  |  | #include <vector>
 | 
					
						
							| 
									
										
										
										
											2013-10-18 03:32:56 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-21 01:47:53 +01:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "DiscIO/Volume.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-21 01:47:53 +01:00
										 |  |  | namespace File { struct FSTEntry; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | // --- this volume type is used for reading files directly from the hard drive ---
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace DiscIO | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-31 22:42:10 +00:00
										 |  |  | class CVolumeDirectory : public IVolume | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	CVolumeDirectory(const std::string& _rDirectory, bool _bIsWii, | 
					
						
							|  |  |  | 		const std::string& _rApploader = "", const std::string& _rDOL = ""); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	~CVolumeDirectory(); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	static bool IsValidDirectory(const std::string& _rDirectory); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-08 01:54:44 +01:00
										 |  |  | 	bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const override; | 
					
						
							|  |  |  | 	bool RAWRead(u64 _Offset, u64 _Length, u8* _pBuffer) const override; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-08 01:54:44 +01:00
										 |  |  | 	std::string GetUniqueID() const override; | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	void SetUniqueID(std::string _ID); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-08 01:54:44 +01:00
										 |  |  | 	std::string GetMakerID() const override; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-08 01:54:44 +01:00
										 |  |  | 	std::vector<std::string> GetNames() const override; | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	void SetName(std::string); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-08 01:54:44 +01:00
										 |  |  | 	u32 GetFSTSize() const override; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-08 01:54:44 +01:00
										 |  |  | 	std::string GetApploaderDate() const override; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-08 01:54:44 +01:00
										 |  |  | 	ECountry GetCountry() const override; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-08 01:54:44 +01:00
										 |  |  | 	u64 GetSize() const override; | 
					
						
							|  |  |  | 	u64 GetRawSize() const override; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	void BuildFST(); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | private: | 
					
						
							|  |  |  | 	static std::string ExtractDirectoryName(const std::string& _rDirectory); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	void SetDiskTypeWii(); | 
					
						
							|  |  |  | 	void SetDiskTypeGC(); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	bool SetApploader(const std::string& _rApploader); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	void SetDOL(const std::string& _rDOL); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	// writing to read buffer
 | 
					
						
							| 
									
										
										
										
											2014-08-25 23:40:05 -04:00
										 |  |  | 	void WriteToBuffer(u64 _SrcStartAddress, u64 _SrcLength, const u8* _Src, | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 					   u64& _Address, u64& _Length, u8*& _pBuffer) const; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	void PadToAddress(u64 _StartAddress, u64& _Address, u64& _Length, u8*& _pBuffer) const; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-25 23:40:05 -04:00
										 |  |  | 	void Write32(u32 data, u32 offset, std::vector<u8>* const buffer); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	// FST creation
 | 
					
						
							|  |  |  | 	void WriteEntryData(u32& entryOffset, u8 type, u32 nameOffset, u64 dataOffset, u32 length); | 
					
						
							|  |  |  | 	void WriteEntryName(u32& nameOffset, const std::string& name); | 
					
						
							|  |  |  | 	void WriteEntry(const File::FSTEntry& entry, u32& fstOffset, u32& nameOffset, u64& dataOffset, u32 parentEntryNum); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	// returns number of entries found in _Directory
 | 
					
						
							|  |  |  | 	u32 AddDirectoryEntries(const std::string& _Directory, File::FSTEntry& parentEntry); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	std::string m_rootDirectory; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	std::map<u64, std::string> m_virtualDisk; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	u32 m_totalNameSize; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	// gc has no shift, wii has 2 bit shift
 | 
					
						
							|  |  |  | 	u32 m_addressShift; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	// first address on disk containing file data
 | 
					
						
							|  |  |  | 	u64 m_dataStartAddress; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	u64 m_fstNameOffset; | 
					
						
							| 
									
										
										
										
											2014-08-25 23:40:05 -04:00
										 |  |  | 	std::vector<u8> m_FSTData; | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-25 23:40:05 -04:00
										 |  |  | 	std::vector<u8> m_diskHeader; | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	#pragma pack(push, 1)
 | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 	struct SDiskHeaderInfo | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		u32 debug_mntr_size; | 
					
						
							|  |  |  | 		u32 simulated_mem_size; | 
					
						
							|  |  |  | 		u32 arg_offset; | 
					
						
							|  |  |  | 		u32 debug_flag; | 
					
						
							|  |  |  | 		u32 track_location; | 
					
						
							|  |  |  | 		u32 track_size; | 
					
						
							|  |  |  | 		u32 countrycode; | 
					
						
							|  |  |  | 		u32 unknown; | 
					
						
							|  |  |  | 		u32 unknown2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// All the data is byteswapped
 | 
					
						
							| 
									
										
										
										
											2014-08-30 16:35:15 -04:00
										 |  |  | 		SDiskHeaderInfo() | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 			debug_mntr_size = 0; | 
					
						
							|  |  |  | 			simulated_mem_size = 0; | 
					
						
							|  |  |  | 			arg_offset = 0; | 
					
						
							|  |  |  | 			debug_flag = 0; | 
					
						
							|  |  |  | 			track_location = 0; | 
					
						
							|  |  |  | 			track_size = 0; | 
					
						
							|  |  |  | 			countrycode = 0; | 
					
						
							|  |  |  | 			unknown = 0; | 
					
						
							|  |  |  | 			unknown2 = 0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 	#pragma pack(pop)
 | 
					
						
							| 
									
										
										
										
											2014-08-25 23:40:05 -04:00
										 |  |  | 	std::unique_ptr<SDiskHeaderInfo> m_diskHeaderInfo; | 
					
						
							| 
									
										
										
										
											2009-12-10 09:16:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-25 23:40:05 -04:00
										 |  |  | 	std::vector<u8> m_apploader; | 
					
						
							|  |  |  | 	std::vector<u8> m_DOL; | 
					
						
							| 
									
										
										
										
											2012-04-23 00:38:58 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-01 15:48:02 -04:00
										 |  |  | 	u64 m_fst_address; | 
					
						
							|  |  |  | 	u64 m_dol_address; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-23 00:38:58 -07:00
										 |  |  | 	static const u8 ENTRY_SIZE = 0x0c; | 
					
						
							|  |  |  | 	static const u8 FILE_ENTRY = 0; | 
					
						
							|  |  |  | 	static const u8 DIRECTORY_ENTRY = 1; | 
					
						
							|  |  |  | 	static const u64 DISKHEADER_ADDRESS = 0; | 
					
						
							|  |  |  | 	static const u64 DISKHEADERINFO_ADDRESS = 0x440; | 
					
						
							|  |  |  | 	static const u64 APPLOADER_ADDRESS = 0x2440; | 
					
						
							|  |  |  | 	static const u32 MAX_NAME_LENGTH = 0x3df; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace
 |