Fixed a problem with buffered io IRPs
authorRex Jolliff <rex@lvcablemodem.com>
Tue, 13 Oct 1998 03:24:42 +0000 (03:24 +0000)
committerRex Jolliff <rex@lvcablemodem.com>
Tue, 13 Oct 1998 03:24:42 +0000 (03:24 +0000)
svn path=/trunk/; revision=72

reactos/ntoskrnl/io/buildirp.c
reactos/ntoskrnl/io/irp.c
reactos/ntoskrnl/io/rw.c
reactos/ntoskrnl/tst/test.c

index 0d35bb4..08590d4 100644 (file)
@@ -229,7 +229,6 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction,
           {
              RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, Buffer, Length);
           }
-       Irp->UserBuffer = NULL;
      }
    if (DeviceObject->Flags&DO_DIRECT_IO)
      {
index 70cbf13..7283c7a 100644 (file)
@@ -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)
index 4f92aad..e7ed561 100644 (file)
@@ -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);
 }
 
index 5456206..e978e95 100644 (file)
@@ -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();