アーカイブファイル中の指定のファイルをメモリに読み込む
| 3745 | |
| 3746 | // アーカイブファイル中の指定のファイルをメモリに読み込む |
| 3747 | s64 DXArchive::LoadFileToMem(const TCHAR *FilePath, void *Buffer, u64 BufferLength) |
| 3748 | { |
| 3749 | DARC_FILEHEAD *FileH; |
| 3750 | char KeyStringBuffer[DXA_KEY_STRING_MAXLENGTH]; |
| 3751 | size_t KeyStringBufferBytes; |
| 3752 | unsigned char lKey[DXA_KEY_BYTES]; |
| 3753 | DARC_DIRECTORY *Directory; |
| 3754 | void *HuffDataBuffer = NULL; |
| 3755 | |
| 3756 | // 指定のファイルの情報を得る |
| 3757 | FileH = this->GetFileInfo(FilePath, &Directory); |
| 3758 | if (FileH == NULL) return -1; |
| 3759 | |
| 3760 | // ファイルサイズが足りているか調べる、足りていないか、バッファ、又はサイズが0だったらサイズを返す |
| 3761 | if (BufferLength < FileH->DataSize || BufferLength == 0 || Buffer == NULL) |
| 3762 | { |
| 3763 | return (s64)FileH->DataSize; |
| 3764 | } |
| 3765 | |
| 3766 | // 足りている場合はバッファーに読み込む |
| 3767 | |
| 3768 | // ファイルが圧縮されているかどうかで処理を分岐 |
| 3769 | if (FileH->PressDataSize != 0xffffffffffffffff) |
| 3770 | { |
| 3771 | // 圧縮されている場合 |
| 3772 | |
| 3773 | // ハフマン圧縮されているかどうかで処理を分岐 |
| 3774 | if (FileH->HuffPressDataSize != 0xffffffffffffffff) |
| 3775 | { |
| 3776 | // メモリ上に読み込んでいるかどうかで処理を分岐 |
| 3777 | if (MemoryOpenFlag == true) |
| 3778 | { |
| 3779 | // ハフマン圧縮を解凍したデータを格納するメモリ領域の確保 |
| 3780 | HuffDataBuffer = malloc((size_t)FileH->PressDataSize); |
| 3781 | if (HuffDataBuffer == NULL) return -1; |
| 3782 | |
| 3783 | // ハフマン圧縮データを解凍 |
| 3784 | Huffman_Decode((u8 *)this->fp + this->Head.DataStartAddress + FileH->DataAddress, HuffDataBuffer); |
| 3785 | |
| 3786 | // メモリ上の圧縮データを解凍する |
| 3787 | Decode(HuffDataBuffer, Buffer); |
| 3788 | |
| 3789 | // メモリを解放 |
| 3790 | free(HuffDataBuffer); |
| 3791 | } |
| 3792 | else |
| 3793 | { |
| 3794 | void *temp; |
| 3795 | |
| 3796 | // 圧縮データをメモリに読み込んでから解凍する |
| 3797 | |
| 3798 | // 圧縮データが収まるメモリ領域の確保 |
| 3799 | temp = malloc((size_t)(FileH->PressDataSize + FileH->HuffPressDataSize)); |
| 3800 | |
| 3801 | // 圧縮データの読み込み |
| 3802 | _fseeki64(this->fp, this->Head.DataStartAddress + FileH->DataAddress, SEEK_SET); |
| 3803 | |
| 3804 | // ファイル個別の鍵を作成 |
no test coverage detected