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
大変参考になりました。助かりました。