411b0004ae3fabca7c0c0ce958eaddff54f54daa
[reactos.git] / ntoskrnl / io / page.c
1 /* $Id$
2  *
3  * COPYRIGHT:       See COPYING in the top level directory
4  * PROJECT:         ReactOS kernel
5  * FILE:            ntoskrnl/io/page.c
6  * PURPOSE:         
7  * PROGRAMMER:      
8  * UPDATE HISTORY:
9  *                  
10  */
11
12 /* INCLUDES *****************************************************************/
13
14 #include <ddk/ntddk.h>
15 #include <internal/io.h>
16
17 #define NDEBUG
18 #include <internal/debug.h>
19
20 /* FUNCTIONS *****************************************************************/
21
22 NTSTATUS STDCALL 
23 IoPageWrite(PFILE_OBJECT FileObject,
24             PMDL Mdl,
25             PLARGE_INTEGER Offset,
26             PKEVENT Event,
27             PIO_STATUS_BLOCK StatusBlock)
28 {
29    PIRP Irp;
30    PIO_STACK_LOCATION StackPtr;
31    NTSTATUS Status;
32    
33    DPRINT("IoPageWrite(FileObject %x, Mdl %x)\n",
34           FileObject, Mdl);
35    
36    Irp = IoBuildSynchronousFsdRequestWithMdl(IRP_MJ_WRITE,
37                                              FileObject->DeviceObject,
38                                              Mdl,
39                                              Offset,
40                                              Event,
41                                              StatusBlock,
42                                              TRUE);
43    if (Irp == NULL)
44    {
45       return (STATUS_INSUFFICIENT_RESOURCES);
46    }
47    Irp->Flags = IRP_NOCACHE|IRP_PAGING_IO;
48    StackPtr = IoGetNextIrpStackLocation(Irp);
49    StackPtr->FileObject = FileObject;
50    DPRINT("Before IoCallDriver\n");
51    Status = IofCallDriver(FileObject->DeviceObject,Irp);
52    DPRINT("Status %d STATUS_PENDING %d\n",Status,STATUS_PENDING);
53    return(Status);
54 }
55
56 NTSTATUS STDCALL 
57 IoPageRead(PFILE_OBJECT FileObject,
58            PMDL Mdl,
59            PLARGE_INTEGER Offset,
60            PKEVENT Event,
61            PIO_STATUS_BLOCK StatusBlock)
62 {
63    PIRP Irp;
64    PIO_STACK_LOCATION StackPtr;
65    NTSTATUS Status;
66    
67    DPRINT("IoPageRead(FileObject %x, Mdl %x)\n",
68           FileObject, Mdl);
69    
70    Irp = IoBuildSynchronousFsdRequestWithMdl(IRP_MJ_READ,
71                                              FileObject->DeviceObject,
72                                              Mdl,
73                                              Offset,
74                                              Event,
75                                              StatusBlock,
76                                              TRUE);
77    if (Irp == NULL)
78    {
79       return (STATUS_INSUFFICIENT_RESOURCES);
80    }
81    Irp->Flags = IRP_NOCACHE
82 #ifndef LIBCAPTIVE
83          |IRP_PAGING_IO;
84 #else /* !LIBCAPTIVE */
85 /* IRP_SYNCHRONOUS_PAGING_IO: We need to prevent STATUS_PENDING
86  * IRP_PAGING_IO: We need to pass check in W32 filesystem as we are FO_CLEANUP_COMPLETE (why?)
87  */
88          |IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO;
89 #endif /* !LIBCAPTIVE */
90    StackPtr = IoGetNextIrpStackLocation(Irp);
91    StackPtr->FileObject = FileObject;
92    DPRINT("Before IoCallDriver\n");
93    Status = IofCallDriver(FileObject->DeviceObject, Irp);
94    DPRINT("Status %d STATUS_PENDING %d\n",Status,STATUS_PENDING);
95
96    return(Status);
97 }
98
99 NTSTATUS STDCALL 
100 IoSynchronousPageWrite (PFILE_OBJECT FileObject,
101                         PMDL Mdl,
102                         PLARGE_INTEGER Offset,
103                         PKEVENT Event,
104                         PIO_STATUS_BLOCK StatusBlock)
105 {
106    PIRP Irp;
107    PIO_STACK_LOCATION StackPtr;
108    NTSTATUS Status;
109    
110    DPRINT("IoSynchronousPageWrite(FileObject %x, Mdl %x, StatusBlock %x)\n",
111           FileObject, Mdl, StatusBlock);
112    
113    Irp = IoBuildSynchronousFsdRequestWithMdl(IRP_MJ_WRITE,
114                                              FileObject->DeviceObject,
115                                              Mdl,
116                                              Offset,
117                                              Event,
118                                              StatusBlock,
119                                              TRUE);
120    if (Irp == NULL)
121    {
122       return (STATUS_INSUFFICIENT_RESOURCES);
123    }
124    Irp->Flags = IRP_NOCACHE|IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO;
125    StackPtr = IoGetNextIrpStackLocation(Irp);
126    StackPtr->FileObject = FileObject;
127    DPRINT("Before IoCallDriver\n");
128    Status = IofCallDriver(FileObject->DeviceObject,Irp);
129    DPRINT("Status %d STATUS_PENDING %d\n",Status,STATUS_PENDING);
130    return(Status);
131 }
132
133 /* EOF */