コード例 #1
0
        /// <summary>
        /// to split a nttrans request to a nttrans request with nttrans secondary requests.
        /// </summary>
        /// <param name="ntTransRequest">the nttrans request packet to be split.</param>
        /// <param name="parameterCount">the parameter count with which to split the request packet.</param>
        /// <param name="dataCount">the data count with which to split the request packet.</param>
        /// <returns>a requests array of the split nttrans request with nttrans secondary requests.</returns>
        public SmbPacket[] CreateNtTransWith2ndRequests(
            SmbNtTransactRequestPacket ntTransRequest,
            int parameterCount,
            int dataCount)
        {
            ntTransRequest.ToBytes();
            ntTransRequest.isDivided = true;
            int paramLength = 0;

            if (ntTransRequest.SmbData.NT_Trans_Parameters != null)
            {
                paramLength = ntTransRequest.SmbData.NT_Trans_Parameters.Length;
            }
            double paramNumber = Math.Ceiling((double)paramLength / parameterCount);
            int dataLength = 0;

            if (ntTransRequest.SmbData.NT_Trans_Data != null)
            {
                dataLength = ntTransRequest.SmbData.NT_Trans_Data.Length;
            }
            int dataNumber = (int)Math.Ceiling((double)dataLength / dataCount);
            double packetCount = paramNumber > dataNumber ? paramNumber : dataNumber;
            List<SmbPacket> packetList = new List<SmbPacket>();

            if (packetCount > 1)
            {
                byte[] ntTransParameters = ntTransRequest.SmbData.NT_Trans_Parameters;
                byte[] ntTransData = ntTransRequest.SmbData.NT_Trans_Data;

                SMB_COM_NT_TRANSACT_Request_SMB_Data ntTransSmbData = ntTransRequest.SmbData;

                if (paramLength > parameterCount)
                {
                    ntTransSmbData.NT_Trans_Parameters = new byte[parameterCount];
                    Array.Copy(ntTransParameters, ntTransSmbData.NT_Trans_Parameters, parameterCount);
                }

                if (dataLength > dataCount)
                {
                    ntTransSmbData.NT_Trans_Data = new byte[dataCount];
                    Array.Copy(ntTransData, ntTransSmbData.NT_Trans_Data, dataCount);
                }
                ntTransRequest.SmbData = ntTransSmbData;
                ntTransRequest.UpdateCountAndOffset();
                packetList.Add(ntTransRequest);
                int currentIndex = 1;
                long remainedParamCount = ntTransRequest.SmbParameters.TotalParameterCount - parameterCount;
                long remainedDataCount = ntTransRequest.SmbParameters.TotalDataCount - dataCount;

                while (currentIndex < packetCount)
                {
                    SmbNtTransactSecondaryRequestPacket packet = new SmbNtTransactSecondaryRequestPacket();
                    SmbHeader header = ntTransRequest.SmbHeader;
                    header.Command = SmbCommand.SMB_COM_NT_TRANSACT_SECONDARY;
                    packet.SmbHeader = header;

                    // Set Smb_Parameters
                    SMB_COM_NT_TRANSACT_SECONDARY_Request_SMB_Parameters smbParameters =
                        new SMB_COM_NT_TRANSACT_SECONDARY_Request_SMB_Parameters();
                    smbParameters.Reserved1 = new byte[3];
                    smbParameters.TotalParameterCount = ntTransRequest.SmbParameters.TotalParameterCount;
                    smbParameters.TotalDataCount = ntTransRequest.SmbParameters.TotalDataCount;
                    smbParameters.WordCount = (byte)(CifsMessageUtils.GetSize<
                        SMB_COM_NT_TRANSACT_SECONDARY_Request_SMB_Parameters>(smbParameters) / NumBytesOfWord);

                    // Set Smb_Data
                    SMB_COM_NT_TRANSACT_SECONDARY_Request_SMB_Data smbData = new SMB_COM_NT_TRANSACT_SECONDARY_Request_SMB_Data();

                    if (remainedParamCount > parameterCount)
                    {
                        smbData.NT_Trans_Parameters = new byte[parameterCount];
                        Array.Copy(ntTransParameters, parameterCount * currentIndex, smbData.NT_Trans_Parameters, 0, parameterCount);
                        smbParameters.ParameterDisplacement = (ushort)(parameterCount * currentIndex);
                        remainedParamCount -= parameterCount;
                    }
                    else if (remainedParamCount > 0)
                    {
                        smbData.NT_Trans_Parameters = new byte[remainedParamCount];
                        Array.Copy(ntTransParameters, parameterCount * currentIndex, smbData.NT_Trans_Parameters, 0, remainedParamCount);
                        smbParameters.ParameterDisplacement = (ushort)(parameterCount * currentIndex);
                        remainedParamCount -= parameterCount;
                    }
                    else
                    {
                        smbData.NT_Trans_Parameters = new byte[0];
                    }

                    if (remainedDataCount > dataCount)
                    {
                        smbData.NT_Trans_Data = new byte[dataCount];
                        Array.Copy(ntTransData, dataCount * currentIndex, smbData.NT_Trans_Data, 0, dataCount);
                        smbParameters.DataDisplacement = (ushort)(dataCount * currentIndex);
                        remainedDataCount -= dataCount;
                    }
                    else if (remainedDataCount > 0)
                    {
                        smbData.NT_Trans_Data = new byte[remainedDataCount];
                        Array.Copy(ntTransData, dataCount * currentIndex, smbData.NT_Trans_Data, 0, remainedDataCount);
                        smbParameters.DataDisplacement = (ushort)(dataCount * currentIndex);
                        remainedDataCount -= dataCount;
                    }
                    else
                    {
                        smbData.NT_Trans_Data = new byte[0];
                    }

                    packet.SmbParameters = smbParameters;
                    packet.SmbData = smbData;
                    currentIndex++;
                    packet.UpdateCountAndOffset();
                    packetList.Add(packet);
                }
            }
            else
            {
                packetList.Add(ntTransRequest);
            }

            return packetList.ToArray();
        }
        /// <summary>
        /// Deep copy constructor.
        /// </summary>
        protected SmbNtTransactRequestPacket(SmbNtTransactRequestPacket packet)
            : base(packet)
        {
            this.InitDefaultValue();

            this.smbParameters.WordCount = packet.SmbParameters.WordCount;
            this.smbParameters.MaxSetupCount = packet.SmbParameters.MaxSetupCount;
            this.smbParameters.Reserved1 = packet.SmbParameters.Reserved1;
            this.smbParameters.TotalParameterCount = packet.SmbParameters.TotalParameterCount;
            this.smbParameters.TotalDataCount = packet.SmbParameters.TotalDataCount;
            this.smbParameters.MaxParameterCount = packet.SmbParameters.MaxParameterCount;
            this.smbParameters.MaxDataCount = packet.SmbParameters.MaxDataCount;
            this.smbParameters.ParameterCount = packet.SmbParameters.ParameterCount;
            this.smbParameters.ParameterOffset = packet.SmbParameters.ParameterOffset;
            this.smbParameters.DataCount = packet.SmbParameters.DataCount;
            this.smbParameters.DataOffset = packet.SmbParameters.DataOffset;
            this.smbParameters.SetupCount = packet.SmbParameters.SetupCount;
            this.smbParameters.Function = packet.SmbParameters.Function;
            this.smbParameters.Setup = new ushort[packet.smbParameters.SetupCount];

            if (packet.smbParameters.Setup != null)
            {
                Array.Copy(packet.smbParameters.Setup, this.smbParameters.Setup, packet.smbParameters.SetupCount);
            }
            this.smbData.ByteCount = packet.SmbData.ByteCount;

            if (packet.smbData.Pad1 != null)
            {
                this.smbData.Pad1 = new byte[packet.smbData.Pad1.Length];
                Array.Copy(packet.smbData.Pad1, this.smbData.Pad1, packet.smbData.Pad1.Length);
            }
            else
            {
                this.smbData.Pad1 = new byte[0];
            }
            this.smbData.NT_Trans_Parameters = new byte[packet.smbParameters.ParameterCount];

            if (packet.smbData.NT_Trans_Parameters != null)
            {
                Array.Copy(packet.smbData.NT_Trans_Parameters, this.smbData.NT_Trans_Parameters,
                    packet.smbParameters.ParameterCount);
            }
            else
            {
                this.smbData.NT_Trans_Parameters = new byte[0];
            }

            if (packet.smbData.Pad2 != null)
            {
                this.smbData.Pad2 = new byte[packet.smbData.Pad2.Length];
                Array.Copy(packet.smbData.Pad2, this.smbData.Pad2, packet.smbData.Pad2.Length);
            }
            else
            {
                this.smbData.Pad2 = new byte[0];
            }
            this.smbData.NT_Trans_Data = new byte[packet.smbParameters.DataCount];

            if (packet.smbData.NT_Trans_Data != null)
            {
                Array.Copy(packet.smbData.NT_Trans_Data, this.smbData.NT_Trans_Data, packet.smbParameters.DataCount);
            }
            else
            {
                this.smbData.NT_Trans_Data = new byte[0];
            }
        }
コード例 #3
0
        public SmbNtTransactInterimResponsePacket CreateNtTransactInterimResponse(
            CifsServerPerConnection connection,
            SmbNtTransactRequestPacket request)
        {
            SmbNtTransactInterimResponsePacket response = new SmbNtTransactInterimResponsePacket();
            response.SmbHeader = CifsMessageUtils.CreateSmbHeader(connection, request);

            SMB_COM_NT_TRANSACT_InterimResponse_SMB_Parameters smbParameters = response.SmbParameters;
            smbParameters.WordCount = (byte)(TypeMarshal.GetBlockMemorySize(smbParameters) / 2);
            response.SmbParameters = smbParameters;

            SMB_COM_NT_TRANSACT_InterimResponse_SMB_Data smbData = response.SmbData;
            smbData.ByteCount = 0x0000;
            response.SmbData = smbData;

            return response;
        }
コード例 #4
0
        /// <summary>
        /// Create default NtTrans response
        /// </summary>
        /// <param name="connection">the connection on which the response will be sent.</param>
        /// <param name="request">the corresponding request</param>
        /// <returns>the default response to the request.</returns>
        private SmbPacket CreateDefaultNtTransResponse(
            CifsServerPerConnection connection,
            SmbNtTransactRequestPacket request)
        {
            SmbNtTransactCreateRequestPacket ntCreateRequest = request as SmbNtTransactCreateRequestPacket;
            SmbNtTransactIoctlRequestPacket ioctlRequest = request as SmbNtTransactIoctlRequestPacket;
            SmbNtTransactSetSecurityDescRequestPacket setSecurityDescRequest =
                request as SmbNtTransactSetSecurityDescRequestPacket;
            SmbNtTransactNotifyChangeRequestPacket notifyChangeRequest =
                request as SmbNtTransactNotifyChangeRequestPacket;
            SmbNtTransactRenameRequestPacket renameRequest = request as SmbNtTransactRenameRequestPacket;
            SmbNtTransactQuerySecurityDescRequestPacket querySecurityDesc =
                request as SmbNtTransactQuerySecurityDescRequestPacket;

            SmbPacket response = null;
            if (ntCreateRequest != null)
            {
                response = this.CreateNtTransactCreateResponse(
                    connection,
                    ntCreateRequest,
                    0x0,
                    0x0,
                    FileTypeValue.FileTypeDisk,
                    SMB_NMPIPE_STATUS.Endpoint, 0x0);
            }
            if (ioctlRequest != null)
            {
                response = this.CreateNtTransactIoctlResponse(connection, ioctlRequest, new byte[0]);
            }

            if (setSecurityDescRequest != null)
            {
                response = this.CreateNtTransactSetSecurityDescResponse(connection, setSecurityDescRequest);
            }

            if (notifyChangeRequest != null)
            {
                response = this.CreateNtTransactNotifyChangeResponse(connection, notifyChangeRequest, null);
            }

            if (renameRequest != null)
            {
                response = this.CreateNtTransactRenameResponse(connection, renameRequest);
            }

            if (querySecurityDesc != null)
            {
                response = this.CreateNtTransactQuerySecurityDescResponse(connection, querySecurityDesc, null);
            }
            return response;
        }
コード例 #5
0
        /// <summary>
        /// Deep copy constructor.
        /// </summary>
        protected SmbNtTransactRequestPacket(SmbNtTransactRequestPacket packet)
            : base(packet)
        {
            this.InitDefaultValue();

            this.smbParameters.WordCount           = packet.SmbParameters.WordCount;
            this.smbParameters.MaxSetupCount       = packet.SmbParameters.MaxSetupCount;
            this.smbParameters.Reserved1           = packet.SmbParameters.Reserved1;
            this.smbParameters.TotalParameterCount = packet.SmbParameters.TotalParameterCount;
            this.smbParameters.TotalDataCount      = packet.SmbParameters.TotalDataCount;
            this.smbParameters.MaxParameterCount   = packet.SmbParameters.MaxParameterCount;
            this.smbParameters.MaxDataCount        = packet.SmbParameters.MaxDataCount;
            this.smbParameters.ParameterCount      = packet.SmbParameters.ParameterCount;
            this.smbParameters.ParameterOffset     = packet.SmbParameters.ParameterOffset;
            this.smbParameters.DataCount           = packet.SmbParameters.DataCount;
            this.smbParameters.DataOffset          = packet.SmbParameters.DataOffset;
            this.smbParameters.SetupCount          = packet.SmbParameters.SetupCount;
            this.smbParameters.Function            = packet.SmbParameters.Function;
            this.smbParameters.Setup = new ushort[packet.smbParameters.SetupCount];

            if (packet.smbParameters.Setup != null)
            {
                Array.Copy(packet.smbParameters.Setup, this.smbParameters.Setup, packet.smbParameters.SetupCount);
            }
            this.smbData.ByteCount = packet.SmbData.ByteCount;

            if (packet.smbData.Pad1 != null)
            {
                this.smbData.Pad1 = new byte[packet.smbData.Pad1.Length];
                Array.Copy(packet.smbData.Pad1, this.smbData.Pad1, packet.smbData.Pad1.Length);
            }
            else
            {
                this.smbData.Pad1 = new byte[0];
            }
            this.smbData.NT_Trans_Parameters = new byte[packet.smbParameters.ParameterCount];

            if (packet.smbData.NT_Trans_Parameters != null)
            {
                Array.Copy(packet.smbData.NT_Trans_Parameters, this.smbData.NT_Trans_Parameters,
                           packet.smbParameters.ParameterCount);
            }
            else
            {
                this.smbData.NT_Trans_Parameters = new byte[0];
            }

            if (packet.smbData.Pad2 != null)
            {
                this.smbData.Pad2 = new byte[packet.smbData.Pad2.Length];
                Array.Copy(packet.smbData.Pad2, this.smbData.Pad2, packet.smbData.Pad2.Length);
            }
            else
            {
                this.smbData.Pad2 = new byte[0];
            }
            this.smbData.NT_Trans_Data = new byte[packet.smbParameters.DataCount];

            if (packet.smbData.NT_Trans_Data != null)
            {
                Array.Copy(packet.smbData.NT_Trans_Data, this.smbData.NT_Trans_Data, packet.smbParameters.DataCount);
            }
            else
            {
                this.smbData.NT_Trans_Data = new byte[0];
            }
        }