2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel
4 * FILE: ntoskrnl/fs/fastio.c
5 * PURPOSE: File System Routines which support Fast I/O or Cc Access.
7 * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
10 /* INCLUDES ****************************************************************/
14 #include <internal/debug.h>
16 /* GLOBALS *******************************************************************/
18 extern ULONG CcFastReadNotPossible
;
19 extern ULONG CcFastReadResourceMiss
;
20 extern ULONG CcFastReadWait
;
21 extern ULONG CcFastReadNoWait
;
23 /* FUNCTIONS *****************************************************************/
30 FsRtlIncrementCcFastReadResourceMiss( VOID
)
32 CcFastReadResourceMiss
++;
40 FsRtlIncrementCcFastReadNotPossible( VOID
)
42 CcFastReadNotPossible
++;
50 FsRtlIncrementCcFastReadWait( VOID
)
60 FsRtlIncrementCcFastReadNoWait( VOID
)
76 * From Bo Branten's ntifs.h v12.
82 FsRtlCopyRead(IN PFILE_OBJECT FileObject
,
83 IN PLARGE_INTEGER FileOffset
,
88 OUT PIO_STATUS_BLOCK IoStatus
,
89 IN PDEVICE_OBJECT DeviceObject
)
106 * From Bo Branten's ntifs.h v12.
112 FsRtlCopyWrite(IN PFILE_OBJECT FileObject
,
113 IN PLARGE_INTEGER FileOffset
,
118 OUT PIO_STATUS_BLOCK IoStatus
,
119 IN PDEVICE_OBJECT DeviceObject
)
139 FsRtlGetFileSize(IN PFILE_OBJECT FileObject
,
140 IN OUT PLARGE_INTEGER FileSize
)
142 FILE_STANDARD_INFORMATION Info
;
144 IO_STATUS_BLOCK IoStatusBlock
;
146 PDEVICE_OBJECT DeviceObject
;
147 PFAST_IO_DISPATCH FastDispatch
;
149 /* Get Device Object and Fast Calls */
150 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
151 FastDispatch
= DeviceObject
->DriverObject
->FastIoDispatch
;
153 /* Check if we support Fast Calls, and check this one */
154 if (FastDispatch
&& FastDispatch
->FastIoQueryStandardInfo
)
157 FastDispatch
->FastIoQueryStandardInfo(FileObject
,
162 Status
= IoStatusBlock
.Status
;
167 Status
= IoQueryFileInformation(FileObject
,
168 FileStandardInformation
,
175 if (NT_SUCCESS(Status
))
177 *FileSize
= Info
.EndOfFile
;
198 FsRtlMdlRead(IN PFILE_OBJECT FileObject
,
199 IN PLARGE_INTEGER FileOffset
,
203 OUT PIO_STATUS_BLOCK IoStatus
)
205 PDEVICE_OBJECT DeviceObject
, BaseDeviceObject
;
206 PFAST_IO_DISPATCH FastDispatch
;
208 /* Get Device Object and Fast Calls */
209 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
210 FastDispatch
= DeviceObject
->DriverObject
->FastIoDispatch
;
212 /* Check if we support Fast Calls, and check this one */
213 if (FastDispatch
&& FastDispatch
->MdlRead
)
215 /* Use the fast path */
216 return FastDispatch
->MdlRead(FileObject
,
225 /* Get the Base File System (Volume) and Fast Calls */
226 BaseDeviceObject
= IoGetBaseFileSystemDeviceObject(FileObject
);
227 FastDispatch
= BaseDeviceObject
->DriverObject
->FastIoDispatch
;
229 /* If the Base Device Object has its own FastDispatch Routine, fail */
230 if (FastDispatch
&& FastDispatch
->MdlRead
&&
231 BaseDeviceObject
!= DeviceObject
)
236 /* No fast path, use slow path */
237 return FsRtlMdlReadDev(FileObject
,
248 * FsRtlMdlReadComplete@8
260 FsRtlMdlReadComplete(IN PFILE_OBJECT FileObject
,
261 IN OUT PMDL MdlChain
)
263 PDEVICE_OBJECT DeviceObject
, BaseDeviceObject
;
264 PFAST_IO_DISPATCH FastDispatch
;
266 /* Get Device Object and Fast Calls */
267 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
268 FastDispatch
= DeviceObject
->DriverObject
->FastIoDispatch
;
270 /* Check if we support Fast Calls, and check this one */
271 if (FastDispatch
&& FastDispatch
->MdlReadComplete
)
273 /* Use the fast path */
274 return FastDispatch
->MdlReadComplete(FileObject
,
279 /* Get the Base File System (Volume) and Fast Calls */
280 BaseDeviceObject
= IoGetBaseFileSystemDeviceObject(FileObject
);
281 FastDispatch
= BaseDeviceObject
->DriverObject
->FastIoDispatch
;
283 /* If the Base Device Object has its own FastDispatch Routine, fail */
284 if (FastDispatch
&& FastDispatch
->MdlReadComplete
&&
285 BaseDeviceObject
!= DeviceObject
)
290 /* No fast path, use slow path */
291 return FsRtlMdlReadCompleteDev(FileObject
, MdlChain
, DeviceObject
);
297 * FsRtlMdlReadCompleteDev@12
306 * From Bo Branten's ntifs.h v13.
307 * (CcMdlReadCompleteDev declared in internal/cc.h)
313 FsRtlMdlReadCompleteDev(IN PFILE_OBJECT FileObject
,
315 IN PDEVICE_OBJECT DeviceObject
)
317 /* Call the Cache Manager */
318 CcMdlReadCompleteDev(MdlChain
, FileObject
);
336 FsRtlMdlReadDev(IN PFILE_OBJECT FileObject
,
337 IN PLARGE_INTEGER FileOffset
,
341 OUT PIO_STATUS_BLOCK IoStatus
,
342 IN PDEVICE_OBJECT DeviceObject
)
351 * FsRtlMdlWriteComplete@12
363 FsRtlMdlWriteComplete(IN PFILE_OBJECT FileObject
,
364 IN PLARGE_INTEGER FileOffset
,
367 PDEVICE_OBJECT DeviceObject
, BaseDeviceObject
;
368 PFAST_IO_DISPATCH FastDispatch
;
370 /* Get Device Object and Fast Calls */
371 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
372 FastDispatch
= DeviceObject
->DriverObject
->FastIoDispatch
;
374 /* Check if we support Fast Calls, and check this one */
375 if (FastDispatch
&& FastDispatch
->MdlWriteComplete
)
377 /* Use the fast path */
378 return FastDispatch
->MdlWriteComplete(FileObject
,
384 /* Get the Base File System (Volume) and Fast Calls */
385 BaseDeviceObject
= IoGetBaseFileSystemDeviceObject(FileObject
);
386 FastDispatch
= BaseDeviceObject
->DriverObject
->FastIoDispatch
;
388 /* If the Base Device Object has its own FastDispatch Routine, fail */
389 if (FastDispatch
&& FastDispatch
->MdlWriteComplete
&&
390 BaseDeviceObject
!= DeviceObject
)
395 /* No fast path, use slow path */
396 return FsRtlMdlWriteCompleteDev(FileObject
,
404 * FsRtlMdlWriteCompleteDev@16
416 FsRtlMdlWriteCompleteDev(IN PFILE_OBJECT FileObject
,
417 IN PLARGE_INTEGER FileOffset
,
419 IN PDEVICE_OBJECT DeviceObject
)
421 /* Call the Cache Manager */
422 CcMdlWriteCompleteDev(FileOffset
, MdlChain
, FileObject
);
429 * FsRtlPrepareMdlWrite@24
441 FsRtlPrepareMdlWrite(IN PFILE_OBJECT FileObject
,
442 IN PLARGE_INTEGER FileOffset
,
446 OUT PIO_STATUS_BLOCK IoStatus
)
448 PDEVICE_OBJECT DeviceObject
, BaseDeviceObject
;
449 PFAST_IO_DISPATCH FastDispatch
;
451 /* Get Device Object and Fast Calls */
452 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
453 FastDispatch
= DeviceObject
->DriverObject
->FastIoDispatch
;
455 /* Check if we support Fast Calls, and check this one */
456 if (FastDispatch
&& FastDispatch
->PrepareMdlWrite
)
458 /* Use the fast path */
459 return FastDispatch
->PrepareMdlWrite(FileObject
,
468 /* Get the Base File System (Volume) and Fast Calls */
469 BaseDeviceObject
= IoGetBaseFileSystemDeviceObject(FileObject
);
470 FastDispatch
= BaseDeviceObject
->DriverObject
->FastIoDispatch
;
472 /* If the Base Device Object has its own FastDispatch Routine, fail */
473 if (FastDispatch
&& FastDispatch
->PrepareMdlWrite
&&
474 BaseDeviceObject
!= DeviceObject
)
479 /* No fast path, use slow path */
480 return FsRtlPrepareMdlWriteDev(FileObject
,
491 * FsRtlPrepareMdlWriteDev@28
503 FsRtlPrepareMdlWriteDev(IN PFILE_OBJECT FileObject
,
504 IN PLARGE_INTEGER FileOffset
,
508 OUT PIO_STATUS_BLOCK IoStatus
,
509 IN PDEVICE_OBJECT DeviceObject
)