public void BVT_SMB2Basic_QueryAndSet_FileInfo() { BaseTestSite.Log.Add(LogEntryKind.TestStep, "Starts a client by sending the following requests: NEGOTIATE; SESSION_SETUP; TREE_CONNECT."); client1 = new Smb2FunctionalClient(TestConfig.Timeout, TestConfig, BaseTestSite); client1.ConnectToServer(TestConfig.UnderlyingTransport, TestConfig.SutComputerName, TestConfig.SutIPAddress); client1.Negotiate(TestConfig.RequestDialects, TestConfig.IsSMB1NegotiateEnabled); client1.SessionSetup( TestConfig.DefaultSecurityPackage, TestConfig.SutComputerName, TestConfig.AccountCredential, TestConfig.UseServerGssToken); uint treeId1; client1.TreeConnect(uncSharePath, out treeId1); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Client sends CREATE request with desired access set to GENERIC_READ and GENERIC_WRITE to create a file."); Smb2CreateContextResponse[] serverCreateContexts; CREATE_Response? createResponse = null; string fileName = Guid.NewGuid().ToString() + ".txt"; FILEID fileId1; client1.Create( treeId1, fileName, CreateOptions_Values.FILE_NON_DIRECTORY_FILE, out fileId1, out serverCreateContexts, accessMask: AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE, checker: (Packet_Header header, CREATE_Response response) => { BaseTestSite.Assert.AreEqual( Smb2Status.STATUS_SUCCESS, header.Status, "CREATE should succeed, actually server returns {0}.", Smb2Status.GetStatusCode(header.Status)); BaseTestSite.Log.Add(LogEntryKind.TestStep, "FileBasicInformation in CREATE response: \r\nCreationTime: {0}\r\nLastAccessTime:{1}\r\nLastWriteTime: {2}\r\nChangeTime: {3}\r\nFileAttributes: {4}", Smb2Utility.ConvertToDateTimeUtc(response.CreationTime).ToString("MM/dd/yyy hh:mm:ss.ffffff"), Smb2Utility.ConvertToDateTimeUtc(response.LastAccessTime).ToString("MM/dd/yyy hh:mm:ss.ffffff"), Smb2Utility.ConvertToDateTimeUtc(response.LastWriteTime).ToString("MM/dd/yyy hh:mm:ss.ffffff"), Smb2Utility.ConvertToDateTimeUtc(response.ChangeTime).ToString("MM/dd/yyy hh:mm:ss.ffffff"), response.FileAttributes); createResponse = response; }); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Client sends QUERY_INFO request to query file attributes."); byte[] outputBuffer; client1.QueryFileAttributes( treeId1, (byte)FileInformationClasses.FileBasicInformation, QUERY_INFO_Request_Flags_Values.SL_RESTART_SCAN, fileId1, new byte[0] { }, out outputBuffer); FileBasicInformation fileBasicInfo = TypeMarshal.ToStruct <FileBasicInformation>(outputBuffer); BaseTestSite.Log.Add(LogEntryKind.TestStep, "FileBasicInformation in QUERY_INFO response: \r\nCreationTime: {0}\r\nLastAccessTime:{1}\r\nLastWriteTime: {2}\r\nChangeTime: {3}\r\nFileAttributes: {4}", Smb2Utility.ConvertToDateTimeUtc(fileBasicInfo.CreationTime).ToString("MM/dd/yyy hh:mm:ss.ffffff"), Smb2Utility.ConvertToDateTimeUtc(fileBasicInfo.LastAccessTime).ToString("MM/dd/yyy hh:mm:ss.ffffff"), Smb2Utility.ConvertToDateTimeUtc(fileBasicInfo.LastWriteTime).ToString("MM/dd/yyy hh:mm:ss.ffffff"), Smb2Utility.ConvertToDateTimeUtc(fileBasicInfo.ChangeTime).ToString("MM/dd/yyy hh:mm:ss.ffffff"), fileBasicInfo.FileAttributes); BaseTestSite.Assert.AreEqual(createResponse.Value.CreationTime, fileBasicInfo.CreationTime, "CreationTime received in QUERY_INFO response should be identical with that got in CREATE response"); BaseTestSite.Assert.AreEqual(createResponse.Value.LastAccessTime, fileBasicInfo.LastAccessTime, "LastAccessTime received in QUERY_INFO response should be identical with that got in CREATE response"); BaseTestSite.Assert.AreEqual(createResponse.Value.LastWriteTime, fileBasicInfo.LastWriteTime, "LastWriteTime received in QUERY_INFO response should be identical with that got in CREATE response"); BaseTestSite.Assert.AreEqual(createResponse.Value.ChangeTime, fileBasicInfo.ChangeTime, "ChangeTime received in QUERY_INFO response should be identical with that got in CREATE response"); BaseTestSite.Assert.AreEqual(createResponse.Value.FileAttributes, fileBasicInfo.FileAttributes, "FileAttributes received in QUERY_INFO response should be identical with that got in CREATE response"); FileBasicInformation fileBasicInfoToSet = fileBasicInfo; DateTime dateTimeToSet = DateTime.UtcNow; fileBasicInfoToSet.LastAccessTime = Smb2Utility.ConvertToFileTime(dateTimeToSet); byte[] inputBuffer; inputBuffer = TypeMarshal.ToBytes <FileBasicInformation>(fileBasicInfoToSet); BaseTestSite.Log.Add( LogEntryKind.TestStep, "Client sends SetFileAttributes request to set LastAccessTime for the file to {0}", dateTimeToSet.ToString("MM/dd/yyy hh:mm:ss.ffffff")); client1.SetFileAttributes( treeId1, (byte)FileInformationClasses.FileBasicInformation, fileId1, inputBuffer); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Client sends QUERY request to query file attributes."); client1.QueryFileAttributes( treeId1, (byte)FileInformationClasses.FileBasicInformation, QUERY_INFO_Request_Flags_Values.SL_RESTART_SCAN, fileId1, new byte[0] { }, out outputBuffer); fileBasicInfo = TypeMarshal.ToStruct <FileBasicInformation>(outputBuffer); BaseTestSite.Log.Add( LogEntryKind.TestStep, "LastAccessTime in QUERY_INFO response after SET_INFO {0}", Smb2Utility.ConvertToDateTimeUtc(fileBasicInfo.LastAccessTime).ToString("MM/dd/yyy hh:mm:ss.ffffff")); BaseTestSite.Assert.AreNotEqual( createResponse.Value.LastAccessTime, fileBasicInfo.LastAccessTime, "LastAccessTime (dwHighDateTime:{0}, dwLowDateTime:{1}) after SET_INFO should not be equal to the value (dwHighDateTime:{2}, dwLowDateTime:{3}) before SET_INFO", fileBasicInfo.LastAccessTime.dwHighDateTime, fileBasicInfo.LastAccessTime.dwLowDateTime, createResponse.Value.LastAccessTime.dwHighDateTime, createResponse.Value.LastAccessTime.dwLowDateTime); BaseTestSite.Assert.AreEqual( fileBasicInfoToSet.LastAccessTime, fileBasicInfo.LastAccessTime, "LastAccessTime (dwHighDateTime:{0}, dwLowDateTime:{1}) queried after SET_INFO should be equal to the desired value (dwHighDateTime:{2}, dwLowDateTime:{3})", fileBasicInfo.LastAccessTime.dwHighDateTime, fileBasicInfo.LastAccessTime.dwLowDateTime, fileBasicInfoToSet.LastAccessTime.dwHighDateTime, fileBasicInfoToSet.LastAccessTime.dwLowDateTime); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Tear down the client by sending the following requests: CLOSE; TREE_DISCONNECT; LOG_OFF"); client1.Close(treeId1, fileId1); client1.TreeDisconnect(treeId1); client1.LogOff(); }