3: 2010-02-04 (木) 01:10:44 sero[6] [7] | 4: 2010-02-04 (木) 23:12:32 sero[6] [8] | ||
---|---|---|---|
Line 21: | Line 21: | ||
** 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を呼び出したときのアプリのレジスタの値(これを変更すると、アプリのレジスタも書き換わる) | ||
- 主要なローカル変数 | - 主要なローカル変数 | ||
Line 26: | Line 27: | ||
-- 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); | ||
+ | } | ||
} | } |
(This host) = http://osask.net