mirror of
https://github.com/reactos/reactos.git
synced 2024-09-30 14:37:45 +00:00
Fixed a problem with buffered io IRPs
svn path=/trunk/; revision=72
This commit is contained in:
parent
d0c8759887
commit
37529daf35
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue