Народ, подскажите пожалуйста: пишу фильтр клавиатуры, отлавливаю клавиши, мне необходим их сканкод. Вот обработчик нажатия клавиш: Код (Text): DriverObject->MajorFunction [IRP_MJ_READ] = DispatchRead; ... NTSTATUS DispatchRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PKEYBOARD_INPUT_DATA KeyData; KeyData = Irp->AssociatedIrp.SystemBuffer; DbgPrint("Key pressed: %d", KeyData[0].MakeCode); IoCopyCurrentIrpStackLocationToNext(Irp); return IoCallDriver(((PDEVICE_EXTENSION)DeviceObject->DeviceExtension)->TopOfStack, Irp); } И мне MakeCode постоянно возвращает 0. Как мне до сканкода добраться правильно?
Код (Text): NTSTATUS DispatchRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PDEVICE_EXTENSION devExt; PIO_STACK_LOCATION currentIrpStack; PIO_STACK_LOCATION nextIrpStack; devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension; currentIrpStack = IoGetCurrentIrpStackLocation(Irp); nextIrpStack = IoGetNextIrpStackLocation(Irp); *nextIrpStack = *currentIrpStack; [b]IoSetCompletionRoutine( Irp, ReadComplete,DeviceObject, TRUE, TRUE, TRUE ); [/b] [b]return IoCallDriver( devExt->TopOfStack, Irp ); [/b] } NTSTATUS ReadComplete( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ) { PIO_STACK_LOCATION IrpSp; PKEYBOARD_INPUT_DATA KeyData; IrpSp = IoGetCurrentIrpStackLocation( Irp ); if( NT_SUCCESS( Irp->IoStatus.Status ) ) { KeyData = Irp->AssociatedIrp.SystemBuffer; DbgPrint(("ScanCode: %x ", KeyData[i].MakeCode )); } if( Irp->PendingReturned ) { IoMarkIrpPending( Irp ); } return Irp->IoStatus.Status; } Смотрите исходник ctrl2cap.
спасибо, со сканкодами разобрался. Но перестала работать выгрузка драйвера. Как корректно завершить поток, обрабатывающий нажатия?