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 UNREFERENCED_PARAMETER(LibDeviceObject);
47 NTSTATUS ntStatus = STATUS_SUCCESS;
48 IO_STACK_LOCATION *pIrpSp;
49 FS_INFORMATION_CLASS FsInformationClass = FileFsMaximumInformation;
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 %p InfoClass %d FCB %p ObjectInfo %p VolCB %p\n",
241 AFSDumpTraceFilesFnc();
248 AFSSetVolumeInfo( IN PDEVICE_OBJECT DeviceObject,
252 UNREFERENCED_PARAMETER(DeviceObject);
253 NTSTATUS ntStatus = STATUS_SUCCESS;
254 IO_STACK_LOCATION *pIrpSp;
256 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
261 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
262 AFS_TRACE_LEVEL_WARNING,
263 "AFSSetVolumeInfo Entry for FO %p\n", pIrpSp->FileObject);
265 AFSCompleteRequest( Irp,
269 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
274 "EXCEPTION - AFSSetVolumeInfo\n");
276 AFSDumpTraceFilesFnc();
283 AFSQueryFsVolumeInfo( IN AFSVolumeInfoCB *VolumeInfo,
284 IN PFILE_FS_VOLUME_INFORMATION Buffer,
285 IN OUT PULONG Length)
289 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
292 RtlZeroMemory( Buffer,
295 if( *Length >= (ULONG)sizeof( FILE_FS_VOLUME_INFORMATION))
298 if( *Length >= (ULONG)(FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel) + (LONG)VolumeInfo->VolumeLabelLength))
301 ulCopyLength = (LONG)VolumeInfo->VolumeLabelLength;
303 ntStatus = STATUS_SUCCESS;
308 ulCopyLength = *Length - FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel);
310 ntStatus = STATUS_BUFFER_OVERFLOW;
313 Buffer->VolumeCreationTime.QuadPart = VolumeInfo->VolumeCreationTime.QuadPart;
315 Buffer->VolumeSerialNumber = VolumeInfo->VolumeID;
317 Buffer->VolumeLabelLength = VolumeInfo->VolumeLabelLength;
319 Buffer->SupportsObjects = FALSE;
321 *Length -= FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel);
323 if( ulCopyLength > 0)
326 RtlCopyMemory( Buffer->VolumeLabel,
327 VolumeInfo->VolumeLabel,
330 *Length -= ulCopyLength;
338 AFSQueryFsSizeInfo( IN AFSVolumeInfoCB *VolumeInfo,
339 IN PFILE_FS_SIZE_INFORMATION Buffer,
340 IN OUT PULONG Length)
343 NTSTATUS ntStatus = STATUS_SUCCESS;
345 AFSVolumeSizeInfoCB VolumeSizeInfo;
347 RtlZeroMemory( Buffer,
350 if( *Length >= sizeof( FILE_FS_SIZE_INFORMATION))
353 RtlZeroMemory( &FileID,
356 FileID.Cell = VolumeInfo->CellID;
358 FileID.Volume = VolumeInfo->VolumeID;
360 ntStatus = AFSRetrieveVolumeSizeInformation( NULL,
364 if ( NT_SUCCESS( ntStatus))
367 Buffer->TotalAllocationUnits.QuadPart = VolumeSizeInfo.TotalAllocationUnits.QuadPart;
369 Buffer->AvailableAllocationUnits.QuadPart = VolumeSizeInfo.AvailableAllocationUnits.QuadPart;
371 Buffer->SectorsPerAllocationUnit = VolumeSizeInfo.SectorsPerAllocationUnit;
373 Buffer->BytesPerSector = VolumeSizeInfo.BytesPerSector;
375 *Length -= sizeof( FILE_FS_SIZE_INFORMATION);
381 ntStatus = STATUS_BUFFER_TOO_SMALL;
388 AFSQueryFsDeviceInfo( IN AFSVolumeInfoCB *VolumeInfo,
389 IN PFILE_FS_DEVICE_INFORMATION Buffer,
390 IN OUT PULONG Length)
392 NTSTATUS ntStatus = STATUS_SUCCESS;
394 RtlZeroMemory( Buffer,
397 if( *Length >= (LONG)sizeof( FILE_FS_DEVICE_INFORMATION))
400 Buffer->DeviceType = FILE_DEVICE_DISK;
402 Buffer->Characteristics = VolumeInfo->Characteristics;
404 *Length -= sizeof( FILE_FS_DEVICE_INFORMATION);
409 ntStatus = STATUS_BUFFER_TOO_SMALL;
416 AFSQueryFsAttributeInfo( IN AFSVolumeInfoCB *VolumeInfo,
417 IN PFILE_FS_ATTRIBUTE_INFORMATION Buffer,
418 IN OUT PULONG Length)
420 UNREFERENCED_PARAMETER(VolumeInfo);
421 NTSTATUS ntStatus = STATUS_SUCCESS;
423 RtlZeroMemory( Buffer,
426 if( *Length >= (LONG)(sizeof( FILE_FS_ATTRIBUTE_INFORMATION)))
429 Buffer->FileSystemAttributes = (FILE_CASE_PRESERVED_NAMES |
430 FILE_UNICODE_ON_DISK |
431 FILE_SUPPORTS_HARD_LINKS |
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;