buisyhanh. Я расскажу как вижу работу такого драйвера.
1. Происходит прерывание.
2. Вызывается ISR.
3. ISR читает байт буфера клавиатуры в буфер драйвера.
4. Ставит в очередь DPC.
5. Блокирует прерывания для клавиатуры.
6. Записывает байт обратно в буфер клавиатуры
7. Разрешает прерывания для клавиатуры.
8. Вызывает предыдущий обработчик.
9. После понижения IRQL вызывается DPC.
10. В DPC устанавливается событие "буфер готов".
11. Приложение в usermode реагирует на событие и вызывает DeviceIoControl для чтения буфера.
Отлично,
sss Вы очень сильно разбираете в ассемблере. Спасибо большое.
Как по этой списке, я предлагаю такой код сооветственно:
В DriverEntry напишу: После создания Обьекта устройства.
- Ставить код HalgetInterruptVector(...) для получения адрес вектор прерывания клавиатуры, после чего использовать IoConnectInterrupt(...) для регистрации ISR для данного прерывания и дальше:
1. Происходить прерывание от клавиатуры.
2. Вызывается ISR, в котором имеется фунция KeInsertQueueDPC
3. ISR читает байт буффера порта 0х60
4. Ставит в очередь DPC.
5. Блокирует прерывания для клавиатуры. - Но не знаю зачем блокировать прерывания клавиатуры, и как в С реализовать, видно что нет такой функции в диассемблерном коде.
6. Обратная запись в буффер клавиатуры - наверно это и есть байт состояния, информируя о завершении обработки, точно в буффер или в другой порт.
7. Разрешает прерывания, какие функции не знаю, и не вижу таких там же в коде.
8. Вызывает предыдущий обработчик. - Наверно где - то должно сохранить предыдущий обработчик, как вызывать ?
9. DPC автоматически вызывается при понижении IRQL.
10. В DPC устанавливается событие "буфер готов". - Тут иформируют Приложению - пользователя о готовность данной для вывода (KeSetEvent).
11. Приложение в usermode реагирует на событие и вызывает DeviceIoControl для чтения буфера. DeviceIoControl (...GET_BUFFER,...,OutputBuffer,size(),...);
Как вы думаете в этой процедуре?.
- Тут у меня тоже возникают некоторые вопросы:
+ Обратная запись байта в буффер клавиатуры - это и есть байт состояния или нет, какой был? Или использовали для блокировки прерывания.
+ Разблокировать прерывание - как реализовать и после чего вызывается уже сохраненный где-то предыдущий обработчик.
+ Может быть при написании драйвера использовали и ассемблер и С.