Merge 13159:13510 from trunk
[reactos.git] / reactos / ntoskrnl / io / flush.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/flush.c
6 * PURPOSE: Flushing file buffer
7 *
8 * PROGRAMMERS: David Welch (welch@cwcom.net)
9 */
10
11 /* INCLUDES *****************************************************************/
12
13 #include <ntoskrnl.h>
14 #define NDEBUG
15 #include <internal/debug.h>
16
17 /* FUNCTIONS *****************************************************************/
18
19
20 NTSTATUS
21 STDCALL
22 NtFlushWriteBuffer(VOID)
23 {
24 KeFlushWriteBuffer();
25 return STATUS_SUCCESS;
26 }
27
28 NTSTATUS
29 STDCALL
30 NtFlushBuffersFile (
31 IN HANDLE FileHandle,
32 OUT PIO_STATUS_BLOCK IoStatusBlock
33 )
34 /*
35 * FUNCTION: Flushes cached file data to disk
36 * ARGUMENTS:
37 * FileHandle = Points to the file
38 * IoStatusBlock = Caller must supply storage to receive the result of
39 * the flush buffers operation. The information field is
40 * set to number of bytes flushed to disk.
41 * RETURNS: Status
42 * REMARKS: This function maps to the win32 FlushFileBuffers
43 */
44 {
45 PFILE_OBJECT FileObject = NULL;
46 PIRP Irp;
47 PIO_STACK_LOCATION StackPtr;
48 NTSTATUS Status;
49 KPROCESSOR_MODE PreviousMode;
50
51 PreviousMode = ExGetPreviousMode();
52
53 Status = ObReferenceObjectByHandle(FileHandle,
54 FILE_WRITE_DATA,
55 NULL,
56 PreviousMode,
57 (PVOID*)&FileObject,
58 NULL);
59 if (Status != STATUS_SUCCESS)
60 {
61 return(Status);
62 }
63 KeResetEvent( &FileObject->Event );
64 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_FLUSH_BUFFERS,
65 FileObject->DeviceObject,
66 NULL,
67 0,
68 NULL,
69 &FileObject->Event,
70 IoStatusBlock);
71
72 /* Trigger FileObject/Event dereferencing */
73 Irp->Tail.Overlay.OriginalFileObject = FileObject;
74
75 Irp->RequestorMode = PreviousMode;
76
77 StackPtr = IoGetNextIrpStackLocation(Irp);
78 StackPtr->FileObject = FileObject;
79
80 Status = IoCallDriver(FileObject->DeviceObject,Irp);
81 if (Status == STATUS_PENDING)
82 {
83 KeWaitForSingleObject(&FileObject->Event,
84 Executive,
85 PreviousMode,
86 FileObject->Flags & FO_ALERTABLE_IO,
87 NULL);
88 Status = IoStatusBlock->Status;
89 }
90
91 return(Status);
92 }