Fix IopCloseFile: Use IRP_SYNC_API flag, use local stack event, get the right deviceobject if FO_DIRECT_DEVICE_OPEN is set, set IRP_CLOSE_OPERATION flag. Modified: trunk/reactos/ntoskrnl/io/file.c _____
Modified: trunk/reactos/ntoskrnl/io/file.c --- trunk/reactos/ntoskrnl/io/file.c 2005-05-01 19:36:00 UTC (rev 14920) +++ trunk/reactos/ntoskrnl/io/file.c 2005-05-01 19:46:51 UTC (rev 14921) @@ -183,7 +183,6 @@
NTSTATUS Status; KEVENT Event; PDEVICE_OBJECT DeviceObject; - IO_STATUS_BLOCK IoStatusBlock;
DPRINT("IopDeleteFile()\n");
@@ -208,9 +207,9 @@
/* Set it up */ Irp->UserEvent = &Event; - Irp->UserIosb = &IoStatusBlock; + Irp->UserIosb = &Irp->IoStatus; Irp->Tail.Overlay.Thread = PsGetCurrentThread(); - Irp->Tail.Overlay.OriginalFileObject= FileObject; + Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Flags = IRP_CLOSE_OPERATION | IRP_SYNCHRONOUS_API;
/* Set up Stack Pointer Data */ @@ -493,48 +492,54 @@ IopCloseFile(PVOID ObjectBody, ULONG HandleCount) { - PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody; - PIRP Irp; - PIO_STACK_LOCATION StackPtr; - NTSTATUS Status; + PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody; + KEVENT Event; + PIRP Irp; + PIO_STACK_LOCATION StackPtr; + NTSTATUS Status; + PDEVICE_OBJECT DeviceObject;
- DPRINT("IopCloseFile()\n"); + DPRINT("IopCloseFile()\n");
- if (HandleCount > 1 || FileObject->DeviceObject == NULL) - { - return; - } + if (HandleCount > 1 || FileObject->DeviceObject == NULL) return;
-#if 0 -//NOTE: Allmost certain that the latest changes to I/O Mgr makes this redundant (OriginalFileObject case) - ObReferenceObjectByPointer(FileObject, - STANDARD_RIGHTS_REQUIRED, - IoFileObjectType, - UserMode); -#endif - - KeResetEvent( &FileObject->Event ); + /* 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);
- IO_STATUS_BLOCK Dummy; - /* WRONG WRONG WRONG WRONG!!!!!! */ - Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP, - FileObject->DeviceObject, - NULL, - 0, - NULL, - &FileObject->Event, - &Dummy); - /* Hack to fix the above WRONG WRONG WRONG WRONG CODE!!! */ - Irp->UserIosb = &Irp->IoStatus; + /* Allocate an IRP */ + Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE); + + /* Set it up */ + Irp->UserEvent = &Event; + Irp->UserIosb = &Irp->IoStatus; + 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_CLEANUP; + StackPtr->FileObject = FileObject;
- StackPtr = IoGetNextIrpStackLocation(Irp); - StackPtr->FileObject = FileObject; - - Status = IoCallDriver(FileObject->DeviceObject, Irp); - if (Status == STATUS_PENDING) - { - KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL); - } + /* Call the FS Driver */ + Status = IoCallDriver(DeviceObject, Irp); + + /* Wait for completion */ + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + } }
/* FUNCTIONS *****************************************************************/