コード例 #1
0
        /// <summary>
        /// Create TRANS_QUERY_NMPIPE_INFO Response 
        /// </summary>
        /// <param name="connection">the connection identified the client</param>
        /// <param name = "outputBufferSize">
        /// The first word of the data buffer that MUST contain the actual size of the buffer for outgoing (server) 
        /// I/O 
        /// </param>
        /// <param name = "inputBufferSize">
        /// This value MUST be the actual size of the buffer for incoming (client) I/O 
        /// </param>
        /// <param name = "maximumInstances">
        /// This value MUST be the maximum allowed number of named pipe instances. 
        /// </param>
        /// <param name = "currectInstances">This value MUST be the current number of named pipe instances </param>
        /// <param name = "pipeName">
        /// This value MUST be a null-terminated string containing the name of the named pipe 
        /// </param>
        /// <returns>The SmbTransQueryNmpipeInfoResponsePacket </returns>
        /// <exception cref="ArgumentNullException">connection must not be null</exception>
        public virtual SmbTransQueryNmpipeInfoResponsePacket CreateTransQueryNmpipeInfoResponse(
            SmbServerConnection connection,
            ushort outputBufferSize,
            ushort inputBufferSize,
            byte maximumInstances,
            byte currectInstances,
            string pipeName)
        {
            if (connection == null)
            {
                throw new ArgumentNullException("connection");
            }

            SmbTransQueryNmpipeInfoResponsePacket packet = new SmbTransQueryNmpipeInfoResponsePacket();

            // get the request packet
            SmbPacket request = connection.GetRequestPacket(connection.MessageId);

            // create smb packet header
            packet.SmbHeader = CifsMessageUtils.CreateSmbHeader(
                SmbCommand.SMB_COM_TRANSACTION,
                connection.ProcessId, connection.MessageId, request.SmbHeader.Uid, request.SmbHeader.Tid,
                (SmbFlags)connection.Capability.Flag, (SmbFlags2)connection.Capability.Flags2);

            // update smb parameters
            SMB_COM_TRANSACTION_SuccessResponse_SMB_Parameters smbParameters = packet.SmbParameters;

            smbParameters.Setup = new ushort[0];

            smbParameters.WordCount = (byte)(CifsMessageUtils.GetSize<SMB_COM_TRANSACTION_SuccessResponse_SMB_Parameters>(
                smbParameters) / SmbCapability.NUM_BYTES_OF_WORD);

            // update smb data
            SMB_COM_TRANSACTION_SuccessResponse_SMB_Data smbData = packet.SmbData;

            // update trans data
            TRANS_QUERY_NMPIPE_INFO_Response_Trans_Data transData = packet.TransData;

            transData.OutputBufferSize = outputBufferSize;
            transData.InputBufferSize = inputBufferSize;
            transData.MaximumInstances = maximumInstances;
            transData.CurrentInstances = currectInstances;
            transData.PipeName = CifsMessageUtils.ToSmbStringBytes(pipeName, connection.Capability.IsUnicode);
            transData.PipeNameLength = (byte)transData.PipeName.Length;

            // store the parameters and data to packet.
            packet.TransData = transData;
            packet.SmbParameters = smbParameters;
            packet.SmbData = smbData;

            packet.UpdateCountAndOffset();

            return packet;
        }