Beispiel #1
0
 public NtStatus SmbdReceiveDataTransferMessage(
     TimeSpan timeout,
     out SmbdDataTransferMessage transferMsg
     )
 {
     return(smbdClient.ReceiveDataTransferMessage(
                timeout,
                out transferMsg
                ));
 }
Beispiel #2
0
        /// <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
        }