Skip to content

Latest commit

 

History

History
112 lines (75 loc) · 4.54 KB

2022-09-25.md

File metadata and controls

112 lines (75 loc) · 4.54 KB

2022-09-25

こんにちはー!

こんにちはー

ReactOSをWinDBGでデバッグできましたか?

いまだに成功してない感じです

mzimeja 0.9.1のデバッグ出力はどうでした?

そっちは今やってるところです

今日は、入力について調べよう。

フォーカスウィンドウとは、GetFocus()で取得でき、SetFocus(hwnd)で設定できる、入力場所を表すウィンドウです。

win32ssでGetFocusをgrepすると、NtUserGetThreadState(THREADSTATE_FOCUSWINDOW);が見える。 さらにTHREADSTATE_FOCUSWINDOWをgrepすると

      case THREADSTATE_FOCUSWINDOW:
         ret = (DWORD_PTR)IntGetThreadFocusWindow();

を発見。さらにIntGetThreadFocusWindowをgrepすると

pti->MessageQueue->spwndFocus

を返していることがわかる。これがフォーカスの正体だ。スレッドごとにフォーカスがある。

例えば、ダイアログにテキストボックス(EDITコントロール)があってそこで入力していれば、 そこにフォーカスがあるということになる。 ボタンにフォーカスがある状態で空白キーを入力するとボタンが押される。

MessageQueueはUSER_MESSAGE_QUEUE構造体へのポインタ。 USER_MESSAGE_QUEUEの定義は、win32ss/user/ntuser/msgqueue.h にある。 spwndFocusの他に、spwndCapture、spwndActive、spwndActivePrevもある。 キャプチャウィンドウというのは、マウスドラッグのときにマウス入力をキープするのに使われる。 アクティブウィンドウというのは、(他とはタイトルバーの色が違うかもしれない)活発なウィンドウのことだ。 API関数としてはGetCapture/SetCapture, GetActiveWindow/SetActiveWindowが用意されている。

次は入力コンテキストについて。

win32ss/include/ntuser.hのWND構造体を見ると、 この中にHIMC hImc;がある。これが入力コンテキストのユーザーハンドルだ。 HIMCはImmLockIMCでロックし、ImmUnlockIMCでロック解除できる。 ImmLockIMCから返ってくるのが、INPUTCONTEXT構造体へのポインタだ。 INPUTCONTEXTの定義はsdk/include/ddk/immdev.hにある。 この構造体が文字通り「入力の文脈」の状態を保持している。

同じimmdev.hにINPUTCONTEXTDX構造体というのがあるが、これはINPUTCONTEXTの拡張だ。 INPUTCONTEXTDXのメンバーはまだ不明な点が多い。

win32ss/include/ntuser.hに戻る。IMEDPI構造体は、IMEへのインターフェイスを保持する。 IMEファイルはDLLファイルであるから、GetProcAddressで関数ポインタを取得できる。 IMEDPI構造体は、多数の関数ポインタを含んでおり、IME内部の処理にアクセスできる。 Imm32FindOrLoadImeDpi関数により、HKLからPIMEDPIを取得できる。 なぜならIMM32内部でグローバル変数gpImeDpiにより、複数のIMEDPIをリスト構造で所持しているからだ。

次はCLIENTIMC構造体。

この構造体はwin32ss/include/ntuser.hで定義されている。 CLIENTIMC.hInputContextの保持しているポインタがLPINPUTCONTEXTです。

dll/win32/imm32/imm.cに移動。imm32!ImmLockClientImcを参照。 引数として渡されたhImcからValidateHandleでポインタpIMCを取得する。 pIMC->dwClientImcDataはpClientImcと等しい。 pClientImcが作成されていなければ、ImmLocalAllocでCLIENTIMCを作成する。 そしてNtUserUpdateInputContextが呼ばれてカーネルに突入し、 UserUpdateInputContextでポインタ値がpIMC->dwClientImcDataにセットされる。

【課題】 https://jira.reactos.org/browse/CORE-18394 氏名とメールアドレスを公開してもいいのであれば、GitHubでPull Request作成。 嫌であれば、git diff > your_file.patchでパッチ作成。

今日はここまで。

了解です

Visual Studioの何を使ってるの? 32ビット?

今はvs 2019の64bit版のはずです

64ビットだとx86のReactOSをビルドしても意味がない。。。

なるほど てっきりクロスコンパイラが入っていたりするのかと思ってましたが

cmake に -A Win32を渡せばうまくいくかもしれない。 x86 VS のコマンドプロンプトじゃないといけない。

x86 Native Tools Command Promptですかね?

はい。

なるほど そこに関係あるかもしれません もう一度じっくりやり直してみます...

では

ありがとうございました


戻る | 次へ