objective-cをちょい研究!ブログ -43ページ目

objective-cをちょい研究!ブログ

WILLCOMを卒業してiOS開発者に転身しました。。
コメント&トラックバック大歓迎です。

2のつづき。


prepare_imgfsする前のファイルをviewimgfsしても「Unable to load compression DLL!」と失敗する。
prepare_imgfsはviewimgfs展開する前の準備として必要らしい。
prepare_imgfsで抽出前後のファイルをバイナリ比較すると、ヘッダ列を検出してそれ以前の部分をただカットしたものっぽい。
そのヘッダというのがこれ。
「F8AC2C9DE3D42B4DBD30916ED84F31DC」(16進16byte)


prepare_imgfs前のファイルを検索してみると、ヘッダらしきが4つ出てきた。4つのうち一番最後を抜き出したのがimgfs_raw_data.bin。
ちなみに手作業で他の3つも抽出してviewimgfsしてみたが同様に全滅。


viewimgfsの結果

D:\imgfs_tools>viewimgfs imgfs_raw_data.bin -nosplit
guidBootSignature: F8 AC 2C 9D E3 D4 2B 4D BD 30 91 6E D8 4F 31 DC ←ヘッダ16byte
dwFSVersion: 00000001
dwSectorsPerHeaderBlock: 00000001
dwRunsPerFileHeader: 00000001
dwBytesPerHeader: 00000034 ←ブロックのヘッダサイズ?
dwChunksPerSector: 00000020
dwFirstHeaderBlockOffset: 00000800 ←ヘッダ先頭からブロックへのオフセット
dwDataBlockSize: 00001000
szCompressionType: LZX ←圧縮形式

dwFreeSectorCount: 00000283
dwHiddenSectorCount: 00000040
dwUpdateModeFlag: 00000001

Address: 00000800, dwBlockSignature: FB8E7B1B
dwNextHeaderBlock: 74918B6F (size: 7491836F)

 Header type: 2C89AA30, Addr: 00000808 ←ヘッダタイプ検出でこけてるっぽい
  Unknown header type, FS_DATA_TABLE??


dwBytesPerHeaderは、0x34Byte毎にHeader typeを探しに行っているので、
多分ブロック毎のヘッダサイズでしょうか。

esのサービスメニューからSYSNA_C2.DBKというファイルができた。
こんなフォーマットらしい。
http://wiki.osdev.info/index.php?W-ZERO3%2FNAND
W-ZERO3/NAND


DBKでぐぐると、DBKというファイル自体はZero3独自ではなくて、
ザウルス時代から受け継いでいるものらしい。
PC98シリーズのディスクイメージうんぬんとかも出てくるので、
フォーマットは違うっぽいけどディスクバックアップ(Disk BacKup)の
略とかそんな感じなのかな。


さて実際の中身ですが、メモリ(NAND型フラッシュ)ダンブにヘッダーと
チェックサムを追加したものってところでしょうか。
そのヘッダーとチェックサムを除いたものをIMGFSというらしい。


IMGFSを抽出するCソースがあったのでビルドして実行。
DBKから抽出できたファイルサイズがぴったり128MB。


//IMGFSを1024分割して、ヘッダと分割毎にチェックサム(4KB)を付加
DBK = ヘッダ(144Byte)
   + IMGFS1(128KB) + チェックサム1(4KB)
   + IMGFS2(128KB) + チェックサム2(4KB) …
   + IMGFS1024(128KB) + チェックサム1024(4KB)


このあとIMGFSイメージの展開にも挑戦してみたが、結論から言うと失敗。さっぱりわからん・・・。
http://d.hatena.ne.jp/Gzh/20060106
ROM作成 (英国だったじぃ様)


海外のサイトより英語がわからないので不安ながらに、imgfs_toolsをダウンロード。

prepare_imgfsすると、imgfs_raw_data.binというファイルができる。
prepare_imgfs [IMGFS抽出したファイル] -nosplit
-nosplitは分割しないオプション?で、付けないと一部データがimgfs_removed_data.binというファイルに分割されてしまう。


その生成ファイルをviewimgfsにかけてみる。ファイル展開するコマンド。
IMGFSの検出には成功したみたいだが、「Unknown header type, FS_DATA_TABLE??」と表示されてファイルタイプの判別に失敗したらしい???
viewimgfs imgfs_raw_data.bin -nosplit

ファイルの入出力する方法です。


BYTE buffer[8];


//ファイル書き込み("12345678"というデータを出力)

HANDLE hFile = CreateFile(
  _T("test.txt"), GENERIC_WRITE, 0, NULL,
  CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, buffer, 8, &dwWriteSize, NULL);
CloseHandle(hFile);


//ファイル読込み
DWORD dwReadSize;

HANDLE hFile = CreateFile(
  _T("test.txt"), GENERIC_READ, 0, NULL,
  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
ReadFile(hFile, buffer, sizeof(buffer), &dwReadSize, NULL);
CloseHandle(hFile);


DWORD dwWriteSize;
memcpy(buffer, "12345678", 8);

http://wisdom.sakura.ne.jp/system/winapi/win32/win113.html
ファイル読み書き(標準 Windows API様)

ROMファイルをバックアップできるらしいページを見つけました。
WS004SHのROMをバックアップしたファイルで、WS003SHをWS004SH化できるとか(驚
http://memn0ck.com/blog/2006/06/w-zero3_ws003sh_ws004sh.html


面白そうなので、手持ちのアドエスで挑戦してみました。
電源を切って、D+M+リセットボタンを押して…、いつもどおりに
WILLCOMロゴが立上がりました(失敗らしい(;_;))


どうやら、esでは電源を入れる時のキーが違うらしい。
http://d.hatena.ne.jp/kzou/20060923/1159020166


キーを押しながら電源ONって、親機登録みたいでなんか懐かしい。
さて電源を切って、今度はG+K+リセットボタンを押して…、おぉなんか
出てきたぞ。「Diag is locked!」。やったー???
和訳すると、「自己診断モードはロックされます!」だそうで(また失敗(ToT))


ネットで調べたら、どうやらこのサービスメニューとやらがアドエスでは
ロックされてしまったらしい。
esも所有しているが、プレミアムバージョンでロックされているという情報も
あり駄目もとでやってみるとサービスメニュー突入!(ばんざーい


XMLで設定データを入出力する方法です。
色々サンプルはあったんですが、結構難しそうだったので、最小限動くものを書いて見ました。


Imports System.Xml


'XMLファイル出力
Dim xmlWriter As XmlTextWriter = New XmlTextWriter("\Program Files\config.xml", System.Text.Encoding.UTF8)
xmlWriter.WriteStartDocument()
xmlWriter.WriteElementString("Name", "APO")
xmlWriter.WriteEndDocument()
xmlWriter.Close()


'XMLファイル読込み
Dim xmlReader As XmlTextReader = New XmlTextReader("\Program Files\config.xml")

Dim strValue As String = xmlReader.ReadElementString("Name")
xmlReader.Close()


\Program Files\config.xmlの出力内容

<?xml version="1.0" encoding="utf-8"?><Name>APO</Name>


xmlWriter.WriteElementString("Name", "APO")
Nameというキーで、APOという値を出力しました。


xmlReader.ReadElementString("Name")
Nameというキーでの値を取得。戻り値は「APO」です。


http://www.atmarkit.co.jp/fdotnet/easyxml/easyxml02/easyxml02_02.html
連載 .NETで簡単XML

http://uchukamen.com/WindowsMobile/WZero3DeAmedas1.1/Default.htm
簡単なモバイルアプリケーション開発8(宇宙仮面のC#プログラミング様)