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