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); }
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(); }
private void FileInfo_Query_FileEaInformation_IsEASupported(FileType fileType) { BaseTestSite.Log.Add(LogEntryKind.TestStep, "Test case steps:"); MessageStatus status; //Step 1: Create file BaseTestSite.Log.Add(LogEntryKind.TestStep, "1. Create " + fileType.ToString()); status = this.fsaAdapter.CreateFile(fileType); //Step 2: Set FILE_FULLEA_INFORMATION string eaName = this.fsaAdapter.ComposeRandomFileName(8); string eaValue = this.fsaAdapter.ComposeRandomFileName(8); FileFullEaInformation fileFullEaInfo = new FileFullEaInformation(); fileFullEaInfo.NextEntryOffset = 0; fileFullEaInfo.Flags = FILE_FULL_EA_INFORMATION_FLAGS.NONE; fileFullEaInfo.EaNameLength = (byte)eaName.Length; fileFullEaInfo.EaValueLength = (ushort)eaValue.Length; fileFullEaInfo.EaName = Encoding.ASCII.GetBytes(eaName + "\0"); fileFullEaInfo.EaValue = Encoding.ASCII.GetBytes(eaValue); byte[] inputBuffer = TypeMarshal.ToBytes <FileFullEaInformation>(fileFullEaInfo); BaseTestSite.Log.Add(LogEntryKind.TestStep, "2. SetFileInformation with FileInfoClass.FILE_FULLEA_INFORMATION."); status = this.fsaAdapter.SetFileFullEaInformation(fileFullEaInfo); //Step 3: Query FILE_EA_INFORMATION long byteCount; byte[] outputBuffer; FileEaInformation fileEaInfo = new FileEaInformation(); uint outputBufferSize = (uint)TypeMarshal.ToBytes <FileEaInformation>(fileEaInfo).Length; BaseTestSite.Log.Add(LogEntryKind.TestStep, "3. QueryFileInformation with FileInfoClass.FILE_EA_INFORMATION"); status = this.fsaAdapter.QueryFileInformation(FileInfoClass.FILE_EA_INFORMATION, outputBufferSize, out byteCount, out outputBuffer); //Step 4: Verify test result fileEaInfo = TypeMarshal.ToStruct <FileEaInformation>(outputBuffer); BaseTestSite.Log.Add(LogEntryKind.TestStep, "4. Verify outputBuffer.EaSize"); if (this.fsaAdapter.IsExtendedAttributeSupported == false) { this.fsaAdapter.AssertAreEqual(this.Manager, (uint)0, fileEaInfo.EaSize, "ExtendedAttribute is not supported, OutputBuffer.EaSize should be 0."); } else { this.fsaAdapter.AssertAreEqual(this.Manager, true, fileEaInfo.EaSize > 0, "ExtendedAttribute is supported, OutputBuffer.EaSize should be greater than 0."); } }
private void AlternateDataStream_Set_FileEaInformation(FileType fileType) { //Prerequisites: Create streams on a newly created file //Step 1: Set FILE_EA_INFORMATION FileEaInformation fileEaInfo = new FileEaInformation(); fileEaInfo.EaSize = 1024; byte[] inputBuffer = TypeMarshal.ToBytes <FileEaInformation>(fileEaInfo); BaseTestSite.Log.Add(LogEntryKind.TestStep, "{0}. SetFileInformation with FileInfoClass.FILE_EA_INFORMATION.", ++testStep); status = this.fsaAdapter.SetFileInformation(FileInfoClass.FILE_EA_INFORMATION, inputBuffer); //Step 2: Verify test result BaseTestSite.Log.Add(LogEntryKind.TestStep, "{0}. Verify returned NTSTATUS code.", ++testStep); this.fsaAdapter.AssertAreEqual(this.Manager, MessageStatus.INVALID_INFO_CLASS, status, "This operation is not supported and MUST be failed with STATUS_ INVALID_INFO_CLASS."); }
private void FileInfo_Set_FileEaInformation_IsEASupported(FileType fileType) { BaseTestSite.Log.Add(LogEntryKind.TestStep, "Test case steps:"); MessageStatus status; //Step 1: Create file BaseTestSite.Log.Add(LogEntryKind.TestStep, "1. Create " + fileType.ToString()); status = this.fsaAdapter.CreateFile(FileType.DataFile); //Step 2: Set FILE_EA_INFORMATION FileEaInformation fileEaInfo = new FileEaInformation(); fileEaInfo.EaSize = 1024; byte[] inputBuffer = TypeMarshal.ToBytes <FileEaInformation>(fileEaInfo); BaseTestSite.Log.Add(LogEntryKind.TestStep, "2. SetFileInformation with FileInfoClass.FILE_EA_INFORMATION."); status = this.fsaAdapter.SetFileInformation(FileInfoClass.FILE_EA_INFORMATION, inputBuffer); //Step 3: Verify test result BaseTestSite.Log.Add(LogEntryKind.TestStep, "3. Verify returned NTSTATUS code."); this.fsaAdapter.AssertAreEqual(this.Manager, MessageStatus.INVALID_INFO_CLASS, status, "This operation is not supported and MUST be failed with STATUS_ INVALID_INFO_CLASS."); }
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); } } }
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(); } }
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); } }