Fixed a problem with buffered io IRPs

svn path=/trunk/; revision=72
This commit is contained in:
Rex Jolliff 1998-10-13 03:24:42 +00:00
parent d0c8759887
commit 37529daf35
4 changed files with 61 additions and 5 deletions

View file

@ -229,7 +229,6 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction,
{ {
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, Buffer, Length); RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, Buffer, Length);
} }
Irp->UserBuffer = NULL;
} }
if (DeviceObject->Flags&DO_DIRECT_IO) if (DeviceObject->Flags&DO_DIRECT_IO)
{ {

View file

@ -83,6 +83,7 @@ VOID IoMarkIrpPending(PIRP Irp)
DPRINT("IoGetCurrentIrpStackLocation(Irp) %x\n", DPRINT("IoGetCurrentIrpStackLocation(Irp) %x\n",
IoGetCurrentIrpStackLocation(Irp)); IoGetCurrentIrpStackLocation(Irp));
IoGetCurrentIrpStackLocation(Irp)->Control |= SL_PENDING_RETURNED; IoGetCurrentIrpStackLocation(Irp)->Control |= SL_PENDING_RETURNED;
Irp->Tail.Overlay.Thread = KeGetCurrentThread();
DPRINT("IoGetCurrentIrpStackLocation(Irp)->Control %x\n", DPRINT("IoGetCurrentIrpStackLocation(Irp)->Control %x\n",
IoGetCurrentIrpStackLocation(Irp)->Control); IoGetCurrentIrpStackLocation(Irp)->Control);
DPRINT("SL_PENDING_RETURNED %x\n",SL_PENDING_RETURNED); DPRINT("SL_PENDING_RETURNED %x\n",SL_PENDING_RETURNED);

View file

@ -112,7 +112,7 @@ NTSTATUS ZwReadFile(HANDLE FileHandle,
DPRINT("FileObject->DeviceObject %x\n",FileObject->DeviceObject); DPRINT("FileObject->DeviceObject %x\n",FileObject->DeviceObject);
Status = IoCallDriver(FileObject->DeviceObject,Irp); Status = IoCallDriver(FileObject->DeviceObject,Irp);
if (NT_SUCCESS(Status)) if (Status == STATUS_PENDING)
{ {
KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL); KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
Status = Irp->IoStatus.Status; Status = Irp->IoStatus.Status;
@ -124,6 +124,14 @@ NTSTATUS ZwReadFile(HANDLE FileHandle,
} }
} }
} }
else if (NT_SUCCESS(Status))
{
if (FileObject->DeviceObject->Flags&DO_BUFFERED_IO)
{
memcpy(Buffer,Irp->AssociatedIrp.SystemBuffer,Length);
}
}
return(Status); return(Status);
} }

View 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() void TstBegin()
{ {
ExExecuteShell(); ExExecuteShell();
// TstFileRead(); // TstFileRead();
// TstGeneralWrite(); // TstGeneralWrite();
// TstThreadSupport(); // TstThreadSupport();
// TstKeyboardRead(); // TstKeyboard();
// TstIDERead(); // TstIDERead();
// TstKeyboardRead(); // TstKeyboardRead();
// TstShell(); // TstShell();