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);
@ -231,8 +232,8 @@ VOID IopCompleteRequest(struct _KAPC* Apc,
PVOID* SystemArgument1, PVOID* SystemArgument1,
PVOID* SystemArgument2) PVOID* SystemArgument2)
{ {
IoSecondStageCompletion((PIRP)(*NormalContext), IoSecondStageCompletion((PIRP)(*NormalContext),
IO_NO_INCREMENT); IO_NO_INCREMENT);
} }
VOID IoCompleteRequest(PIRP Irp, CCHAR PriorityBoost) VOID IoCompleteRequest(PIRP Irp, CCHAR PriorityBoost)

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;
@ -123,7 +123,15 @@ NTSTATUS ZwReadFile(HANDLE FileHandle,
memcpy(Buffer,Irp->AssociatedIrp.SystemBuffer,Length); 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); 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();