Author: ion
Date: Wed Jul 5 06:02:44 2006
New Revision: 22856
URL:
http://svn.reactos.org/svn/reactos?rev=22856&view=rev
Log:
- Fix IopcloseFile... I'm not sure it was working right after the Ob changes, so
it's possible some devices weren't getting IRP_MJ_CLEANUP... also made it lock the
FO and detect malformed FOs (more spam for you on the debug logs!) -- but this is one
problem I'm planning on fixing.
Modified:
trunk/reactos/ntoskrnl/io/iomgr/file.c
Modified: trunk/reactos/ntoskrnl/io/iomgr/file.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/file.c?r…
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/file.c (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/file.c Wed Jul 5 06:02:44 2006
@@ -561,7 +561,7 @@
}
VOID
-STDCALL
+NTAPI
IopCloseFile(IN PEPROCESS Process OPTIONAL,
IN PVOID ObjectBody,
IN ACCESS_MASK GrantedAccess,
@@ -575,19 +575,40 @@
NTSTATUS Status;
PDEVICE_OBJECT DeviceObject;
- DPRINT("IopCloseFile()\n");
-
- if (HandleCount > 1 || FileObject->DeviceObject == NULL) return;
+ /* Check if the file is locked and has more then one handle opened */
+ if ((FileObject->LockOperation) && (SystemHandleCount != 1))
+ {
+ DPRINT1("We need to unlock this file!\n");
+ KEBUGCHECK(0);
+ }
+
+ /* Make sure this is the last handle */
+ if (SystemHandleCount != 1) return;
+
+ /* FIXME: ROS HACK */
+ if (!FileObject->DeviceObject)
+ {
+ DPRINT1("FIXME: MALFORMED FILE OBJECT!\n");
+ return;
+ }
/* Check if this is a direct open or not */
if (FileObject->Flags & FO_DIRECT_DEVICE_OPEN)
{
+ /* Get the attached device */
DeviceObject = IoGetAttachedDevice(FileObject->DeviceObject);
}
else
{
+ /* Get the FO's device */
DeviceObject = IoGetRelatedDeviceObject(FileObject);
}
+
+ /* Set the handle created flag */
+ FileObject->Flags |= FO_HANDLE_CREATED;
+
+ /* Check if this is a sync FO and lock it */
+ if (FileObject->Flags & FO_SYNCHRONOUS_IO) IopLockFileObject(FileObject);
/* Clear and set up Events */
KeClearEvent(&FileObject->Event);
@@ -595,12 +616,14 @@
/* Allocate an IRP */
Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
+ if (!Irp) return;
/* Set it up */
Irp->UserEvent = &Event;
Irp->UserIosb = &Irp->IoStatus;
Irp->Tail.Overlay.Thread = PsGetCurrentThread();
Irp->Tail.Overlay.OriginalFileObject = FileObject;
+ Irp->Overlay.AsynchronousParameters.UserApcRoutine = NULL;
Irp->Flags = IRP_CLOSE_OPERATION | IRP_SYNCHRONOUS_API;
/* Set up Stack Pointer Data */
@@ -608,15 +631,25 @@
StackPtr->MajorFunction = IRP_MJ_CLEANUP;
StackPtr->FileObject = FileObject;
+ /* Queue the IRP */
+ //IopQueueIrpToThread(Irp);
+
+ /* Update operation counts */
+ IopUpdateOperationCount(IopOtherTransfer);
+
/* Call the FS Driver */
Status = IoCallDriver(DeviceObject, Irp);
-
- /* Wait for completion */
if (Status == STATUS_PENDING)
{
- KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
- }
+ /* Wait for completion */
+ KeWaitForSingleObject(&Event, UserRequest, KernelMode, FALSE, NULL);
+ }
+
+ /* Free the IRP */
IoFreeIrp(Irp);
+
+ /* Release the lock if we were holding it */
+ if (FileObject->Flags & FO_SYNCHRONOUS_IO) IopUnlockFileObject(FileObject);
}
NTSTATUS
@@ -986,7 +1019,7 @@
SecurityContext.DesiredAccess = DesiredAccess;
SecurityContext.FullCreateOptions = 0; /* ?? */
- KeInitializeEvent(&FileObject->Lock, SynchronizationEvent, FALSE);
+ KeInitializeEvent(&FileObject->Lock, SynchronizationEvent, TRUE);
KeInitializeEvent(&FileObject->Event, NotificationEvent, FALSE);
DPRINT("FileObject 0x%p\n", FileObject);