internal static MessageStatus WorkaroundFsCtlSetObjID(FsControlRequestType requestType, BufferSize bufferSize, MessageStatus returnedStatus, ITestSite site) { if (returnedStatus != MessageStatus.INVALID_DEVICE_REQUEST) { if (requestType == FsControlRequestType.SET_OBJECT_ID_EXTENDED && bufferSize == BufferSize.NotEqualFILE_OBJECTID_BUFFER) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(1206, MessageStatus.SUCCESS, returnedStatus, site); } else if ((requestType == FsControlRequestType.SET_OBJECT_ID || requestType == FsControlRequestType.SET_OBJECT_ID_EXTENDED) && bufferSize == BufferSize.BufferSizeSuccess) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(1187, MessageStatus.SUCCESS, returnedStatus, site); } } return(returnedStatus); }
internal static MessageStatus WorkaroundFsCtlForEasyRequest(FileSystem fileSystem, FsControlRequestType requestType, BufferSize bufferSize, bool fileVolReadOnly, bool fileVolUsnAct, ref bool isBytesReturnedSet, ref bool isOutputBufferSizeReturn, MessageStatus returnedStatus, ITestSite site) { if (requestType == FsControlRequestType.RECALL_FILE) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(1136, MessageStatus.SUCCESS, returnedStatus, site); } else if (requestType == FsControlRequestType.FSCTL_SET_SHORT_NAME_BEHAVIOR) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(1274, MessageStatus.INVALID_DEVICE_REQUEST, returnedStatus, site); } else if (requestType == FsControlRequestType.WRITE_USN_CLOSE_RECORD && bufferSize == BufferSize.LessThanTwoBytes && !fileVolReadOnly && fileVolUsnAct) { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(3966, true, isBytesReturnedSet, site); } else if (requestType == FsControlRequestType.SET_ZERO_ON_DEALLOCATION && bufferSize == BufferSize.LessThanSizeofUsn) { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(1388, false, isBytesReturnedSet, site); } else if (requestType == FsControlRequestType.SET_OBJECT_ID && bufferSize == BufferSize.LessThan0x24 && !fileVolReadOnly && !fileVolUsnAct) { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(1068, true, isBytesReturnedSet, site); } else if (requestType == FsControlRequestType.QUERY_FAT_BPB && bufferSize == BufferSize.LessThanTotalSizeOfStatistics) { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(1121, true, isBytesReturnedSet, site); } else if (requestType == FsControlRequestType.QUERY_ON_DISK_VOLUME_INFO && bufferSize == BufferSize.LessThanFILE_QUERY_SPARING_BUFFER && fileVolReadOnly && fileVolUsnAct) { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(5522, true, isBytesReturnedSet, site); } else if (requestType == FsControlRequestType.WRITE_USN_CLOSE_RECORD && returnedStatus == MessageStatus.JOURNAL_NOT_ACTIVE && fileSystem == FileSystem.NTFS) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(1274, MessageStatus.SUCCESS, returnedStatus, site); isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(3966, true, isBytesReturnedSet, site); isOutputBufferSizeReturn = FsaUtility.TransferExpectedResult <bool>(3966, true, isOutputBufferSizeReturn, site); } else if (fileSystem != FileSystem.NTFS && requestType == FsControlRequestType.SET_ZERO_ON_DEALLOCATION) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(4721, MessageStatus.INVALID_DEVICE_REQUEST, returnedStatus, site); isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(4721, false, isBytesReturnedSet, site); isOutputBufferSizeReturn = FsaUtility.TransferExpectedResult <bool>(4721, false, isOutputBufferSizeReturn, site); } else if (fileSystem == FileSystem.FAT32 && requestType == FsControlRequestType.FSCTL_FILESYSTEM_GET_STATISTICS) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(5803, MessageStatus.INVALID_DEVICE_REQUEST, returnedStatus, site); isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(5803, false, isBytesReturnedSet, site); isOutputBufferSizeReturn = FsaUtility.TransferExpectedResult <bool>(5803, false, isOutputBufferSizeReturn, site); } return(returnedStatus); }
public static MessageStatus FsCtlForEasyRequest( FsControlRequestType requestType, BufferSize bufferSize, out bool isBytesReturnedSet, out bool isOutputBufferSizeReturn ) { Condition.IsTrue((requestType == FsControlRequestType.FSCTL_FILESYSTEM_GET_STATISTICS && (bufferSize == BufferSize.LessThanSizeOf_FILESYSTEM_STATISTICS || bufferSize == BufferSize.BufferSizeSuccess)) || (requestType == FsControlRequestType.FSCTL_GET_COMPRESSION && (bufferSize == BufferSize.LessThanTwoBytes || bufferSize == BufferSize.BufferSizeSuccess)) || (requestType == FsControlRequestType.GET_NTFS_VOLUME_DATA && (bufferSize == BufferSize.LessThanNTFS_VOLUME_DATA_BUFFER || bufferSize == BufferSize.BufferSizeSuccess)) || (requestType == FsControlRequestType.QUERY_FAT_BPB && (bufferSize == BufferSize.LessThan0x24 || bufferSize == BufferSize.BufferSizeSuccess)) || (requestType == FsControlRequestType.QUERY_ON_DISK_VOLUME_INFO && (bufferSize == BufferSize.LessThanFILE_QUERY_ON_DISK_VOL_INFO_BUFFER || bufferSize == BufferSize.BufferSizeSuccess)) || (requestType == FsControlRequestType.QUERY_SPARING_INFO && (bufferSize == BufferSize.LessThanFILE_QUERY_SPARING_BUFFER || bufferSize == BufferSize.BufferSizeSuccess)) || (requestType == FsControlRequestType.RECALL_FILE && bufferSize == BufferSize.BufferSizeSuccess) || (requestType == FsControlRequestType.FSCTL_SET_SHORT_NAME_BEHAVIOR && bufferSize == BufferSize.BufferSizeSuccess) || (requestType == FsControlRequestType.SET_ZERO_ON_DEALLOCATION && bufferSize == BufferSize.BufferSizeSuccess) || (requestType == FsControlRequestType.WRITE_USN_CLOSE_RECORD && (bufferSize == BufferSize.LessThanSizeofUsn || bufferSize == BufferSize.BufferSizeSuccess)) ); isBytesReturnedSet = false; isOutputBufferSizeReturn = false; switch (requestType) { #region 3.1.5.9.4 FSCTL_FILESYSTEM_GET_STATISTICS case FsControlRequestType.FSCTL_FILESYSTEM_GET_STATISTICS: { if (!isObjectImplementedFunctionality) { Helper.CaptureRequirement(5803, @"[In FSCTL_FILESYSTEM_GET_STATISTICS] If the object store does not implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST. <23>"); return MessageStatus.INVALID_DEVICE_REQUEST; } if (bufferSize == BufferSize.LessThanSizeOf_FILESYSTEM_STATISTICS) { Requirement.Capture(@"[2.1.5.9.6 FSCTL_FILESYSTEM_GET_STATISTICS] Pseudocode for the operation is as follows: If OutputBufferSize is less than sizeof(FILESYSTEM_STATISTICS), the operation is failed with STATUS_BUFFER_TOO_SMALL."); return MessageStatus.BUFFER_TOO_SMALL; } // If OutputBufferSize is less than the total size of statistics information if (bufferSize == BufferSize.LessThanTotalSizeOfStatistics) { isOutputBufferSizeReturn = true; Helper.CaptureRequirement(1258, @"[In FSCTL_FILESYSTEM_GET_STATISTICS,Pseudocode for the operation is as follows:] If OutputBufferSize is less than the total size of statistics information, then only OutputBufferSize bytes will be returned."); Helper.CaptureRequirement(1259, @"[In FSCTL_FILESYSTEM_GET_STATISTICS,Pseudocode for the operation is as follows: If OutputBufferSize is less than the total size of statistics information]the operation MUST succeed but return with STATUS_BUFFER_OVERFLOW."); Helper.CaptureRequirement(4038, @"[In FSCTL_FILESYSTEM_GET_STATISTICS,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:Status set to STATUS_BUFFER_OVERFLOW."); return MessageStatus.BUFFER_OVERFLOW; } Helper.CaptureRequirement(1009, @"[In FSCTL_FILESYSTEM_GET_STATISTICS,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:Status set to STATUS_SUCCESS or STATUS_BUFFER_OVERFLOW."); Helper.CaptureRequirement(999, @"[In FSCTL_FILESYSTEM_GET_STATISTICS]On completion, the object store MUST return:[Status,OutputBuffer,BytesReturned ]."); isBytesReturnedSet = true; isOutputBufferSizeReturn = true; Helper.CaptureRequirement(1008, @"[In FSCTL_FILESYSTEM_GET_STATISTICS,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:BytesReturned set to the number of total number of bytes of statistical information returned."); return MessageStatus.SUCCESS; } #endregion #region 3.1.5.9.6 FSCTL_GET_COMPRESSION case FsControlRequestType.FSCTL_GET_COMPRESSION: { if (!isObjectImplementedFunctionality) { Helper.CaptureRequirement(1043, @"[In FSCTL_GET_COMPRESSION] If the object store does not implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<26>"); return MessageStatus.INVALID_DEVICE_REQUEST; } if (bufferSize == BufferSize.LessThanTwoBytes) { Helper.CaptureRequirement(5008, @"[In FSCTL_GET_COMPRESSION]Pseudocode for the operation is as follows: If OutputBufferSize is less than sizeof( USHORT ) (2 bytes), the operation MUST be failed with STATUS_INVALID_PARAMETER."); return MessageStatus.INVALID_PARAMETER; } Helper.CaptureRequirement(1051, @"[In FSCTL_GET_COMPRESSION]Upon successful completion of the operation, the object store MUST return:Status set to STATUS_SUCCESS."); Helper.CaptureRequirement(1039, @"[In FSCTL_GET_COMPRESSION]On completion, the object store MUST return:[Status,OutputBuffer ,BytesReturned]."); Helper.CaptureRequirement(4037, @"[In FSCTL_GET_COMPRESSION,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:Status set to STATUS_SUCCESS."); isBytesReturnedSet = true; isOutputBufferSizeReturn = true; Helper.CaptureRequirement(1050, @"[In FSCTL_GET_COMPRESSION,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:BytesReturned set to sizeof( USHORT ) (2 bytes)."); return MessageStatus.SUCCESS; } #endregion #region 3.1.5.9.7 FSCTL_GET_NTFS_VOLUME_DATA case FsControlRequestType.GET_NTFS_VOLUME_DATA: { if (!IsImplement_FSCTL_GET_NTFS_VOLUME_DATA) { Helper.CaptureRequirement(5017, @"[In FSCTL_GET_NTFS_VOLUME_DATA] If the object store does not implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<27> "); return MessageStatus.INVALID_DEVICE_REQUEST; } if (bufferSize == BufferSize.LessThanNTFS_VOLUME_DATA_BUFFER) { Helper.CaptureRequirement(5018, @"[In FSCTL_GET_NTFS_VOLUME_DATA] Pseudocode for the operation is as follows: If OutputBufferSize is less than sizeof( NTFS_VOLUME_DATA_BUFFER ), the operation MUST be failed with STATUS_BUFFER_TOO_SMALL."); return MessageStatus.BUFFER_TOO_SMALL; } isBytesReturnedSet = true; isOutputBufferSizeReturn = true; Helper.CaptureRequirement(5033, @"[In FSCTL_GET_NTFS_VOLUME_DATA,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:BytesReturned set to sizeof( NTFS_VOLUME_DATA_BUFFER )."); Helper.CaptureRequirement(5012, @"[In FSCTL_GET_NTFS_VOLUME_DATA] On completion, the object store MUST return: [Status,OutputBuffer,BytesReturned]."); Helper.CaptureRequirement(5034, @"[In FSCTL_GET_NTFS_VOLUME_DATA,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:Status set to STATUS_SUCCESS."); return MessageStatus.SUCCESS; } #endregion #region 3.1.5.9.8 SET_OBJECT_ID //3.1.5.9.8 SET_OBJECT_ID case FsControlRequestType.SET_OBJECT_ID: { if (!isObjectImplementedFunctionality) { Helper.CaptureRequirement(5036, @"[In FSCTL_GET_OBJECT_ID]If the object store does not implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<29>"); return MessageStatus.INVALID_DEVICE_REQUEST; } if (!isObjectIDsSupportedTrue) { Helper.CaptureRequirement(5037, @"[In FSCTL_GET_OBJECT_ID]Pseudocode for the operation is as follows: If Open.File.Volume.IsObjectIDsSupported is FALSE, the operation MUST be failed with STATUS_VOLUME_NOT_UPGRADED."); return MessageStatus.STATUS_VOLUME_NOT_UPGRADED; } if (bufferSize == BufferSize.LessThanFILE_OBJECTID_BUFFER) { Helper.CaptureRequirement(1061, @"[In FSCTL_GET_OBJECT_ID,Pseudocode for the operation is as follows:] If OutputBufferSize is less than sizeof( FILE_OBJECTID_BUFFER ), the operation MUST be failed with STATUS_INVALID_PARAMETER."); return MessageStatus.INVALID_PARAMETER; } Helper.CaptureRequirement(1069, @"[In FSCTL_GET_OBJECT_ID,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:Status set to STATUS_SUCCESS."); isBytesReturnedSet = true; Helper.CaptureRequirement(1057, @"[In FSCTL_GET_OBJECT_ID]On completion, the object store MUST return: [Status, OutputBuffer,BytesReturned]."); Helper.CaptureRequirement(1068, @"[In FSCTL_GET_OBJECT_ID,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return: BytesReturned set to sizeof ( FILE_OBJECTID_BUFFER )."); return MessageStatus.SUCCESS; } #endregion #region 3.1.5.9.14 FSCTL_QUERY_FAT_BPB case FsControlRequestType.QUERY_FAT_BPB: { if (!IsImplement_FSCTL_QUERY_FAT_BPB) { Helper.CaptureRequirement(1117, @"[ In FSCTL_QUERY_FAT_BPB]If this operation is not supported, this operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<31>"); Helper.CaptureRequirement(5944, @"[ In FSCTL_QUERY_FAT_BPB]implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<32>"); return MessageStatus.INVALID_DEVICE_REQUEST; } if (bufferSize == BufferSize.LessThan0x24) { Helper.CaptureRequirement(1124, @"[ In FSCTL_QUERY_FAT_BPB]Pseudocode for the operation is as follows: If OutputBufferSize is less than 0x24, the operation MUST be failed with STATUS_BUFFER_TOO_SMALL."); return MessageStatus.BUFFER_TOO_SMALL; } isBytesReturnedSet = true; Helper.CaptureRequirement(1126, @"[ In FSCTL_QUERY_FAT_BPB,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:BytesReturned set to 0x24."); Helper.CaptureRequirement(5043, @"[ In FSCTL_QUERY_FAT_BPB,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:The operation returns STATUS_SUCCESS."); Helper.CaptureRequirement(1121, @"[ In FSCTL_QUERY_FAT_BPB]On completion, the object store MUST return: [Status,OutputBuffer,BytesReturned ]."); return MessageStatus.SUCCESS; } #endregion #region 3.1.5.9.16 QUERY_ON_DISK_VOLUME_INFO case FsControlRequestType.QUERY_ON_DISK_VOLUME_INFO: { if (!IsImplement_FSCTL_QUERY_ON_DISK_VOLUME_INFO) { Helper.CaptureRequirement(5508, @"[In FSCTL_QUERY_ON_DISK_VOLUME_INFO]If the object store does not implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<34>"); return MessageStatus.INVALID_DEVICE_REQUEST; } if (bufferSize == BufferSize.LessThanFILE_QUERY_ON_DISK_VOL_INFO_BUFFER) { Helper.CaptureRequirement(5509, @"[In FSCTL_QUERY_ON_DISK_VOLUME_INFO]Pseudocode for the operation is as follows: If OutputBufferSize is less than sizeof( FILE_QUERY_ON_DISK_VOL_INFO_BUFFER ), the operation MUST be failed with STATUS_BUFFER_TOO_SMALL."); return MessageStatus.BUFFER_TOO_SMALL; } isBytesReturnedSet = true; Helper.CaptureRequirement(5521, @"[In FSCTL_QUERY_ON_DISK_VOLUME_INFO,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:BytesReturned set to sizeof( FILE_QUERY_ON_DISK_VOL_INFO_BUFFER )."); Helper.CaptureRequirement(5503, @"[In FSCTL_QUERY_ON_DISK_VOLUME_INFO]On completion, the object store MUST return: [Status,OutputBuffer,BytesReturned]."); Helper.CaptureRequirement(5522, @"[In FSCTL_QUERY_ON_DISK_VOLUME_INFO,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:Status set to STATUS_SUCCESS."); return MessageStatus.SUCCESS; } #endregion #region 3.1.5.9.17 FSCTL_QUERY_SPARING_INFO case FsControlRequestType.QUERY_SPARING_INFO: { if (!IsImplement_FSCTL_QUERY_SPARING_INFO) { Helper.CaptureRequirement(7850, @"[In FSCTL_QUERY_SPARING_INFO]If the object store does not implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<35>"); return MessageStatus.INVALID_DEVICE_REQUEST; } if (bufferSize == BufferSize.LessThanFILE_QUERY_SPARING_BUFFER) { Helper.CaptureRequirement(3851, @"[In FSCTL_QUERY_SPARING_INFO]Pseudocode for the operation is as follows: If OutputBufferSize is less than sizeof( FILE_QUERY_SPARING_BUFFER ), the operation MUST be failed with STATUS_INVALID_PARAMETER."); return MessageStatus.INVALID_PARAMETER; } isBytesReturnedSet = true; Helper.CaptureRequirement(7934, @"[In FSCTL_QUERY_SPARING_INFO,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return: BytesReturned set to sizeof(: FILE_QUERY_SPARING_BUFFER )."); Helper.CaptureRequirement(3847, @"[In FSCTL_QUERY_SPARING_INFO]On completion, the object store MUST return:[Status,OutputBuffer]."); Helper.CaptureRequirement(3856, @"[In FSCTL_QUERY_SPARING_INFO,Pseudocode for the operation is as follows: Upon successful completion of the operation, the object store MUST return:] Status set to STATUS_SUCCESS."); return MessageStatus.SUCCESS; } #endregion #region 3.1.5.9.19 FSCTL_RECALL_FILE case FsControlRequestType.RECALL_FILE: { if (!isObjectImplementedFunctionality) { Helper.CaptureRequirement(1132, @"[ In FSCTL_RECALL_FILE] If the object store does not implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<37>"); return MessageStatus.INVALID_DEVICE_REQUEST; } Helper.CaptureRequirement(1263, @"[ In FSCTL_RECALL_FILE]On completion, the object store MUST return:[Status]."); Helper.CaptureRequirement(1136, @"[ In FSCTL_RECALL_FILE,If Open.File.FileAttributes.FILE_ATTRIBUTE_OFFLINE is set] Upon successful completion of the operation, the object store MUST return:Status set to STATUS_SUCCESS."); return MessageStatus.SUCCESS; } #endregion #region 3.1.5.9.27 FSCTL_SET_SHORT_NAME_BEHAVIOR case FsControlRequestType.FSCTL_SET_SHORT_NAME_BEHAVIOR: { Requirement.Capture(@"[2.1.5.9.34 FSCTL_SET_SHORT_NAME_BEHAVIOR] This control code is reserved for the WinPE <95> environment; the object store MUST return STATUS_INVALID_DEVICE_REQUEST."); return MessageStatus.INVALID_DEVICE_REQUEST; } #endregion #region 3.1.5.9.29 FSCTL_SET_ZERO_ON_DEALLOCATION case FsControlRequestType.SET_ZERO_ON_DEALLOCATION: { if (!IsImplement_SET_ZERO_ON_DEALLOCATION) { Helper.CaptureRequirement(4721, @"[In FSCTL_SET_ZERO_ON_DEALLOCATION] If the object store does not implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<51>"); return MessageStatus.INVALID_DEVICE_REQUEST; } isBytesReturnedSet = true; isOutputBufferSizeReturn = true; Helper.CaptureRequirement(1394, @"[In FSCTL_SET_ZERO_ON_DEALLOCATION,Pseudocode for the operation is as follows:] TUpon successful completion of the operation, the object store MUST return:Status set to STATUS_SUCCESS."); Helper.CaptureRequirement(1388, @"[In FSCTL_SET_ZERO_ON_DEALLOCATION]On completion the object store MUST return:[Status]."); return MessageStatus.SUCCESS; } #endregion #region 3.1.5.9.31 FSCTL_WRITE_USN_CLOSE_RECORD case FsControlRequestType.WRITE_USN_CLOSE_RECORD: { if (!isObjectImplementedFunctionality) { Helper.CaptureRequirement(3959, @"[In FSCTL_WRITE_USN_CLOSE_RECORD] If the object store does not implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<56>"); return MessageStatus.INVALID_DEVICE_REQUEST; } // If Open.File.Volume.IsReadOnly is true if (isFileVolumeReadOnly) { Helper.CaptureRequirement(3960, @"[In FSCTL_WRITE_USN_CLOSE_RECORD]Pseudocode for the operation is as follows: If Open.File.Volume.IsReadOnly is TRUE, the operation MUST be failed with STATUS_MEDIA_WRITE_PROTECTED."); return MessageStatus.MEDIA_WRITE_PROTECTED; } if (bufferSize == BufferSize.LessThanSizeofUsn) { Helper.CaptureRequirement(3961, @"[In FSCTL_WRITE_USN_CLOSE_RECORD,Pseudocode for the operation is as follows:] If OutputBufferSize is less than sizeof( Usn ), the operation MUST be failed with STATUS_INVALID_PARAMETER."); return MessageStatus.INVALID_PARAMETER; } // If Open.File.Volume.IsUsnActive is FALSE if (!isFileVolumeUsnJournalActive) { Helper.CaptureRequirement(3962, @"[In FSCTL_WRITE_USN_CLOSE_RECORD,Pseudocode for the operation is as follows:] If Open.File.Volume.IsUsnJournalActive is FALSE, the operation MUST be failed with STATUS_JOURNAL_NOT_ACTIVE."); return MessageStatus.JOURNAL_NOT_ACTIVE; } isBytesReturnedSet = true; isOutputBufferSizeReturn = true; Helper.CaptureRequirement(3965, @"[In FSCTL_WRITE_USN_CLOSE_RECORD,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:BytesReturned set to sizeof( Usn )."); Helper.CaptureRequirement(3955, @"[In FSCTL_WRITE_USN_CLOSE_RECORD]On completion, the object store MUST return: [Status,OutputBuffer,BytesReturned]."); Helper.CaptureRequirement(3966, @"[In FSCTL_WRITE_USN_CLOSE_RECORD,Pseudocode for the operation is as follows:] Upon successful completion of the operation, the object store MUST return:Status set to STATUS_SUCCESS."); return MessageStatus.SUCCESS; } #endregion default: return MessageStatus.SUCCESS; } }
public static MessageStatus FsCtlSetObjID( FsControlRequestType requestType, BufferSize bufferSize ) { Condition.IsTrue(bufferSize == BufferSize.NotEqualFILE_OBJECTID_BUFFER || bufferSize == BufferSize.NotEqual48Bytes || bufferSize == BufferSize.BufferSizeSuccess); Condition.IsTrue(requestType == FsControlRequestType.SET_OBJECT_ID || requestType == FsControlRequestType.SET_OBJECT_ID_EXTENDED); switch (requestType) { case FsControlRequestType.SET_OBJECT_ID: { #region 23 if (!IsImplement_FSCTL_SET_OBJECT_ID) { Helper.CaptureRequirement(4326, @"[ In FSCTL_SET_OBJECT_ID] If the object store does not implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<42>"); return MessageStatus.INVALID_DEVICE_REQUEST; } if (bufferSize == BufferSize.NotEqualFILE_OBJECTID_BUFFER || bufferSize == BufferSize.NotEqual48Bytes) { Helper.CaptureRequirement(1188, @"[ In FSCTL_SET_OBJECT_ID]Pseudocode for the operation is as follows: If InputBufferSize is not equal to sizeof( FILE_OBJECTID_BUFFER ), the operation MUST be failed with STATUS_INVALID_PARAMETER."); return MessageStatus.INVALID_PARAMETER; } if (!gisObjectIDsSupported) { Helper.CaptureRequirement(4327, @"[ In FSCTL_SET_OBJECT_ID,Pseudocode for the operation is as follows:] If Open.File.Volume.IsObjectIDsSupported is FALSE, the operation MUST be failed with STATUS_VOLUME_NOT_UPGRADED."); return MessageStatus.STATUS_VOLUME_NOT_UPGRADED; } if (!isHasRestoreAccess) { Helper.CaptureRequirement(1190, @"[ In FSCTL_SET_OBJECT_ID,Pseudocode for the operation is as follows:] If Open.HasRestoreAccess is FALSE, the operation MUST be failed with STATUS_ACCESS_DENIED."); return MessageStatus.ACCESS_DENIED; } Helper.CaptureRequirement(1200, @"[ In FSCTL_SET_OBJECT_ID]Upon successful completion of the operation, the object store MUST return:Status set to STATUS_SUCCESS."); Helper.CaptureRequirement(1187, @"[ In FSCTL_SET_OBJECT_ID]On completion, the object store MUST return: Status ¨C An NTSTATUS code that specifies the result."); return MessageStatus.SUCCESS; #endregion } case FsControlRequestType.SET_OBJECT_ID_EXTENDED: { #region 24 if (!IsImplement_FSCTL_SET_OBJECT_ID) { Helper.CaptureRequirement(4329, @"[ In FSCTL_SET_OBJECT_ID_EXTENDED] If the object store does not implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<44>"); return MessageStatus.INVALID_DEVICE_REQUEST; } if (bufferSize == BufferSize.NotEqual48Bytes) { Helper.CaptureRequirement(1207, @"[ In FSCTL_SET_OBJECT_ID_EXTENDED]Pseudocode for the operation is as follows: If InputBufferSize is not equal to sizeof( ObjectId.ExtendedInfo ) (48 bytes), the operation MUST be failed with STATUS_INVALID_PARAMETER."); return MessageStatus.INVALID_PARAMETER; } if (!gisObjectIDsSupported) { Helper.CaptureRequirement(4327, @"[ In FSCTL_SET_OBJECT_ID,Pseudocode for the operation is as follows:] If Open.File.Volume.IsObjectIDsSupported is FALSE, the operation MUST be failed with STATUS_VOLUME_NOT_UPGRADED."); return MessageStatus.STATUS_VOLUME_NOT_UPGRADED; } if (!isHasRestoreAccess) { Helper.CaptureRequirement(1190, @"[ In FSCTL_SET_OBJECT_ID,Pseudocode for the operation is as follows:] If Open.HasRestoreAccess is FALSE, the operation MUST be failed with STATUS_ACCESS_DENIED."); return MessageStatus.ACCESS_DENIED; } Helper.CaptureRequirement(1217, @"[ In FSCTL_SET_OBJECT_ID_EXTENDED]Upon successful completion of this operation, the object store MUST return:Status set to STATUS_SUCCESS."); Helper.CaptureRequirement(1206, @"[ In FSCTL_SET_OBJECT_ID_EXTENDED]On completion, the object store MUST return: Status ¨C An NTSTATUS code that specifies the result."); return MessageStatus.SUCCESS; #endregion } default: return MessageStatus.SUCCESS; } }
internal static bool WorkAroundFsCtlForEasyRequestBool(FileSystem fileSystem, FsControlRequestType requestType, BufferSize bufferSize, bool fileVolReadOnly, bool fileVolUsnAct, bool isBytesReturnedSet, ref bool isOutputBufferSizeReturn, MessageStatus returnedStatus, ITestSite site) { switch (requestType) { case FsControlRequestType.FSCTL_FILESYSTEM_GET_STATISTICS: { if (bufferSize != BufferSize.LessThanTotalSizeOfStatistics && bufferSize != BufferSize.LessThanSizeOf_FILESYSTEM_STATISTICS) { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(5522, true, isBytesReturnedSet, site); } } break; case FsControlRequestType.FSCTL_GET_COMPRESSION: { if (bufferSize != BufferSize.LessThanTwoBytes) { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(5522, true, isBytesReturnedSet, site); } } break; case FsControlRequestType.SET_OBJECT_ID: { if (bufferSize != BufferSize.LessThanFILE_OBJECTID_BUFFER) { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(5522, true, isBytesReturnedSet, site); } } break; case FsControlRequestType.QUERY_FAT_BPB: { if (bufferSize != BufferSize.LessThan0x24) { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(5522, true, isBytesReturnedSet, site); } } break; case FsControlRequestType.QUERY_ON_DISK_VOLUME_INFO: { if (bufferSize != BufferSize.LessThanFILE_QUERY_ON_DISK_VOL_INFO_BUFFER) { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(5522, true, isBytesReturnedSet, site); } } break; case FsControlRequestType.QUERY_SPARING_INFO: { if (bufferSize != BufferSize.LessThanFILE_QUERY_SPARING_BUFFER) { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(5522, true, isBytesReturnedSet, site); } } break; case FsControlRequestType.FSCTL_SET_SHORT_NAME_BEHAVIOR: { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(5522, false, isBytesReturnedSet, site); break; } case FsControlRequestType.WRITE_USN_CLOSE_RECORD: { if ((!fileVolReadOnly && bufferSize != BufferSize.LessThanSizeofUsn && fileVolUsnAct) || ((returnedStatus == MessageStatus.JOURNAL_NOT_ACTIVE && fileSystem == FileSystem.NTFS) || returnedStatus == MessageStatus.SUCCESS)) { isBytesReturnedSet = FsaUtility.TransferExpectedResult <bool>(5522, true, isBytesReturnedSet, site); isOutputBufferSizeReturn = FsaUtility.TransferExpectedResult <bool>(5522, true, isOutputBufferSizeReturn, site); } } break; default: break; } return(isBytesReturnedSet); }
internal static MessageStatus WorkAroundFsCtlForEasyRequest(FileSystem fileSystem, FsControlRequestType requestType, BufferSize bufferSize, bool fileVolReadOnly, bool fileVolUsnAct, MessageStatus returnedStatus, ITestSite site) { switch (requestType) { case FsControlRequestType.FSCTL_GET_COMPRESSION: { if (bufferSize != BufferSize.LessThanTwoBytes) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(1136, MessageStatus.SUCCESS, returnedStatus, site); } else { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(3851, MessageStatus.INVALID_PARAMETER, returnedStatus, site); } } break; case FsControlRequestType.QUERY_SPARING_INFO: { if (bufferSize != BufferSize.LessThanFILE_QUERY_SPARING_BUFFER) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(1136, MessageStatus.SUCCESS, returnedStatus, site); } else { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(3851, MessageStatus.INVALID_PARAMETER, returnedStatus, site); } } break; case FsControlRequestType.RECALL_FILE: returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(1136, MessageStatus.SUCCESS, returnedStatus, site); break; case FsControlRequestType.SET_OBJECT_ID: { if (bufferSize != BufferSize.LessThanFILE_OBJECTID_BUFFER) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(1136, MessageStatus.SUCCESS, returnedStatus, site); } else { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(3851, MessageStatus.INVALID_PARAMETER, returnedStatus, site); } } break; case FsControlRequestType.FSCTL_SET_SHORT_NAME_BEHAVIOR: { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(1136, MessageStatus.INVALID_DEVICE_REQUEST, returnedStatus, site); break; } case FsControlRequestType.WRITE_USN_CLOSE_RECORD: { if ((!fileVolReadOnly && bufferSize != BufferSize.LessThanSizeofUsn && fileVolUsnAct) || (returnedStatus == MessageStatus.JOURNAL_NOT_ACTIVE && fileSystem == FileSystem.NTFS)) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(1136, MessageStatus.SUCCESS, returnedStatus, site); } else if (bufferSize == BufferSize.LessThanSizeofUsn) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(3851, MessageStatus.INVALID_PARAMETER, returnedStatus, site); } else if (fileVolReadOnly) { returnedStatus = FsaUtility.TransferExpectedResult <MessageStatus>(3960, MessageStatus.MEDIA_WRITE_PROTECTED, returnedStatus, site); } } break; default: break; } return(returnedStatus); }
internal static MessageStatus WorkaroundFsCtlForEasyRequest(FileSystem fileSystem, FsControlRequestType requestType, BufferSize bufferSize, bool fileVolReadOnly, bool fileVolUsnAct, ref bool isBytesReturnedSet, ref bool isOutputBufferSizeReturn, MessageStatus returnedStatus, ITestSite site) { if (requestType == FsControlRequestType.RECALL_FILE) { returnedStatus = FsaUtility.TransferExpectedResult<MessageStatus>(1136, MessageStatus.SUCCESS, returnedStatus, site); } else if (requestType == FsControlRequestType.FSCTL_SET_SHORT_NAME_BEHAVIOR) { returnedStatus = FsaUtility.TransferExpectedResult<MessageStatus>(1274, MessageStatus.INVALID_DEVICE_REQUEST, returnedStatus, site); } else if (requestType == FsControlRequestType.WRITE_USN_CLOSE_RECORD && bufferSize == BufferSize.LessThanTwoBytes && !fileVolReadOnly && fileVolUsnAct) { isBytesReturnedSet = FsaUtility.TransferExpectedResult<bool>(3966, true, isBytesReturnedSet, site); } else if (requestType == FsControlRequestType.SET_ZERO_ON_DEALLOCATION && bufferSize == BufferSize.LessThanSizeofUsn) { isBytesReturnedSet = FsaUtility.TransferExpectedResult<bool>(1388, false, isBytesReturnedSet, site); } else if (requestType == FsControlRequestType.SET_OBJECT_ID && bufferSize == BufferSize.LessThan0x24 && !fileVolReadOnly && !fileVolUsnAct) { isBytesReturnedSet = FsaUtility.TransferExpectedResult<bool>(1068, true, isBytesReturnedSet, site); } else if (requestType == FsControlRequestType.QUERY_FAT_BPB && bufferSize == BufferSize.LessThanTotalSizeOfStatistics) { isBytesReturnedSet = FsaUtility.TransferExpectedResult<bool>(1121, true, isBytesReturnedSet, site); } else if (requestType == FsControlRequestType.QUERY_ON_DISK_VOLUME_INFO && bufferSize == BufferSize.LessThanFILE_QUERY_SPARING_BUFFER && fileVolReadOnly && fileVolUsnAct) { isBytesReturnedSet = FsaUtility.TransferExpectedResult<bool>(5522, true, isBytesReturnedSet, site); } else if (requestType == FsControlRequestType.WRITE_USN_CLOSE_RECORD && returnedStatus == MessageStatus.JOURNAL_NOT_ACTIVE && fileSystem == FileSystem.NTFS) { returnedStatus = FsaUtility.TransferExpectedResult<MessageStatus>(1274, MessageStatus.SUCCESS, returnedStatus, site); isBytesReturnedSet = FsaUtility.TransferExpectedResult<bool>(3966, true, isBytesReturnedSet, site); isOutputBufferSizeReturn = FsaUtility.TransferExpectedResult<bool>(3966, true, isOutputBufferSizeReturn, site); } return returnedStatus; }
internal static MessageStatus WorkaroundFsCtlSetObjID(FsControlRequestType requestType, BufferSize bufferSize, MessageStatus returnedStatus, ITestSite site) { if (returnedStatus != MessageStatus.INVALID_DEVICE_REQUEST) { if (requestType == FsControlRequestType.SET_OBJECT_ID_EXTENDED && bufferSize == BufferSize.NotEqualFILE_OBJECTID_BUFFER) { returnedStatus = FsaUtility.TransferExpectedResult<MessageStatus>(1206, MessageStatus.SUCCESS, returnedStatus, site); } else if ((requestType == FsControlRequestType.SET_OBJECT_ID || requestType == FsControlRequestType.SET_OBJECT_ID_EXTENDED) && bufferSize == BufferSize.BufferSizeSuccess) { returnedStatus = FsaUtility.TransferExpectedResult<MessageStatus>(1187, MessageStatus.SUCCESS, returnedStatus, site); } } return returnedStatus; }