2 * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3 * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
14 * this list of conditions and the following disclaimer in the
16 * and/or other materials provided with the distribution.
17 * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18 * nor the names of their contributors may be used to endorse or promote
19 * products derived from this software without specific prior written
20 * permission from Kernel Drivers, LLC and Your File System, Inc.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 // File: AFSFastIoSupport.cpp
39 #include "AFSCommon.h"
42 AFSFastIoCheckIfPossible( IN struct _FILE_OBJECT *FileObject,
43 IN PLARGE_INTEGER FileOffset,
47 IN BOOLEAN CheckForReadOperation,
48 OUT PIO_STATUS_BLOCK IoStatus,
49 IN struct _DEVICE_OBJECT *DeviceObject)
51 UNREFERENCED_PARAMETER(FileObject);
52 UNREFERENCED_PARAMETER(FileOffset);
53 UNREFERENCED_PARAMETER(Length);
54 UNREFERENCED_PARAMETER(Wait);
55 UNREFERENCED_PARAMETER(LockKey);
56 UNREFERENCED_PARAMETER(CheckForReadOperation);
57 UNREFERENCED_PARAMETER(IoStatus);
58 UNREFERENCED_PARAMETER(DeviceObject);
60 BOOLEAN bStatus = FALSE;
66 AFSFastIoRead( IN struct _FILE_OBJECT *FileObject,
67 IN PLARGE_INTEGER FileOffset,
72 OUT PIO_STATUS_BLOCK IoStatus,
73 IN struct _DEVICE_OBJECT *DeviceObject)
76 UNREFERENCED_PARAMETER(FileObject);
77 UNREFERENCED_PARAMETER(FileOffset);
78 UNREFERENCED_PARAMETER(Length);
79 UNREFERENCED_PARAMETER(Wait);
80 UNREFERENCED_PARAMETER(LockKey);
81 UNREFERENCED_PARAMETER(Buffer);
82 UNREFERENCED_PARAMETER(IoStatus);
83 UNREFERENCED_PARAMETER(DeviceObject);
85 BOOLEAN bStatus = FALSE;
91 AFSFastIoWrite( IN struct _FILE_OBJECT *FileObject,
92 IN PLARGE_INTEGER FileOffset,
97 OUT PIO_STATUS_BLOCK IoStatus,
98 IN struct _DEVICE_OBJECT *DeviceObject)
101 UNREFERENCED_PARAMETER(FileObject);
102 UNREFERENCED_PARAMETER(FileOffset);
103 UNREFERENCED_PARAMETER(Length);
104 UNREFERENCED_PARAMETER(Wait);
105 UNREFERENCED_PARAMETER(LockKey);
106 UNREFERENCED_PARAMETER(Buffer);
107 UNREFERENCED_PARAMETER(IoStatus);
108 UNREFERENCED_PARAMETER(DeviceObject);
110 BOOLEAN bStatus = FALSE;
116 AFSFastIoQueryBasicInfo( IN struct _FILE_OBJECT *FileObject,
118 OUT PFILE_BASIC_INFORMATION Buffer,
119 OUT PIO_STATUS_BLOCK IoStatus,
120 IN struct _DEVICE_OBJECT *DeviceObject)
122 UNREFERENCED_PARAMETER(FileObject);
123 UNREFERENCED_PARAMETER(Wait);
124 UNREFERENCED_PARAMETER(Buffer);
125 UNREFERENCED_PARAMETER(IoStatus);
126 UNREFERENCED_PARAMETER(DeviceObject);
128 BOOLEAN bStatus = FALSE;
134 AFSFastIoQueryStandardInfo( IN struct _FILE_OBJECT *FileObject,
136 OUT PFILE_STANDARD_INFORMATION Buffer,
137 OUT PIO_STATUS_BLOCK IoStatus,
138 IN struct _DEVICE_OBJECT *DeviceObject)
140 UNREFERENCED_PARAMETER(FileObject);
141 UNREFERENCED_PARAMETER(Wait);
142 UNREFERENCED_PARAMETER(Buffer);
143 UNREFERENCED_PARAMETER(IoStatus);
144 UNREFERENCED_PARAMETER(DeviceObject);
146 BOOLEAN bStatus = FALSE;
152 AFSFastIoLock( IN struct _FILE_OBJECT *FileObject,
153 IN PLARGE_INTEGER FileOffset,
154 IN PLARGE_INTEGER Length,
155 IN PEPROCESS ProcessId,
157 IN BOOLEAN FailImmediately,
158 IN BOOLEAN ExclusiveLock,
159 OUT PIO_STATUS_BLOCK IoStatus,
160 IN struct _DEVICE_OBJECT *DeviceObject)
162 UNREFERENCED_PARAMETER(FileObject);
163 UNREFERENCED_PARAMETER(FileOffset);
164 UNREFERENCED_PARAMETER(Length);
165 UNREFERENCED_PARAMETER(ProcessId);
166 UNREFERENCED_PARAMETER(Key);
167 UNREFERENCED_PARAMETER(FailImmediately);
168 UNREFERENCED_PARAMETER(ExclusiveLock);
169 UNREFERENCED_PARAMETER(IoStatus);
170 UNREFERENCED_PARAMETER(DeviceObject);
172 BOOLEAN bStatus = FALSE;
178 AFSFastIoUnlockSingle( IN struct _FILE_OBJECT *FileObject,
179 IN PLARGE_INTEGER FileOffset,
180 IN PLARGE_INTEGER Length,
181 IN PEPROCESS ProcessId,
183 OUT PIO_STATUS_BLOCK IoStatus,
184 IN struct _DEVICE_OBJECT *DeviceObject)
186 UNREFERENCED_PARAMETER(FileObject);
187 UNREFERENCED_PARAMETER(FileOffset);
188 UNREFERENCED_PARAMETER(Length);
189 UNREFERENCED_PARAMETER(ProcessId);
190 UNREFERENCED_PARAMETER(Key);
191 UNREFERENCED_PARAMETER(IoStatus);
192 UNREFERENCED_PARAMETER(DeviceObject);
194 BOOLEAN bStatus = FALSE;
200 AFSFastIoUnlockAll( IN struct _FILE_OBJECT *FileObject,
201 IN PEPROCESS ProcessId,
202 OUT PIO_STATUS_BLOCK IoStatus,
203 IN struct _DEVICE_OBJECT *DeviceObject)
205 UNREFERENCED_PARAMETER(FileObject);
206 UNREFERENCED_PARAMETER(ProcessId);
207 UNREFERENCED_PARAMETER(IoStatus);
208 UNREFERENCED_PARAMETER(DeviceObject);
210 BOOLEAN bStatus = FALSE;
216 AFSFastIoUnlockAllByKey( IN struct _FILE_OBJECT *FileObject,
219 OUT PIO_STATUS_BLOCK IoStatus,
220 IN struct _DEVICE_OBJECT *DeviceObject)
222 UNREFERENCED_PARAMETER(FileObject);
223 UNREFERENCED_PARAMETER(ProcessId);
224 UNREFERENCED_PARAMETER(Key);
225 UNREFERENCED_PARAMETER(IoStatus);
226 UNREFERENCED_PARAMETER(DeviceObject);
228 BOOLEAN bStatus = FALSE;
234 AFSFastIoDevCtrl( IN struct _FILE_OBJECT *FileObject,
236 IN PVOID InputBuffer OPTIONAL,
237 IN ULONG InputBufferLength,
238 OUT PVOID OutputBuffer OPTIONAL,
239 IN ULONG OutputBufferLength,
240 IN ULONG IoControlCode,
241 OUT PIO_STATUS_BLOCK IoStatus,
242 IN struct _DEVICE_OBJECT *DeviceObject)
244 UNREFERENCED_PARAMETER(FileObject);
245 UNREFERENCED_PARAMETER(Wait);
246 UNREFERENCED_PARAMETER(InputBuffer);
247 UNREFERENCED_PARAMETER(InputBufferLength);
248 UNREFERENCED_PARAMETER(OutputBuffer);
249 UNREFERENCED_PARAMETER(OutputBufferLength);
250 UNREFERENCED_PARAMETER(IoControlCode);
251 UNREFERENCED_PARAMETER(IoStatus);
252 UNREFERENCED_PARAMETER(DeviceObject);
254 BOOLEAN bStatus = FALSE;
260 AFSFastIoAcquireFile( IN struct _FILE_OBJECT *FileObject)
263 AFSFcb *pFcb = (AFSFcb *)FileObject->FsContext;
265 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
266 AFS_TRACE_LEVEL_VERBOSE,
267 "AFSFastIoAcquireFile Acquiring Fcb lock %p EXCL %08lX\n",
268 &pFcb->NPFcb->Resource,
269 PsGetCurrentThread()));
271 AFSAcquireExcl( &pFcb->NPFcb->Resource,
274 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
275 AFS_TRACE_LEVEL_VERBOSE,
276 "AFSFastIoAcquireFile Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
277 &pFcb->NPFcb->SectionObjectResource,
278 PsGetCurrentThread()));
280 AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
283 if( NULL == pFcb->Specific.File.SectionCreateFO )
286 // If not re-entrant then save and reference
288 pFcb->Specific.File.SectionCreateFO =
289 CcGetFileObjectFromSectionPtrs( &pFcb->NPFcb->SectionObjectPointers );
290 if( NULL != pFcb->Specific.File.SectionCreateFO )
292 ObReferenceObject( pFcb->Specific.File.SectionCreateFO);
300 AFSFastIoReleaseFile( IN struct _FILE_OBJECT *FileObject)
303 AFSFcb *pFcb = (AFSFcb *)FileObject->FsContext;
305 if( ExIsResourceAcquiredExclusiveLite( &pFcb->NPFcb->Resource))
307 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
308 AFS_TRACE_LEVEL_VERBOSE,
309 "AFSFastIoReleaseFile Releasing Fcb Lock %p EXCL %08lX\n",
310 &pFcb->NPFcb->Resource,
311 PsGetCurrentThread()));
313 AFSReleaseResource( &pFcb->NPFcb->Resource);
316 if( ExIsResourceAcquiredExclusiveLite( &pFcb->NPFcb->SectionObjectResource))
318 PFILE_OBJECT fileObject = pFcb->Specific.File.SectionCreateFO;
319 pFcb->Specific.File.SectionCreateFO = NULL;
321 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
322 AFS_TRACE_LEVEL_VERBOSE,
323 "AFSFastIoReleaseFile Releasing Fcb SectionObject lock %p EXCL %08lX\n",
324 &pFcb->NPFcb->SectionObjectResource,
325 PsGetCurrentThread()));
327 AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
330 // Now defer the Cc file object (if there was one) now that we are lock free
333 if( NULL != fileObject )
335 ObDereferenceObject( fileObject );
343 AFSFastIoDetachDevice( IN struct _DEVICE_OBJECT *SourceDevice,
344 IN struct _DEVICE_OBJECT *TargetDevice)
346 UNREFERENCED_PARAMETER(SourceDevice);
347 UNREFERENCED_PARAMETER(TargetDevice);
353 AFSFastIoQueryNetworkOpenInfo( IN struct _FILE_OBJECT *FileObject,
355 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
356 OUT struct _IO_STATUS_BLOCK *IoStatus,
357 IN struct _DEVICE_OBJECT *DeviceObject)
359 UNREFERENCED_PARAMETER(FileObject);
360 UNREFERENCED_PARAMETER(Wait);
361 UNREFERENCED_PARAMETER(Buffer);
362 UNREFERENCED_PARAMETER(IoStatus);
363 UNREFERENCED_PARAMETER(DeviceObject);
365 BOOLEAN bStatus = FALSE;
371 AFSFastIoMdlRead( IN struct _FILE_OBJECT *FileObject,
372 IN PLARGE_INTEGER FileOffset,
376 OUT PIO_STATUS_BLOCK IoStatus,
377 IN struct _DEVICE_OBJECT *DeviceObject)
379 UNREFERENCED_PARAMETER(FileObject);
380 UNREFERENCED_PARAMETER(FileOffset);
381 UNREFERENCED_PARAMETER(Length);
382 UNREFERENCED_PARAMETER(LockKey);
383 UNREFERENCED_PARAMETER(MdlChain);
384 UNREFERENCED_PARAMETER(IoStatus);
385 UNREFERENCED_PARAMETER(DeviceObject);
387 BOOLEAN bStatus = FALSE;
393 AFSFastIoMdlReadComplete( IN struct _FILE_OBJECT *FileObject,
395 IN struct _DEVICE_OBJECT *DeviceObject)
397 UNREFERENCED_PARAMETER(FileObject);
398 UNREFERENCED_PARAMETER(MdlChain);
399 UNREFERENCED_PARAMETER(DeviceObject);
401 BOOLEAN bStatus = FALSE;
407 AFSFastIoPrepareMdlWrite( IN struct _FILE_OBJECT *FileObject,
408 IN PLARGE_INTEGER FileOffset,
412 OUT PIO_STATUS_BLOCK IoStatus,
413 IN struct _DEVICE_OBJECT *DeviceObject)
415 UNREFERENCED_PARAMETER(FileObject);
416 UNREFERENCED_PARAMETER(FileOffset);
417 UNREFERENCED_PARAMETER(Length);
418 UNREFERENCED_PARAMETER(LockKey);
419 UNREFERENCED_PARAMETER(MdlChain);
420 UNREFERENCED_PARAMETER(IoStatus);
421 UNREFERENCED_PARAMETER(DeviceObject);
423 BOOLEAN bStatus = FALSE;
429 AFSFastIoMdlWriteComplete( IN struct _FILE_OBJECT *FileObject,
430 IN PLARGE_INTEGER FileOffset,
432 IN struct _DEVICE_OBJECT *DeviceObject)
434 UNREFERENCED_PARAMETER(FileObject);
435 UNREFERENCED_PARAMETER(FileOffset);
436 UNREFERENCED_PARAMETER(MdlChain);
437 UNREFERENCED_PARAMETER(DeviceObject);
439 BOOLEAN bStatus = FALSE;
445 AFSFastIoAcquireForCCFlush( IN struct _FILE_OBJECT *FileObject,
446 IN struct _DEVICE_OBJECT *DeviceObject)
448 UNREFERENCED_PARAMETER(DeviceObject);
450 NTSTATUS ntStatus = STATUS_FILE_LOCK_CONFLICT;
451 AFSFcb *pFcb = (AFSFcb *)FileObject->FsContext;
453 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
454 AFS_TRACE_LEVEL_VERBOSE,
455 "AFSFastIoAcquireForCCFlush Acquiring Fcb PagingIo lock %p SHARED %08lX\n",
456 &pFcb->NPFcb->PagingResource,
457 PsGetCurrentThread()));
459 AFSAcquireShared( &pFcb->NPFcb->PagingResource,
462 if( !ExIsResourceAcquiredSharedLite( &pFcb->NPFcb->SectionObjectResource))
465 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
466 AFS_TRACE_LEVEL_VERBOSE,
467 "AFSFastIoAcquireForCCFlush Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
468 &pFcb->NPFcb->SectionObjectResource,
469 PsGetCurrentThread()));
471 AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
477 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
478 AFS_TRACE_LEVEL_VERBOSE,
479 "AFSFastIoAcquireForCCFlush Acquiring Fcb SectionObject lock %p SHARED %08lX\n",
480 &pFcb->NPFcb->SectionObjectResource,
481 PsGetCurrentThread()));
483 AFSAcquireShared( &pFcb->NPFcb->SectionObjectResource,
487 ntStatus = STATUS_SUCCESS;
490 // Set the TopLevelIrp field for this caller
493 if( IoGetTopLevelIrp() == NULL)
496 IoSetTopLevelIrp( (PIRP)FSRTL_CACHE_TOP_LEVEL_IRP);
503 AFSFastIoReleaseForCCFlush( IN struct _FILE_OBJECT *FileObject,
504 IN struct _DEVICE_OBJECT *DeviceObject)
506 UNREFERENCED_PARAMETER(DeviceObject);
508 NTSTATUS ntStatus = STATUS_SUCCESS;
509 AFSFcb *pFcb = (AFSFcb *)FileObject->FsContext;
511 if( IoGetTopLevelIrp() == (PIRP)FSRTL_CACHE_TOP_LEVEL_IRP)
514 IoSetTopLevelIrp( NULL);
517 if( ExIsResourceAcquiredSharedLite( &pFcb->NPFcb->PagingResource))
520 AFSReleaseResource( &pFcb->NPFcb->PagingResource);
525 AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
526 AFS_TRACE_LEVEL_ERROR,
527 "AFSFastIoReleaseForCCFlush Called for non-acquired paging resource Fcb\n"));
530 if( ExIsResourceAcquiredExclusiveLite( &pFcb->NPFcb->SectionObjectResource) ||
531 ExIsResourceAcquiredSharedLite( &pFcb->NPFcb->SectionObjectResource))
534 AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
539 AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
540 AFS_TRACE_LEVEL_ERROR,
541 "AFSFastIoReleaseForCCFlush Called for non-acquired SectionObject resource Fcb\n"));
548 AFSFastIoReadCompressed( IN struct _FILE_OBJECT *FileObject,
549 IN PLARGE_INTEGER FileOffset,
554 OUT PIO_STATUS_BLOCK IoStatus,
555 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
556 IN ULONG CompressedDataInfoLength,
557 IN struct _DEVICE_OBJECT *DeviceObject)
559 UNREFERENCED_PARAMETER(FileObject);
560 UNREFERENCED_PARAMETER(FileOffset);
561 UNREFERENCED_PARAMETER(Length);
562 UNREFERENCED_PARAMETER(LockKey);
563 UNREFERENCED_PARAMETER(Buffer);
564 UNREFERENCED_PARAMETER(MdlChain);
565 UNREFERENCED_PARAMETER(IoStatus);
566 UNREFERENCED_PARAMETER(CompressedDataInfo);
567 UNREFERENCED_PARAMETER(CompressedDataInfoLength);
568 UNREFERENCED_PARAMETER(DeviceObject);
570 BOOLEAN bStatus = FALSE;
576 AFSFastIoWriteCompressed( IN struct _FILE_OBJECT *FileObject,
577 IN PLARGE_INTEGER FileOffset,
582 OUT PIO_STATUS_BLOCK IoStatus,
583 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
584 IN ULONG CompressedDataInfoLength,
585 IN struct _DEVICE_OBJECT *DeviceObject)
587 UNREFERENCED_PARAMETER(FileObject);
588 UNREFERENCED_PARAMETER(FileOffset);
589 UNREFERENCED_PARAMETER(Length);
590 UNREFERENCED_PARAMETER(LockKey);
591 UNREFERENCED_PARAMETER(Buffer);
592 UNREFERENCED_PARAMETER(MdlChain);
593 UNREFERENCED_PARAMETER(IoStatus);
594 UNREFERENCED_PARAMETER(CompressedDataInfo);
595 UNREFERENCED_PARAMETER(CompressedDataInfoLength);
596 UNREFERENCED_PARAMETER(DeviceObject);
598 BOOLEAN bStatus = FALSE;
604 AFSFastIoMdlReadCompleteCompressed( IN struct _FILE_OBJECT *FileObject,
606 IN struct _DEVICE_OBJECT *DeviceObject)
608 UNREFERENCED_PARAMETER(FileObject);
609 UNREFERENCED_PARAMETER(MdlChain);
610 UNREFERENCED_PARAMETER(DeviceObject);
612 BOOLEAN bStatus = FALSE;
618 AFSFastIoMdlWriteCompleteCompressed( IN struct _FILE_OBJECT *FileObject,
619 IN PLARGE_INTEGER FileOffset,
621 IN struct _DEVICE_OBJECT *DeviceObject)
623 UNREFERENCED_PARAMETER(FileObject);
624 UNREFERENCED_PARAMETER(FileOffset);
625 UNREFERENCED_PARAMETER(MdlChain);
626 UNREFERENCED_PARAMETER(DeviceObject);
628 BOOLEAN bStatus = FALSE;
634 AFSFastIoQueryOpen( IN struct _IRP *Irp,
635 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
636 IN struct _DEVICE_OBJECT *DeviceObject)
638 UNREFERENCED_PARAMETER(Irp);
639 UNREFERENCED_PARAMETER(NetworkInformation);
640 UNREFERENCED_PARAMETER(DeviceObject);
642 BOOLEAN bStatus = FALSE;