/// <summary>
        /// Create  SMB_COM_SESSION_SETUP_ANDX Server response packet 
        /// </summary>
        /// <param name="connection">the connection identified the client</param>
        /// <param name = "uid">
        /// the valid session id, must be response by server of the session setup request. 
        /// </param>
        /// <param name = "action">A 16-bit field. The two lowest order bits have been defined </param>
        /// <returns>The SmbSessionSetupAndXResponsePacket </returns>
        /// <exception cref="ArgumentNullException">connection must not be null</exception>
        public virtual SmbSessionSetupImplicitNtlmAndxResponsePacket CreateSmbComSessionSetupImplicitNtlmResponse(
            SmbServerConnection connection,
            ushort uid,
            ActionValues action
            )
        {
            if (connection == null)
            {
                throw new ArgumentNullException("connection");
            }

            Cifs.SmbSessionSetupAndxResponsePacket packet = new Cifs.SmbSessionSetupAndxResponsePacket();

            // create smb packet header
            packet.SmbHeader = CifsMessageUtils.CreateSmbHeader(
                SmbCommand.SMB_COM_SESSION_SETUP_ANDX, connection.ProcessId, connection.MessageId, uid, 0,
                (SmbFlags)connection.Capability.Flag, (SmbFlags2)connection.Capability.Flags2);

            // update smb parameters
            Cifs.SMB_COM_SESSION_SETUP_ANDX_Response_SMB_Parameters smbParameters = packet.SmbParameters;

            smbParameters.AndXCommand = SmbCommand.SMB_COM_NO_ANDX_COMMAND;
            smbParameters.Action = action;

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

            // update smb data
            Cifs.SMB_COM_SESSION_SETUP_ANDX_Response_SMB_Data smbData = packet.SmbData;

            if (connection.Capability.IsUnicode)
            {
                smbData.Pad = new byte[1];
            }
            else
            {
                smbData.Pad = new byte[0];
            }
            smbData.NativeOS = CifsMessageUtils.ToSmbStringBytes(
                Environment.OSVersion.VersionString, connection.Capability.IsUnicode);
            smbData.NativeLanMan = CifsMessageUtils.ToSmbStringBytes(
                Environment.OSVersion.VersionString, connection.Capability.IsUnicode);
            smbData.PrimaryDomain = CifsMessageUtils.ToSmbStringBytes(
                Environment.UserDomainName, connection.Capability.IsUnicode);

            // update smbData.ByteCount
            smbData.ByteCount = 0;
            smbData.ByteCount += (ushort)smbData.Pad.Length;
            smbData.ByteCount += (ushort)smbData.NativeOS.Length;
            smbData.ByteCount += (ushort)smbData.NativeLanMan.Length;
            smbData.ByteCount += (ushort)smbData.PrimaryDomain.Length;

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

            return new SmbSessionSetupImplicitNtlmAndxResponsePacket(packet);
        }
 /// <summary>
 /// initialize packet from base packet.
 /// </summary>
 /// <param name = "packet">the base packet to initialize this packet. </param>
 public SmbSessionSetupImplicitNtlmAndxResponsePacket(Cifs.SmbSessionSetupAndxResponsePacket packet)
     : base(packet)
 {
 }