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 ASSERT( pObjectInfo->FileType == AFS_FILE_TYPE_DIRECTORY &&
102 pObjectInfo->FileId.Vnode == 1);
104 ulLength = pIrpSp->Parameters.QueryVolume.Length;
105 FsInformationClass = pIrpSp->Parameters.QueryVolume.FsInformationClass;
106 pBuffer = Irp->AssociatedIrp.SystemBuffer;
108 AFSAcquireShared( pVolumeCB->VolumeLock,
111 bReleaseResource = TRUE;
114 // Don't allow requests against IOCtl nodes
117 if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
120 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
121 AFS_TRACE_LEVEL_ERROR,
122 "AFSQueryVolumeInfo Failing request against PIOCtl Fcb\n");
124 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
126 else if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
129 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
130 AFS_TRACE_LEVEL_ERROR,
131 "AFSQueryVolumeInfo Failing request against SpecialShare Fcb\n");
133 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
135 else if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB)
138 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
139 AFS_TRACE_LEVEL_ERROR,
140 "AFSQueryVolumeInfo Failing request against SpecialShare Fcb\n");
142 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
146 // Process the request
149 switch( FsInformationClass)
152 case FileFsVolumeInformation:
155 ntStatus = AFSQueryFsVolumeInfo( &pVolumeCB->VolumeInformation,
156 (PFILE_FS_VOLUME_INFORMATION)pBuffer,
162 case FileFsSizeInformation:
165 ntStatus = AFSQueryFsSizeInfo( &pVolumeCB->VolumeInformation,
166 (PFILE_FS_SIZE_INFORMATION)pBuffer,
172 case FileFsDeviceInformation:
175 ntStatus = AFSQueryFsDeviceInfo( &pVolumeCB->VolumeInformation,
176 (PFILE_FS_DEVICE_INFORMATION)pBuffer,
182 case FileFsAttributeInformation:
185 ntStatus = AFSQueryFsAttributeInfo( &pVolumeCB->VolumeInformation,
186 (PFILE_FS_ATTRIBUTE_INFORMATION)pBuffer,
192 case FileFsFullSizeInformation:
195 ntStatus = AFSQueryFsFullSizeInfo( &pVolumeCB->VolumeInformation,
196 (PFILE_FS_FULL_SIZE_INFORMATION)pBuffer,
204 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
205 AFS_TRACE_LEVEL_WARNING,
206 "AFSQueryVolumeInfo Invalid class %d\n",
209 ntStatus = STATUS_INVALID_PARAMETER;
217 // Setup the Irp's information field to what we actually copied in.
220 Irp->IoStatus.Information = pIrpSp->Parameters.QueryVolume.Length - ulLength;
222 if( bReleaseResource)
225 AFSReleaseResource( pVolumeCB->VolumeLock);
228 AFSCompleteRequest( Irp,
232 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
237 "EXCEPTION - AFSQueryVolumeInfo FO %08lX InfoClass %d FCB %08lX ObjectInfo %08lX VolCB %08lX\n",
244 AFSDumpTraceFilesFnc();
251 AFSSetVolumeInfo( IN PDEVICE_OBJECT DeviceObject,
255 NTSTATUS ntStatus = STATUS_SUCCESS;
256 IO_STACK_LOCATION *pIrpSp;
258 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
263 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
264 AFS_TRACE_LEVEL_WARNING,
265 "AFSSetVolumeInfo Entry for FO %08lX\n", pIrpSp->FileObject);
267 AFSCompleteRequest( Irp,
271 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
276 "EXCEPTION - AFSSetVolumeInfo\n");
278 AFSDumpTraceFilesFnc();
285 AFSQueryFsVolumeInfo( IN AFSVolumeInfoCB *VolumeInfo,
286 IN PFILE_FS_VOLUME_INFORMATION Buffer,
287 IN OUT PULONG Length)
291 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
294 RtlZeroMemory( Buffer,
297 if( *Length >= (ULONG)sizeof( FILE_FS_VOLUME_INFORMATION))
300 if( *Length >= (ULONG)(FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel) + (LONG)VolumeInfo->VolumeLabelLength))
303 ulCopyLength = (LONG)VolumeInfo->VolumeLabelLength;
305 ntStatus = STATUS_SUCCESS;
310 ulCopyLength = *Length - FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel);
312 ntStatus = STATUS_BUFFER_OVERFLOW;
315 Buffer->VolumeCreationTime.QuadPart = VolumeInfo->VolumeCreationTime.QuadPart;
317 Buffer->VolumeSerialNumber = VolumeInfo->VolumeID;
319 Buffer->VolumeLabelLength = VolumeInfo->VolumeLabelLength;
321 Buffer->SupportsObjects = FALSE;
323 *Length -= FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel);
325 if( ulCopyLength > 0)
328 RtlCopyMemory( Buffer->VolumeLabel,
329 VolumeInfo->VolumeLabel,
332 *Length -= ulCopyLength;
340 AFSQueryFsSizeInfo( IN AFSVolumeInfoCB *VolumeInfo,
341 IN PFILE_FS_SIZE_INFORMATION Buffer,
342 IN OUT PULONG Length)
345 NTSTATUS ntStatus = STATUS_SUCCESS;
347 AFSVolumeSizeInfoCB VolumeSizeInfo;
349 RtlZeroMemory( Buffer,
352 if( *Length >= sizeof( FILE_FS_SIZE_INFORMATION))
355 RtlZeroMemory( &FileID,
358 FileID.Cell = VolumeInfo->CellID;
360 FileID.Volume = VolumeInfo->VolumeID;
362 ntStatus = AFSRetrieveVolumeSizeInformation( NULL,
366 if ( NT_SUCCESS( ntStatus))
369 Buffer->TotalAllocationUnits.QuadPart = VolumeSizeInfo.TotalAllocationUnits.QuadPart;
371 Buffer->AvailableAllocationUnits.QuadPart = VolumeSizeInfo.AvailableAllocationUnits.QuadPart;
373 Buffer->SectorsPerAllocationUnit = VolumeSizeInfo.SectorsPerAllocationUnit;
375 Buffer->BytesPerSector = VolumeSizeInfo.BytesPerSector;
377 *Length -= sizeof( FILE_FS_SIZE_INFORMATION);
383 ntStatus = STATUS_BUFFER_TOO_SMALL;
390 AFSQueryFsDeviceInfo( IN AFSVolumeInfoCB *VolumeInfo,
391 IN PFILE_FS_DEVICE_INFORMATION Buffer,
392 IN OUT PULONG Length)
394 NTSTATUS ntStatus = STATUS_SUCCESS;
396 RtlZeroMemory( Buffer,
399 if( *Length >= (LONG)sizeof( FILE_FS_DEVICE_INFORMATION))
402 Buffer->DeviceType = FILE_DEVICE_DISK;
404 Buffer->Characteristics = VolumeInfo->Characteristics;
406 *Length -= sizeof( FILE_FS_DEVICE_INFORMATION);
411 ntStatus = STATUS_BUFFER_TOO_SMALL;
418 AFSQueryFsAttributeInfo( IN AFSVolumeInfoCB *VolumeInfo,
419 IN PFILE_FS_ATTRIBUTE_INFORMATION Buffer,
420 IN OUT PULONG Length)
422 NTSTATUS ntStatus = STATUS_SUCCESS;
424 RtlZeroMemory( Buffer,
427 if( *Length >= (LONG)(sizeof( FILE_FS_ATTRIBUTE_INFORMATION)))
430 Buffer->FileSystemAttributes = (FILE_CASE_PRESERVED_NAMES |
431 FILE_UNICODE_ON_DISK |
432 FILE_SUPPORTS_REPARSE_POINTS);
434 Buffer->MaximumComponentNameLength = 255;
436 Buffer->FileSystemNameLength = 18;
438 *Length -= FIELD_OFFSET( FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName);
443 RtlCopyMemory( Buffer->FileSystemName,
452 ntStatus = STATUS_BUFFER_OVERFLOW;
458 ntStatus = STATUS_BUFFER_TOO_SMALL;
465 AFSQueryFsFullSizeInfo( IN AFSVolumeInfoCB *VolumeInfo,
466 IN PFILE_FS_FULL_SIZE_INFORMATION Buffer,
467 IN OUT PULONG Length)
470 NTSTATUS ntStatus = STATUS_SUCCESS;
472 AFSVolumeSizeInfoCB VolumeSizeInfo;
474 RtlZeroMemory( Buffer,
477 if( *Length >= sizeof( FILE_FS_FULL_SIZE_INFORMATION))
480 RtlZeroMemory( &FileID,
483 FileID.Cell = VolumeInfo->CellID;
485 FileID.Volume = VolumeInfo->VolumeID;
487 ntStatus = AFSRetrieveVolumeSizeInformation( NULL,
491 if ( NT_SUCCESS( ntStatus))
494 Buffer->TotalAllocationUnits.QuadPart = VolumeSizeInfo.TotalAllocationUnits.QuadPart;
496 Buffer->CallerAvailableAllocationUnits.QuadPart = VolumeSizeInfo.AvailableAllocationUnits.QuadPart;
498 Buffer->ActualAvailableAllocationUnits.QuadPart = VolumeSizeInfo.AvailableAllocationUnits.QuadPart;
500 Buffer->SectorsPerAllocationUnit = VolumeSizeInfo.SectorsPerAllocationUnit;
502 Buffer->BytesPerSector = VolumeSizeInfo.BytesPerSector;
504 *Length -= sizeof( FILE_FS_FULL_SIZE_INFORMATION);
510 ntStatus = STATUS_BUFFER_TOO_SMALL;