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 CcFastReadResourceMiss
;
19 extern ULONG CcFastReadNoWait
;
21 /* FUNCTIONS *****************************************************************/
28 FsRtlIncrementCcFastReadResourceMiss( VOID
)
30 CcFastReadResourceMiss
++;
38 FsRtlIncrementCcFastReadNotPossible( VOID
)
40 CcFastReadNotPossible
++;
48 FsRtlIncrementCcFastReadWait( VOID
)
58 FsRtlIncrementCcFastReadNoWait( VOID
)
74 * From Bo Branten's ntifs.h v12.
80 FsRtlCopyRead(IN PFILE_OBJECT FileObject
,
81 IN PLARGE_INTEGER FileOffset
,
86 OUT PIO_STATUS_BLOCK IoStatus
,
87 IN PDEVICE_OBJECT DeviceObject
)
104 * From Bo Branten's ntifs.h v12.
110 FsRtlCopyWrite(IN PFILE_OBJECT FileObject
,
111 IN PLARGE_INTEGER FileOffset
,
116 OUT PIO_STATUS_BLOCK IoStatus
,
117 IN PDEVICE_OBJECT DeviceObject
)
137 FsRtlGetFileSize(IN PFILE_OBJECT FileObject
,
138 IN OUT PLARGE_INTEGER FileSize
)
140 FILE_STANDARD_INFORMATION Info
;
142 IO_STATUS_BLOCK IoStatusBlock
;
144 PDEVICE_OBJECT DeviceObject
;
145 PFAST_IO_DISPATCH FastDispatch
;
147 /* Get Device Object and Fast Calls */
148 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
149 FastDispatch
= DeviceObject
->DriverObject
->FastIoDispatch
;
151 /* Check if we support Fast Calls, and check this one */
152 if (FastDispatch
&& FastDispatch
->FastIoQueryStandardInfo
)
155 FastDispatch
->FastIoQueryStandardInfo(FileObject
,
160 Status
= IoStatusBlock
.Status
;
165 Status
= IoQueryFileInformation(FileObject
,
166 FileStandardInformation
,
173 if (NT_SUCCESS(Status
))
175 *FileSize
= Info
.EndOfFile
;
196 FsRtlMdlRead(IN PFILE_OBJECT FileObject
,
197 IN PLARGE_INTEGER FileOffset
,
201 OUT PIO_STATUS_BLOCK IoStatus
)
203 PDEVICE_OBJECT DeviceObject
, BaseDeviceObject
;
204 PFAST_IO_DISPATCH FastDispatch
;
206 /* Get Device Object and Fast Calls */
207 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
208 FastDispatch
= DeviceObject
->DriverObject
->FastIoDispatch
;
210 /* Check if we support Fast Calls, and check this one */
211 if (FastDispatch
&& FastDispatch
->MdlRead
)
213 /* Use the fast path */
214 return FastDispatch
->MdlRead(FileObject
,
223 /* Get the Base File System (Volume) and Fast Calls */
224 BaseDeviceObject
= IoGetBaseFileSystemDeviceObject(FileObject
);
225 FastDispatch
= BaseDeviceObject
->DriverObject
->FastIoDispatch
;
227 /* If the Base Device Object has its own FastDispatch Routine, fail */
228 if (FastDispatch
&& FastDispatch
->MdlRead
&&
229 BaseDeviceObject
!= DeviceObject
)
234 /* No fast path, use slow path */
235 return FsRtlMdlReadDev(FileObject
,
246 * FsRtlMdlReadComplete@8
258 FsRtlMdlReadComplete(IN PFILE_OBJECT FileObject
,
259 IN OUT PMDL MdlChain
)
261 PDEVICE_OBJECT DeviceObject
, BaseDeviceObject
;
262 PFAST_IO_DISPATCH FastDispatch
;
264 /* Get Device Object and Fast Calls */
265 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
266 FastDispatch
= DeviceObject
->DriverObject
->FastIoDispatch
;
268 /* Check if we support Fast Calls, and check this one */
269 if (FastDispatch
&& FastDispatch
->MdlReadComplete
)
271 /* Use the fast path */
272 return FastDispatch
->MdlReadComplete(FileObject
,
277 /* Get the Base File System (Volume) and Fast Calls */
278 BaseDeviceObject
= IoGetBaseFileSystemDeviceObject(FileObject
);
279 FastDispatch
= BaseDeviceObject
->DriverObject
->FastIoDispatch
;
281 /* If the Base Device Object has its own FastDispatch Routine, fail */
282 if (FastDispatch
&& FastDispatch
->MdlReadComplete
&&
283 BaseDeviceObject
!= DeviceObject
)
288 /* No fast path, use slow path */
289 return FsRtlMdlReadCompleteDev(FileObject
, MdlChain
, DeviceObject
);
295 * FsRtlMdlReadCompleteDev@12
304 * From Bo Branten's ntifs.h v13.
305 * (CcMdlReadCompleteDev declared in internal/cc.h)
311 FsRtlMdlReadCompleteDev(IN PFILE_OBJECT FileObject
,
313 IN PDEVICE_OBJECT DeviceObject
)
315 /* Call the Cache Manager */
316 CcMdlReadCompleteDev(MdlChain
, FileObject
);
334 FsRtlMdlReadDev(IN PFILE_OBJECT FileObject
,
335 IN PLARGE_INTEGER FileOffset
,
339 OUT PIO_STATUS_BLOCK IoStatus
,
340 IN PDEVICE_OBJECT DeviceObject
)
349 * FsRtlMdlWriteComplete@12
361 FsRtlMdlWriteComplete(IN PFILE_OBJECT FileObject
,
362 IN PLARGE_INTEGER FileOffset
,
365 PDEVICE_OBJECT DeviceObject
, BaseDeviceObject
;
366 PFAST_IO_DISPATCH FastDispatch
;
368 /* Get Device Object and Fast Calls */
369 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
370 FastDispatch
= DeviceObject
->DriverObject
->FastIoDispatch
;
372 /* Check if we support Fast Calls, and check this one */
373 if (FastDispatch
&& FastDispatch
->MdlWriteComplete
)
375 /* Use the fast path */
376 return FastDispatch
->MdlWriteComplete(FileObject
,
382 /* Get the Base File System (Volume) and Fast Calls */
383 BaseDeviceObject
= IoGetBaseFileSystemDeviceObject(FileObject
);
384 FastDispatch
= BaseDeviceObject
->DriverObject
->FastIoDispatch
;
386 /* If the Base Device Object has its own FastDispatch Routine, fail */
387 if (FastDispatch
&& FastDispatch
->MdlWriteComplete
&&
388 BaseDeviceObject
!= DeviceObject
)
393 /* No fast path, use slow path */
394 return FsRtlMdlWriteCompleteDev(FileObject
,
402 * FsRtlMdlWriteCompleteDev@16
414 FsRtlMdlWriteCompleteDev(IN PFILE_OBJECT FileObject
,
415 IN PLARGE_INTEGER FileOffset
,
417 IN PDEVICE_OBJECT DeviceObject
)
419 /* Call the Cache Manager */
420 CcMdlWriteCompleteDev(FileOffset
, MdlChain
, FileObject
);
427 * FsRtlPrepareMdlWrite@24
439 FsRtlPrepareMdlWrite(IN PFILE_OBJECT FileObject
,
440 IN PLARGE_INTEGER FileOffset
,
444 OUT PIO_STATUS_BLOCK IoStatus
)
446 PDEVICE_OBJECT DeviceObject
, BaseDeviceObject
;
447 PFAST_IO_DISPATCH FastDispatch
;
449 /* Get Device Object and Fast Calls */
450 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
451 FastDispatch
= DeviceObject
->DriverObject
->FastIoDispatch
;
453 /* Check if we support Fast Calls, and check this one */
454 if (FastDispatch
&& FastDispatch
->PrepareMdlWrite
)
456 /* Use the fast path */
457 return FastDispatch
->PrepareMdlWrite(FileObject
,
466 /* Get the Base File System (Volume) and Fast Calls */
467 BaseDeviceObject
= IoGetBaseFileSystemDeviceObject(FileObject
);
468 FastDispatch
= BaseDeviceObject
->DriverObject
->FastIoDispatch
;
470 /* If the Base Device Object has its own FastDispatch Routine, fail */
471 if (FastDispatch
&& FastDispatch
->PrepareMdlWrite
&&
472 BaseDeviceObject
!= DeviceObject
)
477 /* No fast path, use slow path */
478 return FsRtlPrepareMdlWriteDev(FileObject
,
489 * FsRtlPrepareMdlWriteDev@28
501 FsRtlPrepareMdlWriteDev(IN PFILE_OBJECT FileObject
,
502 IN PLARGE_INTEGER FileOffset
,
506 OUT PIO_STATUS_BLOCK IoStatus
,
507 IN PDEVICE_OBJECT DeviceObject
)