さてと。
ReactOSのデバッガKDBのチートシートを作成した。 ReactOSでデバッグするときに参考にしてくれ。 https://github.com/katahiromz/reactos-kdb-cheatsheet
調査の結果、 IMM32!ImmLockIMCはIMM32!InternalImmLockIMCへの呼び出しがあることが分かった。 また、IMM32!ImmUnlockImeDpiにIMM32!UnloadIMEへの呼び出しがあった。 そして
- IMM32!ImmDestroyIMCC
- IMM32!ImmLockIMC
- IMM32!ImmLockImeDpi
- IMM32!ImmUnlockClientImc
- IMM32!ImmUnlockIMC
- IMM32!InternalImmLockIMC
- IMM32!UnloadIME
には問題は見つからなかった。
IMM32!ImmUnlockImeDpiについては、
(逆工学のため、掲載不可)
この部分が、ReactOSでは
/* Remove from list */
for (ppEntry = &gpImeDpiList; *ppEntry; ppEntry = &((*ppEntry)->pNext))
{
if (*ppEntry == pImeDpi) /* found */
{
*ppEntry = pImeDpi->pNext;
break;
}
}
になっているだけだった。この二つは同じ動作のコードである(確認せよ)。
連続したコードについて、
if (...EXP1...) {
...CODE1...
goto label2;
}
...CODE2...
label2:
というコードは、
if (...EXP1...) {
...CODE1...
} else {
...CODE2...
}
label2:
に置き換え可能。
インデントについては知っているかな? インデントは、コードの制御構造を視覚的に分かりやすくするから重要だ。 コーディングスタイルについては https://reactos.org/wiki/Coding_Style を参照。
これでユーザ側の入力コンテキストの破棄には問題はないと分かった。 次回は、カーネル側の入力コンテキストの破棄について調べる。
【課題】 win32k!NtUserDestroyInputContextを解読せよ。
解読できた関数については、decodedというフォルダに保存して整理しておいてくれ。
今日はここまで。