/// <summary> /// Get the access rights applied to the given file handle. /// </summary> public unsafe static FileAccessRights GetRights(SafeFileHandle fileHandle) { FILE_ACCESS_INFORMATION access = new FILE_ACCESS_INFORMATION(); NTSTATUS result = Imports.NtQueryInformationFile(fileHandle, out _, &access, (uint)sizeof(FILE_ACCESS_INFORMATION), FileInformationClass.FileAccessInformation); if (result != NTSTATUS.STATUS_SUCCESS) { throw ErrorMethods.GetIoExceptionForNTStatus(result); } return(access.AccessFlags); }
public void FileInfo_Query_FileAccessInformation_DataSuffix() { if (this.fsaAdapter.FileSystem == FileSystem.FAT32) { this.TestSite.Assume.Inconclusive("File name with stream type or stream data as suffix is not supported by FAT32."); } // Create a new file string fileName = this.fsaAdapter.ComposeRandomFileName(8, ".txt", CreateOptions.NON_DIRECTORY_FILE); fileName = $"{fileName}::$DATA"; BaseTestSite.Log.Add(LogEntryKind.TestStep, $"Create a file {fileName}"); FILEID fileId; uint treeId = 0; ulong sessionId = 0; MessageStatus status = this.fsaAdapter.CreateFile( fileName, (FileAttribute)0, CreateOptions.NON_DIRECTORY_FILE, (FileAccess.GENERIC_READ | FileAccess.GENERIC_WRITE), (ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE | ShareAccess.FILE_SHARE_DELETE), CreateDisposition.OPEN_IF, out fileId, out treeId, out sessionId); this.fsaAdapter.AssertAreEqual(this.Manager, MessageStatus.SUCCESS, status, $"Create file with name {fileName} is expected to succeed."); long byteCount; byte[] outputBuffer; FILE_ACCESS_INFORMATION fileAccessInfo = new FILE_ACCESS_INFORMATION(); uint outputBufferSize = (uint)TypeMarshal.ToBytes <FILE_ACCESS_INFORMATION>(fileAccessInfo).Length; status = this.fsaAdapter.QueryFileInformation( FileInfoClass.FILE_ACCESS_INFORMATION, outputBufferSize, out byteCount, out outputBuffer); this.fsaAdapter.AssertAreEqual(this.Manager, MessageStatus.SUCCESS, status, $"Query access information of file {fileName} is expected to succeed."); }
private void AlternateDataStream_Query_FileAccessInformation(FileType fileType) { //Prerequisites: Create streams on a newly created file //Step 1: Query FILE_ACCESS_INFORMATION long byteCount; byte[] outputBuffer; FILE_ACCESS_INFORMATION fileAccessInfo = new FILE_ACCESS_INFORMATION(); uint outputBufferSize = (uint)TypeMarshal.ToBytes <FILE_ACCESS_INFORMATION>(fileAccessInfo).Length; BaseTestSite.Log.Add(LogEntryKind.TestStep, "{0}. QueryFileInformation with FileInfoClass.FILE_ACCESS_INFORMATION", ++testStep); status = this.fsaAdapter.QueryFileInformation(FileInfoClass.FILE_ACCESS_INFORMATION, outputBufferSize, out byteCount, out outputBuffer); this.fsaAdapter.AssertIfNotSuccess(status, "QueryFileInformation with FileInfoClass.FILE_ACCESS_INFORMATION operation failed."); // Step 2: Verify FILE_ACCESS_INFORMATION fileAccessInfo = TypeMarshal.ToStruct <FILE_ACCESS_INFORMATION>(outputBuffer); BaseTestSite.Log.Add(LogEntryKind.TestStep, "{0}. Verify outputBuffer.AccessFlags", ++testStep); BaseTestSite.Assert.IsNotNull(fileAccessInfo, "The outputBuffer.AccessFlags MUST be set to Open.GrantedAccess."); }