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: AFSVolumeInfo.cpp
39 #include "AFSCommon.h"
42 AFSQueryVolumeInfo( IN PDEVICE_OBJECT LibDeviceObject,
46 NTSTATUS ntStatus = STATUS_SUCCESS;
47 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
48 IO_STACK_LOCATION *pIrpSp;
49 FS_INFORMATION_CLASS FsInformationClass;
52 BOOLEAN bReleaseResource = FALSE;
53 PFILE_OBJECT pFileObject = NULL;
55 AFSObjectInfoCB *pObjectInfo = NULL;
56 AFSVolumeCB *pVolumeCB = NULL;
58 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
63 pFileObject = pIrpSp->FileObject;
65 if( pFileObject == NULL)
68 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
69 AFS_TRACE_LEVEL_ERROR,
70 "AFSQueryVolumeInfo Failing request with NULL FileObject\n");
72 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
75 pFcb = (AFSFcb *)pFileObject->FsContext;
80 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
81 AFS_TRACE_LEVEL_ERROR,
82 "AFSQueryVolumeInfo Failing request with NULL Fcb\n");
84 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
87 pObjectInfo = pFcb->ObjectInformation;
89 if( pObjectInfo == NULL)
92 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
93 AFS_TRACE_LEVEL_ERROR,
94 "AFSQueryVolumeInfo Failing request with NULL ObjectInformation\n");
96 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
99 pVolumeCB = pObjectInfo->VolumeCB;
101 ulLength = pIrpSp->Parameters.QueryVolume.Length;
102 FsInformationClass = pIrpSp->Parameters.QueryVolume.FsInformationClass;
103 pBuffer = Irp->AssociatedIrp.SystemBuffer;
105 AFSAcquireShared( pVolumeCB->VolumeLock,
108 bReleaseResource = TRUE;
111 // Don't allow requests against IOCtl nodes
114 if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
117 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
118 AFS_TRACE_LEVEL_ERROR,
119 "AFSQueryVolumeInfo Failing request against PIOCtl Fcb\n");
121 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
123 else if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
126 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
127 AFS_TRACE_LEVEL_ERROR,
128 "AFSQueryVolumeInfo Failing request against SpecialShare Fcb\n");
130 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
132 else if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB)
135 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
136 AFS_TRACE_LEVEL_ERROR,
137 "AFSQueryVolumeInfo Failing request against SpecialShare Fcb\n");
139 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
143 // Process the request
146 switch( FsInformationClass)
149 case FileFsVolumeInformation:
152 ntStatus = AFSQueryFsVolumeInfo( &pVolumeCB->VolumeInformation,
153 (PFILE_FS_VOLUME_INFORMATION)pBuffer,
159 case FileFsSizeInformation:
162 ntStatus = AFSQueryFsSizeInfo( &pVolumeCB->VolumeInformation,
163 (PFILE_FS_SIZE_INFORMATION)pBuffer,
169 case FileFsDeviceInformation:
172 ntStatus = AFSQueryFsDeviceInfo( &pVolumeCB->VolumeInformation,
173 (PFILE_FS_DEVICE_INFORMATION)pBuffer,
179 case FileFsAttributeInformation:
182 ntStatus = AFSQueryFsAttributeInfo( &pVolumeCB->VolumeInformation,
183 (PFILE_FS_ATTRIBUTE_INFORMATION)pBuffer,
189 case FileFsFullSizeInformation:
192 ntStatus = AFSQueryFsFullSizeInfo( &pVolumeCB->VolumeInformation,
193 (PFILE_FS_FULL_SIZE_INFORMATION)pBuffer,
201 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
202 AFS_TRACE_LEVEL_WARNING,
203 "AFSQueryVolumeInfo Invalid class %d\n",
206 ntStatus = STATUS_INVALID_PARAMETER;
214 // Setup the Irp's information field to what we actually copied in.
217 Irp->IoStatus.Information = pIrpSp->Parameters.QueryVolume.Length - ulLength;
219 if( bReleaseResource)
222 AFSReleaseResource( pVolumeCB->VolumeLock);
225 AFSCompleteRequest( Irp,
229 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
234 "EXCEPTION - AFSQueryVolumeInfo FO %08lX InfoClass %d FCB %08lX ObjectInfo %08lX VolCB %08lX\n",
241 AFSDumpTraceFilesFnc();
248 AFSSetVolumeInfo( IN PDEVICE_OBJECT DeviceObject,
252 NTSTATUS ntStatus = STATUS_SUCCESS;
253 IO_STACK_LOCATION *pIrpSp;
255 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
260 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
261 AFS_TRACE_LEVEL_WARNING,
262 "AFSSetVolumeInfo Entry for FO %08lX\n", pIrpSp->FileObject);
264 AFSCompleteRequest( Irp,
268 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
273 "EXCEPTION - AFSSetVolumeInfo\n");
275 AFSDumpTraceFilesFnc();
282 AFSQueryFsVolumeInfo( IN AFSVolumeInfoCB *VolumeInfo,
283 IN PFILE_FS_VOLUME_INFORMATION Buffer,
284 IN OUT PULONG Length)
288 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
291 RtlZeroMemory( Buffer,
294 if( *Length >= (ULONG)sizeof( FILE_FS_VOLUME_INFORMATION))
297 if( *Length >= (ULONG)(FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel) + (LONG)VolumeInfo->VolumeLabelLength))
300 ulCopyLength = (LONG)VolumeInfo->VolumeLabelLength;
302 ntStatus = STATUS_SUCCESS;
307 ulCopyLength = *Length - FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel);
309 ntStatus = STATUS_BUFFER_OVERFLOW;
312 Buffer->VolumeCreationTime.QuadPart = VolumeInfo->VolumeCreationTime.QuadPart;
314 Buffer->VolumeSerialNumber = VolumeInfo->VolumeID;
316 Buffer->VolumeLabelLength = VolumeInfo->VolumeLabelLength;
318 Buffer->SupportsObjects = FALSE;
320 *Length -= FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel);
322 if( ulCopyLength > 0)
325 RtlCopyMemory( Buffer->VolumeLabel,
326 VolumeInfo->VolumeLabel,
329 *Length -= ulCopyLength;
337 AFSQueryFsSizeInfo( IN AFSVolumeInfoCB *VolumeInfo,
338 IN PFILE_FS_SIZE_INFORMATION Buffer,
339 IN OUT PULONG Length)
342 NTSTATUS ntStatus = STATUS_SUCCESS;
344 AFSVolumeSizeInfoCB VolumeSizeInfo;
346 RtlZeroMemory( Buffer,
349 if( *Length >= sizeof( FILE_FS_SIZE_INFORMATION))
352 RtlZeroMemory( &FileID,
355 FileID.Cell = VolumeInfo->CellID;
357 FileID.Volume = VolumeInfo->VolumeID;
359 ntStatus = AFSRetrieveVolumeSizeInformation( NULL,
363 if ( NT_SUCCESS( ntStatus))
366 Buffer->TotalAllocationUnits.QuadPart = VolumeSizeInfo.TotalAllocationUnits.QuadPart;
368 Buffer->AvailableAllocationUnits.QuadPart = VolumeSizeInfo.AvailableAllocationUnits.QuadPart;
370 Buffer->SectorsPerAllocationUnit = VolumeSizeInfo.SectorsPerAllocationUnit;
372 Buffer->BytesPerSector = VolumeSizeInfo.BytesPerSector;
374 *Length -= sizeof( FILE_FS_SIZE_INFORMATION);
380 ntStatus = STATUS_BUFFER_TOO_SMALL;
387 AFSQueryFsDeviceInfo( IN AFSVolumeInfoCB *VolumeInfo,
388 IN PFILE_FS_DEVICE_INFORMATION Buffer,
389 IN OUT PULONG Length)
391 NTSTATUS ntStatus = STATUS_SUCCESS;
393 RtlZeroMemory( Buffer,
396 if( *Length >= (LONG)sizeof( FILE_FS_DEVICE_INFORMATION))
399 Buffer->DeviceType = FILE_DEVICE_DISK;
401 Buffer->Characteristics = VolumeInfo->Characteristics;
403 *Length -= sizeof( FILE_FS_DEVICE_INFORMATION);
408 ntStatus = STATUS_BUFFER_TOO_SMALL;
415 AFSQueryFsAttributeInfo( IN AFSVolumeInfoCB *VolumeInfo,
416 IN PFILE_FS_ATTRIBUTE_INFORMATION Buffer,
417 IN OUT PULONG Length)
419 NTSTATUS ntStatus = STATUS_SUCCESS;
421 RtlZeroMemory( Buffer,
424 if( *Length >= (LONG)(sizeof( FILE_FS_ATTRIBUTE_INFORMATION)))
427 Buffer->FileSystemAttributes = (FILE_CASE_PRESERVED_NAMES |
428 FILE_UNICODE_ON_DISK |
429 FILE_SUPPORTS_HARD_LINKS |
430 FILE_SUPPORTS_REPARSE_POINTS);
432 Buffer->MaximumComponentNameLength = 255;
434 Buffer->FileSystemNameLength = 18;
436 *Length -= FIELD_OFFSET( FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName);
441 RtlCopyMemory( Buffer->FileSystemName,
450 ntStatus = STATUS_BUFFER_OVERFLOW;
456 ntStatus = STATUS_BUFFER_TOO_SMALL;
463 AFSQueryFsFullSizeInfo( IN AFSVolumeInfoCB *VolumeInfo,
464 IN PFILE_FS_FULL_SIZE_INFORMATION Buffer,
465 IN OUT PULONG Length)
468 NTSTATUS ntStatus = STATUS_SUCCESS;
470 AFSVolumeSizeInfoCB VolumeSizeInfo;
472 RtlZeroMemory( Buffer,
475 if( *Length >= sizeof( FILE_FS_FULL_SIZE_INFORMATION))
478 RtlZeroMemory( &FileID,
481 FileID.Cell = VolumeInfo->CellID;
483 FileID.Volume = VolumeInfo->VolumeID;
485 ntStatus = AFSRetrieveVolumeSizeInformation( NULL,
489 if ( NT_SUCCESS( ntStatus))
492 Buffer->TotalAllocationUnits.QuadPart = VolumeSizeInfo.TotalAllocationUnits.QuadPart;
494 Buffer->CallerAvailableAllocationUnits.QuadPart = VolumeSizeInfo.AvailableAllocationUnits.QuadPart;
496 Buffer->ActualAvailableAllocationUnits.QuadPart = VolumeSizeInfo.AvailableAllocationUnits.QuadPart;
498 Buffer->SectorsPerAllocationUnit = VolumeSizeInfo.SectorsPerAllocationUnit;
500 Buffer->BytesPerSector = VolumeSizeInfo.BytesPerSector;
502 *Length -= sizeof( FILE_FS_FULL_SIZE_INFORMATION);
508 ntStatus = STATUS_BUFFER_TOO_SMALL;