Отключение клавиатуры

Тема в разделе "WASM.WIN32", создана пользователем ksu_ant, 23 июн 2006.

  1. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Здравствуйте!

    Возникла задача отключения (полного) клавиатурного ввода (мышь работать должна).

    Пока я вижу следующие решения:

    1. Физическое отключение (только по-моему комп не запустится, при загрузке, не найдя клавиатуры будет требовать нажать F1).

    2. Драйвер-фильтр.

    3. Команда винды (чего-то похожее keybd...) в батнике на автозагрузке.

    Вот.

    Подскажите, если знаете, какие еще способы можно применить для решения задачи.

    Перечисленные я реализовать могу, просто сейчас думаю по какому пути пойти.

    Заранее благодарен за ответы.
     
  2. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    ksu_ant

    Если отключить физически - и в BIOS убрать останов по ошибке клавиатуры (во всех AWARD есть точно) то F1 не появится
     
  3. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    С ring-0 можно пообщаться через порт в/в с контролёром клавы. Правда команды уже не помню.
     
  4. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    а просто выгрузить драйвер клавы нельзя?
     
  5. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Глобальный хук на клавиатуру WH_KEYBOARD_LL (там для всего возвращать -1)



    пример (извиняюсь за Дельфи)



    program disable_kb;



    uses

    Windows;



    {$APPTYPE CONSOLE}



    {$J+}

    const

    Hook: HHook = 0;

    WH_KEYBOARD_LL = 13;

    {$J-}



    function HookProc(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;

    begin

    Result := -1;

    end;



    procedure DisableKB; stdcall;

    begin

    if Hook = 0 then Hook:=SetWindowsHookEx(WH_KEYBOARD_LL,@HookProc,HInstance,0);

    end;



    procedure EnableKB; stdcall;

    begin

    UnhookWindowsHookEx(Hook);

    Hook:=0;

    end;



    begin

    writeln('disable leyboard on 3 seconds...');

    DisableKB();

    Sleep(3000);

    EnableKB();

    writeln('kbd enabled, press enter to exit');

    readln;

    end.



    + Ctrl-Alt-Del + Cltrl-Shift-Esc сабклассингом, подробнее

    hxxp://irazin.ru/Samples/SASHook.htm
     
  6. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    PROFi, slow

    Спасибо.

    DelExe

    В смысле? Мне нужно на компьютере, пользователь которого имеет только ограниченные права (не админ), отключить клавиатурный ввод.

    Если Вы о том, что из кернел-мода можно обойти отключение на уровне команд винды, то от меня не требуется защита от такого.

    r90

    А как? Корректно выгрузить, чтобы все работало, кроме клавиатуры :derisive:.
     
  7. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898


    а я не знаю :dntknw:

    в линухах командой rmmod, а как это делается в винде...

    я просто мысль кидаю, дабы, если она здравая, то она не была бы пропущена.
     
  8. ARMICRON

    ARMICRON New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    41
    ksu_ant

    А вот это подойдет?

    61h для чтения и записи — регистр управления клавиатурой. Если в старший бит этого порта записать значение 1, клавиатура будет заблокирована, если 0 — разблокирована. Другие биты этого порта менять нельзя, так как они управляют другими устройствами (в частности динамиком). Чтобы изменить состояние клавиатуры, надо считать байт из порта, изменить бит 7 и снова записать в порт 61h этот байт. (с) Зубков.







    [​IMG] 1972475110__zubkov.txt
     
  9. Rohan

    Rohan New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2004
    Сообщения:
    133
    Start -> run -> rundll32 keyboard,disable подойдет?
     
  10. Son of God

    Son of God New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    125
    А это работает в NT? Насколько я знаю, использование подобных команд (rundll32) проходит только в 9х.
     
  11. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    ARMICRON

    Rohan

    Спасибо большое, проверю, попробую.
     
  12. Eagle_XK

    Eagle_XK New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2006
    Сообщения:
    1
    Адрес:
    Ukraine
    slow, твой пример не работет корректно, клавиатура не блочится.



    <font color="blue]ms-help://MS.MSDNQTR.2003FEB.1033/winui/winui/windowsuserinterfa ce/win dowing/hooks/hookreference/hookfunctions/lowlevelkeyboardproc.htm</font><!--color-->



    только для 9х
     
  13. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Всем спасибо.

    Вроде пока подошел вариант физического отключения.

    Будут неудобства - сделаю программно.
     
  14. zxm

    zxm New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    71
    Мне нужно откюченеи клавиатуры. Решил попробовать работу с портами. Юзаю дефлфи, порты "открыл" с помощью проги UserPort. Проблема такая после включения клавиатуры устанавливается медлеенаая скорость повтора сивола при нажатой клавишы. Почему? Как считать скорость повтора и задержку перед повтором? Вот код:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    asm
    call WaintKbin
    mov al,$F5
    out 60h,al
    end;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    asm
    call WaintKbin
    mov al,$F4
    out 60h,al
    end;
    end;

    procedure WaintKbin;
    begin
    asm
    in al,64h
    test al,0010b
    jnz WaintKbin
    ret
    end;
    end;
     
  15. zxm

    zxm New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    71
    Всё, написал kernel mode driver. ОНО работает! ) Спс MS-Rem.


    ps. Ms-Rem, твой пример работы с ring0 вылетает как при выборе драйве как и при другом способе. У мя XP sp2.
     
  16. Vol4oK

    Vol4oK New Member

    Публикаций:
    0
    Регистрация:
    1 май 2006
    Сообщения:
    15
    вот самый лобовой примитивный вариант вырубания клавы походу рабоет безотказно, хотя мот немного кривовато)) вот код драйвера:
    Код (Text):
    1. ;@echo off
    2. ;goto make
    3. ;----------------------------------------------------------------------------
    4. .386
    5. .model flat, stdcall
    6. option casemap:none
    7. include masm32\include\w2k\ntstatus.inc
    8. include masm32\include\w2k\ntddk.inc
    9. .code
    10. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    11. _wait:
    12.     in al,64h
    13.     test al,0010b
    14.     jnz _wait
    15.     mov al,0F5h
    16.     out 60h,al
    17.     ret
    18. DriverEntry endp
    19. end DriverEntry
    20. ;----------------------------------------------------------------------------
    21. :make
    22. set drv=KeyOff
    23. masm32\bin\ml /nologo /c /coff %drv%.bat
    24. masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys /subsystem:native %drv%.obj
    25. del %drv%.obj
    ЗЫ: походу мой первый рабочий драйвер))
     
  17. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Eagle_XK

    точно, не работает :dntknw:( приношу извинения, о уважаемые воины дзена
     
  18. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Три ха-ха
    Под Windows 7 все отключения клавиатуры через порты идут лесом.
     
  19. niakris

    niakris Дмитрий

    Публикаций:
    0
    Регистрация:
    3 сен 2008
    Сообщения:
    45
    paralvic

    А если клава USBшная, тогда как?