public SMBFileSystemInformation(ISMBFileStore fileStore, string path, NTStatus status) { var shareName = path.ShareName(); var relativePath = path.RelativeSharePath(); if (status == NTStatus.STATUS_SUCCESS) { fileStore.GetFileSystemInformation(out var fileFsVolumeInformation, FileSystemInformationClass.FileFsVolumeInformation); fileStore.GetFileSystemInformation(out var fileFsDeviceInformation, FileSystemInformationClass.FileFsDeviceInformation); fileStore.GetFileSystemInformation(out var fileFsFullSizeInformation, FileSystemInformationClass.FileFsFullSizeInformation); fileStore.GetFileSystemInformation(out var fileFsAttributeInformation, FileSystemInformationClass.FileFsAttributeInformation); fileStore.GetFileSystemInformation(out var fileFsControlInformation, FileSystemInformationClass.FileFsControlInformation); fileStore.GetFileSystemInformation(out var fileFsSectorSizeInformation, FileSystemInformationClass.FileFsSectorSizeInformation); VolumeInformation = (FileFsVolumeInformation)fileFsVolumeInformation; DeviceInformation = (FileFsDeviceInformation)fileFsDeviceInformation; SizeInformation = (FileFsFullSizeInformation)fileFsFullSizeInformation; AttributeInformation = (FileFsAttributeInformation)fileFsAttributeInformation; ControlInformation = (FileFsControlInformation)fileFsControlInformation; SectorSizeInformation = (FileFsSectorSizeInformation)fileFsSectorSizeInformation; } }
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); } } }