3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/page.c
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/io.h>
18 #include <internal/debug.h>
20 /* FUNCTIONS *****************************************************************/
25 IoPageWrite(PFILE_OBJECT FileObject,
27 PLARGE_INTEGER Offset,
29 PIO_STATUS_BLOCK StatusBlock)
32 PIO_STACK_LOCATION StackPtr;
35 DPRINT("IoPageWrite(FileObject %x, Mdl %x)\n",
38 Irp = IoBuildSynchronousFsdRequestWithMdl(IRP_MJ_WRITE,
39 FileObject->DeviceObject,
47 return (STATUS_INSUFFICIENT_RESOURCES);
49 Irp->Flags = IRP_NOCACHE|IRP_PAGING_IO;
50 StackPtr = IoGetNextIrpStackLocation(Irp);
51 StackPtr->FileObject = FileObject;
52 DPRINT("Before IoCallDriver\n");
53 Status = IofCallDriver(FileObject->DeviceObject,Irp);
54 /* FIXME: IoBuildSynchronousFsdRequestWithMdl() will fill 'StatusBlock' to 'Irp->UserIoSb'
55 * but W32 filesystem takes care just of 'Irp->IoStatus'. Hack it back here.
57 *StatusBlock=Irp->IoStatus;
58 DPRINT("Status %d STATUS_PENDING %d\n",Status,STATUS_PENDING);
62 #endif /* LIBCAPTIVE */
65 IoPageRead(PFILE_OBJECT FileObject,
67 PLARGE_INTEGER Offset,
69 PIO_STATUS_BLOCK StatusBlock)
72 PIO_STACK_LOCATION StackPtr;
75 DPRINT("IoPageRead(FileObject %x, Mdl %x)\n",
78 Irp = IoBuildSynchronousFsdRequestWithMdl(IRP_MJ_READ,
79 FileObject->DeviceObject,
87 return (STATUS_INSUFFICIENT_RESOURCES);
89 Irp->Flags = IRP_NOCACHE
92 #else /* !LIBCAPTIVE */
93 /* IRP_SYNCHRONOUS_PAGING_IO: We need to prevent STATUS_PENDING
94 * IRP_PAGING_IO: We need to pass check in W32 filesystem as we are FO_CLEANUP_COMPLETE (why?)
96 |IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO;
97 #endif /* !LIBCAPTIVE */
98 StackPtr = IoGetNextIrpStackLocation(Irp);
99 StackPtr->FileObject = FileObject;
100 DPRINT("Before IoCallDriver\n");
101 Status = IofCallDriver(FileObject->DeviceObject, Irp);
102 /* FIXME: IoBuildSynchronousFsdRequestWithMdl() will fill 'StatusBlock' to 'Irp->UserIoSb'
103 * but W32 filesystem takes care just of 'Irp->IoStatus'. Hack it back here.
105 *StatusBlock=Irp->IoStatus;
106 DPRINT("Status %d STATUS_PENDING %d\n",Status,STATUS_PENDING);
112 IoSynchronousPageWrite (PFILE_OBJECT FileObject,
114 PLARGE_INTEGER Offset,
116 PIO_STATUS_BLOCK StatusBlock)
119 PIO_STACK_LOCATION StackPtr;
122 DPRINT("IoSynchronousPageWrite(FileObject %x, Mdl %x)\n",
125 Irp = IoBuildSynchronousFsdRequestWithMdl(IRP_MJ_WRITE,
126 FileObject->DeviceObject,
134 return (STATUS_INSUFFICIENT_RESOURCES);
136 Irp->Flags = IRP_NOCACHE|IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO;
137 StackPtr = IoGetNextIrpStackLocation(Irp);
138 StackPtr->FileObject = FileObject;
139 DPRINT("Before IoCallDriver\n");
140 Status = IofCallDriver(FileObject->DeviceObject,Irp);
141 /* FIXME: IoBuildSynchronousFsdRequestWithMdl() will fill 'StatusBlock' to 'Irp->UserIoSb'
142 * but W32 filesystem takes care just of 'Irp->IoStatus'. Hack it back here.
144 *StatusBlock=Irp->IoStatus;
145 DPRINT("Status %d STATUS_PENDING %d\n",Status,STATUS_PENDING);