private void FsCtl_Get_Volume_Data(FileType fileType, FileSystem fileSystem) { if (fileSystem != FileSystem.REFS && fileSystem != FileSystem.NTFS) { throw new InvalidOperationException("Unexpected fileSystem!"); } BaseTestSite.Assume.AreEqual(fileSystem, this.fsaAdapter.FileSystem, "The case is only applicable for {0} file system.", fileSystem); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Test case steps:"); MessageStatus status; BaseTestSite.Log.Add(LogEntryKind.TestStep, "1. Create a file."); status = this.fsaAdapter.CreateFile(fileType); BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "Create should succeed."); BaseTestSite.Log.Add(LogEntryKind.TestStep, "2. Query FileIdInformation."); long byteCount; byte[] outputBuffer; status = this.fsaAdapter.QueryFileInformation(FileInfoClass.FileIdInformation, this.fsaAdapter.transBufferSize, out byteCount, out outputBuffer); BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "Query FileIdInformation should succeed."); FileIdInformation fileIdInfo = TypeMarshal.ToStruct <FileIdInformation>(outputBuffer); BaseTestSite.Log.Add(LogEntryKind.TestStep, "3. Query FileFsFullSizeInformation."); status = this.fsaAdapter.QueryFileSystemInformation(FileSystemInfoClass.File_FsFullSize_Information, this.fsaAdapter.transBufferSize, out byteCount, out outputBuffer); BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "Query FileFsFullSizeInformation should succeed."); FileFsFullSizeInformation fileFsFullSizeInfo = TypeMarshal.ToStruct <FileFsFullSizeInformation>(outputBuffer); BaseTestSite.Log.Add(LogEntryKind.TestStep, "4. FSCTL request with FSCTL_GET_{0}_VOLUME_DATA.", fileSystem); status = this.fsaAdapter.FsCtlForEasyRequest(fileSystem == FileSystem.REFS ? FsControlCommand.FSCTL_GET_REFS_VOLUME_DATA : FsControlCommand.FSCTL_GET_NTFS_VOLUME_DATA, out outputBuffer); BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "FSCTL_GET_{0}_VOLUME_DATA should succeed.", fileSystem); long volumeSerialNumber; long totalClusters; uint bytesPerSector; if (fileSystem == FileSystem.REFS) { REFS_VOLUME_DATA_BUFFER refsVolumeData = TypeMarshal.ToStruct <REFS_VOLUME_DATA_BUFFER>(outputBuffer); volumeSerialNumber = refsVolumeData.VolumeSerialNumber; totalClusters = refsVolumeData.TotalClusters; bytesPerSector = refsVolumeData.BytesPerSector; } else { NTFS_VOLUME_DATA_BUFFER ntfsVolumeData = TypeMarshal.ToStruct <NTFS_VOLUME_DATA_BUFFER>(outputBuffer); volumeSerialNumber = ntfsVolumeData.VolumeSerialNumber; totalClusters = ntfsVolumeData.TotalClusters; bytesPerSector = ntfsVolumeData.BytesPerSector; } BaseTestSite.Log.Add(LogEntryKind.TestStep, "5. Verify returned {0}_VOLUME_DATA_BUFFER.", fileSystem); BaseTestSite.Assert.AreEqual(fileIdInfo.VolumeSerialNumber, volumeSerialNumber, "VolumeSerialNumber of {0}_VOLUME_DATA_BUFFER should be the same with VolumeSerialNumber of FileIdInformation.", fileSystem); BaseTestSite.Assert.AreEqual(fileFsFullSizeInfo.TotalAllocationUnits, totalClusters, "TotalClusters of {0}_VOLUME_DATA_BUFFER should be the same with TotalAllocationUnits of FileFsFullSizeInformation", fileSystem); BaseTestSite.Assert.AreEqual(fileFsFullSizeInfo.BytesPerSector, bytesPerSector, "BytesPerSector of {0}_VOLUME_DATA_BUFFER should be the same with BytesPerSector of FileFsFullSizeInformation", fileSystem); }
public NTStatus GetFileSystemInformation(out FileSystemInformation result, FileSystemInformationClass informationClass) { switch (informationClass) { case FileSystemInformationClass.FileFsVolumeInformation: { FileFsVolumeInformation information = new FileFsVolumeInformation(); information.SupportsObjects = false; result = information; return(NTStatus.STATUS_SUCCESS); } case FileSystemInformationClass.FileFsSizeInformation: { FileFsSizeInformation information = new FileFsSizeInformation(); information.TotalAllocationUnits = m_fileSystem.Size / ClusterSize; information.AvailableAllocationUnits = m_fileSystem.FreeSpace / ClusterSize; information.SectorsPerAllocationUnit = ClusterSize / BytesPerSector; information.BytesPerSector = BytesPerSector; result = information; return(NTStatus.STATUS_SUCCESS); } case FileSystemInformationClass.FileFsDeviceInformation: { FileFsDeviceInformation information = new FileFsDeviceInformation(); information.DeviceType = DeviceType.Disk; information.Characteristics = DeviceCharacteristics.IsMounted; result = information; return(NTStatus.STATUS_SUCCESS); } case FileSystemInformationClass.FileFsAttributeInformation: { FileFsAttributeInformation information = new FileFsAttributeInformation(); information.FileSystemAttributes = FileSystemAttributes.CasePreservedNamed | FileSystemAttributes.UnicodeOnDisk; information.MaximumComponentNameLength = 255; information.FileSystemName = m_fileSystem.Name; result = information; return(NTStatus.STATUS_SUCCESS); } case FileSystemInformationClass.FileFsControlInformation: { FileFsControlInformation information = new FileFsControlInformation(); information.FileSystemControlFlags = FileSystemControlFlags.ContentIndexingDisabled; information.DefaultQuotaThreshold = UInt64.MaxValue; information.DefaultQuotaLimit = UInt64.MaxValue; result = information; return(NTStatus.STATUS_SUCCESS); } case FileSystemInformationClass.FileFsFullSizeInformation: { FileFsFullSizeInformation information = new FileFsFullSizeInformation(); information.TotalAllocationUnits = m_fileSystem.Size / ClusterSize; information.CallerAvailableAllocationUnits = m_fileSystem.FreeSpace / ClusterSize; information.ActualAvailableAllocationUnits = m_fileSystem.FreeSpace / ClusterSize; information.SectorsPerAllocationUnit = ClusterSize / BytesPerSector; information.BytesPerSector = BytesPerSector; result = information; return(NTStatus.STATUS_SUCCESS); } case FileSystemInformationClass.FileFsObjectIdInformation: { result = null; // STATUS_INVALID_PARAMETER is returned when the file system does not implement object IDs // See: https://msdn.microsoft.com/en-us/library/cc232106.aspx return(NTStatus.STATUS_INVALID_PARAMETER); } case FileSystemInformationClass.FileFsSectorSizeInformation: { FileFsSectorSizeInformation information = new FileFsSectorSizeInformation(); information.LogicalBytesPerSector = BytesPerSector; information.PhysicalBytesPerSectorForAtomicity = BytesPerSector; information.PhysicalBytesPerSectorForPerformance = BytesPerSector; information.FileSystemEffectivePhysicalBytesPerSectorForAtomicity = BytesPerSector; information.ByteOffsetForSectorAlignment = 0; information.ByteOffsetForPartitionAlignment = 0; result = information; return(NTStatus.STATUS_SUCCESS); } default: { result = null; return(NTStatus.STATUS_INVALID_INFO_CLASS); } } }