Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ntddk.h>
- #pragma warning( disable : 4189 )
- typedef struct {
- PDEVICE_OBJECT LowerKbdDevice;
- } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
- typedef struct _KEYBOARD_INPUT_DATA {
- USHORT UnitId;
- USHORT MakeCode;
- USHORT Flags;
- USHORT Reserved;
- ULONG ExtraInformation;
- } KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;
- PDEVICE_OBJECT myKbdDevice = NULL;
- ULONG pendingKey = 0;
- NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath);
- VOID DriverUnload(PDRIVER_OBJECT DriverObject);
- NTSTATUS DispatchPass(PDEVICE_OBJECT DeviceObject, PIRP Irp) {
- // копирование текущей структуры IRP в следующий элемент стека
- IoCopyCurrentIrpStackLocationToNext(Irp);
- // вызов следующего в стеке драйвера для обработки IRP
- return IoCallDriver(((PDEVICE_EXTENSION)DeviceObject->DeviceExtension)->LowerKbdDevice, Irp);
- }
- NTSTATUS ReadComplete(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context) {
- UNREFERENCED_PARAMETER(DeviceObject);
- UNREFERENCED_PARAMETER(Context);
- // массив строк для интерпретации флагов в структуре KEYBOARD_INPUT_DATA
- CHAR* keyflag[4] = { "KeyDown", "KeyUp", "E0", "E1" };
- // получение указателя на массив структур KEYBOARD_INPUT_DATA из буфера системного IRP
- PKEYBOARD_INPUT_DATA Keys = (PKEYBOARD_INPUT_DATA)Irp->AssociatedIrp.SystemBuffer;
- // расчет количества структур KEYBOARD_INPUT_DATA в буфере
- int structnum = (int) (Irp->IoStatus.Information / sizeof(KEYBOARD_INPUT_DATA));
- int i;
- if (Irp->IoStatus.Status == STATUS_SUCCESS) {
- // вывод информации о скан-коде и флагах в отладочную консоль
- for (i = 0; i < structnum; i++) {
- DbgPrintEx(0, 0, "the scan code is %x (%s)\n", Keys[i].MakeCode, keyflag[Keys[i].Flags]);
- }
- }
- // пометка IRP как ожидающего завершения, если это необходимо
- if (Irp->PendingReturned) {
- IoMarkIrpPending(Irp);
- }
- // уменьшение счетчика ожидающих обработки запросов чтения
- pendingKey--;
- return Irp->IoStatus.Status;
- }
- NTSTATUS DispatchRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) {
- // копирование текущей структуры IRP в следующий элемент стека
- IoCopyCurrentIrpStackLocationToNext(Irp);
- // устанавка обработчика завершения для IRP
- IoSetCompletionRoutine(Irp, ReadComplete, NULL, TRUE, TRUE, TRUE);
- // увеличение счетчика ожидающих обработки запросов чтения
- pendingKey++;
- // вызов следующего в стеке драйвера для обработки IRP
- return IoCallDriver(((PDEVICE_EXTENSION)DeviceObject->DeviceExtension)->LowerKbdDevice, Irp);
- }
- NTSTATUS MyAttachDevice(PDRIVER_OBJECT DriverObject) {
- NTSTATUS status;
- UNICODE_STRING TargetDevice = RTL_CONSTANT_STRING(L"\\Device\\KeyboardClass0");
- // создание устройства
- status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_KEYBOARD, 0, FALSE, &myKbdDevice);
- if (!NT_SUCCESS(status)) {
- return status;
- }
- // установка флагов для устройства с буферизованным вводом/выводом
- myKbdDevice->Flags |= DO_BUFFERED_IO;
- // сброс флага инициализации устройства
- myKbdDevice->Flags &= ~DO_DEVICE_INITIALIZING;
- // заполнение нулями расширенной структуры устройства
- RtlZeroMemory(myKbdDevice->DeviceExtension, sizeof(DEVICE_EXTENSION));
- // присоединение устройства к клавиатуре
- status = IoAttachDevice(myKbdDevice, &TargetDevice, &((PDEVICE_EXTENSION)myKbdDevice->DeviceExtension)->LowerKbdDevice);
- if (!NT_SUCCESS(status)) {
- // удаление устройства в случае неудачи
- IoDeleteDevice(myKbdDevice);
- return status;
- }
- return STATUS_SUCCESS;
- }
- VOID DriverUnload(PDRIVER_OBJECT DriverObject) {
- LARGE_INTEGER interval = { 0 };
- PDEVICE_OBJECT DeviceObject = DriverObject->DeviceObject;
- interval.QuadPart = -10 * 1000 * 1000;
- // отсоединение устройства клавиатуры
- IoDetachDevice(((PDEVICE_EXTENSION)DeviceObject->DeviceExtension)->LowerKbdDevice);
- // ожидание завершения обработки всех оставшихся запросов чтения
- while (pendingKey) {
- KeDelayExecutionThread(KernelMode, FALSE, &interval);
- }
- // удаление устройства клавиатуры
- IoDeleteDevice(myKbdDevice);
- DbgPrintEx(0, 0, "DriverUnload\n");
- }
- NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {
- UNREFERENCED_PARAMETER(RegistryPath);
- NTSTATUS status;
- int i;
- // установка функции, которая выполнится при выгрузке драйвера
- DriverObject->DriverUnload = DriverUnload;
- // устанавка функций обработки по умолчанию для всех типов IRP
- for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) {
- DriverObject->MajorFunction[i] = DispatchPass;
- }
- // устанвока функции для перехвата операций чтения
- DriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead;
- // создание и присоединение устройства к драйверу
- status = MyAttachDevice(DriverObject);
- if (!NT_SUCCESS(status)) {
- DbgPrintEx(0, 0, "Attaching is failed\n");
- } else {
- DbgPrintEx(0, 0, "Attaching is successful\n");
- }
- return status;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement