Esempio n. 1
0
        private void SendIoctlPayload(
            Smb2Client client,
            CtlCode_Values code,
            byte[] payload,
            Packet_Header_Flags_Values headerFlags,
            ulong messageId,
            uint treeId,
            ulong sessionId,
            FILEID fileId)
        {
            if (client == null)
            {
                throw new InvalidOperationException("The transport is not connected.");
            }

            if (payload == null)
            {
                throw new ArgumentNullException("payload");
            }

            var request = new Smb2IOCtlRequestPacket();

            request.Header.CreditCharge          = 1;
            request.Header.Command               = Smb2Command.IOCTL;
            request.Header.CreditRequestResponse = 1;
            request.Header.Flags     = headerFlags;
            request.Header.MessageId = messageId;
            request.Header.TreeId    = treeId;
            request.Header.SessionId = sessionId;

            request.PayLoad.CtlCode = code;

            if (code == CtlCode_Values.FSCTL_DFS_GET_REFERRALS || code == CtlCode_Values.FSCTL_DFS_GET_REFERRALS_EX)
            {
                request.PayLoad.FileId = FILEID.Invalid;
            }
            else
            {
                request.PayLoad.FileId = fileId;
            }

            if (payload.Length > 0)
            {
                request.PayLoad.InputOffset = request.BufferOffset;
                request.PayLoad.InputCount  = (ushort)payload.Length;
                request.Buffer = payload;
            }

            request.PayLoad.MaxInputResponse  = 0;
            request.PayLoad.MaxOutputResponse = 4096;
            request.PayLoad.Flags             = IOCTL_Request_Flags_Values.SMB2_0_IOCTL_IS_FSCTL;

            ioctlRequestMessageIds.Enqueue(request.Header.MessageId);
            client.SendPacket(request);
        }
        public void SendIoctlPayload(CtlCode_Values code, byte[] payload)
        {
            if (this.client == null)
            {
                throw new InvalidOperationException("The transport is not connected.");
            }

            if (payload == null)
            {
                throw new ArgumentNullException("payload");
            }

            var request = new Smb2IOCtlRequestPacket();

            request.Header.CreditCharge = IOCTL_DEFAULT_CREDIT_CHARGE;
            request.Header.Command = Smb2Command.IOCTL;
            request.Header.CreditRequestResponse = 1;
            request.Header.Flags = headerFlags;
            request.Header.MessageId = messageId++;
            request.Header.TreeId = treeId;
            request.Header.SessionId = sessionId;

            request.PayLoad.CtlCode = code;

            if (code == CtlCode_Values.FSCTL_DFS_GET_REFERRALS || code == CtlCode_Values.FSCTL_DFS_GET_REFERRALS_EX)
            {
                request.PayLoad.FileId = FILEID.Invalid;
            }
            else
            {
                request.PayLoad.FileId = this.fileId;
            }

            if (payload.Length > 0)
            {
                request.PayLoad.InputOffset = request.BufferOffset;
                request.PayLoad.InputCount = (ushort)payload.Length;
                request.Buffer = payload;
            }

            request.PayLoad.MaxInputResponse = IOCTL_DEFAULT_MAX_INPUT_RESPONSE;
            request.PayLoad.MaxOutputResponse = IOCTL_DEFAULT_MAX_OUTPUT_RESPONSE;
            request.PayLoad.Flags = IOCTL_Request_Flags_Values.SMB2_0_IOCTL_IS_FSCTL;

            ioctlRequestMessageIds.Enqueue(request.Header.MessageId);
            client.SendPacket(request);
        }