{
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, Buffer, Length);
}
- Irp->UserBuffer = NULL;
}
if (DeviceObject->Flags&DO_DIRECT_IO)
{
DPRINT("IoGetCurrentIrpStackLocation(Irp) %x\n",
IoGetCurrentIrpStackLocation(Irp));
IoGetCurrentIrpStackLocation(Irp)->Control |= SL_PENDING_RETURNED;
+ Irp->Tail.Overlay.Thread = KeGetCurrentThread();
DPRINT("IoGetCurrentIrpStackLocation(Irp)->Control %x\n",
IoGetCurrentIrpStackLocation(Irp)->Control);
DPRINT("SL_PENDING_RETURNED %x\n",SL_PENDING_RETURNED);
PVOID* SystemArgument1,
PVOID* SystemArgument2)
{
- IoSecondStageCompletion((PIRP)(*NormalContext),
- IO_NO_INCREMENT);
+ IoSecondStageCompletion((PIRP)(*NormalContext),
+ IO_NO_INCREMENT);
}
VOID IoCompleteRequest(PIRP Irp, CCHAR PriorityBoost)
DPRINT("FileObject->DeviceObject %x\n",FileObject->DeviceObject);
Status = IoCallDriver(FileObject->DeviceObject,Irp);
- if (NT_SUCCESS(Status))
+ if (Status == STATUS_PENDING)
{
KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
Status = Irp->IoStatus.Status;
memcpy(Buffer,Irp->AssociatedIrp.SystemBuffer,Length);
}
}
+ }
+ else if (NT_SUCCESS(Status))
+ {
+ if (FileObject->DeviceObject->Flags&DO_BUFFERED_IO)
+ {
+ memcpy(Buffer,Irp->AssociatedIrp.SystemBuffer,Length);
+ }
}
+
return(Status);
}
}
}
+void
+TstKeyboard(void)
+{
+ NTSTATUS Status;
+ HANDLE FileHandle;
+ ANSI_STRING AnsiDeviceName;
+ UNICODE_STRING UnicodeDeviceName;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ KEY_EVENT_RECORD KeyEvent[2];
+
+ DbgPrint("Testing keyboard driver...\n");
+
+ DbgPrint("Opening Keyboard device\n");
+ RtlInitAnsiString(&AnsiDeviceName, "\\Device\\Keyboard");
+ RtlAnsiStringToUnicodeString(&UnicodeDeviceName, &AnsiDeviceName, TRUE);
+ InitializeObjectAttributes(&ObjectAttributes,
+ &UnicodeDeviceName,
+ 0,
+ NULL,
+ NULL);
+ Status = ZwOpenFile(&FileHandle, FILE_GENERIC_READ, &ObjectAttributes, NULL, 0, 0);
+ if (!NT_SUCCESS(Status))
+ {
+ DbgPrint("Failed to open keyboard\n");
+ return;
+ }
+
+ DbgPrint(">");
+ for(;;)
+ {
+ Status = ZwReadFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ &KeyEvent,
+ sizeof(KeyEvent),
+ 0,
+ 0);
+ if (!NT_SUCCESS(Status))
+ {
+ DbgPrint("Failed to read key event, status %08x\n", Status);
+ return;
+ }
+ DbgPrint("%c",KeyEvent[0].AsciiChar);
+ }
+}
+
void TstBegin()
{
ExExecuteShell();
// TstFileRead();
// TstGeneralWrite();
// TstThreadSupport();
-// TstKeyboardRead();
+// TstKeyboard();
// TstIDERead();
// TstKeyboardRead();
// TstShell();