Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  01:28[Войти] | [Зарегистрироваться]
Ответ на вопрос № 42578

19-05-2006 04:19
Мне надо отключить клавиатуру с помощью Delphi. На каком-то форуме нашел что ее можно отключить так: с помощью
winexec(Pchar('rundll32 keyboard,disable' ) ,sw_Show);
или ассемблерного кода
Asm 
in al,21h 
or al,00000010b 
out 21h,al 
End;
В первом случае выдается ошибка:
"Ошибка при загрузке keyboard Не найден указанный модуль."
а во втором:
"Project Project1.exe raised exception class EPrivilege with message 'Privileged instruction'"
Помогите. Может кто знает или занимался этим.
P.S. сразу хочу сказать что я пишу не вирус. И про BlockInput знаю, но он мне не подходит т. к. можно отключить с помощью 3 веселых клавиш.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

31-10-2006 00:27
Специально для тех кто утверждает что Ctrl+Alt+Del могут победить BlockInput. Привожу свой код.

while true do BlockInput(1);

Попробуйте :) Еффект потрясающий.

09-07-2006 06:30 | Комментарий к предыдущим ответам
Мне не совсем понятно стремление отключить Ctrl-Alt-Del. Если это делается с целью предотвратить запуск Диспетчера задач и соответственно предотвращения завершения работы программы, то это делается не так (в Windows XP это делается написанием сервиса, а под Windows 98 и, вероятно, Windows ME, это делается через вызов RegisterServiceProcess (только загружать надо динамически в зависимости от версии ОС)).
А от Ctrl-Shift-Esc можно избавиться установкой, скажем WH_CBT и блокировкой создания окна "Диспетчер задач" (только надо посмотреть класс).
А вот мне была раньше интересна блокировка клавиатуры целиком, т.к. никаие ухищрения не помогали против нажатия клавиши Sleep или Power - похоже, они отрабатываются до Windows и ничего не срабатывает. Решение было найдено лишь аппаратное - нажать Fn-F11, это блокирует контроллер клавиатуры на аппаратном уровне и никакие нажатия не отправляются в компьютер (очень удобно для протирания клавиатуры без отключения компьютера)

22-05-2006 13:30 | Комментарий к предыдущим ответам
ну да, забыл написать, что блок на все кроме CAD и CSE
CSE то он как раз ловит :)
мдя... порой у меня возникает подозрение, что PLatform SDK у вас вместо завтрака, обеда, ужина и сказки на ночь
Подозрение правильное, читаю книжки я обычно за едой и на ночь :)
представим ситуацию: две программы на компьютере подменяют GINA.DLL что тогда?
В моём примере этого нет (там кстати баг с удалением записи в реестре: удалять надо не ключ, а значение), но можно при установке своей Gina смотреть есть ли уже такой ключ в реестре, запоминать его и загружать (придётся динамически, а не статически как сейчас) не MSGina, а ту что прописалась в реестре, таким образом будет "очередь" из нескольких Gina. При этом возможны проблемы связанные с порядком удаления этих Gina, но при сабкласинге окон в WinLogon всё ещё хуже, так как правильно разрулить ситуацию, при наличии нескольких желающих словить WM_HOTKEY, невозможно. Если мы будет удалять хуки не в том порядке в котором ставили, то AV-и нам обеспечено, а в Winlogon-е оно приводит к смерти виндов.
Самый правильный и реально (SCADA системы например) используемый способ это написание драйвера (Upper Filter), но к сожалению готовых драйверов с открытым API мне не встречалось.

22-05-2006 07:02 | Комментарий к предыдущим ответам
>>>Ну во первых CAD это не отключает
ну да, забыл написать, что блок на все кроме CAD и CSE

>>>для установки глобального WH_KEYBOARD_LL DLL-ка не требуется
мдя... порой у меня возникает подозрение, что PLatform SDK у вас вместо завтрака, обеда, ужина и сказки на ночь *JOKINGLY*

>>>регистрация своей Gina в реестре рекомендована MS и хорошо описана в MSDN, конечно всё это придумано не для тупого блокирования CAD, но раз такая возможность есть, то почему бы и не воспользоваться

представим ситуацию: две программы на компьютере подменяют GINA.DLL что тогда?

внедрение DLL-ки в Winlogon это уже действительно что-то не очень хорошее.

хотя инжект DLL в winlogon не самое "чистое" решение, но пожалуй самое красивое.

22-05-2006 03:30 | Комментарий к предыдущим ответам
ну вообще, не очень хорошо gina.dll подменять, вам не кажется?
Нет не кажется, регистрация своей Gina в реестре рекомендована MS и хорошо описана в MSDN, конечно всё это придумано не для тупого блокирования CAD, но раз такая возможность есть, то почему бы и не воспользоваться. А вот внедрение DLL-ки в Winlogon это уже действительно что-то не очень хорошее.
вот железно работающий пример отключения клавиатуры
Ну во первых CAD это не отключает, а во вторых для установки глобального WH_KEYBOARD_LL DLL-ка не требуется.
И кстати, WH_KEYBOARD_LL = 13 в Windows.pas не определен...
Это и многое другое определено в Jedi API.

22-05-2006 00:39 | Комментарий к предыдущим ответам
И кстати, WH_KEYBOARD_LL = 13 в Windows.pas не определен... Пришлось смотреть в хедерах SDK

22-05-2006 00:37
DRON
ну вообще, не очень хорошо gina.dll подменять, вам не кажется?

вот железно работающий пример отключения клавиатуры


library DisableKB;

uses
  Forms,
  Windows,
  Messages,
  HookCommon in 'HookCommon.pas';

{$J+}
const
  Hook: HHook = 0;
  WH_KEYBOARD_LL = 13;
{$J-}

{$R *.res}

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;

exports
  DisableKB, EnableKB;

begin
end.



unit HookCommon;

interface

uses Windows;

procedure DisableKB; stdcall;
procedure EnableKB; stdcall;

implementation

procedure DisableKB; stdcall; external 'disablekb.DLL';
procedure EnableKB; stdcall; stdcall; external 'disablekb.DLL';

initialization
end.


21-05-2006 12:32
у меня даже есть рабочий код но на си++
Этот http://www.codeproject.com/win32/AntonioWinLock.asp ?
Если он, то я его как то переводил на Delphi, могу выслать.
а я просто сабклассил окно соответствующее
Ну именно так там и делается.
и кстати ctrl-shift-escape забыли, оно тоже так хватается
Угу, но это можно прикрыть через реестр, правда мессага будет выскакивать, что "у вас нет прав".

Вообще самое правильное назначить соответствующие административные политики и тогда сколько хочешь нажимай этот CAD, а всё равно ничего кроме кнопки "Отмена", на появившемся окне не будет.

21-05-2006 10:40
если надо перхватить CAD то все очень просто:
>>>внедрением DLL-ки и перехвата WM_HOTKEY в winlogon.

а я просто сабклассил окно соответствующее :) правда окно в чужом процессе (winlogon) так что без внедрения DLL никак

и кстати ctrl-shift-escape забыли, оно тоже так хватается

а все остальные клавиши ловятся WH_KEYBOARD_LL

SAS window - это название окна в winlogon

21-05-2006 10:35
если надо перхватить CAD то все очень просто:
>>>внедрением DLL-ки и перехвата WM_HOTKEY в winlogon.

у меня даже есть рабочий код но на си++

21-05-2006 09:29
Вот кстати пример простейшей Gina блокирующей CAD:

library AntiCADGina;
uses
  Windows;

const
  MSGina='MSGina.dll';
  MutexName='Global\4F3636FB-3620-478B-B5CE-9F1B158ED6F1';

procedure WlxActivateUserShell;external MSGina;
procedure WlxDisconnectNotify;external MSGina;
procedure WlxDisplayLockedNotice;external MSGina;
procedure WlxDisplaySASNotice;external MSGina;
procedure WlxDisplayStatusMessage;external MSGina;
procedure WlxGetConsoleSwitchCredentials;external MSGina;
procedure WlxGetStatusMessage;external MSGina;
procedure WlxInitialize;external MSGina;
procedure WlxIsLockOk;external MSGina;
procedure WlxIsLogoffOk;external MSGina;
function WlxLoggedOnSAS(pWlxContext:Pointer;dwSasType:DWORD;pReserved:Pointer):Integer; stdcall;external MSGina;
procedure WlxLoggedOutSAS;external MSGina;
procedure WlxLogoff;external MSGina;
procedure WlxNegotiate;external MSGina;
procedure WlxNetworkProviderLoad;external MSGina;
procedure WlxReconnectNotify;external MSGina;
procedure WlxRemoveStatusMessage;external MSGina;
procedure WlxScreenSaverNotify;external MSGina;
procedure WlxShutdown;external MSGina;
procedure WlxStartApplication;external MSGina;
procedure WlxWkstaLockedSAS;external MSGina;

function MyWlxLoggedOnSAS(pWlxContext:Pointer;dwSasType:DWORD;pReserved:Pointer):Integer; stdcall;
var
  Mutex:THandle;
begin
  if dwSasType=1 then begin
    Mutex:=OpenMutex(MUTEX_ALL_ACCESS,False,MutexName);
    if Mutex<>0 then begin
      CloseHandle(Mutex);
      Result:=2;
      Exit;
    end;
  end;
  Result:=WlxLoggedOnSAS(pWlxContext,dwSasType,pReserved);
end;

function UpdateRegistry(Delete:Boolean):HRESULT;
var
  Key:HKEY;
  DLLName:array[0..MAX_PATH] of Char;
const
  KeyName='SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon';
begin
  Result:=S_OK;
  if Delete then
    RegDeleteKey(HKEY_LOCAL_MACHINE,KeyName)
  else begin
    if (GetModuleFileName(hInstance,DLLName,SizeOf(DLLName))=0)
      or(RegOpenKeyEx(HKEY_LOCAL_MACHINE,KeyName,0,KEY_ALL_ACCESS,Key)<>ERROR_SUCCESS)
      or(RegSetValueEx(Key,'GinaDLL',0,REG_SZ,@DLLName,lStrLen(DLLName)+1)<>ERROR_SUCCESS) then
      Result:=E_UNEXPECTED;
  end;
end;

function DllRegisterServer:HRESULT;
begin
  Result:=UpdateRegistry(False);
end;

function DllUnregisterServer:HRESULT;
begin
  Result:=UpdateRegistry(True);
end;

exports
  DllRegisterServer,
  DllUnregisterServer,
  WlxActivateUserShell,
  WlxDisconnectNotify,
  WlxDisplayLockedNotice,
  WlxDisplaySASNotice,
  WlxDisplayStatusMessage,
  WlxGetConsoleSwitchCredentials,
  WlxGetStatusMessage,
  WlxInitialize,
  WlxIsLockOk,
  WlxIsLogoffOk,
  MyWlxLoggedOnSAS Name'WlxLoggedOnSAS',
  WlxLoggedOutSAS,
  WlxLogoff,
  WlxNegotiate,
  WlxNetworkProviderLoad,
  WlxReconnectNotify,
  WlxRemoveStatusMessage,
  WlxScreenSaverNotify,
  WlxShutdown,
  WlxStartApplication,
  WlxWkstaLockedSAS;
begin
end.


Её надо скопировать например в System32 и зарегистрировать через "regsvr32 AntiCADGina.dll". Теперь в приложении которое хочет заблокировать CAD достаточно написать "CreateMutex(nil,True,'Global\4F3636FB-3620-478B-B5CE-9F1B158ED6F1');" и CAD работать перестанет (экран правда дёргается), после завершения приложения работа CAD восстановится.

21-05-2006 03:42 | Комментарий к предыдущим ответам
а поставить хук WH_KEYBOARD_LL?
А чем это поможет? CAD ведь всё равно не ловится.

21-05-2006 02:22
а поставить хук WH_KEYBOARD_LL?

20-05-2006 02:57 | Комментарий к предыдущим ответам
Спасибо, постараюсь с этим разобраться.

20-05-2006 02:41 | Комментарий к предыдущим ответам
их "привилегированность" заложена на уровне процессора
В регистре EFLAGS есть поле (2 бита) IOPL задающее максимальный уровень привилегий (CPL) на котором можно выполнять ввод/вывод. Вообще почитайте спецификации, на самом деле есть довольно много вещей которыми можно управлять, например тот же RDTSC (тики процессора) можно сделать привилегированной командой.

20-05-2006 01:32 | Комментарий к предыдущим ответам
Возможно я чего-то недопонимаю, но всегда считал, что их "привилегированность" заложена на уровне процессора, и винда (9x или NT) тут не причем

19-05-2006 15:17 | Комментарий к предыдущим ответам
Нельзя вызывать привилегированные команды на 3-м кольце, а команды in и out - привилегированные
Не совсем так :)
Под 9x они тоже привилегированные, но вызывать всё таки можно, как впрочем и в NT. Результат вызова зависит от нескольких параметров: во первых можно действительно запретить любые попытки вызова этих функций из третьего кольца что и сделано под NT, а можно назначить специальную таблицу с помощью которой доступ к одним портам разрешён, а к другим нет. Второй способ реализован под 9x (там например запрещён доступ к портам IDE-контроллера), а под NT он включается отдельно для каждого процесса, чем и пользуются драйвера типа GiveIO.sys.

19-05-2006 12:10 | Комментарий к предыдущим ответам
'Privileged instruction'  и правильно говорит. Нельзя использовать прямое управление контролером клавиатуры под NT даже с правами админа. Вот в режиме ядра - пожалуйста.
Не совсем так. Нельзя вызывать привилегированные команды на 3-м кольце, а команды in и out - привилегированные

19-05-2006 11:53
А тут собственно нечего рассказывать, я таких драйверов не писал, сталкивался только с готовыми (без исходников). Основные идеи по написанию таких драйверов можно посмотреть у Руссиновича http://www.sysinternals.com/Utilities/Ctrl2Cap.html

19-05-2006 10:38 | Сообщение от автора вопроса
dron, расскажите пожалуста о драйвере который вы упомянули

19-05-2006 07:39
Перед тем как оформите его как статью советую проверить весь список, так он фактически неработоспособен под NT (2000, XP).
Конкретно что работает:
WinExec('rundll32 shell32.dll,Control_RunDLL ',1);        //Выводит панель управления
WinExec('rundll32 shell32.dll,Control_RunDLL desk.cpl',1); //Открыть свойства экранa
Неудивительно что работает так как используется оболочкой и имеется полное описание в MSDN, причём можно не RunDLL вызывать, а сразу control.exe с параметрами. Так же есть возможность через параметры задавать текущую закладку.
WinExec('rundll32 shell32.dll,OpenAs_RunDLL <FileName>',1);          //Выводит окошко «Открыть с помощью...»
Работает и тоже упоминается в MSDN.
WinExec('rundll32 diskcopy,DiskCopyRunDll ',1);            //Показать окно «Copy Disk>>
Работает, но по сути своей бесполезно.
ShellAboutA и SHFormatDrive конечно тоже работают, но вызывать их через RunDll глупо, так как это обычные API функции имеющие нормальное описание в справке.

А если автор хочет нормально заблокировать клаву, то ему надо писать драйвер, а если не очень нормально, то использовать BlockInput, а от CAD спасаться или подменой Gina.dll или внедрением DLL-ки и перехвата WM_HOTKEY в winlogon.

19-05-2006 06:56 | Комментарий к предыдущим ответам
Может вы? как бы совместно сделаем?
Нет, так делать не стоит.
Кстати, я полагаю, вопрос открыт, так как автор явно написал в вопросе, что

winexec(Pchar('rundll32 keyboard,disable' ) ,sw_Show);


не работает

19-05-2006 05:57
может оформите его как статью?
К сожалению физически не хватает времени.... Может вы? как бы совместно сделаем?

С Уважением...

19-05-2006 05:43 | Комментарий к предыдущим ответам
to _Master_NN_:
Список может заинтересовать многих, может оформите его как статью?

19-05-2006 04:51
Где-то на королевстве я уже выкладывал список вызовов...
Спасибо 777.
Поиск рулит!

С уважением...

19-05-2006 04:44
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=37557

WinExec('rundll32 keyboard,disable ',1);

19-05-2006 04:43
'Privileged instruction'  и правильно говорит. Нельзя использовать прямое управление контролером клавиатуры под NT даже с правами админа. Вот в режиме ядра - пожалуйста.

У меня работал вот такой код


procedure BlockInput(ABlockInput: boolean); stdcall; external 'USER32.DLL';
  // Вызываем функцию из DLL'ки
Пример использования:

procedure TForm1.N1Click(Sender: TObject);
begin
  BlockInput(True);
  // Вот собственно этим мы и блокируем клаву и мышь
  // (для обратного исхода надо вместо True написать False)
end;


19-05-2006 04:40
Насколько я понимаю, Windows не допускает нарушения своей работоспособности другими программами (по крайней мере, старается не допускать) и перехватывает все опасные действия. Так что, скорее всего, задача не решается, если не найти какую-нибудь дырку в Винде.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жили у бабуси два веселых гуся. Один белый, другой КАКОЙ?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования