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(),...); 
 Как вы думаете в этой процедуре?.
 - Тут у меня тоже возникают некоторые вопросы:
    + Обратная запись байта в буффер клавиатуры - это и есть байт состояния или нет, какой был? Или использовали для     блокировки прерывания.
    + Разблокировать прерывание - как реализовать и после чего вызывается уже сохраненный где-то предыдущий обработчик.
    + Может быть при написании драйвера использовали и ассемблер и С.