こんにちは。
前回の課題の実験レポートを拝見しました。大変明晰な文章でした。合格点をあげましょう。ありがとうございます。
こちらこそありがとうございます!
今回、私はIMM32のデバッグ機構を刷新しました。IMM32実行中のすべての論理エラーをログ出力するようにしました。
https://github.com/reactos/reactos/commit/c2a943653e1f4881a10d20054ae951bd53cc1a1c
その結果、「pWnd->hImcが正しくセットされていないこと」が分かりました。 後でなぜpWnd->hImcがセットされていないかを検証します。
ReactOSは少しずつ変化してます。 GitのコミットによってGitHubのmasterに変更点が追加されてます。 変更点はこちらから確認できます。
https://github.com/reactos/reactos/commits/master
https://git.reactos.org/?p=reactos.git;a=summary
バージョン管理について。 ReactOSのデスクトップの右下コーナーにバージョン情報の表示があります。
「20221014-0.4.15-dev-5189-g2640814」という文字列はGitHubでPRがコミットされたときに更新されます。 「20221014」がコミット日付。「0.4.15」というのはReactOSのバージョン。「dev-5189」がコミット連番。 「g2640814」がGitのハッシュ値の7文字に「g」を付けたものとなっています。 コミットURLは上記のmasterやGitHub検索からたどることができます。 次からコミットURLをレポートに貼り付けて下さい。
WinDbgについてこれまでの知識を確認するためにクイズを実施します。
Q1. WinDbgで「x win32k!NtUser*」とは何をするコマンド?
Q2. WinDbgの「.reload /user」でシンボル読み込みに失敗するのはなぜ?
Q3. WinDbgでブレークポイントを設定するコマンドは何?
Q4. WinDbgでブレークポイントを解除する方法は何?
Q5. WinDbgで呼び出し履歴を表示するコマンドは何?
Q6. WinDbgでグローバル変数IMM32!gpImeDpiListの値を確認する方法は?
Q7. WinDbgで「ba w 4 IMM32!gpImeDpiList」は何をするコマンドでしょうか?
IMM32のソースの最初の方に
WINE_DEFAULT_DEBUG_CHANNEL(imm);
という行がありますが、これはそのソースのデバッグチャンネルの指定です。 実行時にシステムの環境変数DEBUGCHANNELに「+imm,+user32」を設定すると、デバッグチャンネル「imm」と「user32」のTRACE文のログ出力が有効になります。環境変数DEBUGFORMATに「wine」を指定するとログ出力において関数名まで出力されます(sdk/lib/3rdparty/libwine/debug.c を参照)。
さて、Win32サブシステムのデバッグが難しいのは、プロセス・スレッド・モジュール・制御構造だけでなく、 遅延したり届かなかったりするメッセージの流れ(メッセージング)があり、 さらにメッセージングが階層構造を持つウィンドウで区分されているからです。
メッセージを送るのには、メッセージの投函(post)、送信(send)の二種類あり、postはメッセージキューでポーリングする。 例えば、郵便ポストへの投函は、配送を待たない。ポストを使わずに直接配送したりすると時間がかかる。
ちょっと視点を変えてみよう。 IMEでテキスト入力の対象となるのは、EDITコントロール(いわゆるテキストボックス)と リッチエディットコントロール、コンソールウィンドウ、そしてアプリ側が自作したカスタムコントロールの4種類に分けられる。
テキストボックスの実装は、システム既定のテキストボックスとCOMCTL32のテキストボックスに分けられる。
ソースを見ていこう。 システム既定の方は、win32ss/user/user32/controls/edit.cにある。 これを見ると、3つのIMM関数:
- ImmGetContext
- ImmGetCompositionStringW
- ImmReleaseContext
とIMEメッセージハンドリング:
- WM_IME_CHAR
- WM_IME_SETCONTEXT
- WM_IME_STARTCOMPOSITION
- WM_IME_COMPOSITION
- WM_IME_ENDCOMPOSITION
- WM_IME_COMPOSITIONFULL
- WM_IME_SELECT
- WM_IME_CONTROL
- WM_IME_REQUEST
がある。
COMCTL32の方は、dll/win32/comctl32/edit.cにある。 COMCTL32のエディットはCtrl+Aが使える(3377行目)以外はシステム既定のとほぼ同じコードだ。 リッチエディットのソースは、dll/win32/riched20にある。これも、IMM関数とIMEメッセージハンドリングが使われてる。
これらを見るに、テキスト入力を持つコントロールは、IMEメッセージの処理と若干のIMM関数呼び出し以外には、日本語入力のための特別な機構は特に有していない。
デフォルト通りにすれば、システム側でデフォルトでImmProcessKeyとIMEメッセージ経由でIMEが使用可能になっているはずだ。 IMEの状態ウィンドウを表示するのは、コントロール側ではない。
【課題】ReactOSにおいて、なぜときどきWND構造体のhImcメンバーがNULLのままなのかを究明せよ。
(ヒント)「->hImc」でgrepすると何かわかるかも。
調査のために、ReactOSを改変しても構わない。レポートにして提出すること。
今日はここまで。
了解です!
質問があれば
特にありません
では失礼します。