private void AlternateDataStream_Query_FileStandardInformation(FileType fileType)
        {
            //Prerequisites: Create streams on a newly created file

            //Step 1: Query FILE_STANDARD_INFORMATION
            long byteCount;

            byte[] outputBuffer;
            FileStandardInformation fileStandardInfo = new FileStandardInformation();

            fileStandardInfo.Reserved = new byte[2] {
                0x00, 0x00
            };
            uint outputBufferSize = (uint)TypeMarshal.ToBytes <FileStandardInformation>(fileStandardInfo).Length;

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "{0}. QueryFileInformation with FileInfoClass.FILE_STANDARD_INFORMATION", ++testStep);
            status = this.fsaAdapter.QueryFileInformation(FileInfoClass.FILE_STANDARD_INFORMATION, outputBufferSize, out byteCount, out outputBuffer);
            this.fsaAdapter.AssertIfNotSuccess(status, "QueryFileInformation with FileInfoClass.FILE_STANDARD_INFORMATION operation failed.");

            // Step 6: Verify FILE_STANDARD_INFORMATION
            fileStandardInfo = TypeMarshal.ToStruct <FileStandardInformation>(outputBuffer);
            BaseTestSite.Log.Add(LogEntryKind.TestStep, "{0}. Verify outputBuffer.EndOfFile", ++testStep);
            this.fsaAdapter.AssertAreEqual(this.Manager, dataStreamList[":" + dataStreamName1 + ":$DATA"], fileStandardInfo.EndOfFile,
                                           "EndOfFile specifies the offset to the byte immediately following the last valid byte in the file. Because this value is zero-based, it actually refers to the first free byte in the file. That is, it is the offset from the beginning of the file at which new bytes appended to the file will be written.");
        }
Пример #2
0
        internal SMBFileInfo(string path,
                             IFileSystem fileSystem,
                             FileBasicInformation fileBasicInformation,
                             FileStandardInformation fileStandardInformation,
                             ISMBCredential credential) : this(path, fileSystem)
        {
            if (fileBasicInformation.CreationTime.Time.HasValue)
            {
                _creationTime    = fileBasicInformation.CreationTime.Time.Value;
                _creationTimeUtc = CreationTime.ToUniversalTime();
            }
            if (fileBasicInformation.LastAccessTime.Time.HasValue)
            {
                _lastAccessTime    = fileBasicInformation.LastAccessTime.Time.Value;
                _lastAccessTimeUtc = LastAccessTime.ToUniversalTime();
            }
            if (fileBasicInformation.LastWriteTime.Time.HasValue)
            {
                _lastWriteTime    = fileBasicInformation.LastWriteTime.Time.Value;
                _lastWriteTimeUtc = LastWriteTime.ToUniversalTime();
            }

            _attributes = (System.IO.FileAttributes)fileBasicInformation.FileAttributes;

            var parentPath = _fileSystem.Path.GetDirectoryName(path);


            _directory     = _dirInfoFactory.FromDirectoryName(parentPath, credential);
            _directoryName = parentPath;
            _exists        = _file.Exists(path);
            _isReadOnly    = fileBasicInformation.FileAttributes.HasFlag(SMBLibrary.FileAttributes.ReadOnly);
            _length        = fileStandardInformation.EndOfFile;
        }
Пример #3
0
        internal SMBFileInfo(string path,
                             IFileSystem fileSystem,
                             FileBasicInformation fileBasicInformation,
                             FileStandardInformation fileStandardInformation,
                             ISMBCredential credential) : this(path, fileSystem)
        {
            if (fileBasicInformation.CreationTime.Time.HasValue)
            {
                _creationTime    = fileBasicInformation.CreationTime.Time.Value;
                _creationTimeUtc = CreationTime.ToUniversalTime();
            }
            if (fileBasicInformation.LastAccessTime.Time.HasValue)
            {
                _lastAccessTime    = fileBasicInformation.LastAccessTime.Time.Value;
                _lastAccessTimeUtc = LastAccessTime.ToUniversalTime();
            }
            if (fileBasicInformation.LastWriteTime.Time.HasValue)
            {
                _lastWriteTime    = fileBasicInformation.LastWriteTime.Time.Value;
                _lastWriteTimeUtc = LastWriteTime.ToUniversalTime();
            }

            _attributes = (System.IO.FileAttributes)fileBasicInformation.FileAttributes;

            var pathUri          = new Uri(path);
            var parentUri        = pathUri.AbsoluteUri.EndsWith('/') ? new Uri(pathUri, "..") : new Uri(pathUri, ".");
            var parentPathString = parentUri.IsUnc ? parentUri.LocalPath : parentUri.AbsoluteUri;

            _directory     = _dirInfoFactory.FromDirectoryName(parentPathString, credential);
            _directoryName = Directory?.Name;
            _exists        = _file.Exists(path);
            _isReadOnly    = fileBasicInformation.FileAttributes.HasFlag(SMBLibrary.FileAttributes.ReadOnly);
            _length        = fileStandardInformation.EndOfFile;
        }
        /// <summary>
        /// Verify file standard information
        /// </summary>
        /// <param name="info">An instance of FileStandardInformation</param>
        /// <param name="status">An instance of MessageStatus</param>
        private void VerifyFileStandardInformation(FileStandardInformation info, MessageStatus status)
        {
            if (this.fileSystem == FileSystem.NTFS)
            {
                //
                // Add the debug information
                //
                Site.Log.Add(LogEntryKind.Debug, "Verify MS-FSA_R46036 Actual FileSystem: {0}", fileSystem);

                //
                // Verify MS-FSA requirement: MS-FSA_R46036
                //
                Site.CaptureRequirementIfAreEqual <MessageStatus>(
                    MessageStatus.SUCCESS,
                    status,
                    46036,
                    @"[In FileStandardInformation] <58> Section 3.1.5.11.27: This algorithm is implemented by NTFS. ");
            }

            if (this.fileSystem == FileSystem.FAT ||
                this.fileSystem == FileSystem.EXFAT ||
                this.fileSystem == FileSystem.CDFS ||
                this.fileSystem == FileSystem.UDFS)
            {
                //
                // Add the debug information
                //
                Site.Log.Add(LogEntryKind.Debug, "Verify MS-FSA_R4637");

                //
                // Verify MS-FSA requirement: MS-FSA_R4637
                //
                Site.CaptureRequirementIfAreEqual <uint>(
                    1,
                    info.NumberOfLinks,
                    4637,
                    @"[In FileStandardInformation] <58> Section 3.1.5.11.27:The FAT, EXFAT, CDFS, and UDFS file systems always return 1.");
            }

            if (info.NumberOfLinks == 0)
            {
                //
                // Add the debug information
                //
                Site.Log.Add(LogEntryKind.Debug, "Verify MS-FSA_R2746");

                //
                // Verify MS-FSA requirement: MS-FSA_R2746
                //
                Site.CaptureRequirementIfAreEqual <byte>(
                    1,
                    info.DeletePending,
                    2746,
                    @"[In FileStandardInformation,Pseudocode for the operation is as follows:]If alignmentInfo.NumberOfLinks is 0, 
                    set alignmentInfo.DeletePending to 1.");
            }
        }
Пример #5
0
 public FileAllInformation(byte[] buffer, int offset)
 {
     BasicInformation     = new FileBasicInformation(buffer, offset + 0);
     StandardInformation  = new FileStandardInformation(buffer, offset + 40);
     InternalInformation  = new FileInternalInformation(buffer, offset + 64);
     EaInformation        = new FileEaInformation(buffer, offset + 72);
     AccessInformation    = new FileAccessInformation(buffer, offset + 76);
     PositionInformation  = new FilePositionInformation(buffer, offset + 80);
     ModeInformation      = new FileModeInformation(buffer, offset + 88);
     AlignmentInformation = new FileAlignmentInformation(buffer, offset + 92);
     NameInformation      = new FileNameInformation(buffer, offset + 96);
 }
Пример #6
0
 public FileAllInformation()
 {
     BasicInformation     = new FileBasicInformation();
     StandardInformation  = new FileStandardInformation();
     InternalInformation  = new FileInternalInformation();
     EaInformation        = new FileEaInformation();
     AccessInformation    = new FileAccessInformation();
     PositionInformation  = new FilePositionInformation();
     ModeInformation      = new FileModeInformation();
     AlignmentInformation = new FileAlignmentInformation();
     NameInformation      = new FileNameInformation();
 }
Пример #7
0
        /// <summary>
        /// Get Node from Path and SMB-FileInfomation
        /// </summary>
        /// <param name="fullPath"></param>
        /// <param name="paramSet"></param>
        /// <param name="basicInfo"></param>
        /// <param name="stdInfo"></param>
        /// <returns></returns>
        public static Node Get(
            string fullPath,
            FixedParamSet paramSet,
            FileBasicInformation basicInfo,
            FileStandardInformation stdInfo = null
            )
        {
            if (paramSet == null)
            {
                throw new ArgumentException("Required paramSet.");
            }
            if (basicInfo == null)
            {
                throw new ArgumentException("Required info.");
            }

            var pathSet = PathSet.Parse(fullPath);

            if (basicInfo.FileAttributes.HasFlag(SMBLibrary.FileAttributes.Directory))
            {
                // Folder
                var result = NodeFactory.InnerGet(
                    NodeType.Folder,
                    pathSet,
                    paramSet
                    );
                result.Created      = basicInfo.CreationTime;
                result.Updated      = basicInfo.LastWriteTime;
                result.LastAccessed = basicInfo.LastAccessTime;

                return(result);
            }
            else
            {
                // File
                var result = NodeFactory.InnerGet(
                    NodeType.File,
                    pathSet,
                    paramSet
                    );
                result.Size         = stdInfo?.EndOfFile;
                result.Created      = basicInfo.CreationTime;
                result.Updated      = basicInfo.LastWriteTime;
                result.LastAccessed = basicInfo.LastAccessTime;

                return(result);
            }
        }
        public static NTStatus GetFileInformation(out QueryInformation result, INTFileStore fileStore, object handle, QueryInformationLevel informationLevel)
        {
            result = null;
            FileInformation fileInfo;

            switch (informationLevel)
            {
            case QueryInformationLevel.SMB_INFO_QUERY_ALL_EAS:
            {
                result = null;
                return(NTStatus.STATUS_NOT_IMPLEMENTED);
            }

            case QueryInformationLevel.SMB_INFO_IS_NAME_VALID:
            {
                result = null;
                return(NTStatus.STATUS_NOT_IMPLEMENTED);
            }

            case QueryInformationLevel.SMB_QUERY_FILE_BASIC_INFO:
            {
                NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileBasicInformation);
                if (status != NTStatus.STATUS_SUCCESS)
                {
                    return(status);
                }

                FileBasicInformation fileBasicInfo = (FileBasicInformation)fileInfo;

                QueryFileBasicInfo information = new QueryFileBasicInfo();
                information.CreationTime      = fileBasicInfo.CreationTime;
                information.LastAccessTime    = fileBasicInfo.LastAccessTime;
                information.LastWriteTime     = fileBasicInfo.LastWriteTime;
                information.LastChangeTime    = fileBasicInfo.LastWriteTime;
                information.ExtFileAttributes = (ExtendedFileAttributes)fileBasicInfo.FileAttributes;
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case QueryInformationLevel.SMB_QUERY_FILE_STANDARD_INFO:
            {
                NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileStandardInformation);
                if (status != NTStatus.STATUS_SUCCESS)
                {
                    return(status);
                }

                FileStandardInformation fileStandardInfo = (FileStandardInformation)fileInfo;

                QueryFileStandardInfo information = new QueryFileStandardInfo();
                information.AllocationSize = fileStandardInfo.AllocationSize;
                information.EndOfFile      = fileStandardInfo.EndOfFile;
                information.DeletePending  = fileStandardInfo.DeletePending;
                information.Directory      = fileStandardInfo.Directory;
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case QueryInformationLevel.SMB_QUERY_FILE_EA_INFO:
            {
                NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileEaInformation);
                if (status != NTStatus.STATUS_SUCCESS)
                {
                    return(status);
                }

                FileEaInformation fileEAInfo = (FileEaInformation)fileInfo;

                QueryFileExtendedAttributeInfo information = new QueryFileExtendedAttributeInfo();
                information.EASize = fileEAInfo.EaSize;
                result             = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case QueryInformationLevel.SMB_QUERY_FILE_NAME_INFO:
            {
                NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileNameInformation);
                if (status != NTStatus.STATUS_SUCCESS)
                {
                    return(status);
                }

                FileNameInformation fileNameInfo = (FileNameInformation)fileInfo;

                QueryFileNameInfo information = new QueryFileNameInfo();
                information.FileName = fileNameInfo.FileName;
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case QueryInformationLevel.SMB_QUERY_FILE_ALL_INFO:
            {
                NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileAllInformation);
                if (status != NTStatus.STATUS_SUCCESS)
                {
                    return(status);
                }

                FileAllInformation fileAllInfo = (FileAllInformation)fileInfo;

                QueryFileAllInfo information = new QueryFileAllInfo();
                information.CreationDateTime   = fileAllInfo.BasicInformation.CreationTime;
                information.LastAccessDateTime = fileAllInfo.BasicInformation.LastAccessTime;
                information.LastWriteDateTime  = fileAllInfo.BasicInformation.LastWriteTime;
                information.LastChangeTime     = fileAllInfo.BasicInformation.LastWriteTime;
                information.ExtFileAttributes  = (ExtendedFileAttributes)fileAllInfo.BasicInformation.FileAttributes;
                information.AllocationSize     = fileAllInfo.StandardInformation.AllocationSize;
                information.EndOfFile          = fileAllInfo.StandardInformation.EndOfFile;
                information.DeletePending      = fileAllInfo.StandardInformation.DeletePending;
                information.Directory          = fileAllInfo.StandardInformation.Directory;
                information.EASize             = fileAllInfo.EaInformation.EaSize;
                information.FileName           = fileAllInfo.NameInformation.FileName;
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case QueryInformationLevel.SMB_QUERY_FILE_ALT_NAME_INFO:
            {
                NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileAlternateNameInformation);
                if (status != NTStatus.STATUS_SUCCESS)
                {
                    return(status);
                }

                FileAlternateNameInformation fileAltNameInfo = (FileAlternateNameInformation)fileInfo;

                QueryFileAltNameInfo information = new QueryFileAltNameInfo();
                information.FileName = fileAltNameInfo.FileName;
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case QueryInformationLevel.SMB_QUERY_FILE_STREAM_INFO:
            {
                NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileStreamInformation);
                if (status != NTStatus.STATUS_SUCCESS)
                {
                    return(status);
                }

                FileStreamInformation fileStreamInfo = (FileStreamInformation)fileInfo;

                QueryFileStreamInfo information = new QueryFileStreamInfo();
                information.StreamSize           = fileStreamInfo.StreamSize;
                information.StreamAllocationSize = fileStreamInfo.StreamAllocationSize;
                information.StreamName           = fileStreamInfo.StreamName;
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case QueryInformationLevel.SMB_QUERY_FILE_COMPRESSION_INFO:
            {
                NTStatus status = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileCompressionInformation);
                if (status != NTStatus.STATUS_SUCCESS)
                {
                    return(status);
                }

                FileCompressionInformation fileCompressionInfo = (FileCompressionInformation)fileInfo;

                QueryFileCompressionInfo information = new QueryFileCompressionInfo();
                information.CompressedFileSize   = fileCompressionInfo.CompressedFileSize;
                information.CompressionFormat    = fileCompressionInfo.CompressionFormat;
                information.CompressionUnitShift = fileCompressionInfo.CompressionUnitShift;
                information.ChunkShift           = fileCompressionInfo.ChunkShift;
                information.ClusterShift         = fileCompressionInfo.ClusterShift;
                information.Reserved             = fileCompressionInfo.Reserved;
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            default:
            {
                result = null;
                return(NTStatus.STATUS_OS2_INVALID_LEVEL);
            }
            }
        }
Пример #9
0
 public static QueryInformation FromFileInformation(FileInformation fileInformation)
 {
     if (fileInformation is FileBasicInformation)
     {
         FileBasicInformation fileBasicInfo = (FileBasicInformation)fileInformation;
         QueryFileBasicInfo   result        = new QueryFileBasicInfo();
         result.CreationTime      = fileBasicInfo.CreationTime;
         result.LastAccessTime    = fileBasicInfo.LastAccessTime;
         result.LastWriteTime     = fileBasicInfo.LastWriteTime;
         result.LastChangeTime    = fileBasicInfo.ChangeTime;
         result.ExtFileAttributes = (ExtendedFileAttributes)fileBasicInfo.FileAttributes;
         return(result);
     }
     else if (fileInformation is FileStandardInformation)
     {
         FileStandardInformation fileStandardInfo = (FileStandardInformation)fileInformation;
         QueryFileStandardInfo   result           = new QueryFileStandardInfo();
         result.AllocationSize = fileStandardInfo.AllocationSize;
         result.EndOfFile      = fileStandardInfo.EndOfFile;
         result.DeletePending  = fileStandardInfo.DeletePending;
         result.Directory      = fileStandardInfo.Directory;
         return(result);
     }
     else if (fileInformation is FileEaInformation)
     {
         FileEaInformation fileEAInfo = (FileEaInformation)fileInformation;
         QueryFileEaInfo   result     = new QueryFileEaInfo();
         result.EaSize = fileEAInfo.EaSize;
         return(result);
     }
     else if (fileInformation is FileNameInformation)
     {
         FileNameInformation fileNameInfo = (FileNameInformation)fileInformation;
         QueryFileNameInfo   result       = new QueryFileNameInfo();
         result.FileName = fileNameInfo.FileName;
         return(result);
     }
     else if (fileInformation is FileAllInformation)
     {
         FileAllInformation fileAllInfo = (FileAllInformation)fileInformation;
         QueryFileAllInfo   result      = new QueryFileAllInfo();
         result.CreationTime      = fileAllInfo.BasicInformation.CreationTime;
         result.LastAccessTime    = fileAllInfo.BasicInformation.LastAccessTime;
         result.LastWriteTime     = fileAllInfo.BasicInformation.LastWriteTime;
         result.LastChangeTime    = fileAllInfo.BasicInformation.ChangeTime;
         result.ExtFileAttributes = (ExtendedFileAttributes)fileAllInfo.BasicInformation.FileAttributes;
         result.AllocationSize    = fileAllInfo.StandardInformation.AllocationSize;
         result.EndOfFile         = fileAllInfo.StandardInformation.EndOfFile;
         result.DeletePending     = fileAllInfo.StandardInformation.DeletePending;
         result.Directory         = fileAllInfo.StandardInformation.Directory;
         result.EaSize            = fileAllInfo.EaInformation.EaSize;
         result.FileName          = fileAllInfo.NameInformation.FileName;
         return(result);
     }
     else if (fileInformation is FileAlternateNameInformation)
     {
         FileAlternateNameInformation fileAltNameInfo = (FileAlternateNameInformation)fileInformation;
         QueryFileAltNameInfo         result          = new QueryFileAltNameInfo();
         result.FileName = fileAltNameInfo.FileName;
         return(result);
     }
     else if (fileInformation is FileStreamInformation)
     {
         FileStreamInformation fileStreamInfo = (FileStreamInformation)fileInformation;
         QueryFileStreamInfo   result         = new QueryFileStreamInfo();
         result.Entries.AddRange(fileStreamInfo.Entries);
         return(result);
     }
     else if (fileInformation is FileCompressionInformation)
     {
         FileCompressionInformation fileCompressionInfo = (FileCompressionInformation)fileInformation;
         QueryFileCompressionInfo   result = new QueryFileCompressionInfo();
         result.CompressedFileSize   = fileCompressionInfo.CompressedFileSize;
         result.CompressionFormat    = fileCompressionInfo.CompressionFormat;
         result.CompressionUnitShift = fileCompressionInfo.CompressionUnitShift;
         result.ChunkShift           = fileCompressionInfo.ChunkShift;
         result.ClusterShift         = fileCompressionInfo.ClusterShift;
         result.Reserved             = fileCompressionInfo.Reserved;
         return(result);
     }
     else
     {
         throw new NotImplementedException();
     }
 }
Пример #10
0
        public NTStatus GetFileInformation(out FileInformation result, object handle, FileInformationClass informationClass)
        {
            FileHandle      fileHandle = (FileHandle)handle;
            string          path       = fileHandle.Path;
            FileSystemEntry entry;

            try
            {
                entry = m_fileSystem.GetEntry(path);
            }
            catch (Exception ex)
            {
                if (ex is IOException || ex is UnauthorizedAccessException)
                {
                    NTStatus status = ToNTStatus(ex);
                    Log(Severity.Verbose, "GetFileInformation on '{0}' failed. {1}", path, status);
                    result = null;
                    return(status);
                }
                else
                {
                    throw;
                }
            }

            switch (informationClass)
            {
            case FileInformationClass.FileBasicInformation:
            {
                FileBasicInformation information = new FileBasicInformation();
                information.CreationTime   = entry.CreationTime;
                information.LastAccessTime = entry.LastAccessTime;
                information.LastWriteTime  = entry.LastWriteTime;
                information.ChangeTime     = entry.LastWriteTime;
                information.FileAttributes = GetFileAttributes(entry);
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case FileInformationClass.FileStandardInformation:
            {
                FileStandardInformation information = new FileStandardInformation();
                information.AllocationSize = (long)GetAllocationSize(entry.Size);
                information.EndOfFile      = (long)entry.Size;
                information.Directory      = entry.IsDirectory;
                information.DeletePending  = fileHandle.DeleteOnClose;
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case FileInformationClass.FileInternalInformation:
            {
                FileInternalInformation information = new FileInternalInformation();
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case FileInformationClass.FileEaInformation:
            {
                FileEaInformation information = new FileEaInformation();
                information.EaSize = 0;
                result             = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case FileInformationClass.FileAccessInformation:
            {
                result = null;
                return(NTStatus.STATUS_NOT_IMPLEMENTED);
            }

            case FileInformationClass.FileNameInformation:
            {
                FileNameInformation information = new FileNameInformation();
                information.FileName = entry.Name;
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case FileInformationClass.FilePositionInformation:
            {
                result = null;
                return(NTStatus.STATUS_NOT_IMPLEMENTED);
            }

            case FileInformationClass.FileFullEaInformation:
            {
                result = null;
                return(NTStatus.STATUS_NOT_IMPLEMENTED);
            }

            case FileInformationClass.FileModeInformation:
            {
                result = null;
                return(NTStatus.STATUS_NOT_IMPLEMENTED);
            }

            case FileInformationClass.FileAlignmentInformation:
            {
                result = null;
                return(NTStatus.STATUS_NOT_IMPLEMENTED);
            }

            case FileInformationClass.FileAllInformation:
            {
                FileAllInformation information = new FileAllInformation();
                information.BasicInformation.CreationTime      = entry.CreationTime;
                information.BasicInformation.LastAccessTime    = entry.LastAccessTime;
                information.BasicInformation.LastWriteTime     = entry.LastWriteTime;
                information.BasicInformation.ChangeTime        = entry.LastWriteTime;
                information.BasicInformation.FileAttributes    = GetFileAttributes(entry);
                information.StandardInformation.AllocationSize = (long)GetAllocationSize(entry.Size);
                information.StandardInformation.EndOfFile      = (long)entry.Size;
                information.StandardInformation.Directory      = entry.IsDirectory;
                information.StandardInformation.DeletePending  = fileHandle.DeleteOnClose;
                information.NameInformation.FileName           = entry.Name;
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case FileInformationClass.FileAlternateNameInformation:
            {
                // If there is no alternate name Windows will return STATUS_OBJECT_NAME_NOT_FOUND
                result = null;
                return(NTStatus.STATUS_OBJECT_NAME_NOT_FOUND);
            }

            case FileInformationClass.FileStreamInformation:
            {
                // This information class is used to enumerate the data streams of a file or a directory.
                // A buffer of FileStreamInformation data elements is returned by the server.
                FileStreamInformation information = new FileStreamInformation();
                List <KeyValuePair <string, ulong> > dataStreams = m_fileSystem.ListDataStreams(fileHandle.Path);
                foreach (KeyValuePair <string, ulong> dataStream in dataStreams)
                {
                    FileStreamEntry streamEntry = new FileStreamEntry();
                    ulong           streamSize  = dataStream.Value;
                    streamEntry.StreamSize           = (long)streamSize;
                    streamEntry.StreamAllocationSize = (long)GetAllocationSize(streamSize);
                    streamEntry.StreamName           = dataStream.Key;
                    information.Entries.Add(streamEntry);
                }
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case FileInformationClass.FilePipeInformation:
            {
                result = null;
                return(NTStatus.STATUS_NOT_IMPLEMENTED);
            }

            case FileInformationClass.FilePipeLocalInformation:
            {
                result = null;
                return(NTStatus.STATUS_NOT_IMPLEMENTED);
            }

            case FileInformationClass.FilePipeRemoteInformation:
            {
                result = null;
                return(NTStatus.STATUS_NOT_IMPLEMENTED);
            }

            case FileInformationClass.FileCompressionInformation:
            {
                result = null;
                return(NTStatus.STATUS_NOT_IMPLEMENTED);
            }

            case FileInformationClass.FileNetworkOpenInformation:
            {
                FileNetworkOpenInformation information = new FileNetworkOpenInformation();
                information.CreationTime   = entry.CreationTime;
                information.LastAccessTime = entry.LastAccessTime;
                information.LastWriteTime  = entry.LastWriteTime;
                information.ChangeTime     = entry.LastWriteTime;
                information.AllocationSize = (long)GetAllocationSize(entry.Size);
                information.EndOfFile      = (long)entry.Size;
                information.FileAttributes = GetFileAttributes(entry);
                result = information;
                return(NTStatus.STATUS_SUCCESS);
            }

            case FileInformationClass.FileAttributeTagInformation:
            {
                result = null;
                return(NTStatus.STATUS_NOT_IMPLEMENTED);
            }

            default:
                result = null;
                return(NTStatus.STATUS_INVALID_INFO_CLASS);
            }
        }