/// <summary>
        /// Create SMB_COM_NT_CREATE_ANDX Server Response 
        /// </summary>
        /// <param name="connection">the connection identified the client</param>
        /// <param name = "fileId">
        /// The SMB file identifier returned by the SMB server for the file or device that was opened or created 
        /// </param>
        /// <param name = "createAction">The action taken. This field MUST be interpreted as follows </param>
        /// <param name = "extFileAttributes">Extended attributes and flags for this file or directory </param>
        /// <param name = "fileType">The file type </param>
        /// <param name = "isDirectory">
        /// A value that indicates whether this is a directory. MUST be nonzero when this is a directory 
        /// </param>
        /// <returns>The SmbNtCreateAndXResponsePacket </returns>
        /// <exception cref="ArgumentNullException">connection must not be null</exception>
        public virtual SmbNtCreateAndxResponsePacket CreateSmbComNtCreateResponse(
            SmbServerConnection connection,
            ushort fileId,
            uint createAction,
            uint extFileAttributes,
            FileTypeValue fileType,
            bool isDirectory)
        {
            if (connection == null)
            {
                throw new ArgumentNullException("connection");
            }

            SmbNtCreateAndxResponsePacket packet = new SmbNtCreateAndxResponsePacket();

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

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

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

            smbParameters.AndXCommand = SmbCommand.SMB_COM_NO_ANDX_COMMAND;
            smbParameters.OplockLevel = OplockLevelValue.None;
            smbParameters.FID = fileId;
            smbParameters.CreationAction = createAction;
            smbParameters.CreateTime.Time = (ulong)DateTime.Now.ToFileTime();
            smbParameters.LastAccessTime.Time = (ulong)DateTime.Now.ToFileTime();
            smbParameters.LastWriteTime.Time = (ulong)DateTime.Now.ToFileTime();
            smbParameters.LastChangeTime.Time = (ulong)DateTime.Now.ToFileTime();
            smbParameters.ExtFileAttributes = extFileAttributes;
            smbParameters.AllocationSize = 0x00;
            smbParameters.EndOfFile = 0x00;
            smbParameters.ResourceType = fileType;
            smbParameters.NMPipeStatus_or_FileStatusFlags = SMB_NMPIPE_STATUS.None;
            smbParameters.Directory = (byte)(isDirectory == true ? 1 : 0);
            smbParameters.VolumeGUID = Guid.Empty.ToByteArray();
            smbParameters.FileId = new byte[sizeof(long)];
            smbParameters.MaximalAccessRights = new byte[sizeof(int)];
            smbParameters.GuestMaximalAccessRights = new byte[sizeof(int)];

            int size = CifsMessageUtils.GetSize<Cifs.SMB_COM_NT_CREATE_ANDX_Response_SMB_Parameters>(
                new Cifs.SMB_COM_NT_CREATE_ANDX_Response_SMB_Parameters());
            size += smbParameters.VolumeGUID.Length;
            size += smbParameters.FileId.Length;
            size += smbParameters.MaximalAccessRights.Length;
            size += smbParameters.GuestMaximalAccessRights.Length;

            smbParameters.WordCount = (byte)(size / SmbCapability.NUM_BYTES_OF_WORD);

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

            // update smbData.ByteCount
            smbData.ByteCount = 0;

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

            return packet;
        }
        /// <summary>
        /// Create NT_TRANSACT_CREATE Server Response 
        /// </summary>
        /// <param name="connection">the connection identified the client</param>
        /// <param name = "fileId">
        /// The SMB file identifier returned by the SMB server for the file or device that was opened or created 
        /// </param>
        /// <param name = "createAction">The action taken. This field MUST be interpreted as follows </param>
        /// <param name = "extFileAttributes">Extended attributes and flags for this file or directory </param>
        /// <param name = "fileType">The file type </param>
        /// <param name = "isDirectory">
        /// A value that indicates whether this is a directory. MUST be nonzero when this is a directory 
        /// </param>
        /// <returns>The SmbNtTransactCreateResponsePacket </returns>
        /// <exception cref="ArgumentNullException">connection must not be null</exception>
        public virtual SmbNtTransactCreateResponsePacket CreateNtTransCreateResponse(
            SmbServerConnection connection,
            ushort fileId,
            uint createAction,
            uint extFileAttributes,
            FileTypeValue fileType,
            bool isDirectory)
        {
            if (connection == null)
            {
                throw new ArgumentNullException("connection");
            }

            SmbNtTransactCreateResponsePacket packet = new SmbNtTransactCreateResponsePacket();

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

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

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

            // reserved 3 bytes.
            smbParameters.Reserved1 = new byte[3];
            smbParameters.Setup = new ushort[0];

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

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

            // update smbData.ByteCount
            smbData.ByteCount = 0;

            // update nt transaction parameters
            NT_TRANSACT_CREATE_Response_NT_Trans_Parameters ntTransPamameters = packet.NtTransParameters;
            ntTransPamameters.FID = fileId;
            ntTransPamameters.CreateAction = (NtTransactCreateActionValues)createAction;
            ntTransPamameters.ExtFileAttributes = (SMB_EXT_FILE_ATTR)extFileAttributes;
            ntTransPamameters.ResourceType = fileType;
            ntTransPamameters.Directory = (byte)(isDirectory ? 1 : 0);

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

            packet.UpdateCountAndOffset();

            return packet;
        }
        public SmbNtTransactCreateResponsePacket CreateNtTransactCreateResponse(
            CifsServerPerConnection connection,
            SmbNtTransactCreateRequestPacket request,
            ulong allocationSize,
            ulong endOfFile,
            FileTypeValue resourceType,
            SMB_NMPIPE_STATUS nmPipeStatus,
            byte directory)
        {
            SmbNtTransactCreateResponsePacket response = new SmbNtTransactCreateResponsePacket();
            response.SmbHeader = CifsMessageUtils.CreateSmbHeader(connection, request);

            NT_TRANSACT_CREATE_Response_NT_Trans_Parameters ntTransParameters = response.NtTransParameters;
            ntTransParameters.OpLockLevel = OplockLevelValue.None;
            ntTransParameters.Reserved = 0x00;
            ntTransParameters.FID = (ushort)connection.GenerateFID();
            ntTransParameters.CreateAction = NtTransactCreateActionValues.FILE_CREATED;
            FileTime fileTime = new FileTime();
            fileTime.Time = (ulong)DateTime.Now.ToFileTime();
            ntTransParameters.CreationTime = fileTime;
            ntTransParameters.LastAccessTime = fileTime;
            ntTransParameters.LastWriteTime = fileTime;
            ntTransParameters.LastChangeTime = fileTime;
            ntTransParameters.ExtFileAttributes = request.NtTransParameters.ExtFileAttributes;
            ntTransParameters.AllocationSize = allocationSize;
            ntTransParameters.EndOfFile = endOfFile;
            ntTransParameters.ResourceType = resourceType;
            ntTransParameters.NMPipeStatus = nmPipeStatus;
            ntTransParameters.Directory = directory;
            response.NtTransParameters = ntTransParameters;

            response.UpdateCountAndOffset();

            return response;
        }
        public SmbTrans2Open2FinalResponsePacket CreateTrans2Open2FinalResponse(
            CifsServerPerConnection connection,
            SmbTrans2Open2RequestPacket request,
            uint fileDataSize,
            FileTypeValue resourceType,
            SMB_NMPIPE_STATUS nmPipeStatus,
            OpenResultsValues actionTaken)
        {
            SmbTrans2Open2FinalResponsePacket response = new SmbTrans2Open2FinalResponsePacket();
            response.SmbHeader = CifsMessageUtils.CreateSmbHeader(connection, request);

            TRANS2_OPEN2_Response_Trans2_Parameters trans2Parameters = response.Trans2Parameters;
            trans2Parameters.Fid = (ushort)connection.GenerateFID();
            trans2Parameters.FileAttributes = request.Trans2Parameters.FileAttributes;
            trans2Parameters.CreationTime = (uint)DateTime.Now.Millisecond;
            trans2Parameters.FileDataSize = fileDataSize;
            trans2Parameters.AccessMode = request.Trans2Parameters.AccessMode;
            trans2Parameters.ResourceType = resourceType;
            trans2Parameters.NMPipeStatus = nmPipeStatus;
            trans2Parameters.OpenResults = actionTaken;
            trans2Parameters.Reserved = 0x00000000;
            trans2Parameters.ExtendedAttributeErrorOffset = 0;
            trans2Parameters.ExtendedAttributeLength = request.Trans2Data.ExtendedAttributeList.SizeOfListInBytes;
            response.Trans2Parameters = trans2Parameters;

            response.UpdateCountAndOffset();

            return response;
        }
        public SmbNtCreateAndxResponsePacket CreateNtCreateAndxResponse(
            CifsServerPerConnection connection,
            SmbNtCreateAndxRequestPacket request,
            OplockLevelValue opLockLevel,
            ulong allocationSize,
            ulong endOfFile,
            FileTypeValue resourceType,
            SMB_NMPIPE_STATUS nmPipeStatus,
            byte directory,
            SmbPacket andxPacket)
        {
            SmbNtCreateAndxResponsePacket response = new SmbNtCreateAndxResponsePacket();
            response.SmbHeader = CifsMessageUtils.CreateSmbHeader(connection, request);

            SMB_COM_NT_CREATE_ANDX_Response_SMB_Parameters smbParameters = response.SmbParameters;
            smbParameters.AndXCommand =
                andxPacket != null ? andxPacket.SmbHeader.Command : SmbCommand.SMB_COM_NO_ANDX_COMMAND;
            smbParameters.AndXReserved = 0x00;
            smbParameters.AndXOffset = (ushort)(response.HeaderSize + Marshal.SizeOf(response.SmbParameters)
                + Marshal.SizeOf(response.SmbData));
            smbParameters.OplockLevel = opLockLevel;
            smbParameters.FID = (ushort)connection.GenerateFID();
            smbParameters.CreateDisposition = NtTransactCreateDisposition.FILE_CREATE;
            FileTime fileTime = new FileTime();
            fileTime.Time = (ulong)DateTime.Now.ToFileTime();
            smbParameters.CreateTime = fileTime;
            smbParameters.LastAccessTime = fileTime;
            smbParameters.LastChangeTime = fileTime;
            smbParameters.ExtFileAttributes = (SMB_EXT_FILE_ATTR)request.SmbParameters.ExtFileAttributes;
            smbParameters.AllocationSize = allocationSize;
            smbParameters.EndOfFile = endOfFile;
            smbParameters.ResourceType = resourceType;
            smbParameters.NMPipeStatus = nmPipeStatus;
            smbParameters.Directory = directory;
            smbParameters.WordCount = (byte)(TypeMarshal.GetBlockMemorySize(smbParameters) / 2);
            response.SmbParameters = smbParameters;

            response.AndxPacket = andxPacket;
            response.UpdateHeader();

            return response;
        }