Skip to content

Latest commit

 

History

History
112 lines (76 loc) · 3.47 KB

2022-08-06.md

File metadata and controls

112 lines (76 loc) · 3.47 KB

2022-08-06

ようこそ

暑い日が続くが、体調に変わりはないかな。

特に体調は問題ないです!

こんにちは

さて

xxxFreeKeyboardLayoutsの解析は簡単だったね。

VOID xxxFreeKeyboardLayouts(PWINSTATION_OBJECT pWinSta,BOOL bFree)
{
    PKL pKL = HKLtoPKL(gptiCurrent, (HKL)(INT_PTR)HKL_NEXT);

    while (pKL)
    {
        xxxInternalUnloadKeyboardLayout(pWinSta, pKL, 0x80000000);
        pKL = HKLtoPKL(gptiCurrent, (HKL)(INT_PTR)HKL_NEXT);
    }

    if (bFree)
        UserAssignmentUnlock((PVOID*)&pWinSta->spklList);
}

xxxFreeKeyboardLayoutsはxxxLoadKeyboardLayoutExから呼び出されているようだ。

次はUSER32!GetKeyboardLayout。これも簡単。

HKL WINAPI GetKeyboardLayout(DWORD dwThreadId)
{
    return (HKL)NtUserCallOneParam(dwThreadId, 0x28);
}

ReactOSではinline関数のNtUserxGetKeyboardLayoutをはさむ形になるが、 ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT == 0x28となってReactOSと実装が一致する。

その次はUSER32!GetKeyboardLayoutNameW。これはどうでしたか? なんとなくおかしいことに気づきましたか?

ghidraの方では謎の処理が挟まっていることに気付きました

謎とは?

CONCAT22という名前の処理が挟まっていました

答えを言うと、NtUserGetKeyboardLayoutNameの第一引数の型がPUNICODE_STRINGだったということです。

清書して

BOOL WINAPI GetKeyboardLayoutNameW(LPWSTR pwszKLID)
{
    UNICODE_STRING Name;
    Name.Buffer = pwszKLID;
    Name.Length = 0;
    Name.MaximumLength = KL_NAMELENGTH * sizeof(WCHAR);
    return NtUserGetKeyboardLayoutName@4(&Name);
}

これはReactOS側のNtUserGetKeyboardLayoutNameの実装がおかしかったということです(だれも気づいていなかった)。

reactos/reactos#4595

こういう風にたまにReactOSの実装の間違いに遭遇しますので、早めに発見して修正していきましょう。

お知らせ:IMEのインストールに成功しました:reactos/reactos#4596

【課題】mzimejaをReactOSにインストールしたときのログを取得せよ。

WARNING: calling stub ImmWINNLSEnableIME(0x00140076,0x0)
(win32ss/user/ntuser/defwnd.c:1137) err: In Paint and Client area is not empty!
(win32ss/user/ntuser/defwnd.c:1137) err: In Paint and Client area is not empty!
WARNING: calling stub ImmWINNLSEnableIME(0x00140076,0xffffffff)
(dll/ntdll/ldr/ldrinit.c:1887) WARN: Accepting different LOAD_CONFIG size!
(win32ss/user/ntuser/callback.c:1093) err: GetCharsetInfo Failed!!
(win32ss/gdi/gdi32/objects/gdiobj.c:326) Trying to delete system object 0x00850016
WARNING: calling stub ImmWINNLSEnableIME(0x00050172,0x0)
(win32ss/user/ntuser/defwnd.c:1137) err: In Paint and Client area is not empty!
(win32ss/gdi/ntgdi/palette.c:773) RealizePalette unimplemented for memory managed DCs
(win32ss/gdi/ntgdi/palette.c:773) RealizePalette unimplemented for memory managed DCs
WARNING: calling stub ImmWINNLSEnableIME(0x00050172,0xffffffff)

imm32!ImmWINNLSEnableIMEが未実装だ。

【課題】imm32!ImmWINNLSEnableIMEを解析せよ。

【課題】ImmWINNLSEnableIMEがどこから呼び出されているか調査せよ(日本語ReactOSと日本語WinXP)。

今日はここまで。

わかりました

疑問点は隠さずに伝えて下さい。

わかりました 気を付けます

次は火曜日。では


戻る | 次へ