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 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!");
            }
        }