Fix IopDeleteFile: Use IRP_SYNC_API flag, use local stack event, fix memory leak (Free completion context), dereference completion port, get the right deviceobject if FO_DIRECT_DEVICE_OPEN is set

svn path=/trunk/; revision=14920
This commit is contained in:
Alex Ionescu 2005-05-01 19:36:00 +00:00
parent 722d9a84e4
commit f7695b0f53

View file

@ -177,56 +177,71 @@ VOID
STDCALL STDCALL
IopDeleteFile(PVOID ObjectBody) IopDeleteFile(PVOID ObjectBody)
{ {
PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody; PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
PIRP Irp; PIRP Irp;
PIO_STACK_LOCATION StackPtr; PIO_STACK_LOCATION StackPtr;
NTSTATUS Status; NTSTATUS Status;
KEVENT Event;
PDEVICE_OBJECT DeviceObject;
IO_STATUS_BLOCK IoStatusBlock;
DPRINT("IopDeleteFile()\n"); DPRINT("IopDeleteFile()\n");
if (FileObject->DeviceObject) if (FileObject->DeviceObject)
{ {
#if 0 /* Check if this is a direct open or not */
//NOTE: Allmost certain that the latest changes to I/O Mgr makes this redundant (OriginalFileObject case) if (FileObject->Flags & FO_DIRECT_DEVICE_OPEN)
{
DeviceObject = IoGetAttachedDevice(FileObject->DeviceObject);
}
else
{
DeviceObject = IoGetRelatedDeviceObject(FileObject);
}
ObReferenceObjectByPointer(ObjectBody, /* Clear and set up Events */
STANDARD_RIGHTS_REQUIRED, KeClearEvent(&FileObject->Event);
IoFileObjectType, KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
UserMode);
#endif
KeResetEvent( &FileObject->Event );
Irp = IoAllocateIrp(FileObject->DeviceObject->StackSize, TRUE); /* Allocate an IRP */
if (Irp == NULL) Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);
{
/*
* FIXME: This case should eventually be handled. We should wait
* until enough memory is available to allocate the IRP.
*/
ASSERT(FALSE);
}
Irp->UserEvent = &FileObject->Event; /* Set it up */
Irp->Tail.Overlay.Thread = PsGetCurrentThread(); Irp->UserEvent = &Event;
Irp->Flags |= IRP_CLOSE_OPERATION; Irp->UserIosb = &IoStatusBlock;
Irp->Tail.Overlay.Thread = PsGetCurrentThread();
Irp->Tail.Overlay.OriginalFileObject= FileObject;
Irp->Flags = IRP_CLOSE_OPERATION | IRP_SYNCHRONOUS_API;
StackPtr = IoGetNextIrpStackLocation(Irp); /* Set up Stack Pointer Data */
StackPtr->MajorFunction = IRP_MJ_CLOSE; StackPtr = IoGetNextIrpStackLocation(Irp);
StackPtr->DeviceObject = FileObject->DeviceObject; StackPtr->MajorFunction = IRP_MJ_CLOSE;
StackPtr->FileObject = FileObject; StackPtr->DeviceObject = DeviceObject;
StackPtr->FileObject = FileObject;
Status = IoCallDriver(FileObject->DeviceObject, Irp); /* Call the FS Driver */
if (Status == STATUS_PENDING) Status = IoCallDriver(DeviceObject, Irp);
{
KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
}
}
if (FileObject->FileName.Buffer != NULL) /* Wait for completion */
{ if (Status == STATUS_PENDING)
ExFreePool(FileObject->FileName.Buffer); {
FileObject->FileName.Buffer = 0; KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
} }
/* Clear the file name */
if (FileObject->FileName.Buffer)
{
ExFreePool(FileObject->FileName.Buffer);
FileObject->FileName.Buffer = NULL;
}
/* Free the completion context */
if (FileObject->CompletionContext)
{
ObDereferenceObject(FileObject->CompletionContext->Port);
ExFreePool(FileObject->CompletionContext);
}
}
} }
static static