don't touch FileObject after IoCallDriver + cleanup

svn path=/trunk/; revision=4326
This commit is contained in:
Gunnar Dalsnes
2003-03-17 22:30:55 +00:00
parent d03afca494
commit cff9e3c02f
+7 -9
View File
@@ -58,6 +58,7 @@ NtLockFile (
IO_STATUS_BLOCK LocalIoStatusBlock;
PIO_STATUS_BLOCK IoStatusBlock;
PDEVICE_OBJECT DeviceObject;
ULONG FobFlags;
//FIXME: instead of this, use SEH when available?
if (!Length || !ByteOffset) {
@@ -65,13 +66,9 @@ NtLockFile (
goto fail;
}
/*
BUGBUG: ObReferenceObjectByHandle fails if DesiredAccess=0 and mode=UserMode!
It should ONLY fail if we desire an access that conflict with granted access!
*/
Status = ObReferenceObjectByHandle(
FileHandle,
FILE_READ_DATA,//BUGBUG: have to use something...but shouldn't have to!
0,
IoFileObjectType,
ExGetPreviousMode(),
(PVOID*)&FileObject,
@@ -127,7 +124,6 @@ NtLockFile (
StackPtr = IoGetNextIrpStackLocation(Irp);
StackPtr->MajorFunction = IRP_MJ_LOCK_CONTROL;
StackPtr->MinorFunction = IRP_MN_LOCK;
StackPtr->DeviceObject = DeviceObject;
StackPtr->FileObject = FileObject;
if (ExclusiveLock) StackPtr->Flags |= SL_EXCLUSIVE_LOCK;
@@ -157,15 +153,17 @@ NtLockFile (
TRUE,
TRUE );
//can't touch FileObject after IoCallDriver since it might be freed
FobFlags = FileObject->Flags;
Status = IofCallDriver(DeviceObject, Irp);
if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO)) {
if (Status == STATUS_PENDING && (FobFlags & FO_SYNCHRONOUS_IO)) {
Status = KeWaitForSingleObject(
Event,
Executive,
ExGetPreviousMode() ,
(FileObject->Flags & FO_ALERTABLE_IO) ? TRUE : FALSE,
(FobFlags & FO_ALERTABLE_IO) ? TRUE : FALSE,
NULL
);
@@ -181,7 +179,7 @@ NtLockFile (
Status = LocalIoStatusBlock.Status;
}
if (FileObject->Flags & FO_SYNCHRONOUS_IO)
if (FobFlags & FO_SYNCHRONOUS_IO)
*UserIoStatusBlock = LocalIoStatusBlock;
return Status;