Same kind of fixes for NtFlushBuffersFile

svn path=/trunk/; revision=14942
This commit is contained in:
Alex Ionescu 2005-05-02 05:27:32 +00:00
parent fb52d69134
commit f19732f822

View file

@ -1532,10 +1532,6 @@ NtFlushWriteBuffer(VOID)
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
NTSTATUS
STDCALL
NtFlushBuffersFile (IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock)
/* /*
* FUNCTION: Flushes cached file data to disk * FUNCTION: Flushes cached file data to disk
* ARGUMENTS: * ARGUMENTS:
@ -1546,54 +1542,98 @@ NtFlushBuffersFile (IN HANDLE FileHandle,
* RETURNS: Status * RETURNS: Status
* REMARKS: This function maps to the win32 FlushFileBuffers * REMARKS: This function maps to the win32 FlushFileBuffers
*/ */
NTSTATUS
STDCALL
NtFlushBuffersFile(IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock)
{ {
PFILE_OBJECT FileObject = NULL; PFILE_OBJECT FileObject = NULL;
PIRP Irp; PIRP Irp;
PIO_STACK_LOCATION StackPtr; PIO_STACK_LOCATION StackPtr;
NTSTATUS Status; NTSTATUS Status;
KPROCESSOR_MODE PreviousMode; PDEVICE_OBJECT DeviceObject;
KEVENT Event;
BOOLEAN LocalEvent = FALSE;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
PreviousMode = ExGetPreviousMode(); /* Get the File Object */
Status = ObReferenceObjectByHandle(FileHandle,
FILE_WRITE_DATA,
NULL,
PreviousMode,
(PVOID*)&FileObject,
NULL);
if (Status != STATUS_SUCCESS) return(Status);
Status = ObReferenceObjectByHandle(FileHandle, /* Check if this is a direct open or not */
FILE_WRITE_DATA, if (FileObject->Flags & FO_DIRECT_DEVICE_OPEN)
NULL, {
PreviousMode, DeviceObject = IoGetAttachedDevice(FileObject->DeviceObject);
(PVOID*)&FileObject, }
NULL); else
if (Status != STATUS_SUCCESS) {
{ DeviceObject = IoGetRelatedDeviceObject(FileObject);
return(Status); }
}
KeResetEvent( &FileObject->Event ); /* Check if we should use Sync IO or not */
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_FLUSH_BUFFERS, if (FileObject->Flags & FO_SYNCHRONOUS_IO)
FileObject->DeviceObject, {
NULL, /* Use File Object event */
0, KeClearEvent(&FileObject->Event);
NULL, }
&FileObject->Event, else
IoStatusBlock); {
/* Use local event */
KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
LocalEvent = TRUE;
}
/* Trigger FileObject/Event dereferencing */ /* Allocate the IRP */
Irp->Tail.Overlay.OriginalFileObject = FileObject; if (!(Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE)))
{
ObDereferenceObject(FileObject);
return STATUS_INSUFFICIENT_RESOURCES;
}
/* Set up the IRP */
Irp->Flags = (LocalEvent) ? IRP_SYNCHRONOUS_API : 0;
Irp->RequestorMode = PreviousMode;
Irp->UserIosb = IoStatusBlock;
Irp->UserEvent = (LocalEvent) ? &Event : NULL;
Irp->Tail.Overlay.Thread = PsGetCurrentThread();
Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode; /* Set up Stack Data */
StackPtr = IoGetNextIrpStackLocation(Irp);
StackPtr->MajorFunction = IRP_MJ_FLUSH_BUFFERS;
StackPtr->FileObject = FileObject;
/* Call the Driver */
Status = IoCallDriver(DeviceObject, Irp);
if (Status == STATUS_PENDING)
{
if (LocalEvent)
{
KeWaitForSingleObject(&Event,
Executive,
PreviousMode,
FileObject->Flags & FO_ALERTABLE_IO,
NULL);
Status = IoStatusBlock->Status;
}
else
{
KeWaitForSingleObject(&FileObject->Event,
Executive,
PreviousMode,
FileObject->Flags & FO_ALERTABLE_IO,
NULL);
Status = FileObject->FinalStatus;
}
}
StackPtr = IoGetNextIrpStackLocation(Irp); /* Return the Status */
StackPtr->FileObject = FileObject; return Status;
Status = IoCallDriver(FileObject->DeviceObject,Irp);
if (Status == STATUS_PENDING)
{
KeWaitForSingleObject(&FileObject->Event,
Executive,
PreviousMode,
FileObject->Flags & FO_ALERTABLE_IO,
NULL);
Status = IoStatusBlock->Status;
}
return(Status);
} }
/* /*
@ -1650,19 +1690,18 @@ NtNotifyChangeDirectoryFile(IN HANDLE FileHandle,
} }
} }
Status = ObReferenceObjectByHandle(FileHandle, Status = ObReferenceObjectByHandle(FileHandle,
FILE_LIST_DIRECTORY, FILE_LIST_DIRECTORY,
IoFileObjectType, IoFileObjectType,
PreviousMode, PreviousMode,
(PVOID *)&FileObject, (PVOID *)&FileObject,
NULL); NULL);
if (Status != STATUS_SUCCESS) return(Status);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
DeviceObject = FileObject->DeviceObject; DeviceObject = FileObject->DeviceObject;
Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE); Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);
if (Irp==NULL) if (Irp==NULL)
{ {