From a796e33f0fa236cec653a040919175a6d83f50ae Mon Sep 17 00:00:00 2001 From: nishikawa_takeshi Date: Thu, 16 Apr 2009 10:52:14 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=B3=E3=82=AC=E3=83=BC?= =?UTF-8?q?=E3=83=97=E3=83=AA=E3=83=B3=E3=83=88=E3=83=97=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=83=A9=E3=83=A0:GUI=E7=89=88=E5=AE=8C=E6=88=90=E3=80=82tad?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@259 7061adef-622a-194b-ae81-725974e89856 --- .../FingerPrinterTWL/FingerPrinterTWL.ncb | Bin 10308608 -> 10546176 bytes .../FingerPrinterTWL/FingerPrinterTWL.suo | Bin 19968 -> 30720 bytes .../FingerPrinterTWL/FingerPrinterTWL.vcproj | 16 ++ .../FingerPrinterTWL/Form1.cpp | 109 ++++++-- .../FingerPrinterTWL/FingerPrinterTWL/Form1.h | 113 ++++++-- .../FingerPrinterTWL/fingerprint_util.h | 26 +- .../FingerPrinterTWL/fingerprinter_util.cpp | 255 +++++++++++++----- 7 files changed, 410 insertions(+), 109 deletions(-) diff --git a/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL.ncb b/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL.ncb index ee37b5d8ea3e47e875300e60a05903def58981e8..10c54bd0a769732aebca828404388947057f71ae 100644 GIT binary patch delta 75219 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 diff --git a/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL.suo b/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL.suo index c91fdb135da0228e9724fdbd1600cd716efb1c9e..4bdf792180a68d414af687414b6ea52430bfe410 100644 GIT binary patch literal 30720 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 Pu*INGTcbJMRww=e!g + + + + @@ -263,6 +271,14 @@ RelativePath=".\resource.h" > + + + + diff --git a/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/Form1.cpp b/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/Form1.cpp index 33b7728..29cb6a1 100644 --- a/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/Form1.cpp +++ b/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/Form1.cpp @@ -5,6 +5,8 @@ #include #include #include +#include "MasterEditorTWL/split_tad.h" +#include "MasterEditorTWL/split_tad_util.h" #include "fingerprint_util.h" using namespace FingerPrinterTWL; @@ -22,12 +24,13 @@ void Form1::construct() System::String ^example = "Input Example\r\n\r\n" + "(1)String of ASCII Charactors\r\n" - + " *THIS IS FINGERPRINT\r\n\r\n" + + " *ABCD\r\n" + + " => register \"41424344\" (\'T\' \'E\' \'S\' \'T\')\r\n\r\n" + "(2)Hexadecimal Numbers\r\n" + " *5A6B78014A235A\r\n" + " *5a6b78014a235a\r\n" + " *5A 6B 78 01 4A 23 5A\r\n" - + " (2 charactor per 1 number)"; + + " => register \"5A6B78014A235A\""; this->tboxExample->Text = example; } @@ -59,8 +62,21 @@ void Form1::fingerprintRomHeader() } pin_ptr buf = &bytes[0]; // 解放の必要なし memcpy( this->rh->s.reserved_C, buf, 32 ); + SignRomHeader( this->rh ); // 署名 } +System::Boolean Form1::isFingerprint() +{ + int i; + for( i=0; i < 32; i++ ) + { + if( this->rh->s.reserved_C[i] != 0 ) + { + return true; + } + } + return false; +} // ------------------------------------------------------------------ // ファイル処理を共通化させる @@ -68,49 +84,97 @@ void Form1::fingerprintRomHeader() void Form1::commonOpenRom( System::String ^srcpath ) { + System::Boolean bTad = System::IO::Path::GetExtension(srcpath)->ToUpper()->Equals(".TAD"); + + if( bTad ) + { + System::Console::WriteLine( "*** Transform TAD => SRL ***" ); + System::String ^tmp = ".\\tmp" + System::DateTime::Now.ToString("yyyyMMddHHmmss") + ".srl"; + if( splitTad(srcpath, tmp) < 0 ) + { + throw gcnew Exception("Fail to transform TAD => SRL."); + } + this->srlbin = ReadBin(tmp); + System::IO::File::Delete(tmp); // 中間ファイルを削除する + } + else + { + this->srlbin = ReadBin(srcpath); + } memset( this->rh, 0, sizeof(ROM_Header) ); - ReadRomHeader( srcpath, this->rh ); - this->tboxFile->Text = srcpath; - this->tboxFile->SelectionStart = srcpath->Length; // 入りきらないときに右端を表示する + ExtractRomHeader( this->srlbin, this->rh ); } void Form1::commonSaveRom( System::String ^dstpath ) { + System::String ^bindir = System::IO::Path::GetDirectoryName( System::Reflection::Assembly::GetEntryAssembly()->Location ); + if( !bindir->EndsWith("\\") ) + { + bindir = bindir + "\\"; + } + System::String ^maketad_path = bindir + "maketad.exe"; + System::String ^srcpath = this->tboxFile->Text; if( !srcpath ) { throw gcnew Exception("The input ROM file has not read yet."); } - // ファイルをコピーしてROMヘッダを上書き - if( !srcpath->Equals( dstpath ) ) + if( this->rTad->Checked && !(this->rh->s.titleID_Hi && TITLE_ID_MEDIA_MASK) ) { - CopyFile( srcpath, dstpath ); + throw gcnew Exception("Cannot make TAD file for software intended for Game Card."); } - this->fingerprintRomHeader(); - WriteRomHeader( dstpath, this->rh ); -} + this->fingerprintRomHeader(); + OverwriteRomHeader( this->srlbin, this->rh ); + + if( this->rTad->Checked ) + { + System::Console::WriteLine( "*** Transform SRL => TAD ***" ); + System::String ^tmp = ".\\tmp" + System::DateTime::Now.ToString("yyyyMMddHHmmss") + ".srl"; + WriteBin( tmp, this->srlbin ); + makeTad( maketad_path, tmp, dstpath ); + } + else + { + WriteBin( dstpath, this->srlbin ); + } +} // ------------------------------------------------------------------ // ボタンが押されたときの処理 (catch文必須) // ------------------------------------------------------------------ -void Form1::procOpenRomButton() +void Form1::procOpenRomButton( System::String ^path ) { try { -// System::String ^rompath = OpenFileUsingDialog( this->prevDir, "rom format (*.srl;*.tad)|*.srl;*.tad|All files (*.*)|*.*" ); - System::String ^rompath = OpenFileUsingDialog( this->prevDir, "rom format (*.srl)|*.srl|All files (*.*)|*.*" ); + System::String ^rompath = nullptr; + if( !path ) + { + rompath = OpenFileUsingDialog( this->prevDir, "rom format (*.srl;*.tad)|*.srl;*.tad|All files (*.*)|*.*" ); + } + else + { + rompath = System::String::Copy(path); + } if( !rompath ) { return; } this->commonOpenRom( rompath ); - this->prevDir = System::IO::Path::GetDirectoryName( rompath ); + this->tboxFile->Text = rompath; + this->tboxFile->SelectionStart = rompath->Length; // 入りきらないときに右端を表示する + this->rSrl->Checked = true; + this->rTad->Checked = false; + if( !path ) + { + this->prevDir = System::IO::Path::GetDirectoryName( rompath ); // あらかじめパスが指定されたときには更新しない + } } catch( System::Exception ^ex ) { + this->tboxFile->Text = ""; // クリア this->errMsg( ex->Message ); } } @@ -119,7 +183,20 @@ void Form1::procSaveRomButton() { try { - System::String ^rompath = SaveFileUsingDialog( this->prevDir, "rom format (*.srl)|*.srl|All files (*.*)|*.*", ".srl" ); + System::String ^format = nullptr; + System::String ^ext = nullptr; + if( this->rTad->Checked ) + { + format = "rom format (*.tad)|*.tad|All files (*.*)|*.*"; + ext = ".tad"; + } + else + { + format = "rom format (*.srl)|*.srl|All files (*.*)|*.*"; + ext = ".srl"; + } + + System::String ^rompath = SaveFileUsingDialog( this->prevDir, format, ext ); if( !rompath ) { return; diff --git a/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/Form1.h b/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/Form1.h index c358888..c3b1b2a 100644 --- a/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/Form1.h +++ b/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/Form1.h @@ -69,6 +69,12 @@ namespace FingerPrinterTWL { private: System::Windows::Forms::Label^ labFP; + private: System::Windows::Forms::Button^ button1; + private: System::Windows::Forms::Label^ label1; + private: System::Windows::Forms::GroupBox^ gboxFormat; + private: System::Windows::Forms::RadioButton^ rTad; + private: System::Windows::Forms::RadioButton^ rSrl; + private: @@ -96,13 +102,19 @@ namespace FingerPrinterTWL { this->gboxType = (gcnew System::Windows::Forms::GroupBox()); this->rHex = (gcnew System::Windows::Forms::RadioButton()); this->rString = (gcnew System::Windows::Forms::RadioButton()); + this->button1 = (gcnew System::Windows::Forms::Button()); + this->label1 = (gcnew System::Windows::Forms::Label()); + this->gboxFormat = (gcnew System::Windows::Forms::GroupBox()); + this->rSrl = (gcnew System::Windows::Forms::RadioButton()); + this->rTad = (gcnew System::Windows::Forms::RadioButton()); this->gboxFP->SuspendLayout(); this->gboxType->SuspendLayout(); + this->gboxFormat->SuspendLayout(); this->SuspendLayout(); // // tboxFile // - this->tboxFile->Location = System::Drawing::Point(85, 31); + this->tboxFile->Location = System::Drawing::Point(85, 26); this->tboxFile->Name = L"tboxFile"; this->tboxFile->ReadOnly = true; this->tboxFile->Size = System::Drawing::Size(313, 19); @@ -111,7 +123,7 @@ namespace FingerPrinterTWL { // labFile // this->labFile->AutoSize = true; - this->labFile->Location = System::Drawing::Point(26, 34); + this->labFile->Location = System::Drawing::Point(26, 29); this->labFile->Name = L"labFile"; this->labFile->Size = System::Drawing::Size(53, 12); this->labFile->TabIndex = 1; @@ -119,7 +131,7 @@ namespace FingerPrinterTWL { // // butFile // - this->butFile->Location = System::Drawing::Point(404, 29); + this->butFile->Location = System::Drawing::Point(404, 24); this->butFile->Name = L"butFile"; this->butFile->Size = System::Drawing::Size(82, 23); this->butFile->TabIndex = 2; @@ -129,22 +141,23 @@ namespace FingerPrinterTWL { // // gboxFP // + this->gboxFP->Controls->Add(this->gboxFormat); this->gboxFP->Controls->Add(this->labFP); this->gboxFP->Controls->Add(this->labShorter); this->gboxFP->Controls->Add(this->butFP); this->gboxFP->Controls->Add(this->tboxExample); this->gboxFP->Controls->Add(this->tboxFP); this->gboxFP->Controls->Add(this->gboxType); - this->gboxFP->Location = System::Drawing::Point(28, 71); + this->gboxFP->Location = System::Drawing::Point(28, 74); this->gboxFP->Name = L"gboxFP"; - this->gboxFP->Size = System::Drawing::Size(458, 261); + this->gboxFP->Size = System::Drawing::Size(458, 299); this->gboxFP->TabIndex = 3; this->gboxFP->TabStop = false; // // labFP // this->labFP->AutoSize = true; - this->labFP->Location = System::Drawing::Point(20, 150); + this->labFP->Location = System::Drawing::Point(20, 191); this->labFP->Name = L"labFP"; this->labFP->Size = System::Drawing::Size(60, 12); this->labFP->TabIndex = 5; @@ -153,7 +166,7 @@ namespace FingerPrinterTWL { // labShorter // this->labShorter->AutoSize = true; - this->labShorter->Location = System::Drawing::Point(320, 204); + this->labShorter->Location = System::Drawing::Point(320, 245); this->labShorter->Name = L"labShorter"; this->labShorter->Size = System::Drawing::Size(124, 12); this->labShorter->TabIndex = 4; @@ -161,7 +174,7 @@ namespace FingerPrinterTWL { // // butFP // - this->butFP->Location = System::Drawing::Point(151, 225); + this->butFP->Location = System::Drawing::Point(144, 267); this->butFP->Name = L"butFP"; this->butFP->Size = System::Drawing::Size(150, 23); this->butFP->TabIndex = 3; @@ -172,16 +185,16 @@ namespace FingerPrinterTWL { // tboxExample // this->tboxExample->BackColor = System::Drawing::SystemColors::Info; - this->tboxExample->Location = System::Drawing::Point(232, 18); + this->tboxExample->Location = System::Drawing::Point(201, 18); this->tboxExample->Multiline = true; this->tboxExample->Name = L"tboxExample"; this->tboxExample->ReadOnly = true; - this->tboxExample->Size = System::Drawing::Size(212, 122); + this->tboxExample->Size = System::Drawing::Size(243, 159); this->tboxExample->TabIndex = 2; // // tboxFP // - this->tboxFP->Location = System::Drawing::Point(22, 165); + this->tboxFP->Location = System::Drawing::Point(22, 206); this->tboxFP->Multiline = true; this->tboxFP->Name = L"tboxFP"; this->tboxFP->Size = System::Drawing::Size(422, 36); @@ -193,7 +206,7 @@ namespace FingerPrinterTWL { this->gboxType->Controls->Add(this->rString); this->gboxType->Location = System::Drawing::Point(22, 18); this->gboxType->Name = L"gboxType"; - this->gboxType->Size = System::Drawing::Size(204, 113); + this->gboxType->Size = System::Drawing::Size(161, 77); this->gboxType->TabIndex = 0; this->gboxType->TabStop = false; this->gboxType->Text = L"Input Type"; @@ -201,7 +214,7 @@ namespace FingerPrinterTWL { // rHex // this->rHex->AutoSize = true; - this->rHex->Location = System::Drawing::Point(18, 68); + this->rHex->Location = System::Drawing::Point(12, 49); this->rHex->Name = L"rHex"; this->rHex->Size = System::Drawing::Size(137, 16); this->rHex->TabIndex = 1; @@ -213,19 +226,73 @@ namespace FingerPrinterTWL { // this->rString->AutoSize = true; this->rString->Checked = true; - this->rString->Location = System::Drawing::Point(18, 37); + this->rString->Location = System::Drawing::Point(12, 23); this->rString->Name = L"rString"; - this->rString->Size = System::Drawing::Size(160, 16); + this->rString->Size = System::Drawing::Size(112, 16); this->rString->TabIndex = 0; this->rString->TabStop = true; - this->rString->Text = L"String of ASCII Charactors"; + this->rString->Text = L"ASCII Charactors"; this->rString->UseVisualStyleBackColor = true; // + // button1 + // + this->button1->Location = System::Drawing::Point(328, 392); + this->button1->Name = L"button1"; + this->button1->Size = System::Drawing::Size(158, 23); + this->button1->TabIndex = 4; + this->button1->Text = L"About This Application"; + this->button1->UseVisualStyleBackColor = true; + // + // label1 + // + this->label1->AutoSize = true; + this->label1->Location = System::Drawing::Point(138, 50); + this->label1->Name = L"label1"; + this->label1->Size = System::Drawing::Size(260, 12); + this->label1->TabIndex = 5; + this->label1->Text = L"Supported ROM type: TWL application (SRL/TAD)"; + // + // gboxFormat + // + this->gboxFormat->Controls->Add(this->rTad); + this->gboxFormat->Controls->Add(this->rSrl); + this->gboxFormat->Location = System::Drawing::Point(22, 101); + this->gboxFormat->Name = L"gboxFormat"; + this->gboxFormat->Size = System::Drawing::Size(161, 76); + this->gboxFormat->TabIndex = 6; + this->gboxFormat->TabStop = false; + this->gboxFormat->Text = L"Output Format"; + // + // rSrl + // + this->rSrl->AutoSize = true; + this->rSrl->Checked = true; + this->rSrl->Location = System::Drawing::Point(12, 24); + this->rSrl->Name = L"rSrl"; + this->rSrl->Size = System::Drawing::Size(44, 16); + this->rSrl->TabIndex = 0; + this->rSrl->TabStop = true; + this->rSrl->Text = L"SRL"; + this->rSrl->UseVisualStyleBackColor = true; + // + // rTad + // + this->rTad->AutoSize = true; + this->rTad->Location = System::Drawing::Point(12, 49); + this->rTad->Name = L"rTad"; + this->rTad->Size = System::Drawing::Size(46, 16); + this->rTad->TabIndex = 1; + this->rTad->TabStop = true; + this->rTad->Text = L"TAD"; + this->rTad->UseVisualStyleBackColor = true; + // // Form1 // this->AllowDrop = true; this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::None; - this->ClientSize = System::Drawing::Size(503, 352); + this->ClientSize = System::Drawing::Size(512, 427); + this->Controls->Add(this->label1); + this->Controls->Add(this->button1); this->Controls->Add(this->gboxFP); this->Controls->Add(this->butFile); this->Controls->Add(this->labFile); @@ -238,6 +305,8 @@ namespace FingerPrinterTWL { this->gboxFP->PerformLayout(); this->gboxType->ResumeLayout(false); this->gboxType->PerformLayout(); + this->gboxFormat->ResumeLayout(false); + this->gboxFormat->PerformLayout(); this->ResumeLayout(false); this->PerformLayout(); @@ -249,7 +318,8 @@ namespace FingerPrinterTWL { // ================================================================================ private: ROM_Header *rh; - System::String ^prevDir; // 前に選択したディレクトリ + cli::array ^srlbin; // SRLのバイナリ + System::String ^prevDir; // 前に選択したディレクトリ private: void construct(); @@ -258,6 +328,7 @@ namespace FingerPrinterTWL { // フィンガープリント private: void fingerprintRomHeader(); + System::Boolean isFingerprint(); // ファイル処理を共通化させる private: @@ -266,7 +337,7 @@ namespace FingerPrinterTWL { // ボタンが押されたときの処理(例外catchを入れること) private: - void procOpenRomButton(); + void procOpenRomButton( System::String ^path ); void procSaveRomButton(); // ダイアログ @@ -282,7 +353,7 @@ namespace FingerPrinterTWL { private: System::Void butFile_Click(System::Object^ sender, System::EventArgs^ e) { - this->procOpenRomButton(); + this->procOpenRomButton(nullptr); } private: System::Void butFP_Click(System::Object^ sender, System::EventArgs^ e) @@ -303,7 +374,7 @@ namespace FingerPrinterTWL { { array ^files = dynamic_cast< array ^>(e->Data->GetData( DataFormats::FileDrop ) ); String ^path = files[0]; - this->commonOpenRom( path ); + this->procOpenRomButton( path ); // ボタンが押されたときと同じ挙動 } }; } diff --git a/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/fingerprint_util.h b/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/fingerprint_util.h index 4e6960a..02c90cd 100644 --- a/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/fingerprint_util.h +++ b/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/fingerprint_util.h @@ -7,8 +7,11 @@ // ファイル処理 // ---------------------------------------------------------------------- -// ファイルコピー -void CopyFile( System::String ^srcpath, System::String ^dstpath ); +// ファイル全体の読み込み +cli::array^ ReadBin( System::String ^path ); + +// ファイル全体のライト +void WriteBin( System::String ^path, cli::array ^bin ); // ROMヘッダのリード void ReadRomHeader( System::String ^srlpath, ROM_Header *dstrh ); @@ -16,6 +19,15 @@ void ReadRomHeader( System::String ^srlpath, ROM_Header *dstrh ); // ROMヘッダのライト void WriteRomHeader( System::String ^srlpath, ROM_Header *srcrh ); +// バイナリからのROMヘッダの抽出 +void ExtractRomHeader( cli::array ^bin, ROM_Header *dstrh ); + +// バイナリへのROMヘッダの上書き +void OverwriteRomHeader( cli::array ^bin, ROM_Header *srcrh ); + +// ファイルコピー +void CopyFile( System::String ^srcpath, System::String ^dstpath ); + // ---------------------------------------------------------------------- // 署名 // ---------------------------------------------------------------------- @@ -52,3 +64,13 @@ System::String^ OpenFileUsingDialog( System::String ^defdir, System::String ^fil // @arg [in] ファイルの拡張子が不正なときに追加するときの正しい拡張子 // @ret 取得したファイル名 エラーのとき nullptr System::String^ SaveFileUsingDialog( System::String ^defdir, System::String ^filter, System::String ^extension ); + +// ---------------------------------------------------------------------- +// 外部プログラムの実行 +// ---------------------------------------------------------------------- + +// maketadの実行 +// @arg [in] maketadのパス +// @arg [in] 入力SRLのパス +// @arg [in] 出力SRLのパス +void makeTad( System::String ^maketad_path, System::String ^srlpath, System::String ^tadpath ); diff --git a/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/fingerprinter_util.cpp b/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/fingerprinter_util.cpp index 4a26756..e24de53 100644 --- a/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/fingerprinter_util.cpp +++ b/build/tools/MasterEditor/FingerPrinterTWL/FingerPrinterTWL/fingerprinter_util.cpp @@ -14,6 +14,178 @@ using namespace MasterEditorTWL; // ファイル処理 // ---------------------------------------------------------------------- +// ファイル全体の読み込み +cli::array^ ReadBin( System::String ^path ) +{ + System::IntPtr ptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi( path ); + const char *pch = (const char*)ptr.ToPointer(); + FILE *fp = NULL; + System::Exception ^ex = nullptr; + cli::array ^bin = nullptr; + + try + { + if( fopen_s( &fp, pch, "rb" ) != NULL ) + { + ex = gcnew System::Exception( "Fail to open file:" + path ); + throw ex; + } + + // ファイルサイズ分のメモリ割り当て + fseek( fp, 0, SEEK_END ); + int size = ftell(fp); + bin = gcnew cli::array(size); + pin_ptr pbin = &bin[0]; + + fseek( fp, 0, SEEK_SET ); + if( fread( (void*)pbin, 1, size, fp ) != size ) + { + ex = gcnew System::Exception( "Fail to read data from " + path ); + throw ex; + } + } + finally + { + System::Runtime::InteropServices::Marshal::FreeHGlobal( ptr ); + if( fp ) fclose(fp); + if( ex ) + { + throw ex; + } + } + return bin; +} + +// ファイル全体のライト +void WriteBin( System::String ^path, cli::array ^bin ) +{ + System::IntPtr ptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi( path ); + const char *pch = (const char*)ptr.ToPointer(); + FILE *fp = NULL; + System::Exception ^ex = nullptr; + + try + { + if( fopen_s( &fp, pch, "w+b" ) != NULL ) // 上書き・バイナリ + { + ex = gcnew System::Exception( "Fail to open file:" + path ); + throw ex; + } + + int size = bin->Length; + pin_ptr pbin = &bin[0]; + + (void)fseek( fp, 0, SEEK_SET ); + if( fwrite( (const void*)pbin, 1, size, fp ) != size ) + { + ex = gcnew System::Exception( "Fail to write data to " + path ); + throw ex; + } + } + finally + { + System::Runtime::InteropServices::Marshal::FreeHGlobal( ptr ); + if( fp ) fclose( fp ); + if( ex ) + { + throw ex; + } + } +} + +// ROMヘッダのリード +void ReadRomHeader( System::String ^srlpath, ROM_Header *dstrh ) +{ + System::IntPtr ptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi( srlpath ); + const char *pchFile = (const char*)ptr.ToPointer(); + FILE *fp = NULL; + System::Exception ^ex = nullptr; + + try + { + if( fopen_s( &fp, pchFile, "rb" ) != NULL ) + { + ex = gcnew System::Exception( "Fail to open file:" + srlpath ); + throw ex; + } + fseek( fp, 0, SEEK_SET ); + if( fread( (void*)dstrh, 1, sizeof(ROM_Header), fp ) != sizeof(ROM_Header) ) + { + ex = gcnew System::Exception( "Fail to read data from " + srlpath ); + throw ex; + } + } + finally + { + System::Runtime::InteropServices::Marshal::FreeHGlobal( ptr ); + if( fp ) fclose(fp); + if( ex ) + { + throw ex; + } + } +} + +// ROMヘッダのライト +void WriteRomHeader( System::String ^srlpath, ROM_Header *srcrh ) +{ + System::IntPtr ptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi( srlpath ); + const char *pchFile = (const char*)ptr.ToPointer(); + FILE *fp = NULL; + System::Exception ^ex = nullptr; + + try + { + if( fopen_s( &fp, pchFile, "r+b" ) != NULL ) // 上書き・バイナリ + { + ex = gcnew System::Exception( "Fail to open file:" + srlpath ); + throw ex; + } + (void)fseek( fp, 0, SEEK_SET ); + + if( fwrite( (const void*)srcrh, 1, sizeof(ROM_Header), fp ) != sizeof(ROM_Header) ) + { + ex = gcnew System::Exception( "Fail to write data to " + srlpath ); + throw ex; + } + } + finally + { + System::Runtime::InteropServices::Marshal::FreeHGlobal( ptr ); + if( fp ) fclose( fp ); + if( ex ) + { + throw ex; + } + } +} + +// バイナリからのROMヘッダの抽出 +void ExtractRomHeader( cli::array ^bin, ROM_Header *dstrh ) +{ + int size = bin->Length; + pin_ptr pbin = &bin[0]; + + if( size < sizeof(ROM_Header) ) + { + throw gcnew System::Exception( "The binary size is less than size of the ROM Header." ); + } + memcpy( dstrh, pbin, sizeof(ROM_Header) ); +} + +// バイナリへのROMヘッダの上書き +void OverwriteRomHeader( cli::array ^bin, ROM_Header *srcrh ) +{ + int size = bin->Length; + pin_ptr pbin = &bin[0]; + + if( size < sizeof(ROM_Header) ) + { + throw gcnew System::Exception( "The binary size is less than size of the ROM Header." ); + } + memcpy( pbin, srcrh, sizeof(ROM_Header) ); +} + // ファイルコピー #define COPY_FILE_BUFSIZE (10*1024*1024) void CopyFile( System::String ^srcpath, System::String ^dstpath ) @@ -77,74 +249,6 @@ void CopyFile( System::String ^srcpath, System::String ^dstpath ) } } -// ROMヘッダのリード -void ReadRomHeader( System::String ^srlpath, ROM_Header *dstrh ) -{ - System::IntPtr ptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi( srlpath ); - const char *pchFile = (const char*)ptr.ToPointer(); - FILE *fp = NULL; - System::Exception ^ex = nullptr; - - try - { - if( fopen_s( &fp, pchFile, "rb" ) != NULL ) - { - ex = gcnew System::Exception( "Fail to open file:" + srlpath ); - throw ex; - } - fseek( fp, 0, SEEK_SET ); - if( fread( (void*)dstrh, 1, sizeof(ROM_Header), fp ) != sizeof(ROM_Header) ) - { - ex = gcnew System::Exception( "Fail to read data from " + srlpath ); - throw ex; - } - } - finally - { - System::Runtime::InteropServices::Marshal::FreeHGlobal( ptr ); - if( fp ) fclose(fp); - if( ex ) - { - throw ex; - } - } -} - -// ROMヘッダのライト -void WriteRomHeader( System::String ^srlpath, ROM_Header *srcrh ) -{ - System::IntPtr ptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi( srlpath ); - const char *pchFile = (const char*)ptr.ToPointer(); - FILE *fp = NULL; - System::Exception ^ex = nullptr; - - // ファイルにROMヘッダをライト - try - { - if( fopen_s( &fp, pchFile, "r+b" ) != NULL ) // 上書き・バイナリ - { - ex = gcnew System::Exception( "Fail to open file:" + srlpath ); - throw ex; - } - (void)fseek( fp, 0, SEEK_SET ); - - if( fwrite( (const void*)srcrh, 1, sizeof(ROM_Header), fp ) != sizeof(ROM_Header) ) - { - ex = gcnew System::Exception( "Fail to write data to " + srlpath ); - throw ex; - } - } - finally - { - System::Runtime::InteropServices::Marshal::FreeHGlobal( ptr ); - if( fp ) fclose( fp ); - if( ex ) - { - throw ex; - } - } -} - // ---------------------------------------------------------------------- // 署名 // ---------------------------------------------------------------------- @@ -321,7 +425,6 @@ System::String^ OpenFileUsingDialog( System::String ^defdir, System::String ^fil { return nullptr; } - defdir = System::IO::Path::GetDirectoryName( dlg->FileName ); // デフォルトディレクトリの更新 return System::String::Copy(dlg->FileName); } @@ -351,7 +454,6 @@ System::String^ SaveFileUsingDialog( System::String ^defdir, System::String ^fil { return nullptr; } - defdir = System::IO::Path::GetDirectoryName( dlg->FileName ); retfile = dlg->FileName; if( !System::String::IsNullOrEmpty(extension) && !(dlg->FileName->ToLower()->EndsWith( extension->ToLower() )) ) { @@ -359,3 +461,16 @@ System::String^ SaveFileUsingDialog( System::String ^defdir, System::String ^fil } return retfile; } + +// ---------------------------------------------------------------------- +// 外部プログラムの実行 +// ---------------------------------------------------------------------- + +// maketadの実行 +// @arg [in] maketadのパス +// @arg [in] 入力SRLのパス +// @arg [in] 出力SRLのパス +void makeTad( System::String ^maketad_path, System::String ^srlpath, System::String ^tadpath ) +{ + System::Diagnostics::Process::Start( maketad_path, "\"" + srlpath + "\" -o \"" + tadpath + "\"" ); +}