private void FileInfo_Query_FileIdInformation(FileType fileType)
        {
            BaseTestSite.Assume.AreNotEqual(FileSystem.FAT32, fsaAdapter.FileSystem, "File system should not be FAT32.");

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "Test case steps:");
            MessageStatus status;

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "1. Create a file.");
            status = this.fsaAdapter.CreateFile(fileType);
            BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "Create should succeed.");

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "2. Query FileIdInformation.");
            byte[] outputBuffer;
            long   byteCount;

            status = this.fsaAdapter.QueryFileInformation(FileInfoClass.FileIdInformation, this.fsaAdapter.transBufferSize, out byteCount, out outputBuffer);
            BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "Query FileIdInformation should succeed.");

            FileIdInformation fileIdInfo = TypeMarshal.ToStruct <FileIdInformation>(outputBuffer);

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "3. Get FileId by sending FSCTL_READ_FILE_USN_DATA to server.");
            status = this.fsaAdapter.FsCtlReadFileUSNData(3, 3, out outputBuffer); // Only version 3 USN record contains 128 bit FileReferenceNumber;
            BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "FSCTL_READ_FILE_USN_DATA should succeed.");
            USN_RECORD_V3 record = TypeMarshal.ToStruct <USN_RECORD_V3>(outputBuffer);

            System.Guid fileId = record.FileReferenceNumber;
            BaseTestSite.Assert.AreEqual(fileId, fileIdInfo.FileId, "FileId when querying FileIdInformation should be the same with FileReferenceNumber when sending FSCTL_READ_FILE_USN_DATA.");

            // We can get the 64-bit VolumeSerialNumber only by sending FSCTL_GET_NTFS_VOLUME_DATA or FSCTL_GET_REFS_VOLUME_DATA.
            // For other file system, just ignore this check.
            if (this.fsaAdapter.FileSystem == FileSystem.NTFS)
            {
                BaseTestSite.Log.Add(LogEntryKind.TestStep, "4. Get VolumeSerialNumber by sending FSCTL_GET_NTFS_VOLUME_DATA to server.");
                status = this.fsaAdapter.FsCtlForEasyRequest(FsControlCommand.FSCTL_GET_NTFS_VOLUME_DATA, out outputBuffer);
                BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "FSCTL_GET_NTFS_VOLUME_DATA should succeed.");
                NTFS_VOLUME_DATA_BUFFER ntfsVolumeData = TypeMarshal.ToStruct <NTFS_VOLUME_DATA_BUFFER>(outputBuffer);
                long volumeId = ntfsVolumeData.VolumeSerialNumber;
                BaseTestSite.Assert.AreEqual(volumeId, fileIdInfo.VolumeSerialNumber,
                                             "VolumeSerialNumber when querying FileIdInformation should be the same with VolumeSerialNumber when sending FSCTL_GET_NTFS_VOLUME_DATA.");
            }
            else if (this.fsaAdapter.FileSystem == FileSystem.REFS)
            {
                BaseTestSite.Log.Add(LogEntryKind.TestStep, "4. Get VolumeSerialNumber by sending FSCTL_GET_REFS_VOLUME_DATA to server.");
                status = this.fsaAdapter.FsCtlForEasyRequest(FsControlCommand.FSCTL_GET_REFS_VOLUME_DATA, out outputBuffer);
                BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "FSCTL_GET_REFS_VOLUME_DATA should succeed.");
                REFS_VOLUME_DATA_BUFFER refsVolumeData = TypeMarshal.ToStruct <REFS_VOLUME_DATA_BUFFER>(outputBuffer);
                long volumeId = refsVolumeData.VolumeSerialNumber;
                BaseTestSite.Assert.AreEqual(volumeId, fileIdInfo.VolumeSerialNumber,
                                             "VolumeSerialNumber when querying FileIdInformation should be the same with VolumeSerialNumber when sending FSCTL_GET_REFS_VOLUME_DATA.");
            }
        }
        private void FsCtl_Get_Volume_Data(FileType fileType, FileSystem fileSystem)
        {
            if (fileSystem != FileSystem.REFS && fileSystem != FileSystem.NTFS)
            {
                throw new InvalidOperationException("Unexpected fileSystem!");
            }

            BaseTestSite.Assume.AreEqual(fileSystem, this.fsaAdapter.FileSystem, "The case is only applicable for {0} file system.", fileSystem);

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "Test case steps:");
            MessageStatus status;

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "1. Create a file.");
            status = this.fsaAdapter.CreateFile(fileType);
            BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "Create should succeed.");

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "2. Query FileIdInformation.");
            long byteCount;

            byte[] outputBuffer;
            status = this.fsaAdapter.QueryFileInformation(FileInfoClass.FileIdInformation, this.fsaAdapter.transBufferSize, out byteCount, out outputBuffer);
            BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "Query FileIdInformation should succeed.");
            FileIdInformation fileIdInfo = TypeMarshal.ToStruct <FileIdInformation>(outputBuffer);

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "3. Query FileFsFullSizeInformation.");
            status = this.fsaAdapter.QueryFileSystemInformation(FileSystemInfoClass.File_FsFullSize_Information, this.fsaAdapter.transBufferSize, out byteCount, out outputBuffer);
            BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "Query FileFsFullSizeInformation should succeed.");
            FileFsFullSizeInformation fileFsFullSizeInfo = TypeMarshal.ToStruct <FileFsFullSizeInformation>(outputBuffer);

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "4. FSCTL request with FSCTL_GET_{0}_VOLUME_DATA.", fileSystem);
            status = this.fsaAdapter.FsCtlForEasyRequest(fileSystem == FileSystem.REFS ? FsControlCommand.FSCTL_GET_REFS_VOLUME_DATA : FsControlCommand.FSCTL_GET_NTFS_VOLUME_DATA, out outputBuffer);
            BaseTestSite.Assert.AreEqual(MessageStatus.SUCCESS, status, "FSCTL_GET_{0}_VOLUME_DATA should succeed.", fileSystem);

            long volumeSerialNumber;
            long totalClusters;
            uint bytesPerSector;

            if (fileSystem == FileSystem.REFS)
            {
                REFS_VOLUME_DATA_BUFFER refsVolumeData = TypeMarshal.ToStruct <REFS_VOLUME_DATA_BUFFER>(outputBuffer);
                volumeSerialNumber = refsVolumeData.VolumeSerialNumber;
                totalClusters      = refsVolumeData.TotalClusters;
                bytesPerSector     = refsVolumeData.BytesPerSector;
            }
            else
            {
                NTFS_VOLUME_DATA_BUFFER ntfsVolumeData = TypeMarshal.ToStruct <NTFS_VOLUME_DATA_BUFFER>(outputBuffer);
                volumeSerialNumber = ntfsVolumeData.VolumeSerialNumber;
                totalClusters      = ntfsVolumeData.TotalClusters;
                bytesPerSector     = ntfsVolumeData.BytesPerSector;
            }

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "5. Verify returned {0}_VOLUME_DATA_BUFFER.", fileSystem);

            BaseTestSite.Assert.AreEqual(fileIdInfo.VolumeSerialNumber, volumeSerialNumber,
                                         "VolumeSerialNumber of {0}_VOLUME_DATA_BUFFER should be the same with VolumeSerialNumber of FileIdInformation.", fileSystem);
            BaseTestSite.Assert.AreEqual(fileFsFullSizeInfo.TotalAllocationUnits, totalClusters,
                                         "TotalClusters of {0}_VOLUME_DATA_BUFFER should be the same with TotalAllocationUnits of FileFsFullSizeInformation", fileSystem);
            BaseTestSite.Assert.AreEqual(fileFsFullSizeInfo.BytesPerSector, bytesPerSector,
                                         "BytesPerSector of {0}_VOLUME_DATA_BUFFER should be the same with BytesPerSector of FileFsFullSizeInformation", fileSystem);
        }