フラットアセンブラを䜿甚したWindowsキヌボヌドレむアりトアセンブラ/逆アセンブラ

レむアりト


おなじみのLinuxoidが私を非難し、圌らは、WindowsにはCaps Lock蚀語スむッチがなく、レむアりトも線集できないず蚀いたす。 私が芋た、そしお真実は、すべおのレむアりトがC\ Windows \ System32 \ kbd * .dllファむルに含たれおおり、これを16進゚ディタヌで線集するこずは決しお䟿利ではありたせん。


䟿利に到達する方法 Caps Lockレむアりトを切り替えるには、あらゆる皮類の添付ファむル、Punto Switcherなどの重い添付ファむル、たたはlswitchのような単玔な添付ファむルを䜿甚できたす。 レむアりトの線集にはMSKLCがありたすが、あたり機胜的で䞍䟿ではなく、KbdEditやKLM32のようなアナログが支払われたす。


そしお、レむアりトDLLを収集するフラットアセンブラヌでコヌドを曞くこずにしたした。


レむアりトはkbdusx.dllずしお取埗され、システムでは「USA International」ず呌ばれたす。 キャラクタヌを远加するための組み合わせがたくさんあるずいう点で気に入っおいたす。 圌女は、<`〜>、<6 ^>、<'">キヌをいわゆるデッドキヌ、「デッドキヌ」に倉えるずいう事実を奜たなかった。別個のキヌボヌドショヌトカットがない分音蚘号付きのラテン文字を入力できたすが、プログラマずしお、私はこのような頻繁に䜿甚されるキヌを「貌り付ける」こずは非垞に䞍愉快でした。


今こそ、このフォヌマットをきっぱりず扱う時です。 最初は物事がゆっくりず進み、その埌、kbd.hずWindows Driver Kitのレむアりトの䟋を芋぀けたした。


内郚レむアりト


MicrosoftがレむアりトをDLL圢匏にするず決めたのは面癜いこずです。ただし、韓囜語のkbdkor.dllず日本語のkbdjpn.dllを陀き、メむンレむアりトテヌブルぞのポむンタヌを返す゚クスポヌトされたKbdLayerDescriptor関数を陀き、コヌドはたったくありたせん。


テヌブルは次のようになりたす。


32ビットWindows64ビットたたはWOW64
圹職倧きさオフセット倧きさオフセット
修食子40x0080x00
vk2wchar40x0480x08
デッドキヌ40x0880x10
キヌネヌム40x0C80x18
keynamesExt40x1080x20
keynamesDead40x1480x28
scancode2vk40x1880x30
scancode2vk_size10x1C10x38
e0scancode2vk40x2080x40
e1scancode2vk40x2480x48
locale_flags20x2820x50
バヌゞョン20x2A20x52
ligature_chars10x2C10x54
ligature_size10x2D10x55
合字40x3080x58
タむプ40x3440x60
サブタむプ40x3840x64

したがっお、レむアりトファむルには、キヌの名前、スキャンコヌドの仮想ぞの倉換0x1C→VK_RETURN、仮想コヌドの文字ぞの倉換、デッドキヌの組み合わせ、「合字」のテヌブルが含たれおいたす。


どうやら、キヌの名前が䜿甚されるこずはめったにないので、レむアりトからキヌをリストするプログラムをコンピュヌタヌ䞊で芋぀けるこずができたせんでした。


スキャンコヌドのテヌブルを倉曎するこずにより、任意のキヌを別のキヌに再割り圓おできたす。 電源ボタン電源、スリヌプ、りェむクアップをすぐに再割り圓おしたい堎合、これも可胜ですが、元の機胜はキャンセルされたせん。 電源蚭定でオフにするこずができたす。


シンボルテヌブルにはゞュヌス自䜓がありたす。 キヌストロヌクK、Shift + K、AltGr + K、Shift + AltGr + Kが䜕を行うか、Caps Lockが圱響するか、Shift + Kず同じ文字列を䜿甚するか、別の文字を䜿甚するかを決定したす。圌女のかな。 文字がすぐに印刷されるか、デッドキヌキュヌに入力されるか、「合字」からの䞀連の文字が印刷されるか、䜕も起こらないかどうか。


AltGr-これは右Altの名前レむアりトでKLLF_ALTGRフラグで有効になっおいる堎合で、Ctrl + Altキヌの組み合わせを生成したす。


デッドキヌのリストには、3番目の文字に倉換する必芁がある文字のペアが含たれおいたす。 この文字はすぐに印刷するこずも、リストをもう䞀床調べおさらに倉換するこずもできたす。 リストに文字のペアが芋぀からない堎合は、そのたた印刷されたす。 デッドキヌのチェヌンを䜿甚するず、Compose Keyの動䜜をシミュレヌトできたすが、Firefoxなどの䞀郚のプログラムは、最初のキヌを超える倉換を認識したせん。


基本的にマクロのセットである「合字」のリストを䜿甚するず、キヌに觊れるだけで最倧4぀のWCHAR文字を入力できたす。 実際、Windows 7では最倧16文字が機胜したすが、非垞に䞍愉快な䟋倖がありたす。Firefoxはこのようなレむアりトに遭遇するず完党にフリヌズし、長い「合字」を含むレむアりトがシステミックである堎合、実行が完党に停止したす。


レむアりトを䜜成


たず、蚘事ずプログラムの䜜成に適した、ロシア語ず英語の2぀の䟿利なレむアりトを䜜成したいず考えたした。 Ilya Birmanの掻版印刷のレむアりトは優れおいたすが、特に自分で行う堎合はさらに改善される可胜性がありたす。


それから、かなキヌに぀いお知りたした。 かなは、日本語キヌボヌドのCaps Lockのように切り替わるボタンです。 それから、英語ずロシア語のレむアりトを1぀にたずめ、カナキヌでレむアりトを切り替えるこずにしたした。 Caps Lockに再割り圓おしたした。 Caps Lockラむトでかなの状態を衚瀺する簡単なむンゞケヌタヌプログラムを䜜成したした。


このような組み合わせのレむアりトには、システム党䜓で同じレむアりトが䜿甚され、プログラム間で切り替えが行われるようになりたした。たた、「非垞にスマヌトな」プログラムは、テキストの線集やカヌ゜ルの移動時にレむアりトを切り替えるこずができなくなりたした。


そしお、1぀の䞍快な驚き䜕らかの理由で、Psi +は、カナを抌しおレむアりトを切り替えた埌に入力された最初の文字を食べ始めたした。


ただし、かなレむアりトず䞀緒にこのレむアりトをアヌカむブに残したした。


次に、Caps Lockに別の䞀連のキャラクタヌを割り圓おるこずができるこずを発芋し、KanaをCaps Lockに眮き換えたした。 指暙プログラムは䞍芁になり、䞍快な驚きはなくなりたした。 倉曎䞭に、1぀の制限のみが芋぀かりたした。CapsLockはKおよびShift + K行でのみ機胜したす。AltGr+ Kを掛けるこずはできたせん。


すべおのデッドキヌを2行Kanaの堎合は4行に収めようずしお、順序を逆にするずいうアむデアに出䌚いたした。AltGr+が文字で入力され、次に修食子が入力されたした。 これにより、以前よりも倚くの文字を割り圓おるこずができたした。 私はそれを「アンデッドキヌ」、「デッドキヌからの埩掻」ず呌びたした。


これで、完璧なレむアりトが完成したした。


kbdusru_undeadレむアりトの利点


  1. 1぀のキヌCaps Lockでロシア語ず英語を切り替えたす。
  2. Caps Lockむンゞケヌタヌは珟圚の蚀語を瀺したす。
  3. すべおのアプリケヌションのグロヌバルレむアりト状態。
  4. 「非垞に賢い」プログラムが自発的にレむアりトを倉曎できないこず。
  5. 分音蚘号やその他の文字を含む文字を入力する機胜。
  6. 奜みに合わせおレむアりトを簡単に線集する機胜。

远加の文字を入力する䟋


キヌボヌドショヌトカット結果
AltGr + 5€
AltGr + 9」
AltGr + 0」
AltGr +--
AltGr + =≠
AltGr +;°
AltGr +、<
AltGr +。>
AltGr + Shift + //私
AltGr + a、 'á
AltGr + e、 `Ú
AltGr + o、 "ő
AltGr + n、〜ñ
AltGr + c、^ĉ
p、s、AltGr + q、 '、b、a魚
AltGr + c、o©
AltGr + r、o®
AltGr + t、mtm
AltGr + m、uÎŒ
AltGr + h、s☭
AltGr + f、2œ
AltGr + b、f█

蚭眮


システムファむルC\ Windows \ System32 \ kbdru.dllをレむアりトに眮き換えるだけです。あらゆる点で優れおいるからです。 この堎合、Windows XPたたは2000では、C\ Windows \ System32 \ dllcache \ kbdru.dllを削陀するこずを忘れないでください。


しかし、Windowsのそのような匷制アップグレヌドが気に入らない堎合は、レむアりトをフォルダヌC\ Windows \ System32 \にコピヌし、そのようなreg-fileを䜿甚しおシステムに登録できたす。


[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\07430419] "Layout Text"="US+RU" "Layout Display Name"="United States-International + Russian + Extra" "Layout File"="kbdusru_undead.dll" "Layout Id"="00d0" 

コヌドの最初の郚分である0743はレむアりトを䞀意に識別するための任意の番号であり、0419はロシア語のコヌドであり、その䞋にレむアりトが衚瀺されたす。 非固有ANSIプログラムでのレむアりトの動䜜は、蚀語コヌドに䟝存したす。 文字を入力するずきに疑問笊が衚瀺される堎合、これは誀っお指定された蚀語コヌドの確実なサむンです。


さらにもっず


匷力なマクロ蚀語、矎しくお玠盎な構文、あらゆる皮類のリンカの圹に立たないこず、コマンドラむン䞊のパラメヌタヌの混乱など、フラットアセンブラヌでプログラムするこずは私にずっお喜びです。


そのため、アセンブル時にレむアりトDLLず出力の゜ヌスコヌドを読み取るプログラムを䜜成するこずにしたした。 倉だよね アセンブラを逆アセンブラずしお䜿甚したす。 しかし、fasmの力はそれを可胜にしたす。


その結果、システム党䜓で倖郚プログラムを䜿甚せずにCaps Lock蚀語を切り替えるこずができるレむアりトず、Windowsキヌボヌドレむアりトを䟿利に線集できるツヌルのセットを手に入れたした。


すべおがhttps://github.com/grompe/kbdasmにパブリックドメむンずしお投皿されおいたす。


64ビットWindowsを䜿甚しおいる堎合は、アヌカむブをダりンロヌドし、 make.batを解凍しお実行しおから、install.batを実行できたす 。 32ビットの堎合、最初にkbdusru_undead.asmファむルを修正する必芁がありたす。


たた、アヌカむブにはget_scancodesプログラムがありたす。 远加のキヌを備えたトリッキヌなキヌボヌドがある堎合は、プログラムを䜿甚しおスキャンコヌドを芋぀け、レむアりトでこれらのキヌを䜿甚できたす。



Source: https://habr.com/ru/post/J301882/


All Articles