mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
マスタエディタ:SDKバージョン取得処理を追加。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2191 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
6085bccd57
commit
f81a7b43c2
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -3,6 +3,7 @@
|
||||
#include "srl.h"
|
||||
#include "deliverable.h"
|
||||
#include "crc_whole.h"
|
||||
#include "utility.h"
|
||||
|
||||
namespace MasterEditorTWL {
|
||||
|
||||
@ -452,6 +453,7 @@ private: System::Windows::Forms::GroupBox^ gboxProd;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private: System::Windows::Forms::TextBox^ tboxPlatform;
|
||||
@ -3343,6 +3345,16 @@ private: System::Windows::Forms::GroupBox^ gboxProd;
|
||||
// 特殊な設定をテキストボックスに反映
|
||||
this->setSrlFormsCaptionEx();
|
||||
|
||||
// SDKバージョンとライブラリ
|
||||
if( this->hSrl->hSDKList != nullptr )
|
||||
{
|
||||
this->tboxSDK->Clear();
|
||||
for each( System::String ^str in this->hSrl->hSDKList )
|
||||
{
|
||||
this->tboxSDK->Text += str + "\r\n";
|
||||
}
|
||||
}
|
||||
|
||||
// ペアレンタルコントロール関連
|
||||
this->setParentalForms();
|
||||
}
|
||||
@ -4031,8 +4043,8 @@ private: System::Windows::Forms::GroupBox^ gboxProd;
|
||||
MessageBox::Show( str, "Error", MessageBoxButtons::OK, MessageBoxIcon::Error );
|
||||
}
|
||||
|
||||
// 言語切り替え
|
||||
private:
|
||||
// 日本語版への切り替え
|
||||
void changeJapanese(void)
|
||||
{
|
||||
System::Int32 index;
|
||||
@ -4200,6 +4212,7 @@ private: System::Windows::Forms::GroupBox^ gboxProd;
|
||||
}
|
||||
|
||||
private:
|
||||
// 英語版への切り替え
|
||||
void changeEnglish(void)
|
||||
{
|
||||
System::Int32 index;
|
||||
|
||||
@ -54,13 +54,14 @@ ECSrlResult RCSrl::readFromFile( System::String ^filename )
|
||||
}
|
||||
// ファイルを閉じる前にROMヘッダ以外の領域から設定を取り出す
|
||||
{
|
||||
//ECSrlResult r;
|
||||
ECSrlResult r;
|
||||
(void)this->hasDSDLPlaySign( fp );
|
||||
//if( r != ECSrlResult::NOERROR )
|
||||
//{
|
||||
// (void)fclose(fp);
|
||||
// return r;
|
||||
//}
|
||||
r = this->searchSDKVersion( fp );
|
||||
if( r != ECSrlResult::NOERROR )
|
||||
{
|
||||
(void)fclose(fp);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
(void)fclose( fp );
|
||||
|
||||
@ -474,3 +475,65 @@ ECSrlResult RCSrl::hasDSDLPlaySign( FILE *fp )
|
||||
}
|
||||
return (ECSrlResult::NOERROR);
|
||||
}
|
||||
|
||||
//
|
||||
// SDKバージョンを取得する
|
||||
//
|
||||
ECSrlResult RCSrl::searchSDKVersion( FILE *fp )
|
||||
{
|
||||
const u8 pattern[8] = {0x21, 0x06, 0xc0, 0xde, 0xde, 0xc0, 0x06, 0x21};
|
||||
System::Collections::Generic::List<u32> ^list;
|
||||
this->hSDKList = gcnew System::Collections::Generic::List<System::String ^>;
|
||||
this->hSDKList->Clear();
|
||||
|
||||
list = MasterEditorTWL::patternMatch( fp, pattern , 8 );
|
||||
if( list == nullptr )
|
||||
{
|
||||
System::Diagnostics::Debug::WriteLine( "no list" );
|
||||
return ECSrlResult::ERROR_SDK;
|
||||
}
|
||||
for each( u32 item in list )
|
||||
{
|
||||
// マジックコードのオフセットの手前4バイトがSDKバージョン
|
||||
if( item >= 4 )
|
||||
{
|
||||
u32 offset;
|
||||
u32 sdkcode;
|
||||
|
||||
offset = item - 4;
|
||||
fseek( fp, offset, SEEK_SET );
|
||||
if( 4 != fread( (void*)&sdkcode, 1, 4, fp ) )
|
||||
{
|
||||
return ECSrlResult::ERROR_SDK;
|
||||
}
|
||||
|
||||
// 解読
|
||||
System::Byte major = (System::Byte)(0xff & (sdkcode >> 24));
|
||||
System::Byte minor = (System::Byte)(0xff & (sdkcode >> 16));
|
||||
System::UInt16 relstep = (System::UInt16)(0xffff & sdkcode);
|
||||
System::String ^str = nullptr;
|
||||
str += (major.ToString() + "." + minor.ToString() + " ");
|
||||
|
||||
// RELSTEPの解釈
|
||||
// PR1=10100 PR2=10200 ...
|
||||
// RC1=20100 RC2=20200 ...
|
||||
// RELEASE=30000
|
||||
System::UInt16 patch = relstep;
|
||||
while( patch > 10000 )
|
||||
{
|
||||
patch -= 10000;
|
||||
}
|
||||
patch = patch / 100;
|
||||
switch( relstep / 10000 )
|
||||
{
|
||||
case 1: str += ("PR " + patch.ToString()); break;
|
||||
case 2: str += ("RC " + patch.ToString()); break;
|
||||
case 3: str += ("RELEASE " + patch.ToString()); break;
|
||||
default: break;
|
||||
}
|
||||
this->hSDKList->Add( str );
|
||||
//System::Diagnostics::Debug::WriteLine( "SDK " + str );
|
||||
}
|
||||
}
|
||||
return ECSrlResult::NOERROR;
|
||||
}
|
||||
|
||||
@ -29,6 +29,8 @@ namespace MasterEditorTWL
|
||||
ERROR_SIGN_DECRYPT,
|
||||
// CRC算出でのエラー
|
||||
ERROR_SIGN_CRC,
|
||||
// SDKバージョン取得でのエラー
|
||||
ERROR_SDK,
|
||||
};
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
@ -123,6 +125,9 @@ namespace MasterEditorTWL
|
||||
//property System::Boolean ^hRegionChina;
|
||||
//property System::Boolean ^hRegionKorea;
|
||||
|
||||
// SDKバージョンリスト
|
||||
property System::Collections::Generic::List<System::String^> ^hSDKList;
|
||||
|
||||
// constructor and destructor
|
||||
public:
|
||||
RCSrl();
|
||||
@ -152,7 +157,10 @@ namespace MasterEditorTWL
|
||||
// SRLバイナリから特殊な設定を調べる
|
||||
ECSrlResult hasDSDLPlaySign( FILE *fp );
|
||||
// DSダウンロード署名がSRLに格納されているか調べる
|
||||
// @arg [in] 入力ファイルのFP (->SRL読み込み時に実行されるべき)
|
||||
// @arg [in] 入力ファイルのFP (->SRL読み込み時に実行されるべき)]
|
||||
|
||||
// SRLバイナリ中のSDKバージョンを取得する
|
||||
ECSrlResult searchSDKVersion( FILE *fp );
|
||||
|
||||
}; // end of ref class RCSrl
|
||||
|
||||
|
||||
@ -279,4 +279,152 @@ System::String^ MasterEditorTWL::transRatingToString( System::Byte ogn, System::
|
||||
}
|
||||
|
||||
return str;
|
||||
} // MasterEditorTWL::transRatingToString
|
||||
|
||||
//
|
||||
// バイト列に特定のパターンが含まれるかどうかマッチングする
|
||||
//
|
||||
// @arg [in] テキスト
|
||||
// [in] テキストの長さ
|
||||
// [in] パターン
|
||||
// [in] パターンの長さ
|
||||
// [in] テキストの終端まで調べた時点でテキストが途中までマッチしていた場合を成功とみなすか
|
||||
//
|
||||
// @ret マッチしたテキストのオフセットをリストで返す。
|
||||
//
|
||||
System::Collections::Generic::List<u32>^ MasterEditorTWL::patternMatch(
|
||||
const u8 *text, const u32 textLen, const u8 *pattern, const u32 patternLen, const System::Boolean enableLast )
|
||||
{
|
||||
// ひとまずシンプルな方法で実装する
|
||||
u32 first;
|
||||
u32 len;
|
||||
System::Collections::Generic::List<u32> ^list = gcnew System::Collections::Generic::List<u32>();
|
||||
list->Clear();
|
||||
|
||||
// パターンを1文字ずつずらしながらマッチング
|
||||
for( first=0; first < textLen; first++ )
|
||||
{
|
||||
len = (patternLen < (textLen-first))?patternLen:(textLen-first); // 最後のほうは途中までしかマッチングしない
|
||||
if( memcmp( text+first, pattern, len ) == 0 )
|
||||
{
|
||||
if( (enableLast == true) )
|
||||
{
|
||||
list->Add( first );
|
||||
}
|
||||
else if( len == patternLen ) // 完全一致しないとダメ
|
||||
{
|
||||
list->Add( first );
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
} // MasterEditorTWL::patternMatch
|
||||
|
||||
//
|
||||
// ファイルにバイト列のパターンが含まれるかどうかマッチングする
|
||||
//
|
||||
// @arg [in] マッチ対象となるファイルポインタ
|
||||
// @arg [in] パターン
|
||||
// @arg [in] パターンの長さ(PATTERN_MATCH_LEN_MAX以下でなければならない)
|
||||
//
|
||||
// @ret マッチしたテキストのオフセットをリストで返す。
|
||||
// 最後までマッチした場合のみ成功したとみなす。
|
||||
//
|
||||
#define PATTERN_MATCH_LEN_MAX (10*1024)
|
||||
System::Collections::Generic::List<u32>^ MasterEditorTWL::patternMatch( FILE *fp, const u8 *pattern, const u32 patternLen )
|
||||
{
|
||||
u8 text[ 2 * PATTERN_MATCH_LEN_MAX ]; // バッファの切れ目を探索するため多めに読み込むので最大でパターンの2倍だけバッファが必要になる
|
||||
u32 cur;
|
||||
u32 filesize;
|
||||
u32 len;
|
||||
u32 extra;
|
||||
System::Collections::Generic::List<u32> ^tmplist;
|
||||
System::Collections::Generic::List<u32> ^list = gcnew System::Collections::Generic::List<u32>;
|
||||
list->Clear();
|
||||
|
||||
if( patternLen > PATTERN_MATCH_LEN_MAX )
|
||||
return nullptr;
|
||||
|
||||
fseek( fp, 0, SEEK_END );
|
||||
filesize = ftell( fp );
|
||||
|
||||
cur = 0;
|
||||
while( cur < filesize )
|
||||
{
|
||||
// バッファの切れ目を調べたいため実際には(パターンの長さ-1)だけ多めにリードする
|
||||
len = ((filesize - cur) < PATTERN_MATCH_LEN_MAX)?(filesize - cur):PATTERN_MATCH_LEN_MAX;
|
||||
extra = (len < PATTERN_MATCH_LEN_MAX)?0:(patternLen-1);
|
||||
fseek( fp, cur, SEEK_SET );
|
||||
if( (len + extra) != fread( text, 1, len + extra, fp ) )
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// テキスト終端に途中までマッチングしたときは失敗とみなす
|
||||
tmplist = MasterEditorTWL::patternMatch( text, len+extra, pattern, patternLen, false );
|
||||
if( tmplist != nullptr )
|
||||
{
|
||||
for each( u32 tmpval in tmplist )
|
||||
{
|
||||
list->Add( tmpval + cur ); // 実際のオフセットはファイルオフセットを加えた値
|
||||
}
|
||||
}
|
||||
|
||||
// 次のSEEK位置:多めにリードしたはずらす
|
||||
cur += len;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
void MasterEditorTWL::debugPatternMatch( System::String ^filename )
|
||||
{
|
||||
FILE *fp = NULL;
|
||||
u32 i;
|
||||
const u8 pattern[8] = {0x21, 0x06, 0xc0, 0xde, 0xde, 0xc0, 0x06, 0x21};
|
||||
System::Collections::Generic::List<u32> ^list;
|
||||
const char *pchFilename =
|
||||
(const char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi( filename ).ToPointer();
|
||||
|
||||
// ファイルを開いてROMヘッダのみ読み出す
|
||||
if( fopen_s( &fp, pchFilename, "rb" ) != NULL )
|
||||
{
|
||||
System::Diagnostics::Debug::WriteLine( "f_open failed" );
|
||||
return;
|
||||
}
|
||||
|
||||
list = MasterEditorTWL::patternMatch( fp, pattern , 8 );
|
||||
fclose( fp );
|
||||
|
||||
i=0;
|
||||
if( list == nullptr )
|
||||
{
|
||||
System::Diagnostics::Debug::WriteLine( "no list" );
|
||||
return;
|
||||
}
|
||||
for each( u32 item in list )
|
||||
{
|
||||
System::Diagnostics::Debug::WriteLine( "item " + i.ToString() + " = 0x" + item.ToString("X") );
|
||||
i++;
|
||||
}
|
||||
|
||||
//u8 buf[ 512 ];
|
||||
//u32 i;
|
||||
//u8 pattern[8] = {0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05};
|
||||
//System::Collections::Generic::List<u32> ^list;
|
||||
|
||||
//for( i=0; i < 512; i++ )
|
||||
//{
|
||||
// buf[i] = i % 256;
|
||||
//}
|
||||
|
||||
//list = MasterEditorTWL::patternMatch( buf, 512, pattern, 8, true );
|
||||
|
||||
//i = 0;
|
||||
//System::Diagnostics::Debug::WriteLine( "pattern match" );
|
||||
//for each( u32 item in list )
|
||||
//{
|
||||
// System::Diagnostics::Debug::WriteLine( "item " + i + " = " + item );
|
||||
// i++;
|
||||
//}
|
||||
}
|
||||
|
||||
@ -3,6 +3,8 @@
|
||||
// 共用ライブラリ・クラスの宣言
|
||||
|
||||
#include <twl/types.h>
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
|
||||
namespace MasterEditorTWL
|
||||
{
|
||||
@ -42,4 +44,32 @@ namespace MasterEditorTWL
|
||||
//
|
||||
System::String^ transRatingToString( System::Byte ogn, System::Boolean enable, System::Byte rating, System::Boolean english );
|
||||
|
||||
//
|
||||
// バイト列に特定のパターンが含まれるかどうかマッチングする
|
||||
//
|
||||
// @arg [in] テキスト
|
||||
// [in] テキストの長さ
|
||||
// [in] パターン
|
||||
// [in] パターンの長さ
|
||||
// [in] テキストの終端まで調べた時点でテキストが途中までマッチしていた場合を成功とみなすか
|
||||
//
|
||||
// @ret マッチしたテキストのインデックスをリストで返す。
|
||||
//
|
||||
System::Collections::Generic::List<u32>^ patternMatch(
|
||||
const u8 *text, const u32 textLen, const u8 *pattern, const u32 patternLen, const System::Boolean enableLast );
|
||||
|
||||
//
|
||||
// ファイルにバイト列のパターンが含まれるかどうかマッチングする
|
||||
//
|
||||
// @arg [in] マッチ対象となるファイルポインタ
|
||||
// @arg [in] パターン
|
||||
// @arg [in] パターンの長さ
|
||||
//
|
||||
// @ret マッチしたテキストのインデックスをリストで返す。
|
||||
// 最後までマッチした場合のみ成功したとみなす。
|
||||
//
|
||||
System::Collections::Generic::List<u32>^ patternMatch( FILE *fp, const u8 *pattern, const u32 patternLen );
|
||||
|
||||
void debugPatternMatch( System::String ^filename );
|
||||
|
||||
} // end of namespace MasterEditorTWL
|
||||
|
||||
Loading…
Reference in New Issue
Block a user