1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: fs_FileSystemBase.h 4 5 Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 26463 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NN_FS_CTR_MPCORE_FS_FILESYSTEMBASE_H_ 17 #define NN_FS_CTR_MPCORE_FS_FILESYSTEMBASE_H_ 18 19 #include <nn/Handle.h> 20 #include <nn/fs/fs_IpcFileSystem.h> 21 22 #include "fs_UserFileSystem.h" 23 24 namespace nn { namespace fs { namespace detail { 25 26 class FileSystemBaseImpl : public nn::fs::CTR::MPCore::detail::UserFileSystem 27 { 28 }; 29 30 }}} 31 32 namespace nn { namespace fs { 33 34 /*! 35 @brief rom アーカイブのマウントに必要なメモリサイズを取得します。 36 37 ビルド時に生成される ROMFS を参照する rom アーカイブのマウントに必要なメモリサイズを計算して返します。 38 このサイズは、maxFile で指定される数のファイルと、 39 maxDirectory で指定される数のディレクトリを、同時に開くことができるだけのメモリのサイズも含まれます。 40 useCache を true に設定することで、ROMFS のメタデータをメモリにキャッシュする場合に必要なメモリサイズを返します。 41 42 @param[in] maxFile 同時に開くファイルの最大数 43 @param[in] maxDirectory 同時に開くディレクトリの最大数 44 @param[in] useCache メタ情報をメモリにキャッシュするなら true、しないなら false 45 46 @return 計算したメモリサイズを返します。rom アーカイブをマウントすることができない場合、負の値を返します。 47 48 */ 49 s32 GetRomRequiredMemorySize(size_t maxFile, size_t maxDirectory, bool useCache = true); 50 51 /*! 52 @brief rom アーカイブをマウントします。 53 54 ビルド時に生成される ROMFS を参照する rom アーカイブをマウントします。 55 rom アーカイブに対し、maxFile で指定された数のファイルを同時に開くことができ、 56 maxDirectory で指定された数のディレクトリを同時に開けるようになります。 57 workingMemory には @ref GetRomRequiredMemorySize 関数で計算された必要メモリ以上の大きさのメモリを渡す必要があります。 58 useCache を true に設定することで、ROMFS のメタデータをメモリにキャッシュします。 59 これにより、ファイルを開いたり、ディレクトリの走査をするのにかかる時間が短縮されますが、 60 必要なメモリ量は増加します。 61 62 @param[in] archiveName アーカイブ名を指定します(省略するオーバロードでは "rom:" が暗黙的に指定されます) 63 @param[in] maxFile 同時に開くファイルの最大数 64 @param[in] maxDirectory 同時に開くディレクトリの最大数 65 @param[in] workingMemory rom アーカイブの動作に使用するメモリ領域の先頭アドレス 66 @param[in] workingMemorySize rom アーカイブの動作に使用するメモリ領域のサイズ 67 @param[in] useCache メタ情報をメモリにキャッシュするなら true、しないなら false 68 69 @return 処理の結果を返します。 70 71 */ 72 Result MountRom(const char* archiveName, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize, bool useCache = true); 73 Result MountRom(size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize, bool useCache = true); 74 75 /*! 76 @brief セーブデータ領域をフォーマットします。 77 78 アプリケーション固有の領域であるセーブデータ領域を、フォーマットします。 79 この関数を呼ぶと、既存のセーブデータがあった場合には消去されます。 80 81 フォーマットの際には、 82 このセーブデータ領域がもつことのできるファイルの最大数と、ディレクトリの最大数を指定することができます。 83 この数を超えて、ファイルやディレクトリを作成することはできません。 84 85 @param[in] maxFiles ファイルの最大数を指定します 86 @param[in] maxDirectories ディレクトリの最大数を指定します 87 88 @return 処理の結果を返します。 89 90 */ 91 Result FormatSaveData(size_t maxFiles, size_t maxDirectories); 92 93 /*! 94 @brief セーブデータアーカイブをマウントします。 95 96 アプリケーション固有の領域であるセーブデータ領域を、指定されたアーカイブ名でマウントします。 97 セーブデータ領域を使用する前には、セーブデータ領域をフォーマットする必要があります。 98 この関数を呼んだ際に nn::fs::ResultNotFormatted() が返ってきた際には、 99 @ref FormatSaveData 関数を呼ぶことで、セーブデータ領域を初期化した後、 100 もう一度この関数を呼んでマウントしてください。 101 102 @param[in] archiveName アーカイブ名を指定します(省略した際は "data:" が指定されます) 103 104 @return 処理の結果を返します。 105 106 */ 107 Result MountSaveData(const char* archiveName = "data:"); 108 109 /*! 110 @brief セーブデータの変更をコミットします。(※コミット機能は未実装です) 111 112 指定のアーカイブ名でマウントされたセーブデータ領域をコミットし、 113 書き込んだデータを確実なものとします。 114 この関数を呼ばずにアーカイブをアンマウントしたり、プログラムが停止した場合、 115 前回のコミットからこれまでのセーブデータへの変更は全て巻き戻されます。 116 この関数が正常に返ってきた場合、セーブデータへの変更が正しく行われたことが保障されます。 117 この関数の実行中にプログラムが中断した場合のセーブデータの状態は、 118 「以前コミットが行われた状態か」もしくは「全ての変更が反映された状態」のどちらかになります。 119 破損したり、中途半端な状態になることはありません。 120 121 ※現在、セーブデータのコミット機能は未実装です。 122 この関数を呼ばなくてもセーブデータへの変更は反映されます。 123 また、セーブデータへの書き込み中にプログラムが中断した場合などには、 124 セーブデータが破損する可能性があります。 125 ご注意ください。 126 127 @param[in] archiveName アーカイブ名を指定します(省略した際は "data:" が指定されます) 128 129 @return 処理の結果を返します。 130 131 */ 132 inline Result CommitSaveData(const char* archiveName = "data:") { NN_UNUSED_VAR(archiveName); return ResultSuccess(); } 133 134 /*! 135 @brief 拡張セーブデータ領域を作成します。 136 137 Id に対応した拡張セーブデータ領域を作成します。 138 139 @param[out] pOut 作成した拡張セーブデータ領域の MediaType が返ります 140 @param[in] id 拡張セーブデータの ID を指定します。 141 @param[in] iconData アイコンデータを指定します。 142 @param[in] iconDataSize アイコンデータのサイズを指定します。 143 @param[in] entryDirectory この拡張セーブデータ領域に格納したいディレクトリ数を指定します。 144 @param[in] entryFile この拡張セーブデータ領域に格納したいファイル数を指定します。 145 146 @return 処理の結果を返します。 147 148 */ 149 Result CreateExtSaveData(nn::fs::MediaType *pOut, nn::fs::ExtSaveDataId id, const void* iconData, size_t iconDataSize, u32 entryDirectory, u32 entryFile); 150 151 /*! 152 @brief 拡張セーブデータをマウントします。 153 154 指定した拡張セーブデータ ID の拡張セーブデータ領域を、アーカイブとしてマウントします。 155 拡張セーブデータが存在しない場合には、nn::fs::ResultArchiveNotFound() が返されます。 156 この場合、@ref FormatAndMountExtSaveData を呼んで拡張セーブデータを作成してください。 157 158 どのメディアの拡張セーブデータをマウントしたかが pOut 引数によって返されます。 159 160 @param[out] pOut マウントした拡張セーブデータのメディアを返します。 161 @param[in] archiveName アーカイブ名を指定します。 162 @param[in] id 拡張セーブデータの ID を指定します。 163 164 @return 処理の結果を返します。 165 */ 166 Result MountExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, nn::fs::ExtSaveDataId id); 167 168 /*! 169 */ 170 Result MountExtSaveDataForBoss(const char* archiveName, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id); 171 172 /*! 173 */ 174 Result MountExtSaveDataForBossRaw(ArchiveHandle *pOut, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id); 175 176 /*! 177 @brief 拡張セーブデータを作成後、マウントします。 178 179 Id に対応した拡張セーブデータ領域を作成した後、これをマウントします。 180 181 @param[out] pOut 作成・マウントした拡張セーブデータの MediaType を返します。 182 @param[in] archiveName アーカイブ名を指定します。 183 @param[in] id 拡張セーブデータの ID を指定します。 184 @param[in] iconData アイコンデータを指定します。 185 @param[in] iconDataSize アイコンデータのサイズを指定します。 186 @param[in] entryDirectory この拡張セーブデータ領域に格納したいディレクトリ数を指定します。 187 @param[in] entryFile この拡張セーブデータ領域に格納したいファイル数を指定します。 188 189 @return 処理の結果を返します。 190 191 */ 192 Result CreateAndMountExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, nn::fs::ExtSaveDataId id, const void* iconData, size_t iconDataSize, u32 entryDirectory, u32 entryFile); 193 194 /*! 195 @brief 拡張セーブデータをフォーマットし、マウントします。 196 197 指定した拡張セーブデータ ID の拡張セーブデータをフォーマットし、指定したアーカイブ名でマウントします。 198 拡張セーブデータの作成の際には、 199 拡張セーブデータのアイコンのフォーマットに従ったアイコンデータを登録する必要があります。 200 201 拡張セーブデータがどのメディアに作成されたかが pOut 引数によって返されます。 202 203 @param[out] pOut 拡張セーブデータの作成されたメディアを返します。 204 @param[in] archiveName アーカイブ名を指定します。 205 @param[in] id 拡張セーブデータの ID を指定します。 206 @param[in] iconData アイコンデータの格納されたメモリを指定します。 207 @param[in] iconDataSize アイコンデータのサイズを指定します。 208 @param[in] entryDirectory この拡張セーブデータ領域に格納したいディレクトリ数を指定します。 209 @param[in] entryFile この拡張セーブデータ領域に格納したいファイル数を指定します。 210 211 @return 処理の結果を返します。 212 213 */ 214 Result FormatAndMountExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, nn::fs::ExtSaveDataId id, const void* iconData, size_t iconDataSize, u32 entryDirectory, u32 entryFile); 215 216 /*! 217 @brief 拡張セーブデータのアイコンを読み出します。 218 219 指定したメディアと拡張セーブデータ ID の拡張セーブデータが持つアイコンデータを読み取ります。 220 221 @param[out] pOut 読み取ったサイズを返します。 222 @param[in] mediaType メディアを指定します。 223 @param[in] id 拡張セーブデータの ID を指定します。 224 @param[in] iconData アイコンデータを格納するメモリを指定します。 225 @param[in] iconDataSize アイコンデータのサイズを指定します。 226 227 @return 処理の結果を返します。 228 229 */ 230 Result ReadExtSaveDataIcon(s32* pOut, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id, void* iconData, size_t iconDataSize); 231 232 /*! 233 :private 234 235 @brief 共有拡張セーブデータ領域を作成します。 236 237 Id に対応した共有拡張セーブデータ領域を作成します。 238 239 @param[out] pOut 作成した共有拡張セーブデータ領域の MediaType が返ります 240 @param[in] id 共有拡張セーブデータの ID を指定します。 241 @param[in] entryDirectory この共有拡張セーブデータ領域に格納したいディレクトリ数を指定します。 242 @param[in] entryFile この共有拡張セーブデータ領域に格納したいファイル数を指定します。 243 @param[in] limitSize この共有拡張セーブデータ領域が使用できるデータサイズの上限を指定します。 244 245 @return 処理の結果を返します。 246 247 */ 248 Result CreateSharedExtSaveData(nn::fs::MediaType *pOut, bit32 id, u32 entryDirectory, u32 entryFile, size_t limitSize); 249 250 /*! 251 :private 252 253 @brief 共有拡張セーブデータをマウントします。 254 255 Id に対応した共有拡張領域をマウントします。 256 257 @param[out] pOut マウントした共有拡張セーブデータ領域の MediaType が返ります 258 @param[in] archiveName アーカイブ名を指定します。 259 @param[in] id 共有拡張セーブデータの ID を指定します。 260 261 @return 処理の結果を返します。 262 263 */ 264 Result MountSharedExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, bit32 id); 265 266 /*! 267 :private 268 269 @brief 共有拡張セーブデータをフォーマット後、マウントします。 270 271 Id に対応した共有拡張セーブデータ領域をフォーマットした後、これをマウントします。 272 273 @param[out] pOut フォーマット・マウントした共有拡張セーブデータの MediaType を返します。 274 @param[in] archiveName アーカイブ名を指定します。 275 @param[in] id 共有拡張セーブデータの ID を指定します。 276 @param[in] entryDirectory この共有拡張セーブデータ領域に格納したいディレクトリ数を指定します。 277 @param[in] entryFile この共有拡張セーブデータ領域に格納したいファイル数を指定します。 278 279 @return 処理の結果を返します。 280 281 */ 282 Result CreateAndMountSharedExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, bit32 id, u32 entryDirectory, u32 entryFile, size_t limitSize); 283 284 /*! 285 @brief アーカイブをアンマウントします。 286 287 @param[in] archiveName アーカイブ名を指定します 288 289 @return 処理の結果を返します。 290 */ 291 Result Unmount(const char* archiveName); 292 293 294 // Raw 295 ArchiveHandle GetArchiveHandle(const char* path); 296 ArchiveHandle GetArchiveHandle(const wchar_t* path); 297 298 Result UnmountRaw(ArchiveHandle archiveHandle); 299 300 Result MountRomRaw(ArchiveHandle* pOut, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize); 301 302 s32 GetContentRequiredMemorySize(MediaType mediaType, TitleId titleId, ContentIdx contentIndex, size_t maxFile, size_t maxDirectory); 303 Result MountContent(const char* archiveName, MediaType mediaType, TitleId titleId, ContentIdx contentIndex, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize); 304 Result MountContentRaw(ArchiveHandle* pOut, MediaType mediaType, TitleId titleId, ContentIdx contentIndex, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize); 305 306 // 以下はシステム向け 307 // TODO: 別ファイルへ移す必要がある 308 309 // TORIAEZU: システム向けの暫定関数 310 // kernel 起動後に挿入されたゲームカードをアクセス可能にします。 311 // ゲームカードが挿入されていない場合や認識できない場合は失敗します。 312 Result ActivateCardDevice(); 313 314 // TORIAEZU: システム向けの暫定関数 315 // Active 状態のゲームカードの種別を取得できるようにします。 316 // Active 状態とは、kernel 起動時に挿入されていて 自動的に Activate されている状態か、 317 // ActivateCardDevice 関数により Activate された状態です。 318 // ゲームカードが Active 状態でない場合(ゲームカードが挿入されていない場合も含む)は失敗します。 319 Result GetCardType(CardType* pOut); 320 321 /*! 322 @brief SD カードを直接参照するアーカイブをマウントします(デバッグ用)。 323 324 挿入されている SD カードを直接参照するアーカイブをマウントします。 325 SD カードが挿入されていない場合や SD カードがフォーマットされていない場合は失敗します。 326 マウントしていた SD カードが抜かれ、再挿入された SD カードをマウントする場合は、 327 @ref nn::fs::Unmount 関数によりアンマウントした後、再度 @ref nn::fs::MountSdmc 関数を実行する必要があります。 328 329 @param[in] archiveName アーカイブ名を指定します(省略するオーバロードでは "sdmc:" が暗黙的に指定されます) 330 331 @return 処理の結果を返します。 332 */ 333 Result MountSdmc(const char* archiveName = "sdmc:"); 334 335 // exefs のマウント 336 Result MountProgramRaw(ArchiveHandle *pOut, bit64 programHandle); 337 338 // SystemMenuData や BannerData を取得するための TORIAEZU 関数 339 Result MountDataContentRawForSystemMenu(ArchiveHandle *pOut, nn::fs::MediaType media, bit64 programHandle); 340 341 // その他の特殊アーカイブのマウント 342 Result MountSpecialArchive(const char* archiveName, bit32 archiveKind); 343 Result MountSpecialArchiveRaw(ArchiveHandle* pOut, bit32 archiveKind); 344 Result MountExtSaveDataForBoss(const char* archiveName, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id); 345 Result MountExtSaveDataForBossRaw(ArchiveHandle *pOut, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id); 346 347 // TODO: その他細かいもの 348 349 350 /*! 351 @brief メディアの総容量と空き容量を取得します。 352 353 指定したメディアの総容量と空き容量を取得します。 354 指定できるメディアは MEDIA_TYPE_NAND, MEDIA_TYPE_SDMC です。 355 356 @param[out] pTotal メディアの総容量を返します。 357 @param[out] pFree メディアの空き容量を返します。 358 @param[in] mediaType メディアを指定します。 359 360 @return 処理の結果を返します。 361 362 */ 363 Result GetFileSystemSize( s64* pTotal, s64* pFree, nn::fs::MediaType mediaType ); 364 365 /*! 366 @brief アーカイブの空き容量を取得します。 367 368 @param[out] pOut アーカイブの空き容量を返します。 369 @param[in] archiveName アーカイブ名を指定します。L"save:" のように指定してください。 370 371 @return 処理の結果を返します。 372 373 */ 374 Result GetArchiveFreeBytes(s64* pOut, wchar_t* archiveName); 375 376 }} 377 378 379 namespace nn { namespace fs { 380 381 382 /*! @brief PC 上のファイルに直接アクセスするための関数を含んだ名前空間です。 383 384 nn::fs::hio 名前空間内にある関数やクラスを使うためには、libnn_fshio をリンクした上で、 385 予め nn::hio::Initialize(void* pDeviceMemory) を呼んでおく必要があります。 386 基本的にデバッグ用途専用であり、製品版ではアクセスすることはできませんのでご注意ください。 387 */ 388 namespace hio { 389 390 /*! 391 @brief HostIo アーカイブをマウントします。 392 HostIo アーカイブは hostPath で指定される PC 上の特定のディレクトリ以下を一つのアーカイブと見なすためのアーカイブで、 393 デバッグ用途にのみ使用することができます。 394 395 この関数を使用するためには libnn_fshio をリンクした上で、 396 あらかじめ nn::hio::Initialize(void* pDeviceMemory) を呼んで HIO を初期化しておく必要があります。 397 HIO の初期化には連続メモリである DeviceMemory を使用してください。 398 399 @param[in] archiveName アーカイブ名を指定します 400 @param[in] hostPath PC 上のルートディレクトリを指定します 401 @param[in] maxFile 同時に開くファイルの最大数を指定します 402 @param[in] maxDirectory 同時に開くディレクトリの最大数を指定します 403 @param[in] workingMemory アーカイブの動作に使用するメモリ領域の先頭アドレスを指定します 404 @param[in] workingMemorySize アーカイブの動作に使用するメモリ領域のサイズを指定します 405 406 @return 処理の結果を返します。 407 */ 408 Result MountHioArchive(const char* archiveName, const wchar_t* hostPath, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize); 409 410 /*! 411 @brief hio アーカイブのマウントに必要なメモリサイズを取得します。 412 413 hio アーカイブのマウントに必要なメモリサイズを計算して返します。 414 このサイズは、maxFile で指定される数のファイルと、 415 maxDirectory で指定される数のディレクトリを、同時に開くことができるだけのメモリのサイズも含まれます。 416 417 @param[in] maxFile 同時に開くファイルの最大数 418 @param[in] maxDirectory 同時に開くディレクトリの最大数 419 420 @return 計算したメモリサイズを返します。 421 422 */ 423 s32 GetHioRequiredMemorySize(size_t maxFile, size_t maxDirectory); 424 425 }}} 426 427 #endif 428