From a53633d32d952a0fb788f6cd38f74b1176894df1 Mon Sep 17 00:00:00 2001 From: Sinflower Date: Tue, 19 Mar 2019 17:11:18 +0100 Subject: [PATCH] Fixed a few potential memory leaks, warnings and problems with 64-bit builds --- src/WolfDec/3rdParty/DXArchive.cpp | 60 +- src/WolfDec/3rdParty/DXArchive.h | 6 +- src/WolfDec/3rdParty/DXArchiveVer5.cpp | 2964 ++++++++++++------------ src/WolfDec/3rdParty/DXArchiveVer5.h | 6 +- src/WolfDec/3rdParty/FileLib.cpp | 12 +- 5 files changed, 1553 insertions(+), 1495 deletions(-) diff --git a/src/WolfDec/3rdParty/DXArchive.cpp b/src/WolfDec/3rdParty/DXArchive.cpp index fb5a05a..f72df0a 100644 --- a/src/WolfDec/3rdParty/DXArchive.cpp +++ b/src/WolfDec/3rdParty/DXArchive.cpp @@ -229,7 +229,7 @@ int DXArchive::ConvSearchData( SEARCHDATA *SearchData, const TCHAR *Src, int *Le SearchData->Parity = ParityData ; // パックデータ数の保存 - SearchData->PackNum = StringLength / 4 ; + SearchData->PackNum = (u16)(StringLength / 4) ; // 正常終了 return 0 ; @@ -258,7 +258,7 @@ int DXArchive::AddFileNameData( const TCHAR *FileName, u8 *FileNameTable ) PackNum = ( Length + 3 ) / 4 ; // パック数を保存 - *((u16 *)&FileNameTable[0]) = PackNum ; + *((u16 *)&FileNameTable[0]) = (u16)PackNum ; // バッファの初期化 memset( &FileNameTable[4], 0, PackNum * 4 * 2 ) ; @@ -454,7 +454,7 @@ void DXArchive::KeyCreate( const char *Source, unsigned char *Key ) if( Source == NULL ) { - memset( Key, 0xaaaaaaaa, DXA_KEYSTR_LENGTH ) ; + memset( Key, 0xaa, DXA_KEYSTR_LENGTH ) ; } else { @@ -913,7 +913,7 @@ int DXArchive::DirectoryDecode( u8 *NameP, u8 *DirP, u8 *FileP, DARC_HEAD *Head, { HANDLE HFile ; FILETIME CreateTime, LastAccessTime, LastWriteTime ; - TCHAR *pName = GetOriginalFileName(NameP + File->NameAddress); + pName = GetOriginalFileName(NameP + File->NameAddress); HFile = CreateFile(pName, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ; @@ -1011,7 +1011,7 @@ int DXArchive::Encode( void *Src, u32 SrcSize, void *Dest ) { s32 dstsize ; s32 bonus, conbo, conbosize, address, addresssize ; - s32 maxbonus, maxconbo, maxconbosize, maxaddress, maxaddresssize ; + s32 maxbonus, maxconbo, maxconbosize = 0, maxaddress, maxaddresssize = 0 ; u8 keycode, *srcp, *destp, *dp, *sp, *sp2, *sp1 ; u32 srcaddress, nextprintaddress, code ; s32 j ; @@ -1355,7 +1355,7 @@ int DXArchive::Encode( void *Src, u32 SrcSize, void *Dest ) // デコード( 戻り値:解凍後のサイズ -1 はエラー Dest に NULL を入れることも可能 ) int DXArchive::Decode( void *Src, void *Dest ) { - u32 srcsize, destsize, code, indexsize, keycode, conbo, index ; + u32 srcsize, destsize, code, indexsize, keycode, conbo, index = 0; u8 *srcp, *destp, *dp, *sp ; destp = (u8 *)Dest ; @@ -1545,17 +1545,29 @@ int DXArchive::EncodeArchive(TCHAR *OutputFileName, TCHAR **FileOrDirectoryPath, } // 各バッファを確保する - NameP = ( u8 * )malloc( DXA_BUFFERSIZE ) ; - if( NameP == NULL ) return -1 ; - memset( NameP, 0, DXA_BUFFERSIZE ) ; + NameP = ( u8 * )calloc(DXA_BUFFERSIZE, sizeof(u8)) ; + if(NameP == NULL) + { + free(TempBuffer); + return -1; + } - FileP = ( u8 * )malloc( DXA_BUFFERSIZE ) ; - if( FileP == NULL ) return -1 ; - memset( FileP, 0, DXA_BUFFERSIZE ) ; + FileP = (u8 *)calloc(DXA_BUFFERSIZE, sizeof(u8)); + if(FileP == NULL) + { + free(TempBuffer); + free(NameP); + return -1; + } - DirP = ( u8 * )malloc( DXA_BUFFERSIZE ) ; - if( DirP == NULL ) return -1 ; - memset( DirP, 0, DXA_BUFFERSIZE ) ; + DirP = ( u8 * )calloc(DXA_BUFFERSIZE, sizeof(u8)); + if(DirP == NULL) + { + free(TempBuffer); + free(NameP); + free(FileP); + return -1; + } // サイズ保存構造体にデータをセット SizeSave.DataSize = 0 ; @@ -2002,7 +2014,7 @@ ERR : // アーカイブファイルを開き最初にすべてメモリ上に読み込んでから処理する( 0:成功 -1:失敗 ) int DXArchive::OpenArchiveFileMem( const TCHAR *ArchivePath, const char *KeyString ) { - FILE *fp ; + FILE *pFp ; u8 *datp ; void *ArchiveImage ; s64 ArchiveSize ; @@ -2015,19 +2027,19 @@ int DXArchive::OpenArchiveFileMem( const TCHAR *ArchivePath, const char *KeyStri // メモリに読み込む { - fp = _tfopen( ArchivePath, TEXT("rb") ) ; - if( fp == NULL ) return -1 ; - _fseeki64( fp, 0L, SEEK_END ) ; - ArchiveSize = _ftelli64( fp ) ; - _fseeki64( fp, 0L, SEEK_SET ) ; + pFp = _tfopen( ArchivePath, TEXT("rb") ) ; + if(pFp == NULL ) return -1 ; + _fseeki64(pFp, 0L, SEEK_END ) ; + ArchiveSize = _ftelli64(pFp) ; + _fseeki64(pFp, 0L, SEEK_SET ) ; ArchiveImage = malloc( ( size_t )ArchiveSize ) ; if( ArchiveImage == NULL ) { - fclose( fp ) ; + fclose(pFp) ; return -1 ; } - fread64( ArchiveImage, ArchiveSize, fp ) ; - fclose( fp ) ; + fread64( ArchiveImage, ArchiveSize, pFp) ; + fclose(pFp) ; } // 最初にヘッダの部分を反転する diff --git a/src/WolfDec/3rdParty/DXArchive.h b/src/WolfDec/3rdParty/DXArchive.h index a46534e..4d5764b 100644 --- a/src/WolfDec/3rdParty/DXArchive.h +++ b/src/WolfDec/3rdParty/DXArchive.h @@ -165,7 +165,7 @@ public : DATE_RESULT_DRAW, // 日付は同じ } ; - DXArchive(TCHAR *ArchivePath = NULL ) ; + explicit DXArchive(TCHAR *ArchivePath = NULL ) ; ~DXArchive() ; static int EncodeArchive(TCHAR *OutputFileName, TCHAR **FileOrDirectoryPath, int FileNum, bool Press = false, const char *KeyString = NULL ) ; // アーカイブファイルを作成する @@ -291,6 +291,10 @@ public : s64 Size( void ) ; // ファイルのサイズを取得する inline DARC_FILEHEAD *GetFileData( void ){ return FileData ; } + + DXArchiveFile(DXArchiveFile&) = delete; + void operator=(DXArchiveFile const&t) = delete; + DXArchiveFile(DXArchiveFile&&) = delete; } ; #endif diff --git a/src/WolfDec/3rdParty/DXArchiveVer5.cpp b/src/WolfDec/3rdParty/DXArchiveVer5.cpp index c67ac1b..10dc49e 100644 --- a/src/WolfDec/3rdParty/DXArchiveVer5.cpp +++ b/src/WolfDec/3rdParty/DXArchiveVer5.cpp @@ -16,6 +16,11 @@ #include #include +// Check if 64 Bit +#if __x86_64__ || _WIN64 +#define B64 +#endif + // define ----------------------------- #define MIN_COMPRESS_VER5 (4) // 最低圧縮バイト数 @@ -32,319 +37,321 @@ WCHAR sjis2utf8_(const char* sjis); // 圧縮時間短縮用リスト typedef struct LZ_LIST_VER5 { - LZ_LIST_VER5 *next, *prev ; - u32 address ; -} LZ_LIST_VER5 ; + LZ_LIST_VER5 *next, *prev; + u32 address; +} LZ_LIST_VER5; // class code ------------------------- // ファイル名も一緒になっていると分かっているパス中からファイルパスとディレクトリパスを分割する // フルパスである必要は無い -int DXArchive_VER5::GetFilePathAndDirPath(TCHAR *Src, TCHAR *FilePath, TCHAR *DirPath ) +int DXArchive_VER5::GetFilePathAndDirPath(TCHAR *Src, TCHAR *FilePath, TCHAR *DirPath) { - int i, Last ; - + int i, Last; + // ファイル名を抜き出す - i = 0 ; - Last = -1 ; - while( Src[i] != '\0' ) + i = 0; + Last = -1; + while(Src[i] != '\0') { - if( CheckMultiByteChar( &Src[i] ) == FALSE ) + if(CheckMultiByteChar(&Src[i]) == FALSE) { - if( Src[i] == '\\' || Src[i] == '/' || Src[i] == '\0' || Src[i] == ':' ) Last = i ; - i ++ ; + if(Src[i] == '\\' || Src[i] == '/' || Src[i] == '\0' || Src[i] == ':') Last = i; + i++; } else { - i += 2 ; + i += 2; } } - if( FilePath != NULL ) + if(FilePath != NULL) { - if( Last != -1 ) _tcscpy( FilePath, &Src[Last+1] ) ; - else _tcscpy( FilePath, Src ) ; + if(Last != -1) _tcscpy(FilePath, &Src[Last + 1]); + else _tcscpy(FilePath, Src); } - + // ディレクトリパスを抜き出す - if( DirPath != NULL ) + if(DirPath != NULL) { - if( Last != -1 ) + if(Last != -1) { - _tcsncpy( DirPath, Src, Last ) ; - DirPath[Last] = '\0' ; + _tcsncpy(DirPath, Src, Last); + DirPath[Last] = '\0'; } else { - DirPath[0] = '\0' ; + DirPath[0] = '\0'; } } - + // 終了 - return 0 ; + return 0; } // ファイルの情報を得る -DARC_FILEHEAD_VER5 *DXArchive_VER5::GetFileInfo( const TCHAR *FilePath ) +DARC_FILEHEAD_VER5 *DXArchive_VER5::GetFileInfo(const TCHAR *FilePath) { - DARC_DIRECTORY_VER5 *OldDir ; - DARC_FILEHEAD_VER5 *FileH ; - TCHAR *NameData ; - int i, j, k, Num, FileHeadSize ; - SEARCHDATA SearchData ; + DARC_DIRECTORY_VER5 *OldDir; + DARC_FILEHEAD_VER5 *FileH; + TCHAR *NameData; + int i, j, k, Num, FileHeadSize; + SEARCHDATA SearchData; // 元のディレクトリを保存しておく - OldDir = this->CurrentDirectory ; + OldDir = this->CurrentDirectory; // ファイルパスに \ が含まれている場合、ディレクトリ変更を行う - if( _tcschr( FilePath, '\\' ) != NULL ) + if(_tcschr(FilePath, '\\') != NULL) { // カレントディレクトリを目的のファイルがあるディレクトリに変更する - if( this->ChangeCurrentDirectoryBase( FilePath, false, &SearchData ) >= 0 ) + if(this->ChangeCurrentDirectoryBase(FilePath, false, &SearchData) >= 0) { // エラーが起きなかった場合はファイル名もディレクトリだったことになるのでエラー - goto ERR ; + goto ERR; } } else { // ファイル名を検索用データに変換する - ConvSearchData( &SearchData, FilePath, NULL ) ; + ConvSearchData(&SearchData, FilePath, NULL); } // 同名のファイルを探す - FileHeadSize = this->Head.Version >= 0x0002 ? sizeof( DARC_FILEHEAD_VER5 ) : sizeof( DARC_FILEHEAD_VER1 ) ; - FileH = ( DARC_FILEHEAD_VER5 * )( this->FileP + this->CurrentDirectory->FileHeadAddress ) ; - Num = (s32)this->CurrentDirectory->FileHeadNum ; - for( i = 0 ; i < Num ; i ++, FileH = (DARC_FILEHEAD_VER5 *)( (u8 *)FileH + FileHeadSize ) ) + FileHeadSize = this->Head.Version >= 0x0002 ? sizeof(DARC_FILEHEAD_VER5) : sizeof(DARC_FILEHEAD_VER1); + FileH = (DARC_FILEHEAD_VER5 *)(this->FileP + this->CurrentDirectory->FileHeadAddress); + Num = (s32)this->CurrentDirectory->FileHeadNum; + for(i = 0; i < Num; i++, FileH = (DARC_FILEHEAD_VER5 *)((u8 *)FileH + FileHeadSize)) { // ディレクトリチェック - if( ( FileH->Attributes & FILE_ATTRIBUTE_DIRECTORY ) != 0 ) continue ; + if((FileH->Attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) continue; // 文字列数とパリティチェック - NameData = this->NameP + FileH->NameAddress ; - if( SearchData.PackNum != ((u16 *)NameData)[0] || SearchData.Parity != ((u16 *)NameData)[1] ) continue ; + NameData = this->NameP + FileH->NameAddress; + if(SearchData.PackNum != ((u16 *)NameData)[0] || SearchData.Parity != ((u16 *)NameData)[1]) continue; // 文字列チェック - NameData += 4 ; - for( j = 0, k = 0 ; j < SearchData.PackNum ; j ++, k += 4 ) - if( *((u32 *)&SearchData.FileName[k]) != *((u32 *)&NameData[k]) ) break ; + NameData += 4; + for(j = 0, k = 0; j < SearchData.PackNum; j++, k += 4) + if(*((u32 *)&SearchData.FileName[k]) != *((u32 *)&NameData[k])) break; // 適合したファイルがあったらここで終了 - if( SearchData.PackNum == j ) break ; + if(SearchData.PackNum == j) break; } // 無かったらエラー - if( i == Num ) goto ERR ; - + if(i == Num) goto ERR; + // ディレクトリを元に戻す - this->CurrentDirectory = OldDir ; - + this->CurrentDirectory = OldDir; + // 目的のファイルのアドレスを返す - return FileH ; - -ERR : + return FileH; + +ERR: // ディレクトリを元に戻す - this->CurrentDirectory = OldDir ; - + this->CurrentDirectory = OldDir; + // エラー終了 - return NULL ; + return NULL; -/* - DARC_DIRECTORY_VER5 *OldCurrent ; - DARC_FILEHEAD_VER5 *File ; - char TPath[MAX_PATH], FPath[MAX_PATH], DPath[MAX_PATH] ; - int i, len ; - - // 一文字もない場合は例外処理 - if( FilePath[0] == '\0' ) return ( DARC_FILEHEAD_VER5 * )FileP ; - - // 元のカレントディレクトリを保存しておく - OldCurrent = CurrentDirectory ; - - // ファイルパスとディレクトリパスを分解する - strcpy( TPath, FilePath ) ; - if( TPath[(len = strlen( TPath ))-1] == '\\' ) TPath[len-1] = '\0' ; - GetFilePathAndDirPath( TPath, FPath, DPath ) ; - - // カレントディレクトリの変更 - if( ChangeCurrentDirectory( DPath ) == -1 ) goto ERR ; - - // ファイルパスの変更 - File = ( DARC_FILEHEAD_VER5 * )( FileP + CurrentDirectory->FileHeadAddress ) ; - for( i = 0 ; - i < (int)CurrentDirectory->FileHeadNum && _tcscmp( ( const char * )( NameP + File->NameAddress ), FPath ) != 0 ; - i ++, File ++ ){} - if( i == (int)CurrentDirectory->FileHeadNum ) goto ERR ; + /* + DARC_DIRECTORY_VER5 *OldCurrent ; + DARC_FILEHEAD_VER5 *File ; + char TPath[MAX_PATH], FPath[MAX_PATH], DPath[MAX_PATH] ; + int i, len ; - // カレントディレクトリを元に戻す - CurrentDirectory = OldCurrent ; + // 一文字もない場合は例外処理 + if( FilePath[0] == '\0' ) return ( DARC_FILEHEAD_VER5 * )FileP ; - // 見つけたファイルの情報を返す - return File ; + // 元のカレントディレクトリを保存しておく + OldCurrent = CurrentDirectory ; -ERR : - // カレントディレクトリを元に戻す - CurrentDirectory = OldCurrent ; - - return NULL ; -*/ + // ファイルパスとディレクトリパスを分解する + strcpy( TPath, FilePath ) ; + if( TPath[(len = strlen( TPath ))-1] == '\\' ) TPath[len-1] = '\0' ; + GetFilePathAndDirPath( TPath, FPath, DPath ) ; + + // カレントディレクトリの変更 + if( ChangeCurrentDirectory( DPath ) == -1 ) goto ERR ; + + // ファイルパスの変更 + File = ( DARC_FILEHEAD_VER5 * )( FileP + CurrentDirectory->FileHeadAddress ) ; + for( i = 0 ; + i < (int)CurrentDirectory->FileHeadNum && _tcscmp( ( const char * )( NameP + File->NameAddress ), FPath ) != 0 ; + i ++, File ++ ){} + if( i == (int)CurrentDirectory->FileHeadNum ) goto ERR ; + + // カレントディレクトリを元に戻す + CurrentDirectory = OldCurrent ; + + // 見つけたファイルの情報を返す + return File ; + + ERR : + // カレントディレクトリを元に戻す + CurrentDirectory = OldCurrent ; + + return NULL ; + */ } // アーカイブ内のカレントディレクトリの情報を取得する -DARC_DIRECTORY_VER5 *DXArchive_VER5::GetCurrentDirectoryInfo( void ) +DARC_DIRECTORY_VER5 *DXArchive_VER5::GetCurrentDirectoryInfo(void) { - return CurrentDirectory ; + return CurrentDirectory; } // どちらが新しいかを比較する -DXArchive_VER5::DATE_RESULT DXArchive_VER5::DateCmp( DARC_FILETIME_VER5 *date1, DARC_FILETIME_VER5 *date2 ) +DXArchive_VER5::DATE_RESULT DXArchive_VER5::DateCmp(DARC_FILETIME_VER5 *date1, DARC_FILETIME_VER5 *date2) { - if( date1->LastWrite == date2->LastWrite ) return DATE_RESULT_DRAW ; - else if( date1->LastWrite > date2->LastWrite ) return DATE_RESULT_LEFTNEW ; - else return DATE_RESULT_RIGHTNEW ; + if(date1->LastWrite == date2->LastWrite) return DATE_RESULT_DRAW; + else if(date1->LastWrite > date2->LastWrite) return DATE_RESULT_LEFTNEW; + else return DATE_RESULT_RIGHTNEW; } // 比較対照の文字列中の大文字を小文字として扱い比較する( 0:等しい 1:違う ) -int DXArchive_VER5::StrICmp( const TCHAR *Str1, const TCHAR *Str2 ) +int DXArchive_VER5::StrICmp(const TCHAR *Str1, const TCHAR *Str2) { - int c1, c2 ; - - while( *Str1 != '\0' && *Str2 != '\0' ) + int c1, c2; + + while(*Str1 != '\0' && *Str2 != '\0') { - if( CheckMultiByteChar( Str1 ) == FALSE ) + if(CheckMultiByteChar(Str1) == FALSE) { - c1 = ( *Str1 >= 'A' && *Str1 <= 'Z' ) ? *Str1 - 'A' + 'a' : *Str1 ; - c2 = ( *Str2 >= 'A' && *Str2 <= 'Z' ) ? *Str2 - 'A' + 'a' : *Str2 ; - if( c1 != c2 ) return 1 ; - Str1 ++ ; - Str2 ++ ; + c1 = (*Str1 >= 'A' && *Str1 <= 'Z') ? *Str1 - 'A' + 'a' : *Str1; + c2 = (*Str2 >= 'A' && *Str2 <= 'Z') ? *Str2 - 'A' + 'a' : *Str2; + if(c1 != c2) return 1; + Str1++; + Str2++; } else { - if( *( (unsigned short *)Str1 ) != *( (unsigned short *)Str2 ) ) return 1 ; - Str1 += 2 ; - Str2 += 2 ; + if(*((unsigned short *)Str1) != *((unsigned short *)Str2)) return 1; + Str1 += 2; + Str2 += 2; } } - if( *Str1 != '\0' || *Str2 != '\0' ) return 1 ; + if(*Str1 != '\0' || *Str2 != '\0') return 1; // 此処まで来て初めて等しい - return 0 ; + return 0; } // 文字列中の英字の小文字を大文字に変換 -int DXArchive_VER5::ConvSearchData( SEARCHDATA *SearchData, const TCHAR *Src, int *Length ) +int DXArchive_VER5::ConvSearchData(SEARCHDATA *SearchData, const TCHAR *Src, int *Length) { - int i, StringLength ; - u16 ParityData ; + int i, StringLength; + u16 ParityData; - ParityData = 0 ; - for( i = 0 ; Src[i] != '\0' && Src[i] != '\\' ; ) + ParityData = 0; + for(i = 0; Src[i] != '\0' && Src[i] != '\\'; ) { - if( CheckMultiByteChar( &Src[i] ) == TRUE ) + if(CheckMultiByteChar(&Src[i]) == TRUE) { // 2バイト文字の場合はそのままコピー - *((u16 *)&SearchData->FileName[i]) = *((u16 *)&Src[i]) ; - ParityData += (u8)Src[i] + (u8)Src[i+1] ; - i += 2 ; + *((u16 *)&SearchData->FileName[i]) = *((u16 *)&Src[i]); + ParityData += (u8)Src[i] + (u8)Src[i + 1]; + i += 2; } else { // 小文字の場合は大文字に変換 - if( Src[i] >= 'a' && Src[i] <= 'z' ) SearchData->FileName[i] = (u8)Src[i] - 'a' + 'A' ; - else SearchData->FileName[i] = Src[i] ; - ParityData += (u8)SearchData->FileName[i] ; - i ++ ; + if(Src[i] >= 'a' && Src[i] <= 'z') SearchData->FileName[i] = (u8)Src[i] - 'a' + 'A'; + else SearchData->FileName[i] = Src[i]; + ParityData += (u8)SearchData->FileName[i]; + i++; } } // 文字列の長さを保存 - if( Length != NULL ) *Length = i ; + if(Length != NULL) *Length = i; // 4の倍数の位置まで0を代入 - StringLength = ( ( i + 1 ) + 3 ) / 4 * 4 ; - memset( &SearchData->FileName[i], 0, StringLength - i ) ; + StringLength = ((i + 1) + 3) / 4 * 4; + memset(&SearchData->FileName[i], 0, StringLength - i); // パリティデータの保存 - SearchData->Parity = ParityData ; + SearchData->Parity = ParityData; // パックデータ数の保存 - SearchData->PackNum = StringLength / 4 ; + SearchData->PackNum = (u16)(StringLength / 4); // 正常終了 - return 0 ; + return 0; } // ファイル名データを追加する( 戻り値は使用したデータバイト数 ) -int DXArchive_VER5::AddFileNameData( const TCHAR *FileName, u8 *FileNameTable ) +int DXArchive_VER5::AddFileNameData(const TCHAR *FileName, u8 *FileNameTable) { - int PackNum, Length, i ; - u32 Parity ; + int PackNum; + int Length; + int i; + u32 Parity; // サイズをセット - Length = _tcslen( FileName ) ; + Length = static_cast(_tcslen(FileName)); // 一文字も無かった場合の処理 - if( Length == 0 ) + if(Length == 0) { // パック数とパリティ情報のみ保存 - *((u32 *)&FileNameTable[0]) = 0 ; + *((u32 *)&FileNameTable[0]) = 0; // 使用サイズを返す - return 4 ; + return 4; } - Length ++ ; + Length++; - PackNum = ( Length + 3 ) / 4 ; + PackNum = (Length + 3) / 4; // パック数を保存 - *((u16 *)&FileNameTable[0]) = PackNum ; + *((u16 *)&FileNameTable[0]) = static_cast(PackNum); // バッファの初期化 - memset( &FileNameTable[4], 0, PackNum * 4 * 2 ) ; + memset(&FileNameTable[4], 0, PackNum * 4 * 2); // 文字列をコピー - _tcscpy( (TCHAR *)&FileNameTable[4 + PackNum * 4], FileName ) ; + _tcscpy((TCHAR *)&FileNameTable[4 + PackNum * 4], FileName); // 英字の小文字を全て大文字に変換したファイル名を保存 - Parity = 0 ; - for( i = 0 ; FileName[i] != '\0' ; ) + Parity = 0; + for(i = 0; FileName[i] != '\0'; ) { // 2バイト文字かどうかで処理を分岐 - if( CheckMultiByteChar( &FileName[i] ) == TRUE ) + if(CheckMultiByteChar(&FileName[i]) == TRUE) { // 2バイト文字 - *((u16 *)&FileNameTable[4 + i]) = *((u16 *)&FileName[i]) ; - Parity += (u8)FileName[i] + (u8)FileName[i+1] ; - i += 2 ; + *((u16 *)&FileNameTable[4 + i]) = *((u16 *)&FileName[i]); + Parity += (u8)FileName[i] + (u8)FileName[i + 1]; + i += 2; } else { // 1バイト文字 - if( FileName[i] >= 'a' && FileName[i] <= 'z' ) + if(FileName[i] >= 'a' && FileName[i] <= 'z') { // 小文字の場合は大文字に変換 - FileNameTable[4 + i] = (u8)FileName[i] - 'a' + 'A' ; + FileNameTable[4 + i] = (u8)FileName[i] - 'a' + 'A'; } else { // そうではない場合は普通にコピー - FileNameTable[4 + i] = (u8)FileName[i] ; + FileNameTable[4 + i] = (u8)FileName[i]; } - Parity += FileNameTable[4 + i] ; - i ++ ; + Parity += FileNameTable[4 + i]; + i++; } } // パリティ情報を保存 - *((u16 *)&FileNameTable[2]) = (u16)Parity ; + *((u16 *)&FileNameTable[2]) = (u16)Parity; // 使用したサイズを返す - return PackNum * 4 * 2 + 4 ; + return PackNum * 4 * 2 + 4; } // ファイル名データから元のファイル名の文字列を取得する -TCHAR *DXArchive_VER5::GetOriginalFileName( u8 *FileNameTable ) +TCHAR *DXArchive_VER5::GetOriginalFileName(u8 *FileNameTable) { const char *pName = ((char *)FileNameTable + *((u16 *)&FileNameTable[0]) * 4 + 4); @@ -374,34 +381,34 @@ TCHAR *DXArchive_VER5::GetOriginalFileName( u8 *FileNameTable ) } // データを反転させる関数 -void DXArchive_VER5::NotConv( void *Data , int Size ) +void DXArchive_VER5::NotConv(void *Data, int Size) { - int DwordNum ; - int ByteNum ; + int DwordNum; + int ByteNum; - DwordNum = Size / 4 ; - ByteNum = Size - DwordNum * 4 ; + DwordNum = Size / 4; + ByteNum = Size - DwordNum * 4; #ifndef INLINE_ASM { -// int i ; - DWORD *dd ; -// for( int i = 0 ; i < Size ; i ++ ) ( ( BYTE * )Data )[i] = ~( ( BYTE * )Data )[i] ; + // int i ; + DWORD *dd; + // for( int i = 0 ; i < Size ; i ++ ) ( ( BYTE * )Data )[i] = ~( ( BYTE * )Data )[i] ; - dd = ( DWORD * )Data ; - if( DwordNum != 0 ) + dd = (DWORD *)Data; + if(DwordNum != 0) { do { - *dd++ = ~*dd ; - }while( --DwordNum ) ; + *dd++ = ~*dd; + } while(--DwordNum); } - if( ByteNum != 0 ) + if(ByteNum != 0) { do { - *((BYTE *)dd) = ~*((BYTE *)dd) ; - dd = (DWORD *)(((BYTE *)dd) + 1) ; - }while( --ByteNum ) ; + *((BYTE *)dd) = ~*((BYTE *)dd); + dd = (DWORD *)(((BYTE *)dd) + 1); + } while(--ByteNum); } } #else @@ -411,117 +418,117 @@ void DXArchive_VER5::NotConv( void *Data , int Size ) MOV ECX, DwordNum CMP ECX, 0 JE LABEL1 -LOOP1: + LOOP1 : MOV EAX, [ESI] - NOT EAX - MOV [ESI], EAX - ADD ESI, 4 - DEC ECX - JNZ LOOP1 + NOT EAX + MOV[ESI], EAX + ADD ESI, 4 + DEC ECX + JNZ LOOP1 -LABEL1: + LABEL1 : MOV ECX, ByteNum - CMP ECX, 0 - JE END -LOOP2: + CMP ECX, 0 + JE END + LOOP2 : MOV AL, [ESI] - NOT AL - MOV [ESI], AL - INC ESI - DEC ECX - JNZ LOOP2 -END: - } ; + NOT AL + MOV[ESI], AL + INC ESI + DEC ECX + JNZ LOOP2 + END : + }; #endif } // データを反転させてファイルに書き出す関数 -void DXArchive_VER5::NotConvFileWrite( void *Data, int Size, FILE *fp ) +void DXArchive_VER5::NotConvFileWrite(void *Data, int Size, FILE *fp) { // データを反転する - NotConv( Data, Size ) ; + NotConv(Data, Size); // 書き出す - fwrite( Data, Size, 1, fp ) ; + fwrite(Data, Size, 1, fp); // 再び反転 - NotConv( Data, Size ) ; + NotConv(Data, Size); } // データを反転させてファイルから読み込む関数 -void DXArchive_VER5::NotConvFileRead( void *Data, int Size, FILE *fp ) +void DXArchive_VER5::NotConvFileRead(void *Data, int Size, FILE *fp) { // 読み込む - fread( Data, 1, Size, fp ) ; + fread(Data, 1, Size, fp); // データを反転 - NotConv( Data, Size ) ; + NotConv(Data, Size); } // 鍵文字列を作成 -void DXArchive_VER5::KeyCreate( const char *Source, unsigned char *Key ) +void DXArchive_VER5::KeyCreate(const char *Source, unsigned char *Key) { - int Len ; + size_t Len; - if( Source == NULL ) + if(Source == NULL) { - memset( Key, 0xaaaaaaaa, DXA_KEYSTR_LENGTH_VER5 ) ; + memset(Key, 0xaa, DXA_KEYSTR_LENGTH_VER5); } else { - Len = strlen( Source ) ; - if( Len > DXA_KEYSTR_LENGTH_VER5 ) + Len = strlen(Source); + if(Len > DXA_KEYSTR_LENGTH_VER5) { - memcpy( Key, Source, DXA_KEYSTR_LENGTH_VER5 ) ; + memcpy(Key, Source, DXA_KEYSTR_LENGTH_VER5); } else { // 鍵文字列が DXA_KEYSTR_LENGTH_VER5 より短かったらループする - int i ; - - for( i = 0 ; i + Len <= DXA_KEYSTR_LENGTH_VER5 ; i += Len ) - memcpy( Key + i, Source, Len ) ; - if( i < DXA_KEYSTR_LENGTH_VER5 ) - memcpy( Key + i, Source, DXA_KEYSTR_LENGTH_VER5 - i ) ; - } - } - - Key[0] = ~Key[0] ; - Key[1] = ( Key[1] >> 4 ) | ( Key[1] << 4 ) ; - Key[2] = Key[2] ^ 0x8a ; - Key[3] = ~( ( Key[3] >> 4 ) | ( Key[3] << 4 ) ) ; - Key[4] = ~Key[4] ; - Key[5] = Key[5] ^ 0xac ; - Key[6] = ~Key[6] ; - Key[7] = ~( ( Key[7] >> 3 ) | ( Key[7] << 5 ) ) ; - Key[8] = ( Key[8] >> 5 ) | ( Key[8] << 3 ) ; - Key[9] = Key[9] ^ 0x7f ; - Key[10] = ( ( Key[10] >> 4 ) | ( Key[10] << 4 ) ) ^ 0xd6 ; - Key[11] = Key[11] ^ 0xcc ; + size_t i; + + for(i = 0; i + Len <= DXA_KEYSTR_LENGTH_VER5; i += Len) + memcpy(Key + i, Source, Len); + if(i < DXA_KEYSTR_LENGTH_VER5) + memcpy(Key + i, Source, DXA_KEYSTR_LENGTH_VER5 - i); + } + } + + Key[0] = ~Key[0]; + Key[1] = (Key[1] >> 4) | (Key[1] << 4); + Key[2] = Key[2] ^ 0x8a; + Key[3] = ~((Key[3] >> 4) | (Key[3] << 4)); + Key[4] = ~Key[4]; + Key[5] = Key[5] ^ 0xac; + Key[6] = ~Key[6]; + Key[7] = ~((Key[7] >> 3) | (Key[7] << 5)); + Key[8] = (Key[8] >> 5) | (Key[8] << 3); + Key[9] = Key[9] ^ 0x7f; + Key[10] = ((Key[10] >> 4) | (Key[10] << 4)) ^ 0xd6; + Key[11] = Key[11] ^ 0xcc; } // 鍵文字列を使用して Xor 演算( Key は必ず DXA_KEYSTR_LENGTH_VER5 の長さがなければならない ) -void DXArchive_VER5::KeyConv( void *Data, int Size, int Position, unsigned char *Key ) +void DXArchive_VER5::KeyConv(void *Data, int Size, int Position, unsigned char *Key) { - Position %= DXA_KEYSTR_LENGTH_VER5 ; + Position %= DXA_KEYSTR_LENGTH_VER5; #ifndef INLINE_ASM - int i, j ; + int i, j; - j = Position ; - for( i = 0 ; i < Size ; i ++ ) + j = Position; + for(i = 0; i < Size; i++) { - ((u8 *)Data)[i] ^= Key[j] ; + ((u8 *)Data)[i] ^= Key[j]; - j ++ ; - if( j == DXA_KEYSTR_LENGTH_VER5 ) j = 0 ; + j++; + if(j == DXA_KEYSTR_LENGTH_VER5) j = 0; } #else - u32 DataT, SizeT ; - SizeT = (u32)Size ; - DataT = (u32)Data ; - Position %= DXA_KEYSTR_LENGTH_VER5 ; + u32 DataT, SizeT; + SizeT = (u32)Size; + DataT = (u32)Data; + Position %= DXA_KEYSTR_LENGTH_VER5; __asm { MOV EDI, DataT @@ -538,98 +545,98 @@ void DXArchive_VER5::KeyConv( void *Data, int Size, int Position, unsigned char MOV EDX, SizeT -LOOP1: - MOV BL, [ESI+EAX] - XOR [EDI], BL - INC EAX - INC EDI - DEC EDX - CMP EAX, DXA_KEYSTR_LENGTH_VER5 - JB LOOP1 - XOR ECX, ECX - MOV Position, ECX - - MOV SizeT, EDX - CMP EDX, DXA_KEYSTR_LENGTH_VER5 - JB LABEL2 - - -LABEL1: + LOOP1 : + MOV BL, [ESI + EAX] + XOR[EDI], BL + INC EAX + INC EDI + DEC EDX + CMP EAX, DXA_KEYSTR_LENGTH_VER5 + JB LOOP1 + XOR ECX, ECX + MOV Position, ECX + + MOV SizeT, EDX + CMP EDX, DXA_KEYSTR_LENGTH_VER5 + JB LABEL2 + + + LABEL1 : MOV EAX, SizeT - XOR EDX, EDX - MOV ECX, DXA_KEYSTR_LENGTH_VER5 - DIV ECX - MOV SizeT, EDX - MOV ECX, EAX - - MOV EAX, [ESI] - MOV EBX, [ESI+4] - MOV EDX, [ESI+8] -LOOP2: - XOR [EDI], EAX - XOR [EDI+4], EBX - XOR [EDI+8], EDX - ADD EDI, DXA_KEYSTR_LENGTH_VER5 - DEC ECX - JNZ LOOP2 - - -LABEL2: + XOR EDX, EDX + MOV ECX, DXA_KEYSTR_LENGTH_VER5 + DIV ECX + MOV SizeT, EDX + MOV ECX, EAX + + MOV EAX, [ESI] + MOV EBX, [ESI + 4] + MOV EDX, [ESI + 8] + LOOP2: + XOR[EDI], EAX + XOR[EDI + 4], EBX + XOR[EDI + 8], EDX + ADD EDI, DXA_KEYSTR_LENGTH_VER5 + DEC ECX + JNZ LOOP2 + + + LABEL2 : MOV EDX, SizeT - CMP EDX, 0 - JE LABEL3 - - - MOV EAX, Position -LOOP3: - MOV BL, [ESI+EAX] - XOR [EDI], BL - INC EAX - CMP EAX, DXA_KEYSTR_LENGTH_VER5 - JNE LABEL4 - XOR EAX, EAX -LABEL4: + CMP EDX, 0 + JE LABEL3 + + + MOV EAX, Position + LOOP3 : + MOV BL, [ESI + EAX] + XOR[EDI], BL + INC EAX + CMP EAX, DXA_KEYSTR_LENGTH_VER5 + JNE LABEL4 + XOR EAX, EAX + LABEL4 : INC EDI - DEC EDX - JNZ LOOP3 -LABEL3: - } ; + DEC EDX + JNZ LOOP3 + LABEL3 : + }; #endif } // データを鍵文字列を使用して Xor 演算した後ファイルに書き出す関数( Key は必ず DXA_KEYSTR_LENGTH_VER5 の長さがなければならない ) -void DXArchive_VER5::KeyConvFileWrite( void *Data, int Size, FILE *fp, unsigned char *Key, int Position ) +void DXArchive_VER5::KeyConvFileWrite(void *Data, int Size, FILE *fp, unsigned char *Key, int Position) { - int pos ; + int pos; // ファイルの位置を取得しておく - if( Position == -1 ) pos = ftell( fp ) ; - else pos = Position ; + if(Position == -1) pos = ftell(fp); + else pos = Position; // データを鍵文字列を使って Xor 演算する - KeyConv( Data, Size, pos, Key ) ; + KeyConv(Data, Size, pos, Key); // 書き出す - fwrite( Data, Size, 1, fp ) ; + fwrite(Data, Size, 1, fp); // 再び Xor 演算 - KeyConv( Data, Size, pos, Key ) ; + KeyConv(Data, Size, pos, Key); } // ファイルから読み込んだデータを鍵文字列を使用して Xor 演算する関数( Key は必ず DXA_KEYSTR_LENGTH_VER5 の長さがなければならない ) -void DXArchive_VER5::KeyConvFileRead( void *Data, int Size, FILE *fp, unsigned char *Key, int Position ) +void DXArchive_VER5::KeyConvFileRead(void *Data, int Size, FILE *fp, unsigned char *Key, int Position) { - int pos ; + int pos; // ファイルの位置を取得しておく - if( Position == -1 ) pos = ftell( fp ) ; - else pos = Position ; + if(Position == -1) pos = ftell(fp); + else pos = Position; // 読み込む - fread( Data, 1, Size, fp ) ; + fread(Data, 1, Size, fp); // データを鍵文字列を使って Xor 演算 - KeyConv( Data, Size, pos, Key ) ; + KeyConv(Data, Size, pos, Key); } /* @@ -641,1385 +648,1403 @@ int DXArchive_VER5::CheckMultiByteChar( const char *Buf ) */ // 指定のディレクトリにあるファイルをアーカイブデータに吐き出す -int DXArchive_VER5::DirectoryEncode( TCHAR *DirectoryName, u8 *NameP, u8 *DirP, u8 *FileP, DARC_DIRECTORY_VER5 *ParentDir, SIZESAVE *Size, int DataNumber, FILE *DestP, void *TempBuffer, bool Press, unsigned char *Key ) +int DXArchive_VER5::DirectoryEncode(TCHAR *DirectoryName, u8 *NameP, u8 *DirP, u8 *FileP, DARC_DIRECTORY_VER5 *ParentDir, SIZESAVE *Size, int DataNumber, FILE *DestP, void *TempBuffer, bool Press, unsigned char *Key) { - TCHAR DirPath[MAX_PATH] ; - WIN32_FIND_DATA FindData ; - HANDLE FindHandle ; - DARC_DIRECTORY_VER5 Dir ; - DARC_FILEHEAD_VER5 File ; + TCHAR DirPath[MAX_PATH]; + WIN32_FIND_DATA FindData; + HANDLE FindHandle; + DARC_DIRECTORY_VER5 Dir; + DARC_FILEHEAD_VER5 File; // ディレクトリの情報を得る - FindHandle = FindFirstFile( DirectoryName, &FindData ) ; - if( FindHandle == INVALID_HANDLE_VALUE ) return 0 ; - + FindHandle = FindFirstFile(DirectoryName, &FindData); + if(FindHandle == INVALID_HANDLE_VALUE) return 0; + // ディレクトリ情報を格納するファイルヘッダをセットする { - File.NameAddress = Size->NameSize ; - File.Time.Create = ( ( ( LONGLONG )FindData.ftCreationTime.dwHighDateTime ) << 32 ) + FindData.ftCreationTime.dwLowDateTime ; - File.Time.LastAccess = ( ( ( LONGLONG )FindData.ftLastAccessTime.dwHighDateTime ) << 32 ) + FindData.ftLastAccessTime.dwLowDateTime ; - File.Time.LastWrite = ( ( ( LONGLONG )FindData.ftLastWriteTime.dwHighDateTime ) << 32 ) + FindData.ftLastWriteTime.dwLowDateTime ; - File.Attributes = FindData.dwFileAttributes ; - File.DataAddress = Size->DirectorySize ; - File.DataSize = 0 ; - File.PressDataSize = 0xffffffff ; + File.NameAddress = Size->NameSize; + File.Time.Create = (((LONGLONG)FindData.ftCreationTime.dwHighDateTime) << 32) + FindData.ftCreationTime.dwLowDateTime; + File.Time.LastAccess = (((LONGLONG)FindData.ftLastAccessTime.dwHighDateTime) << 32) + FindData.ftLastAccessTime.dwLowDateTime; + File.Time.LastWrite = (((LONGLONG)FindData.ftLastWriteTime.dwHighDateTime) << 32) + FindData.ftLastWriteTime.dwLowDateTime; + File.Attributes = FindData.dwFileAttributes; + File.DataAddress = Size->DirectorySize; + File.DataSize = 0; + File.PressDataSize = 0xffffffff; } // ディレクトリ名を書き出す - Size->NameSize += AddFileNameData( FindData.cFileName, NameP + Size->NameSize ) ; + Size->NameSize += AddFileNameData(FindData.cFileName, NameP + Size->NameSize); // ディレクトリ情報が入ったファイルヘッダを書き出す - memcpy( FileP + ParentDir->FileHeadAddress + DataNumber * sizeof( DARC_FILEHEAD_VER5 ), - &File, sizeof( DARC_FILEHEAD_VER5 ) ) ; + memcpy(FileP + ParentDir->FileHeadAddress + DataNumber * sizeof(DARC_FILEHEAD_VER5), + &File, sizeof(DARC_FILEHEAD_VER5)); // Find ハンドルを閉じる - FindClose( FindHandle ) ; + FindClose(FindHandle); // 指定のディレクトリにカレントディレクトリを移す - GetCurrentDirectory( MAX_PATH, DirPath ) ; - SetCurrentDirectory( DirectoryName ) ; + GetCurrentDirectory(MAX_PATH, DirPath); + SetCurrentDirectory(DirectoryName); // ディレクトリ情報のセット { - Dir.DirectoryAddress = ParentDir->FileHeadAddress + DataNumber * sizeof( DARC_FILEHEAD_VER5 ) ; - Dir.FileHeadAddress = Size->FileSize ; + Dir.DirectoryAddress = ParentDir->FileHeadAddress + DataNumber * sizeof(DARC_FILEHEAD_VER5); + Dir.FileHeadAddress = Size->FileSize; // 親ディレクトリの情報位置をセット - if( ParentDir->DirectoryAddress != 0xffffffff && ParentDir->DirectoryAddress != 0 ) + if(ParentDir->DirectoryAddress != 0xffffffff && ParentDir->DirectoryAddress != 0) { - Dir.ParentDirectoryAddress = ((DARC_FILEHEAD_VER5 *)( FileP + ParentDir->DirectoryAddress ))->DataAddress ; + Dir.ParentDirectoryAddress = ((DARC_FILEHEAD_VER5 *)(FileP + ParentDir->DirectoryAddress))->DataAddress; } else { - Dir.ParentDirectoryAddress = 0 ; + Dir.ParentDirectoryAddress = 0; } // ディレクトリ中のファイルの数を取得する - Dir.FileHeadNum = GetDirectoryFilePath( TEXT(""), NULL ) ; + Dir.FileHeadNum = GetDirectoryFilePath(TEXT(""), NULL); } // ディレクトリの情報を出力する - memcpy( DirP + Size->DirectorySize, &Dir, sizeof( DARC_DIRECTORY_VER5 ) ) ; + memcpy(DirP + Size->DirectorySize, &Dir, sizeof(DARC_DIRECTORY_VER5)); // アドレスを推移させる - Size->DirectorySize += sizeof( DARC_DIRECTORY_VER5 ) ; - Size->FileSize += sizeof( DARC_FILEHEAD_VER5 ) * Dir.FileHeadNum ; - + Size->DirectorySize += sizeof(DARC_DIRECTORY_VER5); + Size->FileSize += sizeof(DARC_FILEHEAD_VER5) * Dir.FileHeadNum; + // ファイルが何も無い場合はここで終了 - if( Dir.FileHeadNum == 0 ) + if(Dir.FileHeadNum == 0) { // もとのディレクトリをカレントディレクトリにセット - SetCurrentDirectory( DirPath ) ; - return 0 ; + SetCurrentDirectory(DirPath); + return 0; } // ファイル情報を出力する { - int i ; - - i = 0 ; - + int i; + + i = 0; + // 列挙開始 - FindHandle = FindFirstFile( TEXT("*"), &FindData ) ; + FindHandle = FindFirstFile(TEXT("*"), &FindData); do { // 上のディレクトリに戻ったりするためのパスは無視する - if( _tcscmp( FindData.cFileName, TEXT(".") ) == 0 || _tcscmp( FindData.cFileName, TEXT("..") ) == 0 ) continue ; + if(_tcscmp(FindData.cFileName, TEXT(".")) == 0 || _tcscmp(FindData.cFileName, TEXT("..")) == 0) continue; // ファイルではなく、ディレクトリだった場合は再帰する - if( FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) + if(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // ディレクトリだった場合の処理 - if( DirectoryEncode( FindData.cFileName, NameP, DirP, FileP, &Dir, Size, i, DestP, TempBuffer, Press, Key ) < 0 ) return -1 ; + if(DirectoryEncode(FindData.cFileName, NameP, DirP, FileP, &Dir, Size, i, DestP, TempBuffer, Press, Key) < 0) return -1; } else { // ファイルだった場合の処理 // ファイルのデータをセット - File.NameAddress = Size->NameSize ; - File.Time.Create = ( ( ( LONGLONG )FindData.ftCreationTime.dwHighDateTime ) << 32 ) + FindData.ftCreationTime.dwLowDateTime ; - File.Time.LastAccess = ( ( ( LONGLONG )FindData.ftLastAccessTime.dwHighDateTime ) << 32 ) + FindData.ftLastAccessTime.dwLowDateTime ; - File.Time.LastWrite = ( ( ( LONGLONG )FindData.ftLastWriteTime.dwHighDateTime ) << 32 ) + FindData.ftLastWriteTime.dwLowDateTime ; - File.Attributes = FindData.dwFileAttributes ; - File.DataAddress = Size->DataSize ; - File.DataSize = FindData.nFileSizeLow ; - File.PressDataSize = 0xffffffff ; + File.NameAddress = Size->NameSize; + File.Time.Create = (((LONGLONG)FindData.ftCreationTime.dwHighDateTime) << 32) + FindData.ftCreationTime.dwLowDateTime; + File.Time.LastAccess = (((LONGLONG)FindData.ftLastAccessTime.dwHighDateTime) << 32) + FindData.ftLastAccessTime.dwLowDateTime; + File.Time.LastWrite = (((LONGLONG)FindData.ftLastWriteTime.dwHighDateTime) << 32) + FindData.ftLastWriteTime.dwLowDateTime; + File.Attributes = FindData.dwFileAttributes; + File.DataAddress = Size->DataSize; + File.DataSize = FindData.nFileSizeLow; + File.PressDataSize = 0xffffffff; // ファイル名を書き出す - Size->NameSize += AddFileNameData( FindData.cFileName, NameP + Size->NameSize ) ; - + Size->NameSize += AddFileNameData(FindData.cFileName, NameP + Size->NameSize); + // ファイルデータを書き出す - if( (u64)FindData.nFileSizeLow + ( (u64)FindData.nFileSizeHigh << 32 ) != 0 ) + if((u64)FindData.nFileSizeLow + ((u64)FindData.nFileSizeHigh << 32) != 0) { - FILE *SrcP ; - u32 FileSize, WriteSize, MoveSize ; + FILE *SrcP; + u32 FileSize, WriteSize, MoveSize; // ファイルを開く - SrcP = _tfopen( FindData.cFileName, TEXT("rb") ) ; - + SrcP = _tfopen(FindData.cFileName, TEXT("rb")); + // サイズを得る - fseek( SrcP, 0, SEEK_END ) ; - FileSize = ftell( SrcP ) ; - fseek( SrcP, 0, SEEK_SET ) ; - + fseek(SrcP, 0, SEEK_END); + FileSize = ftell(SrcP); + fseek(SrcP, 0, SEEK_SET); + // ファイルサイズが 10MB 以下の場合で、圧縮の指定がある場合は圧縮を試みる - if( Press == true && (u64)FindData.nFileSizeLow + ( (u64)FindData.nFileSizeHigh << 32 ) < 10 * 1024 * 1024 ) + if(Press == true && (u64)FindData.nFileSizeLow + ((u64)FindData.nFileSizeHigh << 32) < 10 * 1024 * 1024) { - void *SrcBuf, *DestBuf ; - u32 DestSize, Len ; - + void *SrcBuf, *DestBuf; + u32 DestSize; + size_t Len; + // 一部のファイル形式の場合は予め弾く - if( ( Len = _tcslen( FindData.cFileName ) ) > 4 ) + if((Len = _tcslen(FindData.cFileName)) > 4) { - TCHAR *sp ; - - sp = &FindData.cFileName[Len-3] ; - if( StrICmp( sp, TEXT("wav") ) == 0 || - StrICmp( sp, TEXT("jpg") ) == 0 || - StrICmp( sp, TEXT("png") ) == 0 || - StrICmp( sp, TEXT("mpg") ) == 0 || - StrICmp( sp, TEXT("mp3") ) == 0 || - StrICmp( sp, TEXT("ogg") ) == 0 || - StrICmp( sp, TEXT("wmv") ) == 0 || - StrICmp( sp - 1, TEXT("jpeg") ) == 0 ) goto NOPRESS ; + TCHAR *sp; + + sp = &FindData.cFileName[Len - 3]; + if(StrICmp(sp, TEXT("wav")) == 0 || + StrICmp(sp, TEXT("jpg")) == 0 || + StrICmp(sp, TEXT("png")) == 0 || + StrICmp(sp, TEXT("mpg")) == 0 || + StrICmp(sp, TEXT("mp3")) == 0 || + StrICmp(sp, TEXT("ogg")) == 0 || + StrICmp(sp, TEXT("wmv")) == 0 || + StrICmp(sp - 1, TEXT("jpeg")) == 0) goto NOPRESS; } - + // データが丸ごと入るメモリ領域の確保 - SrcBuf = malloc( FileSize + FileSize * 2 + 64 ) ; - DestBuf = (u8 *)SrcBuf + FileSize ; - + SrcBuf = malloc(FileSize + FileSize * 2 + 64); + DestBuf = (u8 *)SrcBuf + FileSize; + // ファイルを丸ごと読み込む - fread( SrcBuf, FileSize, 1, SrcP ) ; - + fread(SrcBuf, FileSize, 1, SrcP); + // 圧縮 - DestSize = Encode( SrcBuf, FileSize, DestBuf ) ; - + DestSize = Encode(SrcBuf, FileSize, DestBuf); + // 殆ど圧縮出来なかった場合は圧縮無しでアーカイブする - if( (f64)DestSize / (f64)FileSize > 0.90 ) + if((f64)DestSize / (f64)FileSize > 0.90) { - fseek( SrcP, 0L, SEEK_SET ) ; - free( SrcBuf ) ; - goto NOPRESS ; + fseek(SrcP, 0L, SEEK_SET); + free(SrcBuf); + goto NOPRESS; } - + // 圧縮データを反転して書き出す - WriteSize = ( DestSize + 3 ) / 4 * 4 ; - KeyConvFileWrite( DestBuf, WriteSize, DestP, Key, File.DataSize ) ; - + WriteSize = (DestSize + 3) / 4 * 4; + KeyConvFileWrite(DestBuf, WriteSize, DestP, Key, File.DataSize); + // メモリの解放 - free( SrcBuf ) ; - + free(SrcBuf); + // 圧縮データのサイズを保存する - File.PressDataSize = DestSize ; + File.PressDataSize = DestSize; } else { -NOPRESS: +NOPRESS: // 転送開始 - WriteSize = 0 ; - while( WriteSize < FileSize ) + WriteSize = 0; + while(WriteSize < FileSize) { // 転送サイズ決定 - MoveSize = DXA_BUFFERSIZE_VER5 < FileSize - WriteSize ? DXA_BUFFERSIZE_VER5 : FileSize - WriteSize ; - MoveSize = ( MoveSize + 3 ) / 4 * 4 ; // サイズは4の倍数に合わせる - + MoveSize = DXA_BUFFERSIZE_VER5 < FileSize - WriteSize ? DXA_BUFFERSIZE_VER5 : FileSize - WriteSize; + MoveSize = (MoveSize + 3) / 4 * 4; // サイズは4の倍数に合わせる + // ファイルの反転読み込み - KeyConvFileRead( TempBuffer, MoveSize, SrcP, Key, File.DataSize + WriteSize ) ; + KeyConvFileRead(TempBuffer, MoveSize, SrcP, Key, File.DataSize + WriteSize); // 書き出し - fwrite( TempBuffer, MoveSize, 1, DestP ) ; - + fwrite(TempBuffer, MoveSize, 1, DestP); + // 書き出しサイズの加算 - WriteSize += MoveSize ; + WriteSize += MoveSize; } } - + // 書き出したファイルを閉じる - fclose( SrcP ) ; - + fclose(SrcP); + // データサイズの加算 - Size->DataSize += WriteSize ; + Size->DataSize += WriteSize; } - + // ファイルヘッダを書き出す - memcpy( FileP + Dir.FileHeadAddress + sizeof( DARC_FILEHEAD_VER5 ) * i, &File, sizeof( DARC_FILEHEAD_VER5 ) ) ; + memcpy(FileP + Dir.FileHeadAddress + sizeof(DARC_FILEHEAD_VER5) * i, &File, sizeof(DARC_FILEHEAD_VER5)); } - - i ++ ; - } - while( FindNextFile( FindHandle, &FindData ) != 0 ) ; - + + i++; + } while(FindNextFile(FindHandle, &FindData) != 0); + // Find ハンドルを閉じる - FindClose( FindHandle ) ; + FindClose(FindHandle); } - + // もとのディレクトリをカレントディレクトリにセット - SetCurrentDirectory( DirPath ) ; + SetCurrentDirectory(DirPath); // 終了 - return 0 ; + return 0; } // 指定のディレクトリデータにあるファイルを展開する -int DXArchive_VER5::DirectoryDecode( u8 *NameP, u8 *DirP, u8 *FileP, DARC_HEAD_VER5 *Head, DARC_DIRECTORY_VER5 *Dir, FILE *ArcP, unsigned char *Key ) +int DXArchive_VER5::DirectoryDecode(u8 *NameP, u8 *DirP, u8 *FileP, DARC_HEAD_VER5 *Head, DARC_DIRECTORY_VER5 *Dir, FILE *ArcP, unsigned char *Key) { - TCHAR DirPath[MAX_PATH] ; - + TCHAR DirPath[MAX_PATH]; + // 現在のカレントディレクトリを保存 - GetCurrentDirectory( MAX_PATH, DirPath ) ; + GetCurrentDirectory(MAX_PATH, DirPath); // ディレクトリ情報がある場合は、まず展開用のディレクトリを作成する - if( Dir->DirectoryAddress != 0xffffffff && Dir->ParentDirectoryAddress != 0xffffffff ) + if(Dir->DirectoryAddress != 0xffffffff && Dir->ParentDirectoryAddress != 0xffffffff) { - DARC_FILEHEAD_VER5 *DirFile ; - + DARC_FILEHEAD_VER5 *DirFile; + // DARC_FILEHEAD_VER5 のアドレスを取得 - DirFile = ( DARC_FILEHEAD_VER5 * )( FileP + Dir->DirectoryAddress ) ; - + DirFile = (DARC_FILEHEAD_VER5 *)(FileP + Dir->DirectoryAddress); + // ディレクトリの作成 TCHAR *pName = GetOriginalFileName(NameP + DirFile->NameAddress); - CreateDirectory( pName, NULL ) ; + CreateDirectory(pName, NULL); delete[] pName; - + // そのディレクトリにカレントディレクトリを移す pName = GetOriginalFileName(NameP + DirFile->NameAddress); - SetCurrentDirectory( pName ) ; + SetCurrentDirectory(pName); delete[] pName; } // 展開処理開始 { - u32 i, FileHeadSize ; - DARC_FILEHEAD_VER5 *File ; + u32 i, FileHeadSize; + DARC_FILEHEAD_VER5 *File; // 格納されているファイルの数だけ繰り返す - FileHeadSize = Head->Version >= 0x0002 ? sizeof( DARC_FILEHEAD_VER5 ) : sizeof( DARC_FILEHEAD_VER1 ) ; - File = ( DARC_FILEHEAD_VER5 * )( FileP + Dir->FileHeadAddress ) ; - for( i = 0 ; i < Dir->FileHeadNum ; i ++, File = (DARC_FILEHEAD_VER5 *)( (u8 *)File + FileHeadSize ) ) + FileHeadSize = Head->Version >= 0x0002 ? sizeof(DARC_FILEHEAD_VER5) : sizeof(DARC_FILEHEAD_VER1); + File = (DARC_FILEHEAD_VER5 *)(FileP + Dir->FileHeadAddress); + for(i = 0; i < Dir->FileHeadNum; i++, File = (DARC_FILEHEAD_VER5 *)((u8 *)File + FileHeadSize)) { // ディレクトリかどうかで処理を分岐 - if( File->Attributes & FILE_ATTRIBUTE_DIRECTORY ) + if(File->Attributes & FILE_ATTRIBUTE_DIRECTORY) { // ディレクトリの場合は再帰をかける - DirectoryDecode( NameP, DirP, FileP, Head, ( DARC_DIRECTORY_VER5 * )( DirP + File->DataAddress ), ArcP, Key ) ; + DirectoryDecode(NameP, DirP, FileP, Head, (DARC_DIRECTORY_VER5 *)(DirP + File->DataAddress), ArcP, Key); } else { - FILE *DestP ; - void *Buffer ; - + FILE *DestP; + void *Buffer; + // ファイルの場合は展開する - + // バッファを確保する - Buffer = malloc( DXA_BUFFERSIZE_VER5 ) ; - if( Buffer == NULL ) return -1 ; + Buffer = malloc(DXA_BUFFERSIZE_VER5); + if(Buffer == NULL) return -1; // ファイルを開く TCHAR *pName = GetOriginalFileName(NameP + File->NameAddress); - DestP = _tfopen( pName, TEXT("wb") ) ; + DestP = _tfopen(pName, TEXT("wb")); delete[] pName; - + // データがある場合のみ転送 - if( File->DataSize != 0 ) + if(File->DataSize != 0) { // 初期位置をセットする - if( ftell( ArcP ) != ( s32 )( Head->DataStartAddress + File->DataAddress ) ) - fseek( ArcP, Head->DataStartAddress + File->DataAddress, SEEK_SET ) ; - + if(ftell(ArcP) != (s32)(Head->DataStartAddress + File->DataAddress)) + fseek(ArcP, Head->DataStartAddress + File->DataAddress, SEEK_SET); + // データが圧縮されているかどうかで処理を分岐 - if( Head->Version >= 0x0002 && File->PressDataSize != 0xffffffff ) + if(Head->Version >= 0x0002 && File->PressDataSize != 0xffffffff) { - void *temp ; - + void *temp; + // 圧縮されている場合 // 圧縮データが収まるメモリ領域の確保 - temp = malloc( File->PressDataSize + File->DataSize ) ; + temp = malloc(File->PressDataSize + File->DataSize); // 圧縮データの読み込み - if( Head->Version >= 0x0005 ) + if(Head->Version >= 0x0005) { - KeyConvFileRead( temp, File->PressDataSize, ArcP, Key, File->DataSize ) ; + KeyConvFileRead(temp, File->PressDataSize, ArcP, Key, File->DataSize); } else { - KeyConvFileRead( temp, File->PressDataSize, ArcP, Key ) ; + KeyConvFileRead(temp, File->PressDataSize, ArcP, Key); } - + // 解凍 - Decode( temp, (u8 *)temp + File->PressDataSize ) ; - + Decode(temp, (u8 *)temp + File->PressDataSize); + // 書き出し - fwrite( (u8 *)temp + File->PressDataSize, File->DataSize, 1, DestP ) ; - + fwrite((u8 *)temp + File->PressDataSize, File->DataSize, 1, DestP); + // メモリの解放 - free( temp ) ; + free(temp); } else { // 圧縮されていない場合 - + // 転送処理開始 { - u32 MoveSize, WriteSize ; - - WriteSize = 0 ; - while( WriteSize < File->DataSize ) + u32 MoveSize, WriteSize; + + WriteSize = 0; + while(WriteSize < File->DataSize) { - MoveSize = File->DataSize - WriteSize > DXA_BUFFERSIZE_VER5 ? DXA_BUFFERSIZE_VER5 : File->DataSize - WriteSize ; + MoveSize = File->DataSize - WriteSize > DXA_BUFFERSIZE_VER5 ? DXA_BUFFERSIZE_VER5 : File->DataSize - WriteSize; // ファイルの反転読み込み - if( Head->Version >= 0x0005 ) + if(Head->Version >= 0x0005) { - KeyConvFileRead( Buffer, MoveSize, ArcP, Key, File->DataSize + WriteSize ) ; + KeyConvFileRead(Buffer, MoveSize, ArcP, Key, File->DataSize + WriteSize); } else { - KeyConvFileRead( Buffer, MoveSize, ArcP, Key ) ; + KeyConvFileRead(Buffer, MoveSize, ArcP, Key); } // 書き出し - fwrite( Buffer, MoveSize, 1, DestP ) ; - - WriteSize += MoveSize ; + fwrite(Buffer, MoveSize, 1, DestP); + + WriteSize += MoveSize; } } } } - + // ファイルを閉じる - fclose( DestP ) ; + fclose(DestP); // バッファを開放する - free( Buffer ) ; + free(Buffer); // ファイルのタイムスタンプを設定する { - HANDLE HFile ; - FILETIME CreateTime, LastAccessTime, LastWriteTime ; + HANDLE HFile; + FILETIME CreateTime, LastAccessTime, LastWriteTime; - TCHAR *pName = GetOriginalFileName(NameP + File->NameAddress); - HFile = CreateFile( pName, - GENERIC_WRITE, 0, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ; + pName = GetOriginalFileName(NameP + File->NameAddress); + HFile = CreateFile(pName, + GENERIC_WRITE, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); delete[] pName; - if( HFile == INVALID_HANDLE_VALUE ) + if(HFile == INVALID_HANDLE_VALUE) { - HFile = HFile ; + HFile = HFile; } - CreateTime.dwHighDateTime = ( u32 )( File->Time.Create >> 32 ) ; - CreateTime.dwLowDateTime = ( u32 )( File->Time.Create & 0xffffffff ) ; - LastAccessTime.dwHighDateTime = ( u32 )( File->Time.LastAccess >> 32 ) ; - LastAccessTime.dwLowDateTime = ( u32 )( File->Time.LastAccess & 0xffffffff ) ; - LastWriteTime.dwHighDateTime = ( u32 )( File->Time.LastWrite >> 32 ) ; - LastWriteTime.dwLowDateTime = ( u32 )( File->Time.LastWrite & 0xffffffff ) ; - SetFileTime( HFile, &CreateTime, &LastAccessTime, &LastWriteTime ) ; - CloseHandle( HFile ) ; + CreateTime.dwHighDateTime = (u32)(File->Time.Create >> 32); + CreateTime.dwLowDateTime = (u32)(File->Time.Create & 0xffffffff); + LastAccessTime.dwHighDateTime = (u32)(File->Time.LastAccess >> 32); + LastAccessTime.dwLowDateTime = (u32)(File->Time.LastAccess & 0xffffffff); + LastWriteTime.dwHighDateTime = (u32)(File->Time.LastWrite >> 32); + LastWriteTime.dwLowDateTime = (u32)(File->Time.LastWrite & 0xffffffff); + SetFileTime(HFile, &CreateTime, &LastAccessTime, &LastWriteTime); + CloseHandle(HFile); } // ファイル属性を付ける pName = GetOriginalFileName(NameP + File->NameAddress); - SetFileAttributes( pName, File->Attributes ) ; + SetFileAttributes(pName, File->Attributes); delete[] pName; } } } - + // カレントディレクトリを元に戻す - SetCurrentDirectory( DirPath ) ; + SetCurrentDirectory(DirPath); // 終了 - return 0 ; + return 0; } // ディレクトリ内のファイルパスを取得する -int DXArchive_VER5::GetDirectoryFilePath( const TCHAR *DirectoryPath, TCHAR *FileNameBuffer ) +int DXArchive_VER5::GetDirectoryFilePath(const TCHAR *DirectoryPath, TCHAR *FileNameBuffer) { - WIN32_FIND_DATA FindData ; - HANDLE FindHandle ; - int FileNum ; - TCHAR DirPath[256], String[256] ; + WIN32_FIND_DATA FindData; + HANDLE FindHandle; + int FileNum; + TCHAR DirPath[256], String[256]; // ディレクトリかどうかをチェックする - if( DirectoryPath[0] != '\0' ) + if(DirectoryPath[0] != '\0') { - FindHandle = FindFirstFile( DirectoryPath, &FindData ) ; - if( FindHandle == INVALID_HANDLE_VALUE || ( FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == 0 ) return -1 ; - FindClose( FindHandle ) ; + FindHandle = FindFirstFile(DirectoryPath, &FindData); + if(FindHandle == INVALID_HANDLE_VALUE || (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) return -1; + FindClose(FindHandle); } // 指定のフォルダのファイルの名前を取得する - FileNum = 0 ; - if( DirectoryPath[0] != '\0' ) + FileNum = 0; + if(DirectoryPath[0] != '\0') { - _tcscpy( DirPath, DirectoryPath ) ; - if( DirPath[ _tcslen( DirPath ) - 1 ] != '\\' ) _tcscat( DirPath, TEXT("\\") ) ; - _tcscpy( String, DirPath ) ; - _tcscat( String, TEXT("*") ) ; + _tcscpy(DirPath, DirectoryPath); + if(DirPath[_tcslen(DirPath) - 1] != '\\') _tcscat(DirPath, TEXT("\\")); + _tcscpy(String, DirPath); + _tcscat(String, TEXT("*")); } else { - _tcscpy( DirPath, TEXT("") ) ; - _tcscpy( String, TEXT("*") ) ; + _tcscpy(DirPath, TEXT("")); + _tcscpy(String, TEXT("*")); } - FindHandle = FindFirstFile( String, &FindData ) ; - if( FindHandle != INVALID_HANDLE_VALUE ) + FindHandle = FindFirstFile(String, &FindData); + if(FindHandle != INVALID_HANDLE_VALUE) { do { // 上のディレクトリに戻ったりするためのパスは無視する - if( _tcscmp( FindData.cFileName, TEXT(".") ) == 0 || _tcscmp( FindData.cFileName, TEXT("..") ) == 0 ) continue ; + if(_tcscmp(FindData.cFileName, TEXT(".")) == 0 || _tcscmp(FindData.cFileName, TEXT("..")) == 0) continue; // ファイルパスを保存する - if( FileNameBuffer != NULL ) + if(FileNameBuffer != NULL) { - _tcscpy( FileNameBuffer, DirPath ) ; - _tcscat( FileNameBuffer, FindData.cFileName ) ; - FileNameBuffer += 256 ; + _tcscpy(FileNameBuffer, DirPath); + _tcscat(FileNameBuffer, FindData.cFileName); + FileNameBuffer += 256; } // ファイルの数を増やす - FileNum ++ ; - } - while( FindNextFile( FindHandle, &FindData ) != 0 ) ; - FindClose( FindHandle ) ; + FileNum++; + } while(FindNextFile(FindHandle, &FindData) != 0); + FindClose(FindHandle); } // 数を返す - return FileNum ; + return FileNum; } // エンコード( 戻り値:圧縮後のサイズ -1 はエラー Dest に NULL を入れることも可能 ) -int DXArchive_VER5::Encode( void *Src, unsigned int SrcSize, void *Dest ) +int DXArchive_VER5::Encode(void *Src, unsigned int SrcSize, void *Dest) { - s32 dstsize ; - s32 bonus, conbo, conbosize, address, addresssize ; - s32 maxbonus, maxconbo, maxconbosize, maxaddress, maxaddresssize ; - u8 keycode, *srcp, *destp, *dp, *sp, *sp2, *sp1 ; - u32 srcaddress, nextprintaddress, code ; - s32 j ; - u32 i, m ; - u32 maxlistnum, maxlistnummask, listaddp ; - u32 sublistnum, sublistmaxnum ; - LZ_LIST_VER5 *listbuf, *listtemp, *list, *newlist ; - u8 *listfirsttable, *usesublistflagtable, *sublistbuf ; - + s32 dstsize; + s32 bonus, conbo, conbosize, address, addresssize; + s32 maxbonus, maxconbo, maxconbosize = 0, maxaddress, maxaddresssize = 0; + u8 keycode, *srcp, *destp, *dp, *sp, *sp2, *sp1; + u32 srcaddress, nextprintaddress, code; + s32 j; + u32 i, m; + u32 maxlistnum, maxlistnummask, listaddp; + u32 sublistnum, sublistmaxnum; + LZ_LIST_VER5 *listbuf, *listtemp, *list, *newlist; + u8 *listfirsttable, *usesublistflagtable, *sublistbuf; + // サブリストのサイズを決める { - if( SrcSize < 100 * 1024 ) sublistmaxnum = 1 ; - else if( SrcSize < 3 * 1024 * 1024 ) sublistmaxnum = MAX_SUBLISTNUM_VER5 / 3 ; - else sublistmaxnum = MAX_SUBLISTNUM_VER5 ; + if(SrcSize < 100 * 1024) sublistmaxnum = 1; + else if(SrcSize < 3 * 1024 * 1024) sublistmaxnum = MAX_SUBLISTNUM_VER5 / 3; + else sublistmaxnum = MAX_SUBLISTNUM_VER5; } // リストのサイズを決める { - maxlistnum = MAX_ADDRESSLISTNUM_VER5 ; - if( maxlistnum > SrcSize ) + maxlistnum = MAX_ADDRESSLISTNUM_VER5; + if(maxlistnum > SrcSize) { - while( ( maxlistnum >> 1 ) > 0x100 && ( maxlistnum >> 1 ) > SrcSize ) - maxlistnum >>= 1 ; + while((maxlistnum >> 1) > 0x100 && (maxlistnum >> 1) > SrcSize) + maxlistnum >>= 1; } - maxlistnummask = maxlistnum - 1 ; + maxlistnummask = maxlistnum - 1; } // メモリの確保 - usesublistflagtable = (u8 *)malloc( - sizeof( u32 ) * 65536 + // メインリストの先頭オブジェクト用領域 - sizeof( LZ_LIST_VER5 ) * maxlistnum + // メインリスト用領域 - sizeof( u8 ) * 65536 + // サブリストを使用しているかフラグ用領域 - sizeof( u32 ) * 256 * sublistmaxnum ) ; // サブリスト用領域 - + usesublistflagtable = (u8 *)malloc( + sizeof(u32) * 65536 + // メインリストの先頭オブジェクト用領域 + sizeof(LZ_LIST_VER5) * maxlistnum + // メインリスト用領域 + sizeof(u8) * 65536 + // サブリストを使用しているかフラグ用領域 + sizeof(u32) * 256 * sublistmaxnum); // サブリスト用領域 + // アドレスのセット - listfirsttable = usesublistflagtable + sizeof( u8 ) * 65536 ; - sublistbuf = listfirsttable + sizeof( u32 ) * 65536 ; - listbuf = (LZ_LIST_VER5 *)( sublistbuf + sizeof( u32 ) * 256 * sublistmaxnum ) ; - + listfirsttable = usesublistflagtable + sizeof(u8) * 65536; + sublistbuf = listfirsttable + sizeof(u32) * 65536; + listbuf = (LZ_LIST_VER5 *)(sublistbuf + sizeof(u32) * 256 * sublistmaxnum); + // 初期化 - memset( usesublistflagtable, 0, sizeof( u8 ) * 65536 ) ; - memset( sublistbuf, 0, sizeof( u32 ) * 256 * sublistmaxnum ) ; - memset( listfirsttable, 0, sizeof( u32 ) * 65536 ) ; - list = listbuf ; - for( i = maxlistnum / 8 ; i ; i --, list += 8 ) + memset(usesublistflagtable, 0, sizeof(u8) * 65536); + memset(sublistbuf, 0, sizeof(u32) * 256 * sublistmaxnum); + memset(listfirsttable, 0, sizeof(u32) * 65536); + list = listbuf; + for(i = maxlistnum / 8; i; i--, list += 8) { list[0].address = - list[1].address = - list[2].address = - list[3].address = - list[4].address = - list[5].address = - list[6].address = - list[7].address = 0xffffffff ; + list[1].address = + list[2].address = + list[3].address = + list[4].address = + list[5].address = + list[6].address = + list[7].address = 0xffffffff; } - srcp = (u8 *)Src ; - destp = (u8 *)Dest ; + srcp = (u8 *)Src; + destp = (u8 *)Dest; // 圧縮元データの中で一番出現頻度が低いバイトコードを検索する { - u32 qnum, table[256], mincode ; - - for( i = 0 ; i < 256 ; i ++ ) - table[i] = 0 ; - - sp = srcp ; - qnum = SrcSize / 8 ; - i = qnum * 8 ; - for( ; qnum ; qnum --, sp += 8 ) - { - table[sp[0]] ++ ; - table[sp[1]] ++ ; - table[sp[2]] ++ ; - table[sp[3]] ++ ; - table[sp[4]] ++ ; - table[sp[5]] ++ ; - table[sp[6]] ++ ; - table[sp[7]] ++ ; + u32 qnum, table[256], mincode; + + for(i = 0; i < 256; i++) + table[i] = 0; + + sp = srcp; + qnum = SrcSize / 8; + i = qnum * 8; + for(; qnum; qnum--, sp += 8) + { + table[sp[0]] ++; + table[sp[1]] ++; + table[sp[2]] ++; + table[sp[3]] ++; + table[sp[4]] ++; + table[sp[5]] ++; + table[sp[6]] ++; + table[sp[7]] ++; } - for( ; i < SrcSize ; i ++, sp ++ ) - table[*sp] ++ ; - - keycode = 0 ; - mincode = table[0] ; - for( i = 1 ; i < 256 ; i ++ ) - { - if( mincode < table[i] ) continue ; - mincode = table[i] ; - keycode = (u8)i ; + for(; i < SrcSize; i++, sp++) + table[*sp] ++; + + keycode = 0; + mincode = table[0]; + for(i = 1; i < 256; i++) + { + if(mincode < table[i]) continue; + mincode = table[i]; + keycode = (u8)i; } } // 圧縮元のサイズをセット - ((u32 *)destp)[0] = SrcSize ; + ((u32 *)destp)[0] = SrcSize; // キーコードをセット - destp[8] = keycode ; + destp[8] = keycode; // 圧縮処理 - dp = destp + 9 ; - sp = srcp ; - srcaddress = 0 ; - dstsize = 0 ; - listaddp = 0 ; - sublistnum = 0 ; - nextprintaddress = 1024 * 100 ; - while( srcaddress < SrcSize ) + dp = destp + 9; + sp = srcp; + srcaddress = 0; + dstsize = 0; + listaddp = 0; + sublistnum = 0; + nextprintaddress = 1024 * 100; + while(srcaddress < SrcSize) { // 残りサイズが最低圧縮サイズ以下の場合は圧縮処理をしない - if( srcaddress + MIN_COMPRESS_VER5 >= SrcSize ) goto NOENCODE ; + if(srcaddress + MIN_COMPRESS_VER5 >= SrcSize) goto NOENCODE; // リストを取得 - code = *((u16 *)sp) ; - list = (LZ_LIST_VER5 *)( listfirsttable + code * sizeof( u32 ) ) ; - if( usesublistflagtable[code] == 1 ) + code = *((u16 *)sp); + list = (LZ_LIST_VER5 *)(listfirsttable + code * sizeof(u32)); + if(usesublistflagtable[code] == 1) { - list = (LZ_LIST_VER5 *)( (u32 *)list->next + sp[2] ) ; + list = (LZ_LIST_VER5 *)((u32 *)list->next + sp[2]); } else { - if( sublistnum < sublistmaxnum ) + if(sublistnum < sublistmaxnum) { - list->next = (LZ_LIST_VER5 *)( sublistbuf + sizeof( u32 ) * 256 * sublistnum ) ; - list = (LZ_LIST_VER5 *)( (u32 *)list->next + sp[2] ) ; - - usesublistflagtable[code] = 1 ; - sublistnum ++ ; + list->next = (LZ_LIST_VER5 *)(sublistbuf + sizeof(u32) * 256 * sublistnum); + list = (LZ_LIST_VER5 *)((u32 *)list->next + sp[2]); + + usesublistflagtable[code] = 1; + sublistnum++; } } // 一番一致長の長いコードを探す - maxconbo = -1 ; - maxaddress = -1 ; - maxbonus = -1 ; - for( m = 0, listtemp = list->next ; m < MAX_SEARCHLISTNUM_VER5 && listtemp != NULL ; listtemp = listtemp->next, m ++ ) + maxconbo = -1; + maxaddress = -1; + maxbonus = -1; + for(m = 0, listtemp = list->next; m < MAX_SEARCHLISTNUM_VER5 && listtemp != NULL; listtemp = listtemp->next, m++) { - address = srcaddress - listtemp->address ; - if( address >= MAX_POSITION_VER5 ) + address = srcaddress - listtemp->address; + if(address >= MAX_POSITION_VER5) { - if( listtemp->prev ) listtemp->prev->next = listtemp->next ; - if( listtemp->next ) listtemp->next->prev = listtemp->prev ; - listtemp->address = 0xffffffff ; - continue ; + if(listtemp->prev) listtemp->prev->next = listtemp->next; + if(listtemp->next) listtemp->next->prev = listtemp->prev; + listtemp->address = 0xffffffff; + continue; } - - sp2 = &sp[-address] ; - sp1 = sp ; - if( srcaddress + MAX_COPYSIZE_VER5 < SrcSize ) + + sp2 = &sp[-address]; + sp1 = sp; + if(srcaddress + MAX_COPYSIZE_VER5 < SrcSize) { - conbo = MAX_COPYSIZE_VER5 / 4 ; - while( conbo && *((u32 *)sp2) == *((u32 *)sp1) ) + conbo = MAX_COPYSIZE_VER5 / 4; + while(conbo && *((u32 *)sp2) == *((u32 *)sp1)) { - sp2 += 4 ; - sp1 += 4 ; - conbo -- ; + sp2 += 4; + sp1 += 4; + conbo--; } - conbo = MAX_COPYSIZE_VER5 - ( MAX_COPYSIZE_VER5 / 4 - conbo ) * 4 ; + conbo = MAX_COPYSIZE_VER5 - (MAX_COPYSIZE_VER5 / 4 - conbo) * 4; - while( conbo && *sp2 == *sp1 ) + while(conbo && *sp2 == *sp1) { - sp2 ++ ; - sp1 ++ ; - conbo -- ; + sp2++; + sp1++; + conbo--; } - conbo = MAX_COPYSIZE_VER5 - conbo ; + conbo = MAX_COPYSIZE_VER5 - conbo; } else { - for( conbo = 0 ; - conbo < MAX_COPYSIZE_VER5 && - conbo + srcaddress < SrcSize && - sp[conbo - address] == sp[conbo] ; - conbo ++ ){} + for(conbo = 0; + conbo < MAX_COPYSIZE_VER5 && + conbo + srcaddress < SrcSize && + sp[conbo - address] == sp[conbo]; + conbo++) + { + } } - if( conbo >= 4 ) + if(conbo >= 4) { - conbosize = ( conbo - MIN_COMPRESS_VER5 ) < 0x20 ? 0 : 1 ; - addresssize = address < 0x100 ? 0 : ( address < 0x10000 ? 1 : 2 ) ; - bonus = conbo - ( 3 + conbosize + addresssize ) ; + conbosize = (conbo - MIN_COMPRESS_VER5) < 0x20 ? 0 : 1; + addresssize = address < 0x100 ? 0 : (address < 0x10000 ? 1 : 2); + bonus = conbo - (3 + conbosize + addresssize); - if( bonus > maxbonus ) + if(bonus > maxbonus) { - maxconbo = conbo ; - maxaddress = address ; - maxaddresssize = addresssize ; - maxconbosize = conbosize ; - maxbonus = bonus ; + maxconbo = conbo; + maxaddress = address; + maxaddresssize = addresssize; + maxconbosize = conbosize; + maxbonus = bonus; } } } // リストに登録 - newlist = &listbuf[listaddp] ; - if( newlist->address != 0xffffffff ) + newlist = &listbuf[listaddp]; + if(newlist->address != 0xffffffff) { - if( newlist->prev ) newlist->prev->next = newlist->next ; - if( newlist->next ) newlist->next->prev = newlist->prev ; - newlist->address = 0xffffffff ; + if(newlist->prev) newlist->prev->next = newlist->next; + if(newlist->next) newlist->next->prev = newlist->prev; + newlist->address = 0xffffffff; } - newlist->address = srcaddress ; - newlist->prev = list ; - newlist->next = list->next ; - if( list->next != NULL ) list->next->prev = newlist ; - list->next = newlist ; - listaddp = ( listaddp + 1 ) & maxlistnummask ; + newlist->address = srcaddress; + newlist->prev = list; + newlist->next = list->next; + if(list->next != NULL) list->next->prev = newlist; + list->next = newlist; + listaddp = (listaddp + 1) & maxlistnummask; // 一致コードが見つからなかったら非圧縮コードとして出力 - if( maxconbo == -1 ) + if(maxconbo == -1) { NOENCODE: // キーコードだった場合は2回連続で出力する - if( *sp == keycode ) + if(*sp == keycode) { - if( destp != NULL ) + if(destp != NULL) { - dp[0] = - dp[1] = keycode ; - dp += 2 ; + dp[0] = + dp[1] = keycode; + dp += 2; } - dstsize += 2 ; + dstsize += 2; } else { - if( destp != NULL ) + if(destp != NULL) { - *dp = *sp ; - dp ++ ; + *dp = *sp; + dp++; } - dstsize ++ ; + dstsize++; } - sp ++ ; - srcaddress ++ ; + sp++; + srcaddress++; } else { // 見つかった場合は見つけた位置と長さを出力する - + // キーコードと見つけた位置と長さを出力 - if( destp != NULL ) + if(destp != NULL) { // キーコードの出力 - *dp++ = keycode ; + *dp++ = keycode; // 出力する連続長は最低 MIN_COMPRESS_VER5 あることが前提なので - MIN_COMPRESS_VER5 したものを出力する - maxconbo -= MIN_COMPRESS_VER5 ; + maxconbo -= MIN_COMPRESS_VER5; // 連続長0~4ビットと連続長、相対アドレスのビット長を出力 - *dp = (u8)( ( ( maxconbo & 0x1f ) << 3 ) | ( maxconbosize << 2 ) | maxaddresssize ) ; + *dp = (u8)(((maxconbo & 0x1f) << 3) | (maxconbosize << 2) | maxaddresssize); // キーコードの連続はキーコードと値の等しい非圧縮コードと // 判断するため、キーコードの値以上の場合は値を+1する - if( *dp >= keycode ) dp[0] += 1 ; - dp ++ ; + if(*dp >= keycode) dp[0] += 1; + dp++; // 連続長5~12ビットを出力 - if( maxconbosize == 1 ) - *dp++ = (u8)( ( maxconbo >> 5 ) & 0xff ) ; + if(maxconbosize == 1) + *dp++ = (u8)((maxconbo >> 5) & 0xff); // maxconbo はまだ使うため - MIN_COMPRESS_VER5 した分を戻す - maxconbo += MIN_COMPRESS_VER5 ; + maxconbo += MIN_COMPRESS_VER5; // 出力する相対アドレスは0が( 現在のアドレス-1 )を挿すので、-1したものを出力する - maxaddress -- ; + maxaddress--; // 相対アドレスを出力 - *dp++ = (u8)( maxaddress ) ; - if( maxaddresssize > 0 ) + *dp++ = (u8)(maxaddress); + if(maxaddresssize > 0) { - *dp++ = (u8)( maxaddress >> 8 ) ; - if( maxaddresssize == 2 ) - *dp++ = (u8)( maxaddress >> 16 ) ; + *dp++ = (u8)(maxaddress >> 8); + if(maxaddresssize == 2) + *dp++ = (u8)(maxaddress >> 16); } } - + // 出力サイズを加算 - dstsize += 3 + maxaddresssize + maxconbosize ; - + dstsize += 3 + maxaddresssize + maxconbosize; + // リストに情報を追加 - if( srcaddress + maxconbo < SrcSize ) + if(srcaddress + maxconbo < SrcSize) { - sp2 = &sp[1] ; - for( j = 1 ; j < maxconbo && (u32)&sp2[2] - (u32)srcp < SrcSize ; j ++, sp2 ++ ) + sp2 = &sp[1]; +#ifdef B64 + for(j = 1; j < maxconbo && (u64)&sp2[2] - (u64)srcp < (u64)SrcSize; j++, sp2++) +#else + for(j = 1; j < maxconbo && (u32)&sp2[2] - (u32)srcp < SrcSize; j++, sp2++) +#endif { - code = *((u16 *)sp2) ; - list = (LZ_LIST_VER5 *)( listfirsttable + code * sizeof( u32 ) ) ; - if( usesublistflagtable[code] == 1 ) + code = *((u16 *)sp2); + list = (LZ_LIST_VER5 *)(listfirsttable + code * sizeof(u32)); + if(usesublistflagtable[code] == 1) { - list = (LZ_LIST_VER5 *)( (u32 *)list->next + sp2[2] ) ; + list = (LZ_LIST_VER5 *)((u32 *)list->next + sp2[2]); } else { - if( sublistnum < sublistmaxnum ) + if(sublistnum < sublistmaxnum) { - list->next = (LZ_LIST_VER5 *)( sublistbuf + sizeof( u32 ) * 256 * sublistnum ) ; - list = (LZ_LIST_VER5 *)( (u32 *)list->next + sp2[2] ) ; - - usesublistflagtable[code] = 1 ; - sublistnum ++ ; + list->next = (LZ_LIST_VER5 *)(sublistbuf + sizeof(u32) * 256 * sublistnum); + list = (LZ_LIST_VER5 *)((u32 *)list->next + sp2[2]); + + usesublistflagtable[code] = 1; + sublistnum++; } } - newlist = &listbuf[listaddp] ; - if( newlist->address != 0xffffffff ) + newlist = &listbuf[listaddp]; + if(newlist->address != 0xffffffff) { - if( newlist->prev ) newlist->prev->next = newlist->next ; - if( newlist->next ) newlist->next->prev = newlist->prev ; - newlist->address = 0xffffffff ; + if(newlist->prev) newlist->prev->next = newlist->next; + if(newlist->next) newlist->next->prev = newlist->prev; + newlist->address = 0xffffffff; } - newlist->address = srcaddress + j ; - newlist->prev = list ; - newlist->next = list->next ; - if( list->next != NULL ) list->next->prev = newlist ; - list->next = newlist ; - listaddp = ( listaddp + 1 ) & maxlistnummask ; + newlist->address = srcaddress + j; + newlist->prev = list; + newlist->next = list->next; + if(list->next != NULL) list->next->prev = newlist; + list->next = newlist; + listaddp = (listaddp + 1) & maxlistnummask; } } - - sp += maxconbo ; - srcaddress += maxconbo ; + + sp += maxconbo; + srcaddress += maxconbo; } // 圧縮率の表示 - if( nextprintaddress < srcaddress ) + if(nextprintaddress < srcaddress) { - nextprintaddress = srcaddress + 100 * 1024 ; + nextprintaddress = srcaddress + 100 * 1024; } } // 圧縮後のデータサイズを保存する - *((u32 *)&destp[4]) = dstsize + 9 ; + *((u32 *)&destp[4]) = dstsize + 9; // 確保したメモリの解放 - free( usesublistflagtable ) ; + free(usesublistflagtable); // データのサイズを返す - return dstsize + 9 ; + return dstsize + 9; } // デコード( 戻り値:解凍後のサイズ -1 はエラー Dest に NULL を入れることも可能 ) -int DXArchive_VER5::Decode( void *Src, void *Dest ) +int DXArchive_VER5::Decode(void *Src, void *Dest) { - u32 srcsize, destsize, code, indexsize, keycode, conbo, index ; - u8 *srcp, *destp, *dp, *sp ; + u32 srcsize, destsize, code, indexsize, keycode, conbo, index = 0; + u8 *srcp, *destp, *dp, *sp; + + destp = (u8 *)Dest; + srcp = (u8 *)Src; - destp = (u8 *)Dest ; - srcp = (u8 *)Src ; - // 解凍後のデータサイズを得る - destsize = *((u32 *)&srcp[0]) ; + destsize = *((u32 *)&srcp[0]); // 圧縮データのサイズを得る - srcsize = *((u32 *)&srcp[4]) - 9 ; + srcsize = *((u32 *)&srcp[4]) - 9; // キーコード - keycode = srcp[8] ; - + keycode = srcp[8]; + // 出力先がない場合はサイズだけ返す - if( Dest == NULL ) - return destsize ; - + if(Dest == NULL) + return destsize; + // 展開開始 - sp = srcp + 9 ; - dp = destp ; - while( srcsize ) + sp = srcp + 9; + dp = destp; + while(srcsize) { // キーコードか同かで処理を分岐 - if( sp[0] != keycode ) + if(sp[0] != keycode) { // 非圧縮コードの場合はそのまま出力 - *dp = *sp ; - dp ++ ; - sp ++ ; - srcsize -- ; - continue ; + *dp = *sp; + dp++; + sp++; + srcsize--; + continue; } - + // キーコードが連続していた場合はキーコード自体を出力 - if( sp[1] == keycode ) - { - *dp = (u8)keycode ; - dp ++ ; - sp += 2 ; - srcsize -= 2 ; - - continue ; + if(sp[1] == keycode) + { + *dp = (u8)keycode; + dp++; + sp += 2; + srcsize -= 2; + + continue; } // 第一バイトを得る - code = sp[1] ; + code = sp[1]; // もしキーコードよりも大きな値だった場合はキーコード // とのバッティング防止の為に+1しているので-1する - if( code > keycode ) code -- ; + if(code > keycode) code--; - sp += 2 ; - srcsize -= 2 ; + sp += 2; + srcsize -= 2; // 連続長を取得する - conbo = code >> 3 ; - if( code & ( 0x1 << 2 ) ) + conbo = code >> 3; + if(code & (0x1 << 2)) { - conbo |= *sp << 5 ; - sp ++ ; - srcsize -- ; + conbo |= *sp << 5; + sp++; + srcsize--; } - conbo += MIN_COMPRESS_VER5 ; // 保存時に減算した最小圧縮バイト数を足す + conbo += MIN_COMPRESS_VER5; // 保存時に減算した最小圧縮バイト数を足す // 参照相対アドレスを取得する - indexsize = code & 0x3 ; - switch( indexsize ) - { - case 0 : - index = *sp ; - sp ++ ; - srcsize -- ; - break ; - - case 1 : - index = *((u16 *)sp) ; - sp += 2 ; - srcsize -= 2 ; - break ; - - case 2 : - index = *((u16 *)sp) | ( sp[2] << 16 ) ; - sp += 3 ; - srcsize -= 3 ; - break ; + indexsize = code & 0x3; + switch(indexsize) + { + case 0: + index = *sp; + sp++; + srcsize--; + break; + + case 1: + index = *((u16 *)sp); + sp += 2; + srcsize -= 2; + break; + + case 2: + index = *((u16 *)sp) | (sp[2] << 16); + sp += 3; + srcsize -= 3; + break; } - index ++ ; // 保存時に-1しているので+1する + index++; // 保存時に-1しているので+1する // 展開 - if( index < conbo ) + if(index < conbo) { - u32 num ; + u32 num; - num = index ; - while( conbo > num ) + num = index; + while(conbo > num) { - memcpy( dp, dp - num, num ) ; - dp += num ; - conbo -= num ; - num += num ; + memcpy(dp, dp - num, num); + dp += num; + conbo -= num; + num += num; } - if( conbo != 0 ) + if(conbo != 0) { - memcpy( dp, dp - num, conbo ) ; - dp += conbo ; + memcpy(dp, dp - num, conbo); + dp += conbo; } } else { - memcpy( dp, dp - index, conbo ) ; - dp += conbo ; + memcpy(dp, dp - index, conbo); + dp += conbo; } } // 解凍後のサイズを返す - return (int)destsize ; + return (int)destsize; } // アーカイブファイルを作成する(ディレクトリ一個だけ) -int DXArchive_VER5::EncodeArchiveOneDirectory(TCHAR *OutputFileName, TCHAR *DirectoryPath, bool Press, const char *KeyString ) +int DXArchive_VER5::EncodeArchiveOneDirectory(TCHAR *OutputFileName, TCHAR *DirectoryPath, bool Press, const char *KeyString) { - int i, FileNum, Result ; - TCHAR **FilePathList, *NameBuffer ; + int i, FileNum, Result; + TCHAR **FilePathList, *NameBuffer; // ファイルの数を取得する - FileNum = GetDirectoryFilePath( DirectoryPath, NULL ) ; - if( FileNum < 0 ) return -1 ; + FileNum = GetDirectoryFilePath(DirectoryPath, NULL); + if(FileNum < 0) return -1; // ファイルの数の分だけファイル名とファイルポインタの格納用のメモリを確保する - NameBuffer = (TCHAR *)malloc( FileNum * ( 256 + 4 ) ) ; + NameBuffer = (TCHAR *)malloc(FileNum * (256 + 4)); // ファイルのパスを取得する - GetDirectoryFilePath( DirectoryPath, NameBuffer ) ; + GetDirectoryFilePath(DirectoryPath, NameBuffer); // ファイルパスのリストを作成する - FilePathList = (TCHAR **)( NameBuffer + FileNum * 256 ) ; - for( i = 0 ; i < FileNum ; i ++ ) - FilePathList[i] = NameBuffer + i * 256 ; + FilePathList = (TCHAR **)(NameBuffer + FileNum * 256); + for(i = 0; i < FileNum; i++) + FilePathList[i] = NameBuffer + i * 256; // エンコード - Result = EncodeArchive( OutputFileName, FilePathList, FileNum, Press, KeyString ) ; + Result = EncodeArchive(OutputFileName, FilePathList, FileNum, Press, KeyString); // 確保したメモリの解放 - free( NameBuffer ) ; + free(NameBuffer); // 結果を返す - return Result ; + return Result; } // アーカイブファイルを作成する -int DXArchive_VER5::EncodeArchive(TCHAR *OutputFileName, TCHAR **FileOrDirectoryPath, int FileNum, bool Press, const char *KeyString ) +int DXArchive_VER5::EncodeArchive(TCHAR *OutputFileName, TCHAR **FileOrDirectoryPath, int FileNum, bool Press, const char *KeyString) { - DARC_HEAD_VER5 Head ; - DARC_DIRECTORY_VER5 Directory ; - SIZESAVE SizeSave ; - FILE *DestFp ; - u8 *NameP, *FileP, *DirP ; - int i ; - u32 Type ; - void *TempBuffer ; - u8 Key[DXA_KEYSTR_LENGTH_VER5] ; + DARC_HEAD_VER5 Head; + DARC_DIRECTORY_VER5 Directory; + SIZESAVE SizeSave; + FILE *DestFp; + u8 *NameP, *FileP, *DirP; + int i; + u32 Type; + void *TempBuffer; + u8 Key[DXA_KEYSTR_LENGTH_VER5]; // 鍵文字列の作成 - KeyCreate( KeyString, Key ) ; + KeyCreate(KeyString, Key); // ファイル読み込みに使用するバッファの確保 - TempBuffer = malloc( DXA_BUFFERSIZE_VER5 ) ; - + TempBuffer = malloc(DXA_BUFFERSIZE_VER5); + // 出力ファイルを開く - DestFp = _tfopen( OutputFileName, TEXT("wb") ) ; + DestFp = _tfopen(OutputFileName, TEXT("wb")); // アーカイブのヘッダを出力する { - Head.Head = DXA_HEAD_VER5 ; - Head.Version = DXA_VER_VER5 ; - Head.HeadSize = 0xffffffff ; - Head.DataStartAddress = sizeof( DARC_HEAD_VER5 ) ; - Head.FileNameTableStartAddress = 0xffffffff ; - Head.DirectoryTableStartAddress = 0xffffffff ; - Head.FileTableStartAddress = 0xffffffff ; - Head.CodePage = GetACP() ; - SetFileApisToANSI() ; + Head.Head = DXA_HEAD_VER5; + Head.Version = DXA_VER_VER5; + Head.HeadSize = 0xffffffff; + Head.DataStartAddress = sizeof(DARC_HEAD_VER5); + Head.FileNameTableStartAddress = 0xffffffff; + Head.DirectoryTableStartAddress = 0xffffffff; + Head.FileTableStartAddress = 0xffffffff; + Head.CodePage = GetACP(); + SetFileApisToANSI(); - KeyConvFileWrite( &Head, sizeof( DARC_HEAD_VER5 ), DestFp, Key, 0 ) ; + KeyConvFileWrite(&Head, sizeof(DARC_HEAD_VER5), DestFp, Key, 0); } - + // 各バッファを確保する - if( ( NameP = ( u8 * )malloc( DXA_BUFFERSIZE_VER5 ) ) == NULL ) return -1 ; - memset( NameP, 0, DXA_BUFFERSIZE_VER5 ) ; + if((NameP = (u8 *)calloc(DXA_BUFFERSIZE_VER5, sizeof(u8))) == NULL) + { + free(TempBuffer); + return -1; + } - if( ( FileP = ( u8 * )malloc( DXA_BUFFERSIZE_VER5 ) ) == NULL ) return -1 ; - memset( FileP, 0, DXA_BUFFERSIZE_VER5 ) ; + if((FileP = (u8 *)calloc(DXA_BUFFERSIZE_VER5, sizeof(u8))) == NULL) + { + free(TempBuffer); + free(NameP); + return -1; + } - if( ( DirP = ( u8 * )malloc( DXA_BUFFERSIZE_VER5 ) ) == NULL ) return -1 ; - memset( DirP, 0, DXA_BUFFERSIZE_VER5 ) ; + if((DirP = (u8 *)calloc(DXA_BUFFERSIZE_VER5, sizeof(u8))) == NULL) + { + free(TempBuffer); + free(NameP); + free(FileP); + return -1; + } // サイズ保存構造体にデータをセット - SizeSave.DataSize = 0 ; - SizeSave.NameSize = 0 ; - SizeSave.DirectorySize = 0 ; - SizeSave.FileSize = 0 ; - + SizeSave.DataSize = 0; + SizeSave.NameSize = 0; + SizeSave.DirectorySize = 0; + SizeSave.FileSize = 0; + // 最初のディレクトリのファイル情報を書き出す { - DARC_FILEHEAD_VER5 File ; - - memset( &File, 0, sizeof( DARC_FILEHEAD_VER5 ) ) ; - File.NameAddress = SizeSave.NameSize ; - File.Attributes = FILE_ATTRIBUTE_DIRECTORY ; - File.DataAddress = SizeSave.DirectorySize ; - File.DataSize = 0 ; - File.PressDataSize = 0xffffffff ; + DARC_FILEHEAD_VER5 File; + + memset(&File, 0, sizeof(DARC_FILEHEAD_VER5)); + File.NameAddress = SizeSave.NameSize; + File.Attributes = FILE_ATTRIBUTE_DIRECTORY; + File.DataAddress = SizeSave.DirectorySize; + File.DataSize = 0; + File.PressDataSize = 0xffffffff; // ディレクトリ名の書き出し - SizeSave.NameSize += AddFileNameData( TEXT(""), NameP + SizeSave.NameSize ) ; + SizeSave.NameSize += AddFileNameData(TEXT(""), NameP + SizeSave.NameSize); // ファイル情報の書き出し - memcpy( FileP + SizeSave.FileSize, &File, sizeof( DARC_FILEHEAD_VER5 ) ) ; - SizeSave.FileSize += sizeof( DARC_FILEHEAD_VER5 ) ; + memcpy(FileP + SizeSave.FileSize, &File, sizeof(DARC_FILEHEAD_VER5)); + SizeSave.FileSize += sizeof(DARC_FILEHEAD_VER5); } // 最初のディレクトリ情報を書き出す - Directory.DirectoryAddress = 0 ; - Directory.ParentDirectoryAddress = 0xffffffff ; - Directory.FileHeadNum = FileNum ; - Directory.FileHeadAddress = SizeSave.FileSize ; - memcpy( DirP + SizeSave.DirectorySize, &Directory, sizeof( DARC_DIRECTORY_VER5 ) ) ; + Directory.DirectoryAddress = 0; + Directory.ParentDirectoryAddress = 0xffffffff; + Directory.FileHeadNum = FileNum; + Directory.FileHeadAddress = SizeSave.FileSize; + memcpy(DirP + SizeSave.DirectorySize, &Directory, sizeof(DARC_DIRECTORY_VER5)); // サイズを加算する - SizeSave.DirectorySize += sizeof( DARC_DIRECTORY_VER5 ) ; - SizeSave.FileSize += sizeof( DARC_FILEHEAD_VER5 ) * FileNum ; + SizeSave.DirectorySize += sizeof(DARC_DIRECTORY_VER5); + SizeSave.FileSize += sizeof(DARC_FILEHEAD_VER5) * FileNum; // 渡されたファイルの数だけ処理を繰り返す - for( i = 0 ; i < FileNum ; i ++ ) + for(i = 0; i < FileNum; i++) { // 指定されたファイルがあるかどうか検査 - Type = GetFileAttributes( FileOrDirectoryPath[i] ) ; - if( ( signed int )Type == -1 ) continue ; + Type = GetFileAttributes(FileOrDirectoryPath[i]); + if((signed int)Type == -1) continue; // ファイルのタイプによって処理を分岐 - if( ( Type & FILE_ATTRIBUTE_DIRECTORY ) != 0 ) + if((Type & FILE_ATTRIBUTE_DIRECTORY) != 0) { // ディレクトリの場合はディレクトリのアーカイブに回す - DirectoryEncode( FileOrDirectoryPath[i], NameP, DirP, FileP, &Directory, &SizeSave, i, DestFp, TempBuffer, Press, Key ) ; + DirectoryEncode(FileOrDirectoryPath[i], NameP, DirP, FileP, &Directory, &SizeSave, i, DestFp, TempBuffer, Press, Key); } else { - WIN32_FIND_DATA FindData ; - HANDLE FindHandle ; - DARC_FILEHEAD_VER5 File ; - + WIN32_FIND_DATA FindData; + HANDLE FindHandle; + DARC_FILEHEAD_VER5 File; + // ファイルの情報を得る - FindHandle = FindFirstFile( FileOrDirectoryPath[i], &FindData ) ; - if( FindHandle == INVALID_HANDLE_VALUE ) continue ; - + FindHandle = FindFirstFile(FileOrDirectoryPath[i], &FindData); + if(FindHandle == INVALID_HANDLE_VALUE) continue; + // ファイルヘッダをセットする { - File.NameAddress = SizeSave.NameSize ; - File.Time.Create = ( ( ( LONGLONG )FindData.ftCreationTime.dwHighDateTime ) << 32 ) + FindData.ftCreationTime.dwLowDateTime ; - File.Time.LastAccess = ( ( ( LONGLONG )FindData.ftLastAccessTime.dwHighDateTime ) << 32 ) + FindData.ftLastAccessTime.dwLowDateTime ; - File.Time.LastWrite = ( ( ( LONGLONG )FindData.ftLastWriteTime.dwHighDateTime ) << 32 ) + FindData.ftLastWriteTime.dwLowDateTime ; - File.Attributes = FindData.dwFileAttributes ; - File.DataAddress = SizeSave.DataSize ; - File.DataSize = FindData.nFileSizeLow ; - File.PressDataSize = 0xffffffff ; + File.NameAddress = SizeSave.NameSize; + File.Time.Create = (((LONGLONG)FindData.ftCreationTime.dwHighDateTime) << 32) + FindData.ftCreationTime.dwLowDateTime; + File.Time.LastAccess = (((LONGLONG)FindData.ftLastAccessTime.dwHighDateTime) << 32) + FindData.ftLastAccessTime.dwLowDateTime; + File.Time.LastWrite = (((LONGLONG)FindData.ftLastWriteTime.dwHighDateTime) << 32) + FindData.ftLastWriteTime.dwLowDateTime; + File.Attributes = FindData.dwFileAttributes; + File.DataAddress = SizeSave.DataSize; + File.DataSize = FindData.nFileSizeLow; + File.PressDataSize = 0xffffffff; } // ファイル名を書き出す - SizeSave.NameSize += AddFileNameData( FindData.cFileName, NameP + SizeSave.NameSize ) ; + SizeSave.NameSize += AddFileNameData(FindData.cFileName, NameP + SizeSave.NameSize); // ファイルデータを書き出す - if( (u64)FindData.nFileSizeLow + ( (u64)FindData.nFileSizeHigh << 32 ) != 0 ) + if((u64)FindData.nFileSizeLow + ((u64)FindData.nFileSizeHigh << 32) != 0) { - FILE *SrcP ; - u32 FileSize, WriteSize, MoveSize ; + FILE *SrcP; + u32 FileSize, WriteSize, MoveSize; // ファイルを開く - SrcP = _tfopen( FileOrDirectoryPath[i], TEXT("rb") ) ; - + SrcP = _tfopen(FileOrDirectoryPath[i], TEXT("rb")); + // サイズを得る - fseek( SrcP, 0, SEEK_END ) ; - FileSize = ftell( SrcP ) ; - fseek( SrcP, 0, SEEK_SET ) ; - + fseek(SrcP, 0, SEEK_END); + FileSize = ftell(SrcP); + fseek(SrcP, 0, SEEK_SET); + // ファイルサイズが 10MB 以下の場合で、圧縮の指定がある場合は圧縮を試みる - if( Press == true && (u64)FindData.nFileSizeLow + ( (u64)FindData.nFileSizeHigh << 32 ) < 10 * 1024 * 1024 ) + if(Press == true && (u64)FindData.nFileSizeLow + ((u64)FindData.nFileSizeHigh << 32) < 10 * 1024 * 1024) { - void *SrcBuf, *DestBuf ; - u32 DestSize, Len ; - + void *SrcBuf, *DestBuf; + u32 DestSize; + size_t Len; + // 一部のファイル形式の場合は予め弾く - if( ( Len = _tcslen( FindData.cFileName ) ) > 4 ) + if((Len = _tcslen(FindData.cFileName)) > 4) { - TCHAR *sp ; - - sp = &FindData.cFileName[Len-3] ; - if( StrICmp( sp, TEXT("wav") ) == 0 || - StrICmp( sp, TEXT("jpg") ) == 0 || - StrICmp( sp, TEXT("png") ) == 0 || - StrICmp( sp, TEXT("mpg") ) == 0 || - StrICmp( sp, TEXT("mp3") ) == 0 || - StrICmp( sp, TEXT("ogg") ) == 0 || - StrICmp( sp, TEXT("wmv") ) == 0 || - StrICmp( sp - 1, TEXT("jpeg") ) == 0 ) goto NOPRESS ; + TCHAR *sp; + + sp = &FindData.cFileName[Len - 3]; + if(StrICmp(sp, TEXT("wav")) == 0 || + StrICmp(sp, TEXT("jpg")) == 0 || + StrICmp(sp, TEXT("png")) == 0 || + StrICmp(sp, TEXT("mpg")) == 0 || + StrICmp(sp, TEXT("mp3")) == 0 || + StrICmp(sp, TEXT("ogg")) == 0 || + StrICmp(sp, TEXT("wmv")) == 0 || + StrICmp(sp - 1, TEXT("jpeg")) == 0) goto NOPRESS; } - + // データが丸ごと入るメモリ領域の確保 - SrcBuf = malloc( FileSize + FileSize * 2 + 64 ) ; - DestBuf = (u8 *)SrcBuf + FileSize ; - + SrcBuf = malloc(FileSize + FileSize * 2 + 64); + DestBuf = (u8 *)SrcBuf + FileSize; + // ファイルを丸ごと読み込む - fread( SrcBuf, FileSize, 1, SrcP ) ; - + fread(SrcBuf, FileSize, 1, SrcP); + // 圧縮 - DestSize = Encode( SrcBuf, FileSize, DestBuf ) ; - + DestSize = Encode(SrcBuf, FileSize, DestBuf); + // 殆ど圧縮出来なかった場合は圧縮無しでアーカイブする - if( (f64)DestSize / (f64)FileSize > 0.90 ) + if((f64)DestSize / (f64)FileSize > 0.90) { - fseek( SrcP, 0L, SEEK_SET ) ; - free( SrcBuf ) ; - goto NOPRESS ; + fseek(SrcP, 0L, SEEK_SET); + free(SrcBuf); + goto NOPRESS; } - + // 圧縮データを反転して書き出す - WriteSize = ( DestSize + 3 ) / 4 * 4 ; - KeyConvFileWrite( DestBuf, WriteSize, DestFp, Key, File.DataSize ) ; - + WriteSize = (DestSize + 3) / 4 * 4; + KeyConvFileWrite(DestBuf, WriteSize, DestFp, Key, File.DataSize); + // メモリの解放 - free( SrcBuf ) ; - + free(SrcBuf); + // 圧縮データのサイズを保存する - File.PressDataSize = DestSize ; + File.PressDataSize = DestSize; } else { -NOPRESS: +NOPRESS: // 転送開始 - WriteSize = 0 ; - while( WriteSize < FileSize ) + WriteSize = 0; + while(WriteSize < FileSize) { // 転送サイズ決定 - MoveSize = DXA_BUFFERSIZE_VER5 < FileSize - WriteSize ? DXA_BUFFERSIZE_VER5 : FileSize - WriteSize ; - MoveSize = ( MoveSize + 3 ) / 4 * 4 ; // サイズは4の倍数に合わせる - + MoveSize = DXA_BUFFERSIZE_VER5 < FileSize - WriteSize ? DXA_BUFFERSIZE_VER5 : FileSize - WriteSize; + MoveSize = (MoveSize + 3) / 4 * 4; // サイズは4の倍数に合わせる + // ファイルの反転読み込み - KeyConvFileRead( TempBuffer, MoveSize, SrcP, Key, File.DataSize + WriteSize ) ; + KeyConvFileRead(TempBuffer, MoveSize, SrcP, Key, File.DataSize + WriteSize); // 書き出し - fwrite( TempBuffer, MoveSize, 1, DestFp ) ; - + fwrite(TempBuffer, MoveSize, 1, DestFp); + // 書き出しサイズの加算 - WriteSize += MoveSize ; + WriteSize += MoveSize; } } - + // 書き出したファイルを閉じる - fclose( SrcP ) ; - + fclose(SrcP); + // データサイズの加算 - SizeSave.DataSize += WriteSize ; + SizeSave.DataSize += WriteSize; } - + // ファイルヘッダを書き出す - memcpy( FileP + Directory.FileHeadAddress + sizeof( DARC_FILEHEAD_VER5 ) * i, &File, sizeof( DARC_FILEHEAD_VER5 ) ) ; + memcpy(FileP + Directory.FileHeadAddress + sizeof(DARC_FILEHEAD_VER5) * i, &File, sizeof(DARC_FILEHEAD_VER5)); // Find ハンドルを閉じる - FindClose( FindHandle ) ; + FindClose(FindHandle); } } - + // バッファに溜め込んだ各種ヘッダデータを出力する { // 出力する順番は ファイルネームテーブル、 DARC_FILEHEAD_VER5 テーブル、 DARC_DIRECTORY_VER5 テーブル の順 - KeyConvFileWrite( NameP, SizeSave.NameSize, DestFp, Key, 0 ) ; - KeyConvFileWrite( FileP, SizeSave.FileSize, DestFp, Key, SizeSave.NameSize ) ; - KeyConvFileWrite( DirP, SizeSave.DirectorySize, DestFp, Key, SizeSave.NameSize + SizeSave.FileSize ) ; + KeyConvFileWrite(NameP, SizeSave.NameSize, DestFp, Key, 0); + KeyConvFileWrite(FileP, SizeSave.FileSize, DestFp, Key, SizeSave.NameSize); + KeyConvFileWrite(DirP, SizeSave.DirectorySize, DestFp, Key, SizeSave.NameSize + SizeSave.FileSize); } - + // 再びアーカイブのヘッダを出力する { - Head.Head = DXA_HEAD_VER5 ; - Head.Version = DXA_VER_VER5 ; - Head.HeadSize = SizeSave.NameSize + SizeSave.DirectorySize + SizeSave.FileSize ; - Head.DataStartAddress = sizeof( DARC_HEAD_VER5 ) ; - Head.FileNameTableStartAddress = SizeSave.DataSize + Head.DataStartAddress ; - Head.FileTableStartAddress = SizeSave.NameSize ; - Head.DirectoryTableStartAddress = Head.FileTableStartAddress + SizeSave.FileSize ; + Head.Head = DXA_HEAD_VER5; + Head.Version = DXA_VER_VER5; + Head.HeadSize = SizeSave.NameSize + SizeSave.DirectorySize + SizeSave.FileSize; + Head.DataStartAddress = sizeof(DARC_HEAD_VER5); + Head.FileNameTableStartAddress = SizeSave.DataSize + Head.DataStartAddress; + Head.FileTableStartAddress = SizeSave.NameSize; + Head.DirectoryTableStartAddress = Head.FileTableStartAddress + SizeSave.FileSize; - fseek( DestFp, 0, SEEK_SET ) ; - KeyConvFileWrite( &Head, sizeof( DARC_HEAD_VER5 ), DestFp, Key, 0 ) ; + fseek(DestFp, 0, SEEK_SET); + KeyConvFileWrite(&Head, sizeof(DARC_HEAD_VER5), DestFp, Key, 0); } - + // 書き出したファイルを閉じる - fclose( DestFp ) ; - + fclose(DestFp); + // 確保したバッファを開放する - free( NameP ) ; - free( FileP ) ; - free( DirP ) ; - free( TempBuffer ) ; + free(NameP); + free(FileP); + free(DirP); + free(TempBuffer); // 終了 - return 0 ; + return 0; } // アーカイブファイルを展開する -int DXArchive_VER5::DecodeArchive(TCHAR *ArchiveName, const TCHAR *OutputPath, const char *KeyString ) +int DXArchive_VER5::DecodeArchive(TCHAR *ArchiveName, const TCHAR *OutputPath, const char *KeyString) { - u8 *HeadBuffer = NULL ; - DARC_HEAD_VER5 Head ; - u8 *FileP, *NameP, *DirP ; - FILE *ArcP = NULL ; - TCHAR OldDir[MAX_PATH] ; - u8 Key[DXA_KEYSTR_LENGTH_VER5] ; + u8 *HeadBuffer = NULL; + DARC_HEAD_VER5 Head; + u8 *FileP, *NameP, *DirP; + FILE *ArcP = NULL; + TCHAR OldDir[MAX_PATH]; + u8 Key[DXA_KEYSTR_LENGTH_VER5]; // 鍵文字列の作成 - KeyCreate( KeyString, Key ) ; + KeyCreate(KeyString, Key); // アーカイブファイルを開く - ArcP = _tfopen( ArchiveName, TEXT("rb") ) ; - if( ArcP == NULL ) return -1 ; + ArcP = _tfopen(ArchiveName, TEXT("rb")); + if(ArcP == NULL) return -1; // 出力先のディレクトリにカレントディレクトリを変更する - GetCurrentDirectory( MAX_PATH, OldDir ) ; - SetCurrentDirectory( OutputPath ) ; + GetCurrentDirectory(MAX_PATH, OldDir); + SetCurrentDirectory(OutputPath); // ヘッダを解析する { - KeyConvFileRead( &Head, sizeof( DARC_HEAD_VER5 ), ArcP, Key, 0 ) ; + KeyConvFileRead(&Head, sizeof(DARC_HEAD_VER5), ArcP, Key, 0); // IDの検査 - if( Head.Head != DXA_HEAD_VER5 ) + if(Head.Head != DXA_HEAD_VER5) { // バージョン2以前か調べる - memset( Key, 0xffffffff, DXA_KEYSTR_LENGTH_VER5 ) ; + memset(Key, 0xff, DXA_KEYSTR_LENGTH_VER5); - fseek( ArcP, 0L, SEEK_SET ) ; - KeyConvFileRead( &Head, sizeof( DARC_HEAD_VER5 ), ArcP, Key, 0 ) ; + fseek(ArcP, 0L, SEEK_SET); + KeyConvFileRead(&Head, sizeof(DARC_HEAD_VER5), ArcP, Key, 0); // バージョン2以前でもない場合はエラー - if( Head.Head != DXA_HEAD_VER5 ) - goto ERR ; + if(Head.Head != DXA_HEAD_VER5) + goto ERR; } - + // バージョン検査 - if( Head.Version > DXA_VER_VER5 ) goto ERR ; - + if(Head.Version > DXA_VER_VER5) goto ERR; + // ヘッダのサイズ分のメモリを確保する - HeadBuffer = ( u8 * )malloc( Head.HeadSize ) ; - if( HeadBuffer == NULL ) goto ERR ; - + HeadBuffer = (u8 *)malloc(Head.HeadSize); + if(HeadBuffer == NULL) goto ERR; + // ヘッダパックをメモリに読み込む - fseek( ArcP, Head.FileNameTableStartAddress, SEEK_SET ) ; - if( Head.Version >= 0x0005 ) + fseek(ArcP, Head.FileNameTableStartAddress, SEEK_SET); + if(Head.Version >= 0x0005) { - KeyConvFileRead( HeadBuffer, Head.HeadSize, ArcP, Key, 0 ) ; + KeyConvFileRead(HeadBuffer, Head.HeadSize, ArcP, Key, 0); } else { - KeyConvFileRead( HeadBuffer, Head.HeadSize, ArcP, Key ) ; + KeyConvFileRead(HeadBuffer, Head.HeadSize, ArcP, Key); } - + // 各アドレスをセットする - NameP = HeadBuffer ; - FileP = NameP + Head.FileTableStartAddress ; - DirP = NameP + Head.DirectoryTableStartAddress ; + NameP = HeadBuffer; + FileP = NameP + Head.FileTableStartAddress; + DirP = NameP + Head.DirectoryTableStartAddress; } // アーカイブの展開を開始する - DirectoryDecode( NameP, DirP, FileP, &Head, ( DARC_DIRECTORY_VER5 * )DirP, ArcP, Key ) ; - + DirectoryDecode(NameP, DirP, FileP, &Head, (DARC_DIRECTORY_VER5 *)DirP, ArcP, Key); + // ファイルを閉じる - fclose( ArcP ) ; - + fclose(ArcP); + // ヘッダを読み込んでいたメモリを解放する - free( HeadBuffer ) ; + free(HeadBuffer); // カレントディレクトリを元に戻す - SetCurrentDirectory( OldDir ) ; + SetCurrentDirectory(OldDir); // 終了 - return 0 ; + return 0; -ERR : - if( HeadBuffer != NULL ) free( HeadBuffer ) ; - if( ArcP != NULL ) fclose( ArcP ) ; +ERR: + if(HeadBuffer != NULL) free(HeadBuffer); + if(ArcP != NULL) fclose(ArcP); // カレントディレクトリを元に戻す - SetCurrentDirectory( OldDir ) ; + SetCurrentDirectory(OldDir); // 終了 - return -1 ; + return -1; } // コンストラクタ -DXArchive_VER5::DXArchive_VER5(TCHAR *ArchivePath ) +DXArchive_VER5::DXArchive_VER5(TCHAR *ArchivePath) { - this->fp = NULL ; - this->HeadBuffer = NULL ; - this->NameP = this->DirP = this->FileP = NULL ; - this->CurrentDirectory = NULL ; - this->CashBuffer = NULL ; + this->fp = NULL; + this->HeadBuffer = NULL; + this->NameP = this->DirP = this->FileP = NULL; + this->CurrentDirectory = NULL; + this->CashBuffer = NULL; - if( ArchivePath != NULL ) + if(ArchivePath != NULL) { - this->OpenArchiveFile( ArchivePath ) ; + this->OpenArchiveFile(ArchivePath); } } // デストラクタ DXArchive_VER5::~DXArchive_VER5() { - if( this->fp != NULL ) this->CloseArchiveFile() ; + if(this->fp != NULL) this->CloseArchiveFile(); - if( this->fp != NULL ) fclose( this->fp ) ; - if( this->HeadBuffer != NULL ) free( this->HeadBuffer ) ; - if( this->CashBuffer != NULL ) free( this->CashBuffer ) ; + if(this->fp != NULL) fclose(this->fp); + if(this->HeadBuffer != NULL) free(this->HeadBuffer); + if(this->CashBuffer != NULL) free(this->CashBuffer); - this->fp = NULL ; - this->HeadBuffer = NULL ; - this->NameP = this->DirP = this->FileP = NULL ; - this->CurrentDirectory = NULL ; + this->fp = NULL; + this->HeadBuffer = NULL; + this->NameP = this->DirP = this->FileP = NULL; + this->CurrentDirectory = NULL; } // 指定のディレクトリデータの暗号化を解除する( 丸ごとメモリに読み込んだ場合用 ) -int DXArchive_VER5::DirectoryKeyConv( DARC_DIRECTORY_VER5 *Dir ) +int DXArchive_VER5::DirectoryKeyConv(DARC_DIRECTORY_VER5 *Dir) { // メモリイメージではない場合はエラー - if( this->MemoryOpenFlag == false ) - return -1 ; + if(this->MemoryOpenFlag == false) + return -1; // バージョン 0x0005 より前では何もしない - if( this->Head.Version < 0x0005 ) - return 0 ; - + if(this->Head.Version < 0x0005) + return 0; + // 暗号化解除処理開始 { - u32 i, FileHeadSize ; - DARC_FILEHEAD_VER5 *File ; + u32 i, FileHeadSize; + DARC_FILEHEAD_VER5 *File; // 格納されているファイルの数だけ繰り返す - FileHeadSize = this->Head.Version >= 0x0002 ? sizeof( DARC_FILEHEAD_VER5 ) : sizeof( DARC_FILEHEAD_VER1 ) ; - File = ( DARC_FILEHEAD_VER5 * )( this->FileP + Dir->FileHeadAddress ) ; - for( i = 0 ; i < Dir->FileHeadNum ; i ++, File = (DARC_FILEHEAD_VER5 *)( (u8 *)File + FileHeadSize ) ) + FileHeadSize = this->Head.Version >= 0x0002 ? sizeof(DARC_FILEHEAD_VER5) : sizeof(DARC_FILEHEAD_VER1); + File = (DARC_FILEHEAD_VER5 *)(this->FileP + Dir->FileHeadAddress); + for(i = 0; i < Dir->FileHeadNum; i++, File = (DARC_FILEHEAD_VER5 *)((u8 *)File + FileHeadSize)) { // ディレクトリかどうかで処理を分岐 - if( File->Attributes & FILE_ATTRIBUTE_DIRECTORY ) + if(File->Attributes & FILE_ATTRIBUTE_DIRECTORY) { // ディレクトリの場合は再帰をかける - DirectoryKeyConv( ( DARC_DIRECTORY_VER5 * )( this->DirP + File->DataAddress ) ) ; + DirectoryKeyConv((DARC_DIRECTORY_VER5 *)(this->DirP + File->DataAddress)); } else { - u8 *DataP ; + u8 *DataP; // ファイルの場合は暗号化を解除する - + // データがある場合のみ処理 - if( File->DataSize != 0 ) + if(File->DataSize != 0) { // データ位置をセットする - DataP = ( u8 * )this->fp + this->Head.DataStartAddress + File->DataAddress ; + DataP = (u8 *)this->fp + this->Head.DataStartAddress + File->DataAddress; // データが圧縮されているかどうかで処理を分岐 - if( this->Head.Version >= 0x0002 && File->PressDataSize != 0xffffffff ) + if(this->Head.Version >= 0x0002 && File->PressDataSize != 0xffffffff) { // 圧縮されている場合 - KeyConv( DataP, File->PressDataSize, File->DataSize, this->Key ) ; + KeyConv(DataP, File->PressDataSize, File->DataSize, this->Key); } else { // 圧縮されていない場合 - KeyConv( DataP, File->DataSize, File->DataSize, this->Key ) ; + KeyConv(DataP, File->DataSize, File->DataSize, this->Key); } } } @@ -2027,630 +2052,639 @@ int DXArchive_VER5::DirectoryKeyConv( DARC_DIRECTORY_VER5 *Dir ) } // 終了 - return 0 ; + return 0; } // メモリ上にあるアーカイブイメージを開く( 0:成功 -1:失敗 ) -int DXArchive_VER5::OpenArchiveMem( void *ArchiveImage, int ArchiveSize, const char *KeyString ) +int DXArchive_VER5::OpenArchiveMem(void *ArchiveImage, int ArchiveSize, const char *KeyString) { - u8 *datp ; + u8 *datp; // 既になんらかのアーカイブを開いていた場合はエラー - if( this->fp != NULL ) return -1 ; + if(this->fp != NULL) return -1; // 鍵の作成 - KeyCreate( KeyString, this->Key ) ; + KeyCreate(KeyString, this->Key); // 最初にヘッダの部分を反転する - memcpy( &this->Head, ArchiveImage, sizeof( DARC_HEAD_VER5 ) ) ; - KeyConv( &this->Head, sizeof( DARC_HEAD_VER5 ), 0, this->Key ) ; + memcpy(&this->Head, ArchiveImage, sizeof(DARC_HEAD_VER5)); + KeyConv(&this->Head, sizeof(DARC_HEAD_VER5), 0, this->Key); // IDが違う場合はバージョン2以前か調べる - if( Head.Head != DXA_HEAD_VER5 ) + if(Head.Head != DXA_HEAD_VER5) { // バージョン2以前か調べる - memset( this->Key, 0xffffffff, DXA_KEYSTR_LENGTH_VER5 ) ; + memset(this->Key, 0xff, DXA_KEYSTR_LENGTH_VER5); - memcpy( &this->Head, ArchiveImage, sizeof( DARC_HEAD_VER5 ) ) ; - KeyConv( &this->Head, sizeof( DARC_HEAD_VER5 ), 0, this->Key ) ; + memcpy(&this->Head, ArchiveImage, sizeof(DARC_HEAD_VER5)); + KeyConv(&this->Head, sizeof(DARC_HEAD_VER5), 0, this->Key); // バージョン2以前でもない場合はエラー - if( Head.Head != DXA_HEAD_VER5 ) - return -1 ; + if(Head.Head != DXA_HEAD_VER5) + return -1; } - if( Head.Version < 0x0005 ) + if(Head.Version < 0x0005) { // すべてのデータを反転する - KeyConv( ArchiveImage, ArchiveSize, 0, this->Key ) ; + KeyConv(ArchiveImage, ArchiveSize, 0, this->Key); } // ポインタを保存 - this->fp = (FILE *)ArchiveImage ; - datp = (u8 *)ArchiveImage ; + this->fp = (FILE *)ArchiveImage; + datp = (u8 *)ArchiveImage; // ヘッダを解析する { - if( Head.Version >= 0x0005 ) + if(Head.Version >= 0x0005) { - memcpy( &this->Head, datp, sizeof( DARC_HEAD_VER5 ) ) ; - KeyConv( &this->Head, sizeof( DARC_HEAD_VER5 ), 0, this->Key ) ; + memcpy(&this->Head, datp, sizeof(DARC_HEAD_VER5)); + KeyConv(&this->Head, sizeof(DARC_HEAD_VER5), 0, this->Key); } else { - memcpy( &this->Head, datp, sizeof( DARC_HEAD_VER5 ) ) ; + memcpy(&this->Head, datp, sizeof(DARC_HEAD_VER5)); } - datp += sizeof( DARC_HEAD_VER5 ) ; + datp += sizeof(DARC_HEAD_VER5); // IDの検査 - if( this->Head.Head != DXA_HEAD_VER5 ) goto ERR ; - + if(this->Head.Head != DXA_HEAD_VER5) goto ERR; + // バージョン検査 - if( this->Head.Version > DXA_VER_VER5 ) goto ERR ; + if(this->Head.Version > DXA_VER_VER5) goto ERR; // ヘッダパックのアドレスをセットする - this->HeadBuffer = (TCHAR *)this->fp + this->Head.FileNameTableStartAddress ; + this->HeadBuffer = (TCHAR *)this->fp + this->Head.FileNameTableStartAddress; // 各アドレスをセットする - if( Head.Version >= 0x0005 ) + if(Head.Version >= 0x0005) { - KeyConv( this->HeadBuffer, this->Head.HeadSize, 0, this->Key ) ; + KeyConv(this->HeadBuffer, this->Head.HeadSize, 0, this->Key); } - this->NameP = this->HeadBuffer ; - this->FileP = this->NameP + this->Head.FileTableStartAddress ; - this->DirP = this->NameP + this->Head.DirectoryTableStartAddress ; + this->NameP = this->HeadBuffer; + this->FileP = this->NameP + this->Head.FileTableStartAddress; + this->DirP = this->NameP + this->Head.DirectoryTableStartAddress; } // カレントディレクトリのセット - this->CurrentDirectory = ( DARC_DIRECTORY_VER5 * )this->DirP ; + this->CurrentDirectory = (DARC_DIRECTORY_VER5 *)this->DirP; // メモリイメージから開いているフラグを立てる - MemoryOpenFlag = true ; + MemoryOpenFlag = true; // 全てのファイルの暗号化を解除する - if( this->Head.Version >= 0x0005 ) + if(this->Head.Version >= 0x0005) { - DirectoryKeyConv( ( DARC_DIRECTORY_VER5 * )this->DirP ) ; + DirectoryKeyConv((DARC_DIRECTORY_VER5 *)this->DirP); } // ユーザーのイメージから開いたフラグを立てる - UserMemoryImageFlag = true ; + UserMemoryImageFlag = true; // サイズも保存しておく - MemoryImageSize = ArchiveSize ; + MemoryImageSize = ArchiveSize; // 終了 - return 0 ; + return 0; -ERR : - if( Head.Version < 0x0005 ) +ERR: + if(Head.Version < 0x0005) { // 反転したデータを元に戻す - KeyConv( ArchiveImage, ArchiveSize, 0, this->Key ) ; + KeyConv(ArchiveImage, ArchiveSize, 0, this->Key); } // 終了 - return -1 ; + return -1; } // アーカイブファイルを開き最初にすべてメモリ上に読み込んでから処理する( 0:成功 -1:失敗 ) -int DXArchive_VER5::OpenArchiveFileMem( const TCHAR *ArchivePath, const char *KeyString ) +int DXArchive_VER5::OpenArchiveFileMem(const TCHAR *ArchivePath, const char *KeyString) { - FILE *fp ; - u8 *datp ; - void *ArchiveImage ; - int ArchiveSize ; + FILE *pFp; + u8 *datp; + void *ArchiveImage; + int ArchiveSize; // 既になんらかのアーカイブを開いていた場合はエラー - if( this->fp != NULL ) return -1 ; + if(this->fp != NULL) return -1; // 鍵の作成 - KeyCreate( KeyString, this->Key ) ; + KeyCreate(KeyString, this->Key); // メモリに読み込む { - fp = _tfopen( ArchivePath, TEXT("rb") ) ; - if( fp == NULL ) return -1 ; - fseek( fp, 0L, SEEK_END ) ; - ArchiveSize = ftell( fp ) ; - fseek( fp, 0L, SEEK_SET ) ; - ArchiveImage = malloc( ArchiveSize ) ; - if( ArchiveImage == NULL ) + pFp = _tfopen(ArchivePath, TEXT("rb")); + if(pFp == NULL) return -1; + fseek(pFp, 0L, SEEK_END); + ArchiveSize = ftell(pFp); + fseek(pFp, 0L, SEEK_SET); + ArchiveImage = malloc(ArchiveSize); + if(ArchiveImage == NULL) { - fclose( fp ) ; - return -1 ; + fclose(pFp); + return -1; } - fread( ArchiveImage, ArchiveSize, 1, fp ) ; - fclose( fp ) ; + fread(ArchiveImage, ArchiveSize, 1, pFp); + fclose(pFp); } // 最初にヘッダの部分を反転する - memcpy( &this->Head, ArchiveImage, sizeof( DARC_HEAD_VER5 ) ) ; - KeyConv( &this->Head, sizeof( DARC_HEAD_VER5 ), 0, this->Key ) ; + memcpy(&this->Head, ArchiveImage, sizeof(DARC_HEAD_VER5)); + KeyConv(&this->Head, sizeof(DARC_HEAD_VER5), 0, this->Key); // IDが違う場合はバージョン2以前か調べる - if( Head.Head != DXA_HEAD_VER5 ) + if(Head.Head != DXA_HEAD_VER5) { // バージョン2以前か調べる - memset( this->Key, 0xffffffff, DXA_KEYSTR_LENGTH_VER5 ) ; + memset(this->Key, 0xff, DXA_KEYSTR_LENGTH_VER5); - memcpy( &this->Head, ArchiveImage, sizeof( DARC_HEAD_VER5 ) ) ; - KeyConv( &this->Head, sizeof( DARC_HEAD_VER5 ), 0, this->Key ) ; + memcpy(&this->Head, ArchiveImage, sizeof(DARC_HEAD_VER5)); + KeyConv(&this->Head, sizeof(DARC_HEAD_VER5), 0, this->Key); // バージョン2以前でもない場合はエラー - if( Head.Head != DXA_HEAD_VER5 ) - return -1 ; + if(Head.Head != DXA_HEAD_VER5) + { + free(ArchiveImage); + return -1; + } } // すべてのデータを反転する - if( Head.Version < 0x0005 ) + if(Head.Version < 0x0005) { - KeyConv( ArchiveImage, ArchiveSize, 0, this->Key ) ; + KeyConv(ArchiveImage, ArchiveSize, 0, this->Key); } // ポインタを保存 - this->fp = (FILE *)ArchiveImage ; - datp = (u8 *)ArchiveImage ; + this->fp = (FILE *)ArchiveImage; + datp = (u8 *)ArchiveImage; // ヘッダを解析する { - if( Head.Version >= 0x0005 ) + if(Head.Version >= 0x0005) { - memcpy( &this->Head, datp, sizeof( DARC_HEAD_VER5 ) ) ; - KeyConv( &this->Head, sizeof( DARC_HEAD_VER5 ), 0, this->Key ) ; + memcpy(&this->Head, datp, sizeof(DARC_HEAD_VER5)); + KeyConv(&this->Head, sizeof(DARC_HEAD_VER5), 0, this->Key); } else { - memcpy( &this->Head, datp, sizeof( DARC_HEAD_VER5 ) ) ; + memcpy(&this->Head, datp, sizeof(DARC_HEAD_VER5)); } - datp += sizeof( DARC_HEAD_VER5 ) ; - + datp += sizeof(DARC_HEAD_VER5); + // IDの検査 - if( this->Head.Head != DXA_HEAD_VER5 ) goto ERR ; - + if(this->Head.Head != DXA_HEAD_VER5) goto ERR; + // バージョン検査 - if( this->Head.Version > DXA_VER_VER5 ) goto ERR ; + if(this->Head.Version > DXA_VER_VER5) goto ERR; // ヘッダパックのアドレスをセットする - this->HeadBuffer = (TCHAR *)this->fp + this->Head.FileNameTableStartAddress ; + this->HeadBuffer = (TCHAR *)this->fp + this->Head.FileNameTableStartAddress; // 各アドレスをセットする - if( Head.Version >= 0x0005 ) + if(Head.Version >= 0x0005) { - KeyConv( this->HeadBuffer, this->Head.HeadSize, 0, this->Key ) ; + KeyConv(this->HeadBuffer, this->Head.HeadSize, 0, this->Key); } - this->NameP = this->HeadBuffer ; - this->FileP = this->NameP + this->Head.FileTableStartAddress ; - this->DirP = this->NameP + this->Head.DirectoryTableStartAddress ; + this->NameP = this->HeadBuffer; + this->FileP = this->NameP + this->Head.FileTableStartAddress; + this->DirP = this->NameP + this->Head.DirectoryTableStartAddress; } // カレントディレクトリのセット - this->CurrentDirectory = ( DARC_DIRECTORY_VER5 * )this->DirP ; + this->CurrentDirectory = (DARC_DIRECTORY_VER5 *)this->DirP; // メモリイメージから開いているフラグを立てる - MemoryOpenFlag = true ; + MemoryOpenFlag = true; // 全てのファイルの暗号化を解除する - if( this->Head.Version >= 0x0005 ) + if(this->Head.Version >= 0x0005) { - DirectoryKeyConv( ( DARC_DIRECTORY_VER5 * )this->DirP ) ; + DirectoryKeyConv((DARC_DIRECTORY_VER5 *)this->DirP); } - + // ユーザーのイメージから開いたわけではないのでフラグを倒す - UserMemoryImageFlag = false ; + UserMemoryImageFlag = false; // サイズも保存しておく - MemoryImageSize = ArchiveSize ; + MemoryImageSize = ArchiveSize; // 終了 - return 0 ; + return 0; -ERR : - if( Head.Version < 0x0005 ) +ERR: + if(Head.Version < 0x0005) { // 反転したデータを元に戻す - KeyConv( ArchiveImage, ArchiveSize, 0, this->Key ) ; + KeyConv(ArchiveImage, ArchiveSize, 0, this->Key); } - + // 終了 - return -1 ; + return -1; } // アーカイブファイルを開く -int DXArchive_VER5::OpenArchiveFile( const TCHAR *ArchivePath, const char *KeyString ) +int DXArchive_VER5::OpenArchiveFile(const TCHAR *ArchivePath, const char *KeyString) { // 既になんらかのアーカイブを開いていた場合はエラー - if( this->fp != NULL ) return -1 ; + if(this->fp != NULL) return -1; // アーカイブファイルを開こうと試みる - this->fp = _tfopen( ArchivePath, TEXT("rb") ) ; - if( this->fp == NULL ) return -1 ; + this->fp = _tfopen(ArchivePath, TEXT("rb")); + if(this->fp == NULL) return -1; // 鍵文字列の作成 - KeyCreate( KeyString, this->Key ) ; + KeyCreate(KeyString, this->Key); // ヘッダを解析する { - KeyConvFileRead( &this->Head, sizeof( DARC_HEAD_VER5 ), this->fp, this->Key, 0 ) ; - + KeyConvFileRead(&this->Head, sizeof(DARC_HEAD_VER5), this->fp, this->Key, 0); + // IDの検査 - if( this->Head.Head != DXA_HEAD_VER5 ) + if(this->Head.Head != DXA_HEAD_VER5) { // バージョン2以前か調べる - memset( this->Key, 0xffffffff, DXA_KEYSTR_LENGTH_VER5 ) ; + memset(this->Key, 0xff, DXA_KEYSTR_LENGTH_VER5); - fseek( this->fp, 0L, SEEK_SET ) ; - KeyConvFileRead( &Head, sizeof( DARC_HEAD_VER5 ), this->fp, this->Key, 0 ) ; + fseek(this->fp, 0L, SEEK_SET); + KeyConvFileRead(&Head, sizeof(DARC_HEAD_VER5), this->fp, this->Key, 0); // バージョン2以前でもない場合はエラー - if( Head.Head != DXA_HEAD_VER5 ) - goto ERR ; + if(Head.Head != DXA_HEAD_VER5) + goto ERR; } - + // バージョン検査 - if( this->Head.Version > DXA_VER_VER5 ) goto ERR ; - + if(this->Head.Version > DXA_VER_VER5) goto ERR; + // ヘッダのサイズ分のメモリを確保する - this->HeadBuffer = (TCHAR * )calloc( this->Head.HeadSize, sizeof(TCHAR) ) ; - if( this->HeadBuffer == NULL ) goto ERR ; - + this->HeadBuffer = (TCHAR *)calloc(this->Head.HeadSize, sizeof(TCHAR)); + if(this->HeadBuffer == NULL) goto ERR; + // ヘッダパックをメモリに読み込む - fseek( this->fp, this->Head.FileNameTableStartAddress, SEEK_SET ) ; - if( this->Head.Version >= 0x0005 ) + fseek(this->fp, this->Head.FileNameTableStartAddress, SEEK_SET); + if(this->Head.Version >= 0x0005) { - KeyConvFileRead( this->HeadBuffer, this->Head.HeadSize, this->fp, this->Key, 0 ) ; + KeyConvFileRead(this->HeadBuffer, this->Head.HeadSize, this->fp, this->Key, 0); } else { - KeyConvFileRead( this->HeadBuffer, this->Head.HeadSize, this->fp, this->Key ) ; + KeyConvFileRead(this->HeadBuffer, this->Head.HeadSize, this->fp, this->Key); } - + // 各アドレスをセットする - this->NameP = this->HeadBuffer ; - this->FileP = this->NameP + this->Head.FileTableStartAddress ; - this->DirP = this->NameP + this->Head.DirectoryTableStartAddress ; + this->NameP = this->HeadBuffer; + this->FileP = this->NameP + this->Head.FileTableStartAddress; + this->DirP = this->NameP + this->Head.DirectoryTableStartAddress; } // カレントディレクトリのセット - this->CurrentDirectory = ( DARC_DIRECTORY_VER5 * )this->DirP ; + this->CurrentDirectory = (DARC_DIRECTORY_VER5 *)this->DirP; // メモリイメージから開いている、フラグを倒す - MemoryOpenFlag = false ; + MemoryOpenFlag = false; // 終了 - return 0 ; + return 0; + +ERR: + if(this->fp != NULL) + { + fclose(this->fp); this->fp = NULL; + } + if(this->HeadBuffer != NULL) + { + free(this->HeadBuffer); this->HeadBuffer = NULL; + } -ERR : - if( this->fp != NULL ){ fclose( this->fp ) ; this->fp = NULL ; } - if( this->HeadBuffer != NULL ){ free( this->HeadBuffer ) ; this->HeadBuffer = NULL ; } - // 終了 - return -1 ; + return -1; } // アーカイブファイルを閉じる -int DXArchive_VER5::CloseArchiveFile( void ) +int DXArchive_VER5::CloseArchiveFile(void) { // 既に閉じていたら何もせず終了 - if( this->fp == NULL ) return 0 ; + if(this->fp == NULL) return 0; // メモリから開いているかどうかで処理を分岐 - if( MemoryOpenFlag == true ) + if(MemoryOpenFlag == true) { // アーカイブクラスが読み込んだ場合とそうでない場合で処理を分岐 - if( UserMemoryImageFlag == true ) + if(UserMemoryImageFlag == true) { // 反転したデータを元に戻す - if( this->Head.Version >= 0x0005 ) + if(this->Head.Version >= 0x0005) { - DirectoryKeyConv( ( DARC_DIRECTORY_VER5 * )this->DirP ) ; - KeyConv( this->HeadBuffer, this->Head.HeadSize, 0, this->Key ) ; + DirectoryKeyConv((DARC_DIRECTORY_VER5 *)this->DirP); + KeyConv(this->HeadBuffer, this->Head.HeadSize, 0, this->Key); } else { - KeyConv( this->fp, this->MemoryImageSize, 0, this->Key ) ; + KeyConv(this->fp, this->MemoryImageSize, 0, this->Key); } } else { // 確保していたメモリを開放する - free( this->fp ) ; + free(this->fp); } } else { // アーカイブファイルを閉じる - fclose( this->fp ) ; - + fclose(this->fp); + // ヘッダバッファも解放 - free( this->HeadBuffer ) ; + free(this->HeadBuffer); } // ポインタ初期化 - this->fp = NULL ; - this->HeadBuffer = NULL ; - this->NameP = this->DirP = this->FileP = NULL ; - this->CurrentDirectory = NULL ; + this->fp = NULL; + this->HeadBuffer = NULL; + this->NameP = this->DirP = this->FileP = NULL; + this->CurrentDirectory = NULL; // 終了 - return 0 ; + return 0; } // アーカイブ内のディレクトリパスを変更する( 0:成功 -1:失敗 ) -int DXArchive_VER5::ChangeCurrentDirectoryFast( SEARCHDATA *SearchData ) +int DXArchive_VER5::ChangeCurrentDirectoryFast(SEARCHDATA *SearchData) { - DARC_FILEHEAD_VER5 *FileH ; - int i, j, k, Num ; - TCHAR *NameData, *PathData ; - u16 PackNum, Parity ; + DARC_FILEHEAD_VER5 *FileH; + int i, j, k, Num; + TCHAR *NameData, *PathData; + u16 PackNum, Parity; - PackNum = SearchData->PackNum ; - Parity = SearchData->Parity ; - PathData = SearchData->FileName ; + PackNum = SearchData->PackNum; + Parity = SearchData->Parity; + PathData = SearchData->FileName; // カレントディレクトリから同名のディレクトリを探す - FileH = ( DARC_FILEHEAD_VER5 * )( this->FileP + this->CurrentDirectory->FileHeadAddress ) ; - Num = (s32)this->CurrentDirectory->FileHeadNum ; - for( i = 0 ; i < Num ; i ++, FileH ++ ) + FileH = (DARC_FILEHEAD_VER5 *)(this->FileP + this->CurrentDirectory->FileHeadAddress); + Num = (s32)this->CurrentDirectory->FileHeadNum; + for(i = 0; i < Num; i++, FileH++) { // ディレクトリチェック - if( ( FileH->Attributes & FILE_ATTRIBUTE_DIRECTORY ) == 0 ) continue ; + if((FileH->Attributes & FILE_ATTRIBUTE_DIRECTORY) == 0) continue; // 文字列数とパリティチェック - NameData = this->NameP + FileH->NameAddress ; - if( PackNum != ((u16 *)NameData)[0] || Parity != ((u16 *)NameData)[1] ) continue ; + NameData = this->NameP + FileH->NameAddress; + if(PackNum != ((u16 *)NameData)[0] || Parity != ((u16 *)NameData)[1]) continue; // 文字列チェック - NameData += 4 ; - for( j = 0, k = 0 ; j < PackNum ; j ++, k += 4 ) - if( *((u32 *)&PathData[k]) != *((u32 *)&NameData[k]) ) break ; + NameData += 4; + for(j = 0, k = 0; j < PackNum; j++, k += 4) + if(*((u32 *)&PathData[k]) != *((u32 *)&NameData[k])) break; // 適合したディレクトリがあったらここで終了 - if( PackNum == j ) break ; + if(PackNum == j) break; } // 無かったらエラー - if( i == Num ) return -1 ; + if(i == Num) return -1; // 在ったらカレントディレクトリを変更 - this->CurrentDirectory = ( DARC_DIRECTORY_VER5 * )( this->DirP + FileH->DataAddress ) ; + this->CurrentDirectory = (DARC_DIRECTORY_VER5 *)(this->DirP + FileH->DataAddress); // 正常終了 - return 0 ; + return 0; } // アーカイブ内のディレクトリパスを変更する( 0:成功 -1:失敗 ) -int DXArchive_VER5::ChangeCurrentDir( const TCHAR *DirPath ) +int DXArchive_VER5::ChangeCurrentDir(const TCHAR *DirPath) { - return ChangeCurrentDirectoryBase( DirPath, true ) ; + return ChangeCurrentDirectoryBase(DirPath, true); } // アーカイブ内のディレクトリパスを変更する( 0:成功 -1:失敗 ) -int DXArchive_VER5::ChangeCurrentDirectoryBase( const TCHAR *DirectoryPath, bool ErrorIsDirectoryReset, SEARCHDATA *LastSearchData ) +int DXArchive_VER5::ChangeCurrentDirectoryBase(const TCHAR *DirectoryPath, bool ErrorIsDirectoryReset, SEARCHDATA *LastSearchData) { - DARC_DIRECTORY_VER5 *OldDir ; - SEARCHDATA SearchData ; + DARC_DIRECTORY_VER5 *OldDir; + SEARCHDATA SearchData; // ここに留まるパスだったら無視 - if( _tcscmp( DirectoryPath, TEXT(".") ) == 0 ) return 0 ; + if(_tcscmp(DirectoryPath, TEXT(".")) == 0) return 0; // 『\』だけの場合はルートディレクトリに戻る - if( _tcscmp( DirectoryPath, TEXT("\\") ) == 0 ) + if(_tcscmp(DirectoryPath, TEXT("\\")) == 0) { - this->CurrentDirectory = ( DARC_DIRECTORY_VER5 * )this->DirP ; - return 0 ; + this->CurrentDirectory = (DARC_DIRECTORY_VER5 *)this->DirP; + return 0; } // 下に一つ下がるパスだったら処理を分岐 - if( _tcscmp( DirectoryPath, TEXT("..") ) == 0 ) + if(_tcscmp(DirectoryPath, TEXT("..")) == 0) { // ルートディレクトリに居たらエラー - if( this->CurrentDirectory->ParentDirectoryAddress == 0xffffffff ) return -1 ; - + if(this->CurrentDirectory->ParentDirectoryAddress == 0xffffffff) return -1; + // 親ディレクトリがあったらそちらに移る - this->CurrentDirectory = ( DARC_DIRECTORY_VER5 * )( this->DirP + this->CurrentDirectory->ParentDirectoryAddress ) ; - return 0 ; + this->CurrentDirectory = (DARC_DIRECTORY_VER5 *)(this->DirP + this->CurrentDirectory->ParentDirectoryAddress); + return 0; } // それ以外の場合は指定の名前のディレクトリを探す - + // 変更以前のディレクトリを保存しておく - OldDir = this->CurrentDirectory ; + OldDir = this->CurrentDirectory; // パス中に『\』があるかどうかで処理を分岐 - if( _tcschr( DirectoryPath, '\\' ) == NULL ) + if(_tcschr(DirectoryPath, '\\') == NULL) { // ファイル名を検索専用の形式に変換する - ConvSearchData( &SearchData, DirectoryPath, NULL ) ; + ConvSearchData(&SearchData, DirectoryPath, NULL); // ディレクトリを変更 - if( ChangeCurrentDirectoryFast( &SearchData ) < 0 ) goto ERR ; - -/* // \ が無い場合は、同名のディレクトリを探す - FileH = ( DARC_FILEHEAD_VER5 * )( this->FileP + this->CurrentDirectory->FileHeadAddress ) ; - for( i = 0 ; - i < (s32)this->CurrentDirectory->FileHeadNum && - StrICmp( ( char * )( this->NameP + FileH->NameAddress ), DirectoryPath ) != 0 ; - i ++, FileH ++ ){} -*/ + if(ChangeCurrentDirectoryFast(&SearchData) < 0) goto ERR; + + /* // \ が無い場合は、同名のディレクトリを探す + FileH = ( DARC_FILEHEAD_VER5 * )( this->FileP + this->CurrentDirectory->FileHeadAddress ) ; + for( i = 0 ; + i < (s32)this->CurrentDirectory->FileHeadNum && + StrICmp( ( char * )( this->NameP + FileH->NameAddress ), DirectoryPath ) != 0 ; + i ++, FileH ++ ){} + */ } else { // \ がある場合は繋がったディレクトリを一つづつ変更してゆく - - int Point, StrLength ; - Point = 0 ; + int Point, StrLength; + + Point = 0; // ループ for(;;) { // 文字列を取得する - ConvSearchData( &SearchData, &DirectoryPath[Point], &StrLength ) ; - Point += StrLength ; -/* StrPoint = 0 ; - while( DirectoryPath[Point] != '\0' && DirectoryPath[Point] != '\\' ) - { - if( CheckMultiByteChar( &DirectoryPath[Point] ) == TRUE ) - { - *((u16 *)&String[StrPoint]) = *((u16 *)&DirectoryPath[Point]) ; - StrPoint += 2 ; - Point += 2 ; - } - else - { - String[StrPoint] = DirectoryPath[Point] ; - StrPoint ++ ; - Point ++ ; - } - } - String[StrPoint] = '\0' ; -*/ + ConvSearchData(&SearchData, &DirectoryPath[Point], &StrLength); + Point += StrLength; + /* StrPoint = 0 ; + while( DirectoryPath[Point] != '\0' && DirectoryPath[Point] != '\\' ) + { + if( CheckMultiByteChar( &DirectoryPath[Point] ) == TRUE ) + { + *((u16 *)&String[StrPoint]) = *((u16 *)&DirectoryPath[Point]) ; + StrPoint += 2 ; + Point += 2 ; + } + else + { + String[StrPoint] = DirectoryPath[Point] ; + StrPoint ++ ; + Point ++ ; + } + } + String[StrPoint] = '\0' ; + */ // もし初っ端が \ だった場合はルートディレクトリに落とす - if( StrLength == 0 && DirectoryPath[Point] == '\\' ) + if(StrLength == 0 && DirectoryPath[Point] == '\\') { - this->ChangeCurrentDirectoryBase( TEXT("\\"), false ) ; + this->ChangeCurrentDirectoryBase(TEXT("\\"), false); } else { // それ以外の場合は普通にディレクトリ変更 - if( this->ChangeCurrentDirectoryFast( &SearchData ) < 0 ) + if(this->ChangeCurrentDirectoryFast(&SearchData) < 0) { // エラーが起きて、更にエラーが起きた時に元のディレクトリに戻せの // フラグが立っている場合は元のディレクトリに戻す - if( ErrorIsDirectoryReset == true ) this->CurrentDirectory = OldDir ; + if(ErrorIsDirectoryReset == true) this->CurrentDirectory = OldDir; // エラー終了 - goto ERR ; + goto ERR; } } // もし終端文字で終了した場合はループから抜ける // 又はあと \ しかない場合もループから抜ける - if( DirectoryPath[Point] == '\0' || - ( DirectoryPath[Point] == '\\' && DirectoryPath[Point+1] == '\0' ) ) break ; - Point ++ ; + if(DirectoryPath[Point] == '\0' || + (DirectoryPath[Point] == '\\' && DirectoryPath[Point + 1] == '\0')) break; + Point++; } } - if( LastSearchData != NULL ) + if(LastSearchData != NULL) { - memcpy( LastSearchData->FileName, SearchData.FileName, SearchData.PackNum * 4 ) ; - LastSearchData->Parity = SearchData.Parity ; - LastSearchData->PackNum = SearchData.PackNum ; + memcpy(LastSearchData->FileName, SearchData.FileName, SearchData.PackNum * 4); + LastSearchData->Parity = SearchData.Parity; + LastSearchData->PackNum = SearchData.PackNum; } // 正常終了 - return 0 ; + return 0; ERR: - if( LastSearchData != NULL ) + if(LastSearchData != NULL) { - memcpy( LastSearchData->FileName, SearchData.FileName, SearchData.PackNum * 4 ) ; - LastSearchData->Parity = SearchData.Parity ; - LastSearchData->PackNum = SearchData.PackNum ; + memcpy(LastSearchData->FileName, SearchData.FileName, SearchData.PackNum * 4); + LastSearchData->Parity = SearchData.Parity; + LastSearchData->PackNum = SearchData.PackNum; } // エラー終了 - return -1 ; + return -1; } - + // アーカイブ内のカレントディレクトリパスを取得する -int DXArchive_VER5::GetCurrentDir(TCHAR *DirPathBuffer, int BufferLength ) +int DXArchive_VER5::GetCurrentDir(TCHAR *DirPathBuffer, int BufferLength) { - TCHAR DirPath[MAX_PATH] ; - DARC_DIRECTORY_VER5 *Dir[200], *DirTempP ; - int Depth, i ; + TCHAR DirPath[MAX_PATH]; + DARC_DIRECTORY_VER5 *Dir[200], *DirTempP; + int Depth, i; // ルートディレクトリに着くまで検索する - Depth = 0 ; - DirTempP = this->CurrentDirectory ; - while( DirTempP->DirectoryAddress != 0xffffffff && DirTempP->DirectoryAddress != 0 ) + Depth = 0; + DirTempP = this->CurrentDirectory; + while(DirTempP->DirectoryAddress != 0xffffffff && DirTempP->DirectoryAddress != 0) { - Dir[Depth] = DirTempP ; - DirTempP = ( DARC_DIRECTORY_VER5 * )( this->DirP + DirTempP->ParentDirectoryAddress ) ; - Depth ++ ; + Dir[Depth] = DirTempP; + DirTempP = (DARC_DIRECTORY_VER5 *)(this->DirP + DirTempP->ParentDirectoryAddress); + Depth++; } - + // パス名を連結する - DirPath[0] = '\0' ; - for( i = Depth - 1 ; i >= 0 ; i -- ) + DirPath[0] = '\0'; + for(i = Depth - 1; i >= 0; i--) { - _tcscat( DirPath, TEXT("\\") ) ; - _tcscat( DirPath, ( TCHAR * )( this->NameP + ( ( DARC_FILEHEAD_VER5 * )( this->FileP + Dir[i]->DirectoryAddress ) )->NameAddress ) ) ; + _tcscat(DirPath, TEXT("\\")); + _tcscat(DirPath, (TCHAR *)(this->NameP + ((DARC_FILEHEAD_VER5 *)(this->FileP + Dir[i]->DirectoryAddress))->NameAddress)); } // バッファの長さが0か、長さが足りないときはディレクトリ名の長さを返す - if( BufferLength == 0 || BufferLength < (s32)_tcslen( DirPath ) ) + if(BufferLength == 0 || BufferLength < (s32)_tcslen(DirPath)) { - return _tcslen( DirPath ) + 1 ; + return static_cast(_tcslen(DirPath) + 1); } else { // ディレクトリ名をバッファに転送する - _tcscpy( DirPathBuffer, DirPath ) ; + _tcscpy(DirPathBuffer, DirPath); } // 終了 - return 0 ; + return 0; } // アーカイブファイル中の指定のファイルをメモリに読み込む -int DXArchive_VER5::LoadFileToMem( const TCHAR *FilePath, void *Buffer, unsigned int BufferLength ) +int DXArchive_VER5::LoadFileToMem(const TCHAR *FilePath, void *Buffer, unsigned int BufferLength) { - DARC_FILEHEAD_VER5 *FileH ; + DARC_FILEHEAD_VER5 *FileH; // 指定のファイルの情報を得る - FileH = this->GetFileInfo( FilePath ) ; - if( FileH == NULL ) return -1 ; + FileH = this->GetFileInfo(FilePath); + if(FileH == NULL) return -1; // ファイルサイズが足りているか調べる、足りていないか、バッファ、又はサイズが0だったらサイズを返す - if( BufferLength < FileH->DataSize || BufferLength == 0 || Buffer == NULL ) + if(BufferLength < FileH->DataSize || BufferLength == 0 || Buffer == NULL) { - return ( int )FileH->DataSize ; + return (int)FileH->DataSize; } // 足りている場合はバッファーに読み込む // ファイルが圧縮されているかどうかで処理を分岐 - if( this->Head.Version >= 0x0002 && FileH->PressDataSize != 0xffffffff ) + if(this->Head.Version >= 0x0002 && FileH->PressDataSize != 0xffffffff) { // 圧縮されている場合 // メモリ上に読み込んでいるかどうかで処理を分岐 - if( MemoryOpenFlag == true ) + if(MemoryOpenFlag == true) { // メモリ上の圧縮データを解凍する - Decode( (u8 *)this->fp + this->Head.DataStartAddress + FileH->DataAddress, Buffer ) ; + Decode((u8 *)this->fp + this->Head.DataStartAddress + FileH->DataAddress, Buffer); } else { - void *temp ; + void *temp; // 圧縮データをメモリに読み込んでから解凍する // 圧縮データが収まるメモリ領域の確保 - temp = malloc( FileH->PressDataSize ) ; + temp = malloc(FileH->PressDataSize); // 圧縮データの読み込み - fseek( this->fp, this->Head.DataStartAddress + FileH->DataAddress, SEEK_SET ) ; - if( this->Head.Version >= 0x0005 ) + fseek(this->fp, this->Head.DataStartAddress + FileH->DataAddress, SEEK_SET); + if(this->Head.Version >= 0x0005) { - KeyConvFileRead( temp, FileH->PressDataSize, this->fp, this->Key, FileH->DataSize ) ; + KeyConvFileRead(temp, FileH->PressDataSize, this->fp, this->Key, FileH->DataSize); } else { - KeyConvFileRead( temp, FileH->PressDataSize, this->fp, this->Key ) ; + KeyConvFileRead(temp, FileH->PressDataSize, this->fp, this->Key); } - + // 解凍 - Decode( temp, Buffer ) ; - + Decode(temp, Buffer); + // メモリの解放 - free( temp ) ; + free(temp); } } else @@ -2658,134 +2692,134 @@ int DXArchive_VER5::LoadFileToMem( const TCHAR *FilePath, void *Buffer, unsigned // 圧縮されていない場合 // メモリ上に読み込んでいるかどうかで処理を分岐 - if( MemoryOpenFlag == true ) + if(MemoryOpenFlag == true) { // コピー - memcpy( Buffer, (u8 *)this->fp + this->Head.DataStartAddress + FileH->DataAddress, FileH->DataSize ) ; + memcpy(Buffer, (u8 *)this->fp + this->Head.DataStartAddress + FileH->DataAddress, FileH->DataSize); } else { // ファイルポインタを移動 - fseek( this->fp, this->Head.DataStartAddress + FileH->DataAddress, SEEK_SET ) ; + fseek(this->fp, this->Head.DataStartAddress + FileH->DataAddress, SEEK_SET); // 読み込み - if( this->Head.Version >= 0x0005 ) + if(this->Head.Version >= 0x0005) { - KeyConvFileRead( Buffer, FileH->DataSize, this->fp, this->Key, FileH->DataSize ) ; + KeyConvFileRead(Buffer, FileH->DataSize, this->fp, this->Key, FileH->DataSize); } else { - KeyConvFileRead( Buffer, FileH->DataSize, this->fp, this->Key ) ; + KeyConvFileRead(Buffer, FileH->DataSize, this->fp, this->Key); } } } - + // 終了 - return 0 ; + return 0; } // アーカイブファイル中の指定のファイルをサイズを取得する -int DXArchive_VER5::GetFileSize( const TCHAR *FilePath ) +int DXArchive_VER5::GetFileSize(const TCHAR *FilePath) { // ファイルサイズを返す - return this->LoadFileToMem( FilePath, NULL, 0 ) ; + return this->LoadFileToMem(FilePath, NULL, 0); } // アーカイブファイルをメモリに読み込んだ場合のファイルイメージが格納されている先頭アドレスを取得する( メモリから開いている場合のみ有効 ) -void *DXArchive_VER5::GetFileImage( void ) +void *DXArchive_VER5::GetFileImage(void) { // メモリイメージから開いていなかったらエラー - if( MemoryOpenFlag == false ) return NULL ; + if(MemoryOpenFlag == false) return NULL; // 先頭アドレスを返す - return this->fp ; + return this->fp; } // アーカイブファイル中の指定のファイルのファイル内の位置とファイルの大きさを得る( -1:エラー ) -int DXArchive_VER5::GetFileInfo( const TCHAR *FilePath, int *PositionP, int *SizeP ) +int DXArchive_VER5::GetFileInfo(const TCHAR *FilePath, int *PositionP, int *SizeP) { - DARC_FILEHEAD_VER5 *FileH ; + DARC_FILEHEAD_VER5 *FileH; // 指定のファイルの情報を得る - FileH = this->GetFileInfo( FilePath ) ; - if( FileH == NULL ) return -1 ; + FileH = this->GetFileInfo(FilePath); + if(FileH == NULL) return -1; // ファイルのデータがある位置とファイルサイズを保存する - if( PositionP != NULL ) *PositionP = this->Head.DataStartAddress + FileH->DataAddress ; - if( SizeP != NULL ) *SizeP = FileH->DataSize ; + if(PositionP != NULL) *PositionP = this->Head.DataStartAddress + FileH->DataAddress; + if(SizeP != NULL) *SizeP = FileH->DataSize; // 成功終了 - return 0 ; + return 0; } // アーカイブファイル中の指定のファイルを、クラス内のバッファに読み込む -void *DXArchive_VER5::LoadFileToCash( const TCHAR *FilePath ) +void *DXArchive_VER5::LoadFileToCash(const TCHAR *FilePath) { - int FileSize ; + int FileSize; // ファイルサイズを取得する - FileSize = this->GetFileSize( FilePath ) ; + FileSize = this->GetFileSize(FilePath); // ファイルが無かったらエラー - if( FileSize < 0 ) return NULL ; + if(FileSize < 0) return NULL; // 確保しているキャッシュバッファのサイズよりも大きい場合はバッファを再確保する - if( FileSize > ( int )this->CashBufferSize ) + if(FileSize > (int)this->CashBufferSize) { // キャッシュバッファのクリア - this->ClearCash() ; + this->ClearCash(); // キャッシュバッファの再確保 - this->CashBuffer = malloc( FileSize ) ; + this->CashBuffer = malloc(FileSize); // 確保に失敗した場合は NULL を返す - if( this->CashBuffer == NULL ) return NULL ; + if(this->CashBuffer == NULL) return NULL; // キャッシュバッファのサイズを保存 - this->CashBufferSize = FileSize ; + this->CashBufferSize = FileSize; } // ファイルをメモリに読み込む - this->LoadFileToMem( FilePath, this->CashBuffer, FileSize ) ; + this->LoadFileToMem(FilePath, this->CashBuffer, FileSize); // キャッシュバッファのアドレスを返す - return this->CashBuffer ; + return this->CashBuffer; } // キャッシュバッファを開放する -int DXArchive_VER5::ClearCash( void ) +int DXArchive_VER5::ClearCash(void) { // メモリが確保されていたら解放する - if( this->CashBuffer != NULL ) + if(this->CashBuffer != NULL) { - free( this->CashBuffer ) ; - this->CashBuffer = NULL ; - this->CashBufferSize = 0 ; + free(this->CashBuffer); + this->CashBuffer = NULL; + this->CashBufferSize = 0; } // 終了 - return 0 ; + return 0; } - + // アーカイブファイル中の指定のファイルを開き、ファイルアクセス用オブジェクトを作成する -DXArchiveFile_VER5 *DXArchive_VER5::OpenFile( const TCHAR *FilePath ) +DXArchiveFile_VER5 *DXArchive_VER5::OpenFile(const TCHAR *FilePath) { - DARC_FILEHEAD_VER5 *FileH ; - DXArchiveFile_VER5 *CDArc = NULL ; + DARC_FILEHEAD_VER5 *FileH; + DXArchiveFile_VER5 *CDArc = NULL; // メモリから開いている場合は無効 - if( MemoryOpenFlag == true ) return NULL ; + if(MemoryOpenFlag == true) return NULL; // 指定のファイルの情報を得る - FileH = this->GetFileInfo( FilePath ) ; - if( FileH == NULL ) return NULL ; + FileH = this->GetFileInfo(FilePath); + if(FileH == NULL) return NULL; // 新しく DXArchiveFile_VER5 クラスを作成する - CDArc = new DXArchiveFile_VER5( FileH, this ) ; - + CDArc = new DXArchiveFile_VER5(FileH, this); + // DXArchiveFile_VER5 クラスのポインタを返す - return CDArc ; + return CDArc; } @@ -2801,41 +2835,41 @@ DXArchiveFile_VER5 *DXArchive_VER5::OpenFile( const TCHAR *FilePath ) // コンストラクタ -DXArchiveFile_VER5::DXArchiveFile_VER5( DARC_FILEHEAD_VER5 *FileHead, DXArchive_VER5 *Archive ) +DXArchiveFile_VER5::DXArchiveFile_VER5(DARC_FILEHEAD_VER5 *FileHead, DXArchive_VER5 *Archive) { - this->FileData = FileHead ; - this->Archive = Archive ; - this->EOFFlag = FALSE ; - this->FilePoint = 0 ; - this->DataBuffer = NULL ; - + this->FileData = FileHead; + this->Archive = Archive; + this->EOFFlag = FALSE; + this->FilePoint = 0; + this->DataBuffer = NULL; + // ファイルが圧縮されている場合はここで読み込んで解凍してしまう - if( this->Archive->GetHeader()->Version >= 0x0002 && FileHead->PressDataSize != 0xffffffff ) + if(this->Archive->GetHeader()->Version >= 0x0002 && FileHead->PressDataSize != 0xffffffff) { - void *temp ; + void *temp; // 圧縮データが収まるメモリ領域の確保 - temp = malloc( FileHead->PressDataSize ) ; + temp = malloc(FileHead->PressDataSize); // 解凍データが収まるメモリ領域の確保 - this->DataBuffer = malloc( FileHead->DataSize ) ; + this->DataBuffer = malloc(FileHead->DataSize); // 圧縮データの読み込み - fseek( this->Archive->GetFilePointer(), this->Archive->GetHeader()->DataStartAddress + FileHead->DataAddress, SEEK_SET ) ; - if( this->Archive->GetHeader()->Version >= 0x0005 ) + fseek(this->Archive->GetFilePointer(), this->Archive->GetHeader()->DataStartAddress + FileHead->DataAddress, SEEK_SET); + if(this->Archive->GetHeader()->Version >= 0x0005) { - DXArchive_VER5::KeyConvFileRead( temp, FileHead->PressDataSize, this->Archive->GetFilePointer(), this->Archive->GetKey(), FileHead->DataSize ) ; + DXArchive_VER5::KeyConvFileRead(temp, FileHead->PressDataSize, this->Archive->GetFilePointer(), this->Archive->GetKey(), FileHead->DataSize); } else { - DXArchive_VER5::KeyConvFileRead( temp, FileHead->PressDataSize, this->Archive->GetFilePointer(), this->Archive->GetKey() ) ; + DXArchive_VER5::KeyConvFileRead(temp, FileHead->PressDataSize, this->Archive->GetFilePointer(), this->Archive->GetKey()); } - + // 解凍 - DXArchive_VER5::Decode( temp, this->DataBuffer ) ; - + DXArchive_VER5::Decode(temp, this->DataBuffer); + // メモリの解放 - free( temp ) ; + free(temp); } } @@ -2843,106 +2877,106 @@ DXArchiveFile_VER5::DXArchiveFile_VER5( DARC_FILEHEAD_VER5 *FileHead, DXArchive_ DXArchiveFile_VER5::~DXArchiveFile_VER5() { // メモリの解放 - if( this->DataBuffer != NULL ) + if(this->DataBuffer != NULL) { - free( this->DataBuffer ) ; - this->DataBuffer = NULL ; + free(this->DataBuffer); + this->DataBuffer = NULL; } } // ファイルの内容を読み込む -int DXArchiveFile_VER5::Read( void *Buffer, int ReadLength ) +int DXArchiveFile_VER5::Read(void *Buffer, int ReadLength) { - int ReadSize ; + int ReadSize; // EOF フラグが立っていたら0を返す - if( this->EOFFlag == TRUE ) return 0 ; - + if(this->EOFFlag == TRUE) return 0; + // アーカイブファイルポインタと、仮想ファイルポインタが一致しているか調べる // 一致していなかったらアーカイブファイルポインタを移動する - if( this->DataBuffer == NULL && ftell( this->Archive->GetFilePointer() ) != (s32)( this->FileData->DataAddress + this->Archive->GetHeader()->DataStartAddress + this->FilePoint ) ) + if(this->DataBuffer == NULL && ftell(this->Archive->GetFilePointer()) != (s32)(this->FileData->DataAddress + this->Archive->GetHeader()->DataStartAddress + this->FilePoint)) { - fseek( this->Archive->GetFilePointer(), this->FileData->DataAddress + this->Archive->GetHeader()->DataStartAddress + this->FilePoint, SEEK_SET ) ; + fseek(this->Archive->GetFilePointer(), this->FileData->DataAddress + this->Archive->GetHeader()->DataStartAddress + this->FilePoint, SEEK_SET); } - + // EOF 検出 - if( this->FileData->DataSize == this->FilePoint ) + if(this->FileData->DataSize == this->FilePoint) { - this->EOFFlag = TRUE ; - return 0 ; + this->EOFFlag = TRUE; + return 0; } - + // データを読み込む量を設定する - ReadSize = ReadLength < (s32)( this->FileData->DataSize - this->FilePoint ) ? ReadLength : this->FileData->DataSize - this->FilePoint ; - + ReadSize = ReadLength < (s32)(this->FileData->DataSize - this->FilePoint) ? ReadLength : this->FileData->DataSize - this->FilePoint; + // データを読み込む - if( this->DataBuffer == NULL ) + if(this->DataBuffer == NULL) { - if( this->Archive->GetHeader()->Version >= 0x0005 ) + if(this->Archive->GetHeader()->Version >= 0x0005) { - DXArchive_VER5::KeyConvFileRead( Buffer, ReadSize, this->Archive->GetFilePointer(), this->Archive->GetKey(), this->FileData->DataSize + this->FilePoint ) ; + DXArchive_VER5::KeyConvFileRead(Buffer, ReadSize, this->Archive->GetFilePointer(), this->Archive->GetKey(), this->FileData->DataSize + this->FilePoint); } else { - DXArchive_VER5::KeyConvFileRead( Buffer, ReadSize, this->Archive->GetFilePointer(), this->Archive->GetKey() ) ; + DXArchive_VER5::KeyConvFileRead(Buffer, ReadSize, this->Archive->GetFilePointer(), this->Archive->GetKey()); } } else { - memcpy( Buffer, (u8 *)this->DataBuffer + this->FilePoint, ReadSize ) ; + memcpy(Buffer, (u8 *)this->DataBuffer + this->FilePoint, ReadSize); } - + // EOF フラグを倒す - this->EOFFlag = FALSE ; + this->EOFFlag = FALSE; // 読み込んだ分だけファイルポインタを移動する - this->FilePoint += ReadSize ; - + this->FilePoint += ReadSize; + // 読み込んだ容量を返す - return ReadSize ; + return ReadSize; } - + // ファイルポインタを変更する -int DXArchiveFile_VER5::Seek( int SeekPoint, int SeekMode ) +int DXArchiveFile_VER5::Seek(int SeekPoint, int SeekMode) { // シークタイプによって処理を分岐 - switch( SeekMode ) + switch(SeekMode) { - case SEEK_SET : break ; - case SEEK_CUR : SeekPoint += this->FilePoint ; break ; - case SEEK_END : SeekPoint = this->FileData->DataSize + SeekPoint ; break ; + case SEEK_SET: break; + case SEEK_CUR: SeekPoint += this->FilePoint; break; + case SEEK_END: SeekPoint = this->FileData->DataSize + SeekPoint; break; } - + // 補正 - if( SeekPoint > (s32)this->FileData->DataSize ) SeekPoint = this->FileData->DataSize ; - if( SeekPoint < 0 ) SeekPoint = 0 ; - + if(SeekPoint > (s32)this->FileData->DataSize) SeekPoint = this->FileData->DataSize; + if(SeekPoint < 0) SeekPoint = 0; + // セット - this->FilePoint = SeekPoint ; - + this->FilePoint = SeekPoint; + // EOFフラグを倒す - this->EOFFlag = FALSE ; - + this->EOFFlag = FALSE; + // 終了 - return 0 ; + return 0; } // 現在のファイルポインタを得る -int DXArchiveFile_VER5::Tell( void ) +int DXArchiveFile_VER5::Tell(void) { - return this->FilePoint ; + return this->FilePoint; } // ファイルの終端に来ているか、のフラグを得る -int DXArchiveFile_VER5::Eof( void ) +int DXArchiveFile_VER5::Eof(void) { - return this->EOFFlag ; + return this->EOFFlag; } // ファイルのサイズを取得する -int DXArchiveFile_VER5::Size( void ) +int DXArchiveFile_VER5::Size(void) { - return this->FileData->DataSize ; + return this->FileData->DataSize; } diff --git a/src/WolfDec/3rdParty/DXArchiveVer5.h b/src/WolfDec/3rdParty/DXArchiveVer5.h index a9c6188..1a8a4d2 100644 --- a/src/WolfDec/3rdParty/DXArchiveVer5.h +++ b/src/WolfDec/3rdParty/DXArchiveVer5.h @@ -190,7 +190,7 @@ public : DATE_RESULT_DRAW, // 日付は同じ } ; - DXArchive_VER5(TCHAR *ArchivePath = NULL ) ; + explicit DXArchive_VER5(TCHAR *ArchivePath = NULL ) ; ~DXArchive_VER5() ; static int EncodeArchive(TCHAR *OutputFileName, TCHAR **FileOrDirectoryPath, int FileNum, bool Press = false, const char *KeyString = NULL ) ; // アーカイブファイルを作成する @@ -313,6 +313,10 @@ public : int Size( void ) ; // ファイルのサイズを取得する inline DARC_FILEHEAD_VER5 *GetFileData( void ){ return FileData ; } + + DXArchiveFile_VER5(DXArchiveFile_VER5&) = delete; + void operator=(DXArchiveFile_VER5 const&t) = delete; + DXArchiveFile_VER5(DXArchiveFile_VER5&&) = delete; } ; #endif diff --git a/src/WolfDec/3rdParty/FileLib.cpp b/src/WolfDec/3rdParty/FileLib.cpp index 26c3bd6..ee8a6b1 100644 --- a/src/WolfDec/3rdParty/FileLib.cpp +++ b/src/WolfDec/3rdParty/FileLib.cpp @@ -76,7 +76,7 @@ static int __EnumObject(TCHAR *Path, TCHAR *CurrentPath, FILE_INFOLIST *FileList int FileNum, IsDirectory ; TCHAR RelDir[PATH_LENGTH] ; TCHAR *AbsDir ; - int RelDirLen, AbsDirLen, StartNum ; + int RelDirLen, AbsDirLen, StartNum = 0 ; // ディレクトリパスの作成 AbsDir = Path ; @@ -486,7 +486,11 @@ extern int LoadFileMem( const TCHAR *Path, void **DataBuf, int *Size ) fclose( fp ) ; // セット - if( DataBuf != NULL ) *DataBuf = buf ; + if(DataBuf != NULL) + *DataBuf = buf; + else + free(buf); + if( Size != NULL ) *Size = size ; // 終了 @@ -1037,8 +1041,8 @@ extern int ConvertFullPath__( const TCHAR *Src, TCHAR *Dest, const TCHAR *Curren { *(( unsigned short * )&iden[k] ) = *(( unsigned short * )&Src[i] ) ; iden[k+1] = '\0' ; - k += 1 ; - i += 1 ; + k ++ ; + i ++ ; } break ; }