Код (Text): NTSTATUS MJ_DispatchIoctl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { PIO_STACK_LOCATION irpStack; NTSTATUS status= STATUS_SUCCESS; irpStack = IoGetCurrentIrpStackLocation (Irp); switch (irpStack->Parameters.DeviceIoControl.IoControlCode) { case 1: WRITE_PORT_UCHAR(0x64,0xD2); WRITE_PORT_UCHAR(0x60,'a'); KeStallExecutionProcessor(10000); WRITE_PORT_UCHAR(0x64,0xD2); WRITE_PORT_UCHAR(0x60,'a'); WRITE_PORT_UCHAR(0x64,0xD2); WRITE_PORT_UCHAR(0x60,'a'); KeStallExecutionProcessor(10000); WRITE_PORT_UCHAR(0x64,0xD2); WRITE_PORT_UCHAR(0x60,'a'); WRITE_PORT_UCHAR(0x64,0xD2); WRITE_PORT_UCHAR(0x60,'a'); KeStallExecutionProcessor(10000); WRITE_PORT_UCHAR(0x64,0xD2); WRITE_PORT_UCHAR(0x60,'a'); DbgPrint("IOCTL CODE PASSED"); break; default: break; }; Irp->IoStatus.Status = status; IoCompleteRequest (Irp, IO_NO_INCREMENT); return status; } почему ноль результата? помогите пожалуйста/ устал уже биться/
В порт нужно писать сканкод а не аски! Кстати, такой код не будет работать на машине с отсутствующим i8042 контроллером. Сегодня это достаточно распоростанено. Если нужно - пиши в личку. Есть море опыта работы с клавиатурой в ядре.
можно ли в дрове написать так Код (Text): __asm { mov ah, 5 mov ch,0 mov cl,0dh int 16h } если нет то почему? Бсодит постоянно(
punxer Вы находитесь в защищённом режиме, там прерывания реалмода не работают. Младшие векторы используются как ловушки, старшие как железячые ISR. Вы вызывается ловушку KiTrap0F() которая специально установлена, дабы генерить багчек. В NT управление оборудованием производится посредством IOCTL. Это вам не дос. Есть(был) програмный эмулятор V8086, вызывается через сервис NtVdmControl, либо через обёртку Ke386CallBios(). Изучайте матчасть. Закрыто.