> Спасибо, за совет, будет время, попробую так сделать, если > получится. > Конечно было бы лучше пример кода, а то пока плохо у меня > все получается :(
Пример есть в ddk samples-ах. Например именно так работает IOCTL_SERIAL_WAIT_ON_MASK в src/kernel/serial
> Вот, например, захотелось помигать индикаторами на > клавиатуре из процедуры таймера, но при вызове > IoBuildDeviceIoControlRequest компьютер уходит на > перезагрузку, что не так, может это делают по-другому?
Во первых выключи автоматическую перезагрузку:
Мой компютер (правой кнопкой)->Свойства->Дополнительно (вкладка)->Параметры (в группе "Загрузка и восстановление")->Чекбокс Выполнить автоматическую перезагрузку (в группе "Отказ системы") выключить
Кроме того неплохо было бы поставить какой нибудь отладчик уровня ядра (SoftICE или KD - кому что нравится)
> 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; // а тут уже ПК идет на перезагрузку
Скорее всего твой bugcheck IRQL_NOT_LESS_OR_EQUAL. Дело в том, что практически все функции I/O manager-а должны вызываться на IRQL == PASSIVE_LEVEL, если больше - то вылетает этот багчек.
> 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_SUCCESS?
> status = iosb.Status; > } > > return status; > > переменная KeyboardDeviceObject задается в AddDevice: > > status = IoCreateDevice(Driver, > maxSize, > NULL, > FILE_DEVICE_UNKNOWN, // > неизвестно для клавиатуры или мышы создается устройство
Здесь лучше использовать PhysicalDeviceObject->DeviceType (где PhysicalDeviceObject - второй аргумент твоего обработчика AddDevice).
> 0, > FALSE, > &device > ); > > RtlZeroMemory(device->DeviceExtension, > sizeof(maxSize));
Неправильно, тебе надо указывать не размер ПЕРЕМЕННОЙ maxSize, а ее значение
> devExt = (PKEYBOARD_DEVICE_EXTENSION) > device->DeviceExtension; > devExt->TopOfStack = > IoAttachDeviceToDeviceStack(device, PDO);
Не проверяешь возвращенное значение. Оно МОЖЕТ быть NULL, а у тебя могут быть проблемы когда оно будет NULL
> if ( IsKeyboard ) KeyboardDeviceObject = > devExt->TopOfStack;
|