3: 2010-02-04 (木) 01:10:44 sero |
現: 2024-01-08 (月) 12:59:02 lina |
| - よって、正確な情報であるという保障はありません | | - よって、正確な情報であるという保障はありません |
| - その点留意していただければ幸いです | | - その点留意していただければ幸いです |
| + | - 優先的に解析結果がほしい分野があればコメント欄へどうぞ 実力の及ぶ限り努力します |
| | | |
| ** 解析の前に [#af236b59] | | ** 解析の前に [#af236b59] |
| + efg01/asm_apiで、レジスタをスタックに積んでから、 | | + efg01/asm_apiで、レジスタをスタックに積んでから、 |
| + efg01/c_api()がコールされる | | + efg01/c_api()がコールされる |
| + | |
| + | ** 型名・構造体など [#dc5a88da] |
| + | - UCHAR |
| + | -- 実体はunsigned char型 |
| + | - READ_EH4 |
| + | -- 概要: (名前はEH4になっているが)GH4形式のパケットからデータを取り出すための構造体 FIFO構造を持つ |
| + | --- UCHAR buf[READ_EH4_BUFLEN] : パケットのデータを一時的にキャッシュするバッファ |
| + | --- int r : 次のデータがあるbuf上のインデックス |
| | | |
| ** void c_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax, int eip) [#k101e498] | | ** void c_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax, int eip) [#k101e498] |
| + | - 概要: GUIGUI01のAPI処理本体(名称は「Cで書かれたAPI」に由来すると思われる) 行数: 797行 |
| - 引数: APIを呼び出したときのアプリのレジスタの値(これを変更すると、アプリのレジスタも書き換わる) | | - 引数: APIを呼び出したときのアプリのレジスタの値(これを変更すると、アプリのレジスタも書き換わる) |
| - 主要なローカル変数 | | - 主要なローカル変数 |
| -- int f3 = 1 : あといくつのAPI機能を実行するか(初期値は1、つまり、一つの機能を実行したら終了) | | -- int f3 = 1 : あといくつのAPI機能を実行するか(初期値は1、つまり、一つの機能を実行したら終了) |
| - メインの処理 | | - メインの処理 |
- | if (edi == 0) | + | if (edi == 0) // EDIが0だったら |
- | cmd = (UCHAR *) eip; | + | cmd = (UCHAR *) eip; // APIパケットの開始はEIPから |
- | init_ra(&ra, cmd); | + | init_ra(&ra, cmd); // raを初期化し、パケット情報を受け取る準備をする |
- | ra.reg32 = &edi; | + | ra.reg32 = &edi; // レジスタを参照・書き換えするための準備 |
- | ra.st0 = &eip; | + | ra.st0 = &eip; // 詳細は不明(guigui01.h(つまりC言語からのアクセス)を使うだけならおそらく使われていない(要調査TODO)) |
| for (;;) { | | for (;;) { |
- | 中略 | + | if (f3 == 0) // 実行する機能の残りが0ならば |
| + | goto fin; // API処理終了 |
| + | f3--; // 今からひとつ処理する |
| + | i = getnum_api(&ra, 0); // パケットからひとつデータを取り出す |
| + | if (i == 0) |
| + | continue; // API番号0はパディングのためスキップされる |
| + | if (i == 3) { // パケットの終端、またはパケットの延長 |
| + | 中略 |
| + | return; |
| + | } |
| + | if (i == 4) { // アプリの終了 |
| + | 中略 |
| + | exit(1); |
| + | } |
| + | if (i == 5) { // 文字列表示 |
| + | 中略 |
| + | } else if (i == 6) { // コマンドラインオプションの処理 |
| + | 中略 |
| + | } else if (i == 0x00ffffff) { // ジャンクAPI(仕様が決定版でないAPI)の処理 |
| + | 中略 |
| + | } else { |
| + | printf("c_api: error i=%d\n", i); |
| + | exit(1); |
| + | } |
| } | | } |
| + | |
| + | *** コマンドラインオプションの処理 [#j57d1ec7] |
| + | - 概要: (GUIGUI01アプリに渡された(実際はefg01が受け取っている))コマンドラインオプションの形式を定義し、その値をアプリに引き渡す 行数: 287行 |
| + | - 関連するグローバル変数 |
| + | -- FUNC06STR *func06str : コマンドラインオプションの定義を保管する構造体 ポインタになっているが、アプリ実行開始時にはすでに動的確保済み |
| + | |
| + | ** コメント欄 [#pfe3f553] |
| + | #comment |