フィンガープリントプログラム:GUI版完成。tad対応。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@259 7061adef-622a-194b-ae81-725974e89856
This commit is contained in:
nishikawa_takeshi 2009-04-16 10:52:14 +00:00
parent baf30f2ada
commit a796e33f0f
7 changed files with 410 additions and 109 deletions

View File

@ -219,6 +219,14 @@
RelativePath="..\..\MasterEditorTWL\MasterEditorTWL\keys.cpp"
>
</File>
<File
RelativePath="..\..\MasterEditorTWL\MasterEditorTWL\split_tad.cpp"
>
</File>
<File
RelativePath="..\..\MasterEditorTWL\MasterEditorTWL\split_tad_util.cpp"
>
</File>
<File
RelativePath=".\stdafx.cpp"
>
@ -263,6 +271,14 @@
RelativePath=".\resource.h"
>
</File>
<File
RelativePath="..\..\MasterEditorTWL\MasterEditorTWL\split_tad.h"
>
</File>
<File
RelativePath="..\..\MasterEditorTWL\MasterEditorTWL\split_tad_util.h"
>
</File>
<File
RelativePath=".\stdafx.h"
>

View File

@ -5,6 +5,8 @@
#include <twl/os/common/format_rom.h>
#include <cstring>
#include <cstdio>
#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<unsigned char> 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;

View File

@ -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<System::Byte> ^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<String^> ^files = dynamic_cast< array<String^> ^>(e->Data->GetData( DataFormats::FileDrop ) );
String ^path = files[0];
this->commonOpenRom( path );
this->procOpenRomButton( path ); // ボタンが押されたときと同じ挙動
}
};
}

View File

@ -7,8 +7,11 @@
// ファイル処理
// ----------------------------------------------------------------------
// ファイルコピー
void CopyFile( System::String ^srcpath, System::String ^dstpath );
// ファイル全体の読み込み
cli::array<System::Byte>^ ReadBin( System::String ^path );
// ファイル全体のライト
void WriteBin( System::String ^path, cli::array<System::Byte> ^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<System::Byte> ^bin, ROM_Header *dstrh );
// バイナリへのROMヘッダの上書き
void OverwriteRomHeader( cli::array<System::Byte> ^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 );

View File

@ -14,6 +14,178 @@ using namespace MasterEditorTWL;
// ファイル処理
// ----------------------------------------------------------------------
// ファイル全体の読み込み
cli::array<System::Byte>^ 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<System::Byte> ^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<System::Byte>(size);
pin_ptr<unsigned char> 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<System::Byte> ^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<unsigned char> 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<System::Byte> ^bin, ROM_Header *dstrh )
{
int size = bin->Length;
pin_ptr<unsigned char> 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<System::Byte> ^bin, ROM_Header *srcrh )
{
int size = bin->Length;
pin_ptr<unsigned char> 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 + "\"" );
}