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