1: 2010-02-02 (火) 22:47:46 sero[5] [6] | 現: 2024-01-08 (月) 12:59:02 lina[7] [8] | ||
---|---|---|---|
Line 1: | Line 1: | ||
* efg01解析 [#b357c99a] | * efg01解析 [#b357c99a] | ||
- | - by [[sero]] | + | - (by [[sero]], 2010/2/2~) |
- このページはSeroがefg01のソースを読んでわかったことをメモするページです | - このページはSeroがefg01のソースを読んでわかったことをメモするページです | ||
- よって、正確な情報であるという保障はありません | - よって、正確な情報であるという保障はありません | ||
- その点留意していただければ幸いです | - その点留意していただければ幸いです | ||
+ | - 優先的に解析結果がほしい分野があればコメント欄へどうぞ 実力の及ぶ限り努力します | ||
** 解析の前に [#af236b59] | ** 解析の前に [#af236b59] | ||
Line 10: | Line 11: | ||
** 概要 [#g19ba445] | ** 概要 [#g19ba445] | ||
- | // - GUIGUI01アプリは | + | - GUIGUI01のAPIは複数の機能を一度に実行できる |
+ | - そのため、実行するAPIの機能を順に並べたパケットをefg01に渡すことになっている | ||
+ | - その形式は、[[GH4>GUIGUI01/man0004]]と呼ばれる | ||
+ | |||
+ | ** efg01に到達するまで [#s5534258] | ||
+ | + APIコール(z_tools/guigui01/g01libc0.lib/startup.askのg01_execcmd(0)) | ||
+ | + JMP [ESI] | ||
+ | + efg01/asm_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] | ||
+ | - 概要: GUIGUI01のAPI処理本体(名称は「Cで書かれたAPI」に由来すると思われる) 行数: 797行 | ||
+ | - 引数: APIを呼び出したときのアプリのレジスタの値(これを変更すると、アプリのレジスタも書き換わる) | ||
+ | - 主要なローカル変数 | ||
+ | -- struct READ_API ra : efg01に渡されるパケットから情報を取り出すための構造体 | ||
+ | -- int f3 = 1 : あといくつのAPI機能を実行するか(初期値は1、つまり、一つの機能を実行したら終了) | ||
+ | - メインの処理 | ||
+ | if (edi == 0) // EDIが0だったら | ||
+ | cmd = (UCHAR *) eip; // APIパケットの開始はEIPから | ||
+ | init_ra(&ra, cmd); // raを初期化し、パケット情報を受け取る準備をする | ||
+ | ra.reg32 = &edi; // レジスタを参照・書き換えするための準備 | ||
+ | ra.st0 = &eip; // 詳細は不明(guigui01.h(つまりC言語からのアクセス)を使うだけならおそらく使われていない(要調査TODO)) | ||
+ | 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 |
(This host) = http://osask.net