- Make IoCreateFile use deferred I/O completion.

- Fixed a bug in TCP/IP that was making it complete IRP_MJ_CREATE with STATUS_SUCCESS yet with the IRP marked as pending.

svn path=/trunk/; revision=22859
This commit is contained in:
Alex Ionescu 2006-07-05 06:45:00 +00:00
parent 5338d133b3
commit ce56d2bf07
3 changed files with 13 additions and 17 deletions

View file

@ -18,7 +18,7 @@ VOID IRPRemember( PIRP Irp, PCHAR File, UINT Line ) {
}
NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) {
TI_DbgPrint(MID_TRACE,("Called: Irp %x, Status %x Event %x\n", Irp, Status, Irp->UserEvent));
DbgPrint("Called: Irp %x, Status %x Event %x\n", Irp, Status, Irp->UserEvent);
#ifdef MEMTRACK
UntrackFL( __FILE__, __LINE__, Irp );

View file

@ -385,11 +385,7 @@ TiDispatchOpenClose(
RIRP(Irp);
TI_DbgPrint(DEBUG_IRP, ("Called. DeviceObject is at (0x%X), IRP is at (0x%X).\n", DeviceObject, Irp));
IoMarkIrpPending(Irp);
Irp->IoStatus.Status = STATUS_PENDING;
Irp->IoStatus.Information = 0;
DbgPrint("Called. DeviceObject is at (0x%X), IRP is at (0x%X).\n", DeviceObject, Irp);
IrpSp = IoGetCurrentIrpStackLocation(Irp);
@ -417,7 +413,7 @@ TiDispatchOpenClose(
Status = STATUS_INVALID_DEVICE_REQUEST;
}
TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status));
DbgPrint("Leaving. Status is (0x%X)\n", Status);
return IRPFinish( Irp, Status );
}

View file

@ -892,6 +892,9 @@ IoCreateFile(OUT PHANDLE FileHandle,
NTSTATUS Status = STATUS_SUCCESS;
AUX_DATA AuxData;
ACCESS_STATE AccessState;
KIRQL OldIrql;
PKNORMAL_ROUTINE NormalRoutine;
PVOID NormalContext;
DPRINT("IoCreateFile(FileHandle 0x%p, DesiredAccess %x, "
"ObjectAttributes 0x%p ObjectAttributes->ObjectName->Buffer %S)\n",
@ -1063,8 +1066,8 @@ IoCreateFile(OUT PHANDLE FileHandle,
Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = AccessMode;
Irp->Flags = IRP_CREATE_OPERATION |
IRP_SYNCHRONOUS_API;// |
//IRP_DEFER_IO_COMPLETION;
IRP_SYNCHRONOUS_API |
IRP_DEFER_IO_COMPLETION;
Irp->Tail.Overlay.Thread = PsGetCurrentThread();
Irp->UserEvent = &FileObject->Event;
Irp->UserIosb = IoStatusBlock;
@ -1130,21 +1133,18 @@ IoCreateFile(OUT PHANDLE FileHandle,
NULL);
Status = IoStatusBlock->Status;
}
#if 0
else
{
/* We'll have to complete it ourselves */
ASSERT(!Irp->PendingReturned);
KeRaiseIrql(APC_LEVEL, &OldIrql);
FileObject->Event.Header.SignalState = 1;
if ((Irp->Flags & IRP_BUFFERED_IO) && (Irp->Flags & IRP_DEALLOCATE_BUFFER))
{
ExFreePool(Irp->AssociatedIrp.SystemBuffer);
}
IoFreeIrp(Irp);
IopCompleteRequest(&Irp->Tail.Apc,
&NormalRoutine,
&NormalContext,
(PVOID*)&FileObject,
&NormalContext);
KeLowerIrql(OldIrql);
}
#endif
if (!NT_SUCCESS(Status))
{
DPRINT("Failing create request with status %x\n", Status);