こんにちは
こんにちは
前回、日本語キーボードの解析が終わり、次の結果を得た。 reactos/reactos#4515 https://github.com/reactos/reactos/commit/99d9fc698fd3475c8f1531c5cc51649f948fdb57
さいわい、Micros*ftが日本語106キーボードのドライバをMS-PL licenseで公開していたのでこれを参考にした。 https://github.com/microsoft/Windows-driver-samples/blob/master/input/layout/fe_kbds/jpn/106/kbd106.c
さて話は戻ってuser32!LoadKeyboardLayoutWの解析だ。 LoadKeyboardLayoutAは文字列変換してLoadKeyboardLayoutWを呼んでいる。 LoadKeyboardLayoutWはLoadKeyboardLayoutWorkerを呼んでいる。 LoadKeyboardLayoutAとLoadKeyboardLayoutWはReactOS側に型情報があるので、それを適用。
LoadKeyboardLayoutWorkerは、OpenKeyboardLayoutFileと_LoadKeyboardLayoutExとCliImmInitializeHotKeysとNtCloseを呼んでいる。 (_LoadKeyboardLayoutExとLoadKeyboardLayoutExは別物なので注意)。 LoadKeyboardLayoutExは、引数param_1をチェックしてLoadKeyboardLayoutWorkerを呼んでいる。
NtCloseはNTオブジェクトを閉じる関数だ。NT APIについては: NT Undocumented Functions: http://undocumented.ntinternals.net/ を参照。Win32 APIの下には、NTカーネルで動作する、より低レベルなNT APIがある。
RTL関数とNT API関数の組み合わせでNTネイティブアプリを作ることができる(※危険):https://github.com/katahiromz/hello-native-app
CliImmInitializeHotKeysはすでに前回で解析済みだ。
_LoadKeyboardLayoutExを解析しよう。_LoadKeyboardLayoutExにジャンプ。 RTL関数のRtlInitUnicodeStringはReactOSですでに実装済み。 NtUserLoadKeyboardLayoutEx呼び出しはシステムコール。 これに引数情報を付けていろいろすれば_LoadKeyboardLayoutExは解析できる。
残りはOpenKeyboardLayoutFileだ。OpenKeyboardLayoutFileにジャンプ。 OpenKeyboardLayoutFileのparam_6は配列か構造体へのポインタだと思われる。 GetKeyboardDllNameが呼ばれる。その後、OpenKeyboardLayoutFileWorkerの呼び出しだ。
このあたりは本当に難しい。間違ったらやり直しになるからバックアップを忘れずに。 汗と逆コンパを注意深く読み進めると、OpenKeyboardLayoutFileのparam_6の実体の先頭(0xB14)バイトがゼロで初期化されているのが分かる。 OpenKeyboardLayoutFileWorkerの最後の引数にOpenKeyboardLayoutFileのparam_6が渡されている。 おそらく同じ型だ。そこで0xb14バイトの構造体MYLAYOUTSTRUCTを仮に定義し、型を適用する。
GetKeyboardDllNameの最初の引数は文字列バッファと思われるので、WCHAR szDllName[260]とする。 260と言えばMAX_PATHだ。 これでOpenKeyboardLayoutFile関数そのものの解析は完了する。 残りはGetKeyboardDllNameとOpenKeyboardLayoutFileWorkerだ。
【課題】GetKeyboardDllNameを解析せよ。関数名より、おそらくキーボードのDLL名を返す関数と思われる。
今日はここまで。質問はありませんか。
特にありません