Esempio n. 1
0
        /// <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.");
        }