> Правильным способом будет держать в третьем кольце программу с вызовом > DeviceIoControl, драйвер принимает его и возвращает > STATUS_PENDING.
Спасибо, за совет, будет время, попробую так сделать, если получится.
Конечно было бы лучше пример кода, а то пока плохо у меня все получается :(
Вот, например, захотелось помигать индикаторами на клавиатуре из процедуры таймера, но при вызове IoBuildDeviceIoControlRequest компьютер уходит на перезагрузку, что не так, может это делают по-другому?
KEVENT event;
NTSTATUS status = STATUS_SUCCESS;
IO_STATUS_BLOCK iosb;
PIRP irp;
KEYBOARD_INDICATOR_PARAMETERS InputBuffer;
InputBuffer.UnitId = 0;
InputBuffer.LedFlags = KEYBOARD_NUM_LOCK_ON | KEYBOARD_CAPS_LOCK_ON | KEYBOARD_SCROLL_LOCK_ON;
KeInitializeEvent(&event,
NotificationEvent,
FALSE
);
DbgPrint("KbFilter_SendIoctl: Target 0x%08lx\n", KeyboardDeviceObject);
// return status; // здесь еще работает
if (NULL == (irp = IoBuildDeviceIoControlRequest(
IOCTL_KEYBOARD_SET_INDICATORS,
KeyboardDeviceObject,
(PVOID) &InputBuffer,
sizeof(KEYBOARD_INDICATOR_PARAMETERS)
NULL,
0,
TRUE,
&event,
&iosb))) {
return STATUS_INSUFFICIENT_RESOURCES;
}
// return status; // а тут уже ПК идет на перезагрузку
status = IoCallDriver(KeyboardDeviceObject, irp);
if (STATUS_PENDING == status) {
status = KeWaitForSingleObject(&event,
Executive,
KernelMode,
FALSE, // Not alertable
NULL); // No timeout structure
ASSERT(STATUS_SUCCESS == status);
status = iosb.Status;
}
return status;
переменная KeyboardDeviceObject задается в AddDevice:
status = IoCreateDevice(Driver,
maxSize,
NULL,
FILE_DEVICE_UNKNOWN, // неизвестно для клавиатуры или мышы создается устройство
0,
FALSE,
&device
);
RtlZeroMemory(device->DeviceExtension, sizeof(maxSize));
devExt = (PKEYBOARD_DEVICE_EXTENSION) device->DeviceExtension;
devExt->TopOfStack = IoAttachDeviceToDeviceStack(device, PDO);
if ( IsKeyboard ) KeyboardDeviceObject = devExt->TopOfStack;
|