InitialKeyboardIndicators の謎を明らかにしてみた

ログオン画面で NUM LOCK キーを有効にする方法

InitialKeyboardIndicators は Windows でログインした時のNumLockの状態を設定するためのレジストリーなのだが、
肝心の HKEY_USERS\.Default\Control Panel\Keyboard を開いてみると
2147483648 だったり、謎の多い仕様になっています。

これは Windows Vista のソース
          mov    edi,80000000h
          mov    [ebp-04h],edi
          mov    esi,[eax+30h]
          jnz    LBF818780
          push    00000000h
          lea    eax,[ebp-04h]
          push    eax
          push    edi
          push    SWCBF9BA330_InitialKeyboardIndicators
          push    0000000Dh
          push    [ebp+08h]
          call    SUB_LBF822419
          and    dword ptr [ebp-04h],80000002h
          cmp    [ebp-04h],edi
          jnz    LBF818730
          movzx    eax,[LBF9E26AA]
          mov    [ebp-04h],eax
 LBF818730:
          mov    al,02h
          test    [ebp-04h],al
          jz     LBF81874B
          or    [esi+00000098h],al
          or    [LBF9E2664],al
          or    [LBF9E2604],al
          jmp    LBF818760

これを見ると、見てるのは 最上位Bit と下から 2番目のBitだけなのですが、

最上位Bitが立っている場合 レジストリの値を無視して、別のところから値を引っ張ってきていることが分かります。
たどってみると IoQueryDeviceDescriptionIoQueryDeviceDescription でハードウェアから情報を取得しようとしているようです。

 つまり、

値が 2147483648 以上の場合は、ハードウエアの設定をそのまま継承
値を4で割った余りが 0か1 の場合は、NUMLOCK無効
値を4で割った余りが 2か3 の場合は、NUMLOCK有効

ということのようです。
Windows 10のソースも見てみましたが最上位が立っていた場合の取得方法が
gklpBootTime で取得した構造体の第2ワードを入力として使用するようになっているだけで基本的に同じで、上記の3通りしかパターンはないようです

2147483650 や 80000002 の入力を促すサイトもありますが、最上位ビットが有効になっていれば、
2147483648 を入れても、2147483650 を入れても同じ結果になるようです( ˘ω˘)b

おすすめ

1件の返信

  1. Nan より:

    大変参考になりました。助かりました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です