public NtStatus SmbdReceiveDataTransferMessage( TimeSpan timeout, out SmbdDataTransferMessage transferMsg ) { return(smbdClient.ReceiveDataTransferMessage( timeout, out transferMsg )); }
/// <summary> /// Receive and validate SMB2 Read Response /// </summary> /// <param name="readResponseSize">Size of SMB2 read response</param> public void ValidateReadResponse(int credits, int readResponseSize) { // receive read response, maybe in several SMBDirect data transfer messages SmbdDataTransferMessage transferPackage = new SmbdDataTransferMessage(); byte[] readResponsePacket = new byte[readResponseSize]; int offset = 0; NtStatus status; while (offset < readResponseSize) { while (smbdAdapter.ClientConnection.ReceiveCredits > 0) { status = (NtStatus)smbdAdapter.SmbdReceivDataTransferMessage( smbdAdapter.TestConfig.Smb2ConnectionTimeout, out transferPackage ); BaseTestSite.Log.Add( LogEntryKind.Debug, "Received a SMBDirect Data Transfer message, current Connection.ReceiveCredits is {0}", smbdAdapter.ClientConnection.ReceiveCredits); #region Assert BaseTestSite.Assert.AreEqual <NtStatus>( NtStatus.STATUS_SUCCESS, status, "Received SMBDirect Data Transfer Message with status {0}", status); BaseTestSite.Assert.AreEqual <uint>( (uint)(readResponseSize - offset), transferPackage.DataLength + transferPackage.RemainingDataLength, "Received SMBDirect Data Transfer Message: DataLength {0}, RemainingDataLength {1}", transferPackage.DataLength, transferPackage.RemainingDataLength); BaseTestSite.Assert.AreEqual <uint>( 0, transferPackage.DataOffset % 8, "Received SMBDirect Data Transfer Message: DataOffset {0}, which should be 8-byte aligned", transferPackage.DataOffset); #endregion Array.Copy(transferPackage.Buffer, 0, readResponsePacket, offset, transferPackage.DataLength); offset += (int)transferPackage.DataLength; if (transferPackage.RemainingDataLength == 0) { break; } } BaseTestSite.Assert.IsTrue(transferPackage.CreditsGranted > 0, "SMBDirect Data Tranfer message with last credit should with CreditsGranted greater than 0"); #region send empty message to grant credit status = NtStatus.STATUS_SUCCESS; do { status = smbdAdapter.SmbdPostReceive(); }while (status == NtStatus.STATUS_SUCCESS && smbdAdapter.ClientConnection.ReceiveCredits < credits); // check receive queue before sending BaseTestSite.Assert.AreEqual <int>( 0, smbdAdapter.ReceiveEntryInQueue, "No message should be sent from server"); smbdAdapter.SmbdSendDataTransferMessage( smbdAdapter.ClientConnection.SendCreditTarget, (ushort)smbdAdapter.ClientConnection.ReceiveCredits, SmbdDataTransfer_Flags.NONE, 0, 0, 0, new byte[0]); BaseTestSite.Log.Add( LogEntryKind.Debug, "Grant {0} credits to peer, current Connection.ReceiveCredits is {0}", smbdAdapter.ClientConnection.ReceiveCredits); #endregion } #region Decode SMB2 READ response and validate object endpoint = new object(); int consumedLength; int expectedLength; StackPacket[] stackPackets = smbdAdapter.Decoder.Smb2DecodePacketCallback( endpoint, readResponsePacket, out consumedLength, out expectedLength); Smb2ReadResponsePacket package = (Smb2ReadResponsePacket)stackPackets[0]; READ_Response readResponse = package.PayLoad; BaseTestSite.Assert.AreEqual <NtStatus>( NtStatus.STATUS_SUCCESS, (NtStatus)package.Header.Status, "Status of SMB2 Read File is {0}", (NtStatus)package.Header.Status); #endregion }