Skip to content

Latest commit

 

History

History
120 lines (76 loc) · 5.55 KB

2022-10-23.md

File metadata and controls

120 lines (76 loc) · 5.55 KB

2022-10-23

こんにちは。

前回の課題の実験レポートを拝見しました。大変明晰な文章でした。合格点をあげましょう。ありがとうございます。

こちらこそありがとうございます!

今回、私は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を改変しても構わない。レポートにして提出すること。

今日はここまで。

了解です!

質問があれば

特にありません

では失礼します。


戻る | 次へ