示例#1
0
        public uint Smb2WriteOverRdmaChannel(
            UInt64 offset,
            byte[] writeChannelInfo,
            uint length,
            out WRITE_Response responsePayload,
            Channel_Values channel = Channel_Values.CHANNEL_RDMA_V1
            )
        {
            ushort creditCharge = CalculateCreditCharge(length);

            RequestCreditsFromSmb2Server(creditCharge);

            uint status = this.Smb2WriteOverRdmaChannel(
                creditCharge,
                64,
                offset,
                writeChannelInfo,
                length,
                out responsePayload,
                channel
                );

            CalculateSmb2AvailableCredits(creditCharge, packetHeader.CreditRequestResponse);
            return(status);
        }
示例#2
0
        public uint Smb2ReadOverRdmaChannel(
            UInt64 offset,
            uint byteCount,
            byte[] channelBuffer,
            out READ_Response readResponse,
            out byte[] readData,
            Channel_Values channel = Channel_Values.CHANNEL_RDMA_V1
            )
        {
            ushort creditCharge = CalculateCreditCharge(byteCount);

            RequestCreditsFromSmb2Server(creditCharge);

            uint status = this.Read(
                (ushort)creditCharge,
                64,
                Packet_Header_Flags_Values.FLAGS_SIGNED,
                this.messageId,
                this.sessionId,
                this.TreeId,
                byteCount,
                offset,
                this.FileId,
                0,
                channel,
                0,
                channelBuffer,
                out readData,
                out packetHeader,
                out readResponse
                );

            CalculateSmb2AvailableCredits(creditCharge, packetHeader.CreditRequestResponse);
            return(status);
        }
示例#3
0
        private uint Smb2WriteOverRdmaChannel(
            ushort creditCharge,
            ushort creditRequest,
            UInt64 offset,
            byte[] writeChannelInfo,
            uint length,
            out WRITE_Response responsePayload,
            Channel_Values channel = Channel_Values.CHANNEL_RDMA_V1
            )
        {
            WriteRequest(
                creditCharge,
                creditRequest,
                Packet_Header_Flags_Values.FLAGS_SIGNED,
                messageId,
                sessionId,
                TreeId,
                offset,
                FileId,
                channel,
                WRITE_Request_Flags_Values.None,
                writeChannelInfo,
                new byte[length]
                );

            return(WriteResponse(messageId, out this.packetHeader, out responsePayload));
        }
        public void SMBDRead(uint treeId, FILEID fileId, Channel_Values channel, out byte[] buffer, uint offset, uint length, RDMAEndian endian)
        {
            NtStatus status;
            SmbdBufferDescriptorV1 descriptor;


            status = smbdClient.RegisterBuffer(
                (uint)length,
                SmbdBufferReadWrite.RDMA_WRITE_PERMISSION_FOR_READ_FILE,
                endianMap[endian],
                out descriptor
                );

            if (status != NtStatus.STATUS_SUCCESS)
            {
                throw new InvalidOperationException("SMBD register buffer failed!");
            }


            byte[] channelInfo = TypeMarshal.ToBytes(descriptor);

            Packet_Header packetHeader;
            READ_Response response;

            status = (NtStatus)Read(
                0,
                RequestAndConsumeCredit(),
                signingRequired ? Packet_Header_Flags_Values.FLAGS_SIGNED : Packet_Header_Flags_Values.NONE,
                GetMessageId(),
                sessionId,
                treeId,
                length,
                offset,
                fileId,
                length,
                channel,
                0,
                channelInfo,
                out buffer,
                out packetHeader,
                out response
                );

            UpdateCredit(packetHeader);

            if (status != NtStatus.STATUS_SUCCESS)
            {
                throw new InvalidOperationException("Read through SMBD failed!");
            }

            buffer = new byte[length];

            status = smbdClient.ReadRegisteredBuffer(buffer, descriptor);

            if (status != NtStatus.STATUS_SUCCESS)
            {
                throw new InvalidOperationException("SMBD write buffer failed!");
            }
        }
示例#5
0
        private bool CheckSMBDReadWrite(DialectRevision[] dialects, Channel_Values channel)
        {
            try
            {
                using (var client = new SMBDClient(DetectionInfo.ConnectionTimeout))
                {
                    var config = DetectionInfo.SMBDClientCapability;

                    RdmaAdapterInfo rdmaAdapterInfo;

                    client.ConnectOverRDMA(DetectionInfo.DriverRdmaNICIPAddress, DetectionInfo.SUTRdmaNICIPAddress, DetectionInfo.SMBDPort, config.MaxReceiveSize, out rdmaAdapterInfo);

                    client.SMBDNegotiate(
                        config.CreditsRequested,
                        config.ReceiveCreditMax,
                        config.PreferredSendSize,
                        config.MaxReceiveSize,
                        config.MaxFragmentedSize
                        );

                    client.Smb2Negotiate(dialects);

                    client.Smb2SessionSetup(DetectionInfo.Authentication, DetectionInfo.DomainName, DetectionInfo.SUTName, DetectionInfo.UserName, DetectionInfo.Password);

                    string path = Smb2Utility.GetUncPath(DetectionInfo.SUTName, DetectionInfo.ShareFolder);

                    uint treeId;

                    client.Smb2TreeConnect(path, out treeId);

                    FILEID fileId;

                    client.CreateRandomFile(treeId, out fileId);

                    uint length = client.CalculateSMBDMaxReadWriteSize();

                    var buffer = Smb2Utility.CreateRandomByteArray((int)length);

                    client.SMBDWrite(treeId, fileId, channel, buffer, 0, DetectionInfo.Endian);

                    var readBuffer = new byte[length];

                    client.SMBDRead(treeId, fileId, channel, out readBuffer, 0, length, DetectionInfo.Endian);

                    if (!Enumerable.SequenceEqual(buffer, readBuffer))
                    {
                        throw new InvalidOperationException("The data is inconsistent for write and read!");
                    }

                    return(true);
                }
            }
            catch (Exception ex)
            {
                DetectorUtil.WriteLog(String.Format("CheckSMBDReadWrite threw exception: {0}", ex));
                return(false);
            }
        }
示例#6
0
        protected NtStatus Smb2WriteOverRdma(string fileName, byte[] content, Channel_Values channel, SmbdBufferDescriptorV1 descp)
        {
            smbdAdapter.SmbdWriteRegisteredBuffer(content, descp);

            byte[] channelInfo = TypeMarshal.ToBytes <SmbdBufferDescriptorV1>(descp);

            WRITE_Response writeResponse;

            return((NtStatus)smbdAdapter.Smb2WriteOverRdmaChannel(
                       0,
                       channelInfo,
                       (uint)content.Length,
                       out writeResponse,
                       channel));
        }
        private uint Smb2WriteOverRdmaChannel(
            ushort creditCharge,
            ushort creditRequest,
            UInt64 offset,
            byte[] writeChannelInfo,
            uint length,
            out WRITE_Response responsePayload,
            Channel_Values channel = Channel_Values.CHANNEL_RDMA_V1
            )
        {
            var request = new Smb2WriteRequestPacket();

            request.Header.CreditCharge          = creditCharge;
            request.Header.Command               = Smb2Command.WRITE;
            request.Header.CreditRequestResponse = creditRequest;
            request.Header.Flags     = Packet_Header_Flags_Values.FLAGS_SIGNED;
            request.Header.MessageId = messageId;
            request.Header.TreeId    = TreeId;
            request.Header.SessionId = sessionId;

            request.PayLoad.Length                 = 0;
            request.PayLoad.Offset                 = offset;
            request.PayLoad.FileId                 = FileId;
            request.PayLoad.Channel                = channel;
            request.PayLoad.RemainingBytes         = length; // not described in TD. Get from capture package
            request.PayLoad.WriteChannelInfoOffset = request.BufferOffset;
            request.PayLoad.WriteChannelInfoLength = (ushort)writeChannelInfo.Length;
            request.PayLoad.DataOffset             = 0;
            request.PayLoad.Flags = WRITE_Request_Flags_Values.None;

            request.Buffer = writeChannelInfo;

            SendPacket(request);

            return(WriteResponse(messageId, out this.packetHeader, out responsePayload));
        }
        protected NtStatus Smb2WriteOverRdma(string fileName, byte[] content, Channel_Values channel, SmbdBufferDescriptorV1 descp)
        {
            smbdAdapter.SmbdWriteRegisteredBuffer(content, descp);

            byte[] channelInfo = TypeMarshal.ToBytes<SmbdBufferDescriptorV1>(descp);

            WRITE_Response writeResponse;
            return (NtStatus)smbdAdapter.Smb2WriteOverRdmaChannel(
                0,
                channelInfo,
                (uint)content.Length,
                out writeResponse,
                channel);
        }
        public void SMBDWrite(uint treeId, FILEID fileId, Channel_Values channel, byte[] buffer, uint offset, RDMAEndian endian)
        {
            NtStatus status;
            SmbdBufferDescriptorV1 descriptor;

            status = smbdClient.RegisterBuffer(
                (uint)buffer.Length,
                SmbdBufferReadWrite.RDMA_READ_PERMISSION_FOR_WRITE_FILE,
                endianMap[endian],
                out descriptor
                );

            if (status != NtStatus.STATUS_SUCCESS)
            {
                throw new InvalidOperationException("SMBD register buffer failed!");
            }

            status = smbdClient.WriteRegisteredBuffer(buffer, descriptor);
            if (status != NtStatus.STATUS_SUCCESS)
            {
                throw new InvalidOperationException("SMBD write buffer failed!");
            }

            byte[] channelInfo = TypeMarshal.ToBytes(descriptor);

            Packet_Header  packetHeader;
            WRITE_Response response;

            // Pack WRITE request manually since the DataOffset and RemainingBytes need to be fixed.
            var request = new Smb2WriteRequestPacket();

            request.Header.CreditCharge          = 0;
            request.Header.CreditRequestResponse = RequestAndConsumeCredit();
            request.Header.Flags     = signingRequired ? Packet_Header_Flags_Values.FLAGS_SIGNED : Packet_Header_Flags_Values.NONE;
            request.Header.MessageId = GetMessageId();
            request.Header.SessionId = sessionId;
            request.Header.TreeId    = treeId;
            request.Header.Command   = Smb2Command.WRITE;

            request.PayLoad.Offset                 = 0;
            request.PayLoad.FileId                 = fileId;
            request.PayLoad.Channel                = channel;
            request.PayLoad.Flags                  = WRITE_Request_Flags_Values.None;
            request.PayLoad.Length                 = 0;
            request.PayLoad.RemainingBytes         = (uint)buffer.Length;
            request.PayLoad.DataOffset             = 0;
            request.PayLoad.WriteChannelInfoLength = (ushort)channelInfo.Length;
            request.PayLoad.WriteChannelInfoOffset = request.BufferOffset;

            request.Buffer = channelInfo;

            SendPacket(request);

            status = (NtStatus)WriteResponse(messageId, out packetHeader, out response);

            UpdateCredit(packetHeader);

            if (status != NtStatus.STATUS_SUCCESS)
            {
                throw new InvalidOperationException("Write through SMBD failed!");
            }
        }
 public uint Smb2WriteOverRdmaChannel(
     UInt64 offset,
     byte[] channelInfo,
     uint length,
     out WRITE_Response writeResponse,
     Channel_Values channel = Channel_Values.CHANNEL_RDMA_V1)
 {
     return client.Smb2WriteOverRdmaChannel(
         offset,
         channelInfo,
         length,
         out writeResponse,
         channel);
 }
 public uint Smb2ReadOverRdmaChannel(
     UInt64 offset,
     uint byteCount,
     byte[] channelBuffer,
     out READ_Response readResponse,
     out byte[] readData,
     Channel_Values channel = Channel_Values.CHANNEL_RDMA_V1)
 {
     return client.Smb2ReadOverRdmaChannel(
         offset,
         byteCount,
         channelBuffer,
         out readResponse,
         out readData,
         channel);
 }