------ Kterak si podbrobit klávesnici -----


           Možná  jste si  někdy všimli,  že  se  skoro u  každé hry  nebo
     programu  chová klávesnice  pokaždé úplně  jinak. Většinou  se můžete
     setkat s vlastnostmi tohoto charakteru:  Num Lock, Caps Lock a Scroll
     Lock  nereagují a  kontrolky svítí  stále stejně  jako před spuštěním
     programu,  nefunguje  Ctrl-C,   Ctrl-Break,  Ctrl-Alt-Del,  známé  to
     kombinace  brutálně  ukončující  právě  běžící  program.  Disablování
     těchto funkcí  je s největší pravděpodobností  záměr autora programu.
     Možná jste  se s podobným  problémem při psaní  programů setkali, ale
     stále  nemůžete  přijít  na  to,  jak  podobné srandičky s klávesnicí
     realizovat.  Celý princip  spočívá ve  vlastním handleru softwarového
     přerušení  klávesnice  INT9.  Možná  si  myslíte,  že  je  to  zavání
     praktikami  virů  a  vůbec  všech  magických  programů,  které dokáží
     vymlátit z počítače všechno možné, ale ono to v podstatě jinak nelze.
     Nastavení vlastního klávesnicového handleru získáte obrovské množství
     výhod, o  kterých  se  vám  před  tím  ani  nesnilo. Odpadá používání
     trapného  ReadKey a  podobné násilnické  funkce, klávesnice  bude pod
     vaší kontrolu a pokud budete chtít, aby se vám někdo na INT9 nemotal,
     stačí použít obnovovací stealth metodu, kterou ovšem doporučuji pouze
     pro  pokročilé programátory.  V neposlední  řadě si  můžete dělat  se
     scankódy  stisklých kláves  cokoli, třeba  je úplně  vyřadit z funkce
     nebo je  používat v neomezeném množství  třeba ve hře, která  by měla
     zvládat třeba 6 klávesnicových hráčů  najednou. V průběhu programu se
     nebudete vůbec muset starat o to,jestli se má zrovna teď číst klávesa
     nebo  ne. Prostě  si kdykoli  porovnáte proměnnou,  do které  vám váš
     handler  ukládá  scan  kód   poslední  stisklé  klávesy  a  provedete
     požadovanou  funkci.  Nebo  si  můžete  vytvořit  vlastní  buffer pro
     stisklé klávesy a s ním pak pracovat. Nechci nijak snižovat filozofii
     BIOSu a  na něm závislých kompilátorů  high-level jazyků, ale vlastní
     handler klávesnice je to nejlepší řešení.
           Jak na to  v praxi ? Je to velice  jednoduché stačí akorát znát
     příslušné  číslo portu  odkud vám  klávesnice bude  posílat scankódy.
     Ostatní už obstará  Pascal. Zde je příklad, jak  by takový jednoduchý
     prográmek, který používá vlastní ovladač klávesnice měl vypadat:

         Uses Dos;

         Var OldKeyBHandler : Procedure;
             UseBIOSHandler : Boolean;
             KeyPressed     : Byte;


         {F+}
         Procedure MyKeyBHandler(Flags, CS, IP, AX, BX, CX, DX,
                                 SI, DI, DS, ES, BP: Word); Interrupt;
         begin
           KeyPressed:=Port[60];
           if UseBIOSHandler then
             begin
               asm pushf end;
               OldKeyBHandler;
             end else Port[20]:=20;
         end;
         {F-}

         Begin
          UseBIOSHandler:=False;
          GetIntVec(9,@OldKeyBHandler);
          SetIntVec(9,@MyKeyBHandler);
         ......
         V programu můžete i rychle přepnout zpět do staré BIOS klávesnice
         pomocí UseBIOSHander, pokud je to potřeba (například při použití
         některých Pascalských funkcí nebo pokud už máte nějaké vaše starší
         funkce, které pracují se základním BIOS handlerem...).
         ......

          SetIntVec(9,@OldKeyboardHandler);
         End.

     Na  závěr přikládám oficiální scankódy kláves, které vám bude posílat
     klávesnice  přes  port  60.  Jsou  v  podstatě  podobné jako v ASCII
     konvenci,  ale  pozor na výjimky ! Také si možná všimnete další velké
     výhody,  jelikož  ASCII  konvence  neuznává  tzv. stavové kávesy jako
     Ctrl,  Alt,  Shift,  musí se za normálních okolností ohlídávat jejich
     stisk   různými   prasáckými   způsoby,   které   zde   nebudu  radši
     osvětlovat.  Při  použití  vlastního handleru je po problémech. Každá
     klávesa  má  ve  skutečnosti  dva scankódy, ten první (kódy zapsané v
     tabulce)  určuje  zda-li  je  určitá  klávesa právě  stisknutá, potom
     existuje  ještě  druhý  scan  kód, který odpovídá klávese, která byla
     naposledy  stisknuta,  tento  scankód zpravidla odpovídá scankódu při
     stisku klávesy plus 128. Existuje také speciální scankód (E0), který
     určuje,  zdali  je  právě stisknutá klávesa držena dostatečně dlouho,
     aby se v programu aktivovala určitá specifická funkce, jako například
     v  Nortonu, když chvíli podržíte šipkovou klávesu, začne vám rychleji
     scrolovat menu-bar, kterým vybíráte fajly.


           1   Esc                       44   z
           2   1                         45   x
           3   2                         46   c
           4   3                         47   v
           5   4                         48   b
           6   5                         49   n
           7   6                         50   m
           8   7                         51   , <
           9   8                         52   . >
          10   9                         53   / ?
          11   0                         54   Right-Shift
          12   - _                       55   *            (keypad)
          13   = +                       56   Left-Alt
          14   BackSpace                 57   SpaceBar
          15   Tab                       58   Caps-Lock
          16   q                         59   F1
          17   w                         60   F2
          18   e                         61   F3
          19   r                         62   F4
          20   t                         63   F5
          21   y                         64   F6
          22   u                         65   F7
          23   i                         66   F8
          24   o                         67   F9
          25   p                         68   F10
          26   [ {                       69   Num-Lock     (keypad)
          27   ] }                       70   Scroll-Lock
          28   Enter (Return)            71   7 Home       (keypad)
          29   Left-Arrow                72   8 Up         (keypad)
          30   a                         73   9 PgUp       (keypad)
          31   s                         74   -            (keypad)
          32   d                         75   4 Left       (keypad)
          33   f                         76   5            (keypad)
          34   g                         77   6 Right      (keypad)
          35   h                         78   +            (keypad)
          36   j                         79   1 End        (keypad)
          37   k                         80   2 Down       (keypad)
          38   l                         81   3 PgDn       (keypad)
          39   ; :                       82   0 Insert     (keypad)
          40   ' "                       83   . Del        (keypad)
          41   '                         87   F11
          42   Left Shift                88   F12
          28   Enter        (keypad)     75   Left         (not keypad)
          29   Right-Arrow               77   Right        (not keypad)
          42   Print-Screen              79   End          (not keypad)
          53   /            (keypad)     80   Down         (not keypad)
          55   Print-Screen              81   Page-Down    (not keypad)
          56   Right-Alt                 82   Insert       (not keypad)
          71   Home         (not keypad) 83   Delete       (not keypad)
          72   Up           (not keypad) 111  Macro
          73   Page-Up      (not keypad)

     Pro majitele klávesnice Windows 95 tu mám scankódy speciálních kláves
     s  hnusným  okýnkem a nějakým menu s šipkou, nebo co to je :) To levý
     okýnko  má  91, pravý 92 a to menu 93. Jako nápad zlepšení klávesnice
     to  není  špatné,  ale  o  použití  radši ani mluvit nebudu. Nejlepší
     cesta, jak sabotovat Microsoft, je, udělat programy, které budou tyto
     klávesy  využívat  pro svojí vlastní potřebu a Wokna budou mít smůlu.
     Taky to chce hromadně vydat přelepky...


                                                        ReDox


            výheň