Я хочу написать драйвер для перехвата нажатия кнопок с клавиатуры и, если надо, не оповещать систему о нажатии.
Драйверы не писал не разу. Может кто нибудь помочь с отправной точкой? Например, нужные функи, ссылки...
Успеховъ.
IP>Я хочу написать драйвер для перехвата нажатия кнопок с клавиатуры и, если надо, не оповещать систему о нажатии. IP>Драйверы не писал не разу. Может кто нибудь помочь с отправной точкой? Например, нужные функи, ссылки...
Ну господа! Я ведь тоже могу так ответить. Хотя при этом я не знаю как написать драйвер. А очень хочется узнать. Человек спрашивал конкретные советы, а не отписки. Ясно, что если уж он задал вопрос, то DDK у него уже стоит на машине.
Е-мае, модераторов на нас нет!
TO Igor_Pavlov: Чего получится, расскажи, чтобы и я узнал. Очень надо написать драйвер, правда под NT, а все никак не могу.
Дерзай и все будет. Может я сподоблюсь, смогу опытом поделиться, когда появится.
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Здравствуйте, Kont, Вы писали:
K>Ну господа! Я ведь тоже могу так ответить. Хотя при этом я не знаю как написать драйвер. А очень хочется узнать. Человек спрашивал конкретные советы, а не отписки. Ясно, что если уж он задал вопрос, то DDK у него уже стоит на машине. K>Е-мае, модераторов на нас нет!
Человек просил отправную точку, она ему дадена. Ку? Думаешь тебе tyt будут готовое решение приводить, али весь DDK цитировать? STFW "Keyboard class driver" никто не отменял.
Здравствуйте, Patalog, Вы писали:
P>Здравствуйте, Kont, Вы писали:
K>>Ну господа! Я ведь тоже могу так ответить. Хотя при этом я не знаю как написать драйвер. А очень хочется узнать. Человек спрашивал конкретные советы, а не отписки. Ясно, что если уж он задал вопрос, то DDK у него уже стоит на машине. K>>Е-мае, модераторов на нас нет!
P>Человек просил отправную точку, она ему дадена. Ку? Думаешь тебе tyt будут готовое решение приводить, али весь DDK цитировать? STFW "Keyboard class driver" никто не отменял.
Извини если плечиком зашиб тебя!
Ссылка на DDK не катит в качестве отправной точки. Точное место в DDK не было указано. Надеюсь ему поможет твое сообщение.
Кстати, если кто знает ресурсы (жел. русские), на примерах расписывающие написание драйвера, например сетевых протоколов, то не молчите, а то "укушу".
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Правда? А может еще кашки налить и хлебушек покрошить???? Господа, ну учитесь работать сами, а не при помощи чужой головы. В документации DDK есть абсолютно все про драйверы фильтрации для win nt и про 9х(ме) написано немало. И примеры есть. Надо просто установить DDK. А если вы это не могете даже это сами сделать — тогда я просто опускаю лапки... Вот когда будет видно, что Вы сами искали и будете задавать конкретные вопросы по конкретным вещам, приводить примеры того, что вы сами видели/делали — вот тогда и ждите помощи. А так — только призывы к самостоятельности.
K>>>Ну господа! Я ведь тоже могу так ответить. Хотя при этом я не знаю как написать драйвер. А очень хочется узнать. Человек спрашивал конкретные советы, а не отписки. Ясно, что если уж он задал вопрос, то DDK у него уже стоит на машине. K>>>Е-мае, модераторов на нас нет!
P>>Человек просил отправную точку, она ему дадена. Ку? Думаешь тебе tyt будут готовое решение приводить, али весь DDK цитировать? STFW "Keyboard class driver" никто не отменял.
K>Извини если плечиком зашиб тебя! K>Ссылка на DDK не катит в качестве отправной точки. Точное место в DDK не было указано. Надеюсь ему поможет твое сообщение. K>Кстати, если кто знает ресурсы (жел. русские), на примерах расписывающие написание драйвера, например сетевых протоколов, то не молчите, а то "укушу".
Здравствуйте, Andrew S, Вы писали:
AS>Правда? А может еще кашки налить и хлебушек покрошить???? Господа, ну учитесь работать сами, а не при помощи чужой головы. В документации DDK есть абсолютно все про драйверы фильтрации для win nt и про 9х(ме) написано немало. И примеры есть. Надо просто установить DDK. А если вы это не могете даже это сами сделать — тогда я просто опускаю лапки... Вот когда будет видно, что Вы сами искали и будете задавать конкретные вопросы по конкретным вещам, приводить примеры того, что вы сами видели/делали — вот тогда и ждите помощи. А так — только призывы к самостоятельности.
По поводу меня можно не беспокоиться. Драйвер сетевой я только думал писать. Лениво просматривая DDK. Не доходят просто руки. Замечание правильное, но не конструктивное. Я ведь просил помочь с русскими ресурсами. Укажи какие-нить URL-ы, или скажи что не знаешь.
Критику принимаю и обеими парами рук голосую за. Но все-же поконструктивнее. Сам-то че-нить написал из дров? Если да, то поделись опытом. Расскажи про подводные камни. Особенности отладки. И т.п.
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Здравствуйте, Igor_Pavlov, Вы писали:
IP>Я хочу написать драйвер для перехвата нажатия кнопок с клавиатуры и, если надо, не оповещать систему о нажатии. IP>Драйверы не писал не разу. Может кто нибудь помочь с отправной точкой? Например, нужные функи, ссылки...
В DDK от WinME (другого установленного DDK у меня под рукой сейчас нет) есть такая функция:
VKD_Filter_Keyboard_Input (см. файл vkd.inc)
Allows a virtual device to monitor keyboard input and either modify or reject keyboard keystrokes. To monitor keyboard input, a virtual device must hook this service. The virtual device sets the carry flag to reject a keystroke , or clears the carry flag to continue processing the keystroke. Uses Flags.
Returns the scan code of the keystroke in CL, if if the carry flag is clear.
Но эту функцию надо не вызвать, а перехватывать с помощью VMMCall Hook_Device_Service.
Лично я писал mirror драйвер для win nt, hook драйвер под 9х и обычный kmd драйвер под nt. Пользовался в основном поиском по группо-гуглю, советами Alexa'a Fedotov'a (за что ему огромное спасибо) и документацией DDK.
Я вообще не беспокоюсь Драйверы такая тема, что надо самому и с нули, иначе потом много непоняток. Обязательно почитай "Недокументированные возможности win2k", "Programming WDM drivers" и что-нибудь из гарри наббета.
Отладка... Без софтайса не обойтись.
Успехов.
K>По поводу меня можно не беспокоиться. Драйвер сетевой я только думал писать. Лениво просматривая DDK. Не доходят просто руки. Замечание правильное, но не конструктивное. Я ведь просил помочь с русскими ресурсами. Укажи какие-нить URL-ы, или скажи что не знаешь. K>Критику принимаю и обеими парами рук голосую за. Но все-же поконструктивнее. Сам-то че-нить написал из дров? Если да, то поделись опытом. Расскажи про подводные камни. Особенности отладки. И т.п.
Здравствуйте, Igor_Pavlov, Вы писали:
IP>Я хочу написать драйвер для перехвата нажатия кнопок с клавиатуры и, если надо, не оповещать систему о нажатии. IP>Драйверы не писал не разу. Может кто нибудь помочь с отправной точкой? Например, нужные функи, ссылки...
Здравствуйте, Andrew S, Вы писали:
AS>Лично я писал mirror драйвер для win nt, hook драйвер под 9х и обычный kmd драйвер под nt. Пользовался в основном поиском по группо-гуглю, советами Alexa'a Fedotov'a (за что ему огромное спасибо) и документацией DDK.
AS>Я вообще не беспокоюсь Драйверы такая тема, что надо самому и с нули, иначе потом много непоняток. Обязательно почитай "Недокументированные возможности win2k", "Programming WDM drivers" и что-нибудь из гарри наббета.
AS>Отладка... Без софтайса не обойтись.
AS>Успехов.
Незнаю незнаю... Я установил ДДК. В хелпе нифига отправной теории нету. На сайте глухо. Причем насколько я знаю так и должно быть. Майкрософт доки рассылает на дисках вместе с ДДК. Беспалатно, но толку от этого мало. ЧТо мне теперь ждать чтоли? Я хотел поиметь описание типа DirectX. Вот там все грамотно: теория, пошаговое выполенение задач, примеры. В ДДК примеров нет как класса. Пошаговыми операциями не пахнет. Я не ясновидящий что бы догадываться как и что делается.
Вот вы советуете почитать про WDM-дрова. А что они есть такое? В доке по ДДК толком ничего не сказано. Для чего они и чем отлича.тся от других дров.
Все что я нарыл на ДДК сайте так это асмовый исходник от которого не холодно не жарко.
Потому и обратился сюда за помощью.
Здравствуйте, Igor_Pavlov, Вы писали:
IP>Я хочу написать драйвер для перехвата нажатия кнопок с клавиатуры и, если надо, не оповещать систему о нажатии. IP>Драйверы не писал не разу. Может кто нибудь помочь с отправной точкой? Например, нужные функи, ссылки...
В DDK есть целый каталог с самплами. Они не идеальны — но представление о проблеме и рабочие проекты дадут.
IP>Незнаю незнаю... Я установил ДДК. В хелпе нифига отправной теории нету. На сайте глухо. Причем насколько я знаю так и должно быть. Майкрософт доки рассылает на дисках вместе с ДДК. Беспалатно, но толку от этого мало. ЧТо мне теперь ждать чтоли? Я хотел поиметь описание типа DirectX. Вот там все грамотно: теория, пошаговое выполенение задач, примеры. В ДДК примеров нет как класса. Пошаговыми операциями не пахнет. Я не ясновидящий что бы догадываться как и что делается.
Здравствуйте, Igor_Pavlov, Вы писали:
IP>Вот вы советуете почитать про WDM-дрова. А что они есть такое? В доке по ДДК толком ничего не сказано. Для чего они и чем отлича.тся от других дров.
Про WDM могу книгу посоветовать "Programming the MS Windows Driver Model" Walter Oney, MS Press 1999. В русском варианте не видел. Английский где то в сети был. Ссылку к сожалению не помню, но гугл должен знать
так я ему это посоветовал — не внемлеть
IP>>Вот вы советуете почитать про WDM-дрова. А что они есть такое? В доке по ДДК толком ничего не сказано. Для чего они и чем отлича.тся от других дров.
C>Про WDM могу книгу посоветовать "Programming the MS Windows Driver Model" Walter Oney, MS Press 1999. В русском варианте не видел. Английский где то в сети был. Ссылку к сожалению не помню, но гугл должен знать
IP>Незнаю незнаю... Я установил ДДК. В хелпе нифига отправной теории нету. На сайте глухо. Причем насколько я знаю так и должно быть. Майкрософт доки рассылает на дисках вместе с ДДК. Беспалатно, но толку от этого мало. ЧТо мне теперь ждать чтоли? Я хотел поиметь описание типа DirectX. Вот там все грамотно: теория, пошаговое выполенение задач, примеры. В ДДК примеров нет как класса. Пошаговыми операциями не пахнет. Я не ясновидящий что бы догадываться как и что делается. IP>Вот вы советуете почитать про WDM-дрова. А что они есть такое? В доке по ДДК толком ничего не сказано. Для чего они и чем отлича.тся от других дров. IP>Все что я нарыл на ДДК сайте так это асмовый исходник от которого не холодно не жарко. IP>Потому и обратился сюда за помощью.
Общие сведения о написании VxD:
vxd — это исполняемый файл в формате LE. Большинство vxd не имеют точки входа в заголовке, но через таблицу экспортируют адрес структуры DDB. Если драйвер имеют точку входа, то она должна находится в сегменты code16. Этот код будет вызван в самом начале инициализации Windows, в реальном режиме. Подробности этого можно посмотреть в DDK, используется эта возможность довольно редко. Основная точка входа драйвера содержится в структуре DDB.
Вот некоторые важные поля
DDB_SDK_Version — это минимальная версия системы, для которой предназначен драйверDDB_Req_Device_Number — 16-битный номер(ID) устройства для взаимодействия с DOS и Win16 программами и другими VxD
DDB_Dev_Major_VersionDDB_Dev_Minor_Version
это версия самого драйвера
DDB_Name — имя драйвера, ровно 8 байт, иными словами char DDB_Name[8];
DDB_Control_Proc — адрес фукнции обработки сообщений системе (не имеет никакого отношения к окными сообщениям и т.п.)
DDB_V86_API_Proc
DDB_PM_API_Proc
это адреса обработчиков API режимов VM86 и PM (для этого API обязателен ID), эти API будут доступны через INT 2Fh (AX=1684h), адреса могут совпадать
DDB_Service_Table_Ptr
DDB_Service_Table_SizeЭто адрес и размер таблицы функций, которые драйвер предоставляет другим vxd через "VxDCall"
Итак, что нужно сделать для минимальной работы драйвера.
1) Сделать структуру DDB
2) Указать в ней адрес ControlProc
3) Указать там же имя устройства
4) Экспортировать эту структуру под первым номером (ordinal)
Теперь о ControlProc:
Эту функцию вызывет система по аналоги с WindowProc, но параметры передаются в регистрах, главный параметр — номер сообщения в регистре EAX.
Например, когда программа загружает и работает с vxd с помощью функций CreateFile/DeviceIoControl/CloseHandle, система вызывает ControlProc, и в регистре EAX находится значения 23h (W32_DEVICEIOCONTROL)
В DDK опеределены симбольные обозначения номеров сообщений.
Когда драйвер загружается, то, в зависимости от способа загрузки, системы посылает сообщения SYS_CRITICAL_INIT (0h), DEVICE_INIT (1h), INIT_COMPLETE (2h), SYS_DYNAMIC_DEVICE_INIT (1Bh). Содержимое разных регистров завист от номера сообщения. В сюработчике сообщения можно выполнять различные функции, но набор допустимых зависит от сообщения. То есть не всегда можно пользоваться той или иной функцией. Кроме того, некоторые сообщения нужно отрабатывать ОЧЕНЬ быстро.
Обрабатывать нужно только те сообщения, которые интересуют драйвер. Обработчкик обычно устанавливает CF=0 (cls) если не имеет ничего против данного сообщения и CF=1 (stc) если хочет возразить против данного действия.
При инициализации драйвера можно перхватить опеределённые функции и прерывания, установить callback, которые будет вызывать система в определённых ситуациях.
VxD пользуется функциями других vxd (и системы) через механизм VxDCall. Это метод динамического связывания драйверов, в исполняемом файле вызов функций реализается так:
int 20h
dw <номер функции>
dw <id устройства>
При первом вызове система заменяет в памяти этот код на инструкцию call с указанием конкретного адреса.
Параметры могут передаваться в функцию разными способами: как через стек (__cdecl, __stdcall), так и через регистры процессора. Результат обычно возвращается в регистрах общего назначения (eax, ebx, ecx, edx, esi, edi) или через Carry Flag.