From 37529daf35bc0327322ef5e27a4952af2d2c8d9b Mon Sep 17 00:00:00 2001 From: Rex Jolliff Date: Tue, 13 Oct 1998 03:24:42 +0000 Subject: [PATCH] Fixed a problem with buffered io IRPs svn path=/trunk/; revision=72 --- reactos/ntoskrnl/io/buildirp.c | 1 - reactos/ntoskrnl/io/irp.c | 5 ++-- reactos/ntoskrnl/io/rw.c | 10 ++++++- reactos/ntoskrnl/tst/test.c | 50 +++++++++++++++++++++++++++++++++- 4 files changed, 61 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/io/buildirp.c b/reactos/ntoskrnl/io/buildirp.c index 0d35bb467c7..08590d4b4af 100644 --- a/reactos/ntoskrnl/io/buildirp.c +++ b/reactos/ntoskrnl/io/buildirp.c @@ -229,7 +229,6 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction, { RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, Buffer, Length); } - Irp->UserBuffer = NULL; } if (DeviceObject->Flags&DO_DIRECT_IO) { diff --git a/reactos/ntoskrnl/io/irp.c b/reactos/ntoskrnl/io/irp.c index 70cbf134436..7283c7a6bf3 100644 --- a/reactos/ntoskrnl/io/irp.c +++ b/reactos/ntoskrnl/io/irp.c @@ -83,6 +83,7 @@ VOID IoMarkIrpPending(PIRP Irp) 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); @@ -231,8 +232,8 @@ VOID IopCompleteRequest(struct _KAPC* Apc, PVOID* SystemArgument1, PVOID* SystemArgument2) { - IoSecondStageCompletion((PIRP)(*NormalContext), - IO_NO_INCREMENT); + IoSecondStageCompletion((PIRP)(*NormalContext), + IO_NO_INCREMENT); } VOID IoCompleteRequest(PIRP Irp, CCHAR PriorityBoost) diff --git a/reactos/ntoskrnl/io/rw.c b/reactos/ntoskrnl/io/rw.c index 4f92aadd637..e7ed56101df 100644 --- a/reactos/ntoskrnl/io/rw.c +++ b/reactos/ntoskrnl/io/rw.c @@ -112,7 +112,7 @@ NTSTATUS ZwReadFile(HANDLE FileHandle, 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; @@ -123,7 +123,15 @@ NTSTATUS ZwReadFile(HANDLE FileHandle, 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); } diff --git a/reactos/ntoskrnl/tst/test.c b/reactos/ntoskrnl/tst/test.c index 5456206a615..e978e950154 100644 --- a/reactos/ntoskrnl/tst/test.c +++ b/reactos/ntoskrnl/tst/test.c @@ -433,13 +433,61 @@ static char SectorBuffer[512 * 10]; } } +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();