/// <summary>
        /// Create  TRANS2_QUERY_PATH_INFORMATION Response 
        /// </summary>
        /// <param name="connection">the connection identified the client</param>
        /// <param name = "data">The Data buffer that contains the information bytes requested </param>
        /// <returns>The SmbTrans2QueryPathInformationResponsePacket </returns>
        /// <exception cref="ArgumentNullException">connection must not be null</exception>
        public virtual SmbTrans2QueryPathInformationResponsePacket CreateTrans2QueryPathInformationResponse(
            SmbServerConnection connection,
            object data)
        {
            if (connection == null)
            {
                throw new ArgumentNullException("connection");
            }

            SmbTrans2QueryPathInformationResponsePacket packet = new SmbTrans2QueryPathInformationResponsePacket();

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

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

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

            smbParameters.Setup = new ushort[0];

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

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

            // update trans2 param
            TRANS2_QUERY_PATH_INFORMATION_Response_Trans2_Parameters trans2Parameters = packet.Trans2Parameters;

            // update trans2 data
            TRANS2_QUERY_PATH_INFORMATION_Response_Trans2_Data trans2Data = packet.Trans2Data;

            trans2Data.Data = data;

            // store the parameters and data to packet.
            packet.Trans2Parameters = trans2Parameters;
            packet.Trans2Data = trans2Data;
            packet.SmbParameters = smbParameters;
            packet.SmbData = smbData;

            packet.UpdateCountAndOffset();

            return packet;
        }
        private SmbPacket CreateTransaction2ResponsePacket(SmbPacket request, SmbHeader smbHeader, Channel channel)
        {
            SmbPacket smbPacket = null;

            if (smbHeader.Status == 0 && channel.Peek<byte>(0) == 0 && channel.Peek<ushort>(1) == 0)
            {
                return smbPacket;
            }

            SmbTransaction2RequestPacket transaction2Request = request as SmbTransaction2RequestPacket;
            if (transaction2Request == null)
            {
                return smbPacket;
            }

            // if no setup command. break
            if (transaction2Request.SmbParameters.SetupCount == 0)
            {
                return smbPacket;
            }

            // decode packet using the setup command
            switch ((Trans2SubCommand)transaction2Request.SmbParameters.Setup[0])
            {
                case Trans2SubCommand.TRANS2_QUERY_FILE_INFORMATION:
                    SmbTrans2QueryFileInformationRequestPacket queryFileRequest =
                        transaction2Request as SmbTrans2QueryFileInformationRequestPacket;
                    if (queryFileRequest != null)
                    {
                        smbPacket = new SmbTrans2QueryFileInformationResponsePacket(
                            queryFileRequest.Trans2Parameters.InformationLevel);
                    }
                    break;

                case Trans2SubCommand.TRANS2_QUERY_PATH_INFORMATION:
                    SmbTrans2QueryPathInformationRequestPacket queryPathRequest =
                       transaction2Request as SmbTrans2QueryPathInformationRequestPacket;
                    if (queryPathRequest != null)
                    {
                        smbPacket = new SmbTrans2QueryPathInformationResponsePacket(
                            queryPathRequest.Trans2Parameters.InformationLevel);
                    }
                    break;

                case Trans2SubCommand.TRANS2_SET_FILE_INFORMATION:
                    smbPacket = new SmbTrans2SetFileInformationResponsePacket();
                    break;

                case Trans2SubCommand.TRANS2_SET_PATH_INFORMATION:
                    smbPacket = new SmbTrans2SetPathInformationResponsePacket();
                    break;

                case Trans2SubCommand.TRANS2_QUERY_FS_INFORMATION:
                    SmbTrans2QueryFsInformationRequestPacket queryFsRequest =
                        transaction2Request as SmbTrans2QueryFsInformationRequestPacket;
                    if (queryFsRequest != null)
                    {
                        smbPacket = new SmbTrans2QueryFsInformationResponsePacket(
                            queryFsRequest.Trans2Parameters.InformationLevel);
                    }
                    break;

                case Trans2SubCommand.TRANS2_SET_FS_INFORMATION:
                    smbPacket = new SmbTrans2SetFsInformationResponsePacket();
                    break;

                case Trans2SubCommand.TRANS2_FIND_FIRST2:
                    SmbTrans2FindFirst2RequestPacket first2Request =
                       transaction2Request as SmbTrans2FindFirst2RequestPacket;
                    if (first2Request != null)
                    {
                        smbPacket = new SmbTrans2FindFirst2ResponsePacket(first2Request.Trans2Parameters.InformationLevel,
                            (first2Request.Trans2Parameters.Flags & Trans2FindFlags.SMB_FIND_RETURN_RESUME_KEYS)
                            == Trans2FindFlags.SMB_FIND_RETURN_RESUME_KEYS);
                    }
                    break;

                case Trans2SubCommand.TRANS2_FIND_NEXT2:
                    SmbTrans2FindNext2RequestPacket next2Request =
                       transaction2Request as SmbTrans2FindNext2RequestPacket;
                    if (next2Request != null)
                    {
                        smbPacket = new SmbTrans2FindNext2ResponsePacket(next2Request.Trans2Parameters.InformationLevel,
                            (next2Request.Trans2Parameters.Flags & Trans2FindFlags.SMB_FIND_RETURN_RESUME_KEYS)
                            == Trans2FindFlags.SMB_FIND_RETURN_RESUME_KEYS);
                    }
                    break;

                case Trans2SubCommand.TRANS2_GET_DFS_REFERRAL:
                    smbPacket = new SmbTrans2GetDfsReferralResponsePacket();
                    break;

                default:
                    break;
            }

            return smbPacket;
        }
        private void FSCCTrans2QueryPathInformation(SmbTrans2QueryPathInformationResponsePacket
            smbTrans2QueryPathInformationPacket)
        {
            switch (fsccQueryPathLevel)
            {
                //FileBasicInformation,
                case 0:
                    NamespaceFscc.FsccFileBasicInformationResponsePacket fileBasicInformationResponse
                        = new NamespaceFscc.FsccFileBasicInformationResponsePacket();
                    fileBasicInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FileBasicInformation fileBasicInformation = fileBasicInformationResponse.Payload;

                    VerifyDataTypeFileBasicInformation(fileBasicInformation);

                    break;

                //FileStandardInformation,
                case 1:
                    NamespaceFscc.FsccFileStandardInformationResponsePacket fileStandardInformationResponse
                        = new NamespaceFscc.FsccFileStandardInformationResponsePacket();
                    fileStandardInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FileStandardInformation fileStandardInformation = fileStandardInformationResponse.Payload;

                    bool isFileDeletionRequested = Boolean.Parse(Site.Properties["IsFileDeletionRequestedForFscc"]);
                    bool isDirector = Boolean.Parse(Site.Properties["IsDirectorForFscc"]);

                    VerifyDataTypeFileStandardInformation(
                        fileStandardInformation,
                        isFileDeletionRequested,
                        isDirector);
                    break;

                //FileInternalInformation,
                case 2:
                    NamespaceFscc.FsccFileInternalInformationResponsePacket fileInternalInformationResponse
                        = new NamespaceFscc.FsccFileInternalInformationResponsePacket();
                    fileInternalInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FileInternalInformation fileInternalInformation = fileInternalInformationResponse.Payload;

                    bool isSupportFileReferenceNum = Boolean.Parse(Site.Properties["IsSupportFileReferenceNumForFscc"]);
                    VerifyDataTypeFileInternalInformation(fileInternalInformation, isSupportFileReferenceNum);
                    break;

                //FileEaInformation,
                case 3:
                    NamespaceFscc.FsccFileEaInformationResponsePacket fileEaInformationResponse
                        = new NamespaceFscc.FsccFileEaInformationResponsePacket();
                    fileEaInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FileEaInformation fileEaInformation = fileEaInformationResponse.Payload;

                    uint EAlength = uint.Parse(Site.Properties["EAlengthForFscc"]);
                    VerifyDataTypeFileEaInformation(fileEaInformation, EAlength);
                    break;

                //FileAccessInformation,
                case 4:
                    NamespaceFscc.FsccFileAccessInformationResponsePacket fileAccessInformationResponse
                        = new NamespaceFscc.FsccFileAccessInformationResponsePacket();
                    fileAccessInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FILE_ACCESS_INFORMATION fileAccessInformation = fileAccessInformationResponse.Payload;

                    VerifyDataTypeFileAccessInformation(fileAccessInformation);
                    break;

                //FileNameInformation,
                case 5:
                    NamespaceFscc.FsccFileNameInformationResponsePacket fileNameInformationResponse
                        = new NamespaceFscc.FsccFileNameInformationResponsePacket();
                    fileNameInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FileNameInformation fileNameInformation = fileNameInformationResponse.Payload;

                    VerifyDataTypeFileNameInformation(fileNameInformation);
                    VerifyMessageSyntaxFileNameInformation(fileNameInformation);
                    break;

                //FileModeInformation,
                case 6:
                    NamespaceFscc.FsccFileModeInformationResponsePacket fileModeInformationResponse
                        = new NamespaceFscc.FsccFileModeInformationResponsePacket();
                    fileModeInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FILE_MODE_INFORMATION fileModeInformation = fileModeInformationResponse.Payload;

                    bool isDeleteFile = Boolean.Parse(Site.Properties["IsDeleteFileForFscc"]);
                    VerifyMessageSyntaxFileModeinformation(fileModeInformation, isDeleteFile);

                    VerifyDataTypeFileModeInformation(fileModeInformation);
                    break;

                //FileAlignmentInformation,
                case 7:
                    NamespaceFscc.FsccFileAlignmentInformationResponsePacket fileAlignmentInformationResponse
                        = new NamespaceFscc.FsccFileAlignmentInformationResponsePacket();
                    fileAlignmentInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FILE_ALIGNMENT_INFORMATION fileAlignmentInformation
                        = fileAlignmentInformationResponse.Payload;

                    VerifyDataTypeFileAlignmentInformation(
                        fileAlignmentInformation,
                        smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data.Length);
                    break;

                //FileAlternateNameInformation,
                case 8:
                    NamespaceFscc.FsccFileAlternateNameInformationResponsePacket fileAlternateNameInformationResponse
                        = new NamespaceFscc.FsccFileAlternateNameInformationResponsePacket();
                    fileAlternateNameInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FileAlternateNameInformation fileAlternateNameInformation
                        = fileAlternateNameInformationResponse.Payload;

                    VerifyDataTypeFileAlternateNameInformation(fileAlternateNameInformation);
                    break;

                //FileStreamInformation,
                case 9:
                    NamespaceFscc.FsccFileStreamInformationResponsePacket fileStreamInformationResponse
                        = new NamespaceFscc.FsccFileStreamInformationResponsePacket();
                    fileStreamInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FileStreamInformation fileStreamInformation = fileStreamInformationResponse.Payload;

                    bool isNoOtherEntriesFollow = Boolean.Parse(Site.Properties["IsNoOtherEntriesFollowForFSCC"]);
                    bool isMultipleEntriesPresent = Boolean.Parse(Site.Properties["IsMultipleEntriesPresentForFSCC"]);
                    VerifyDataTypeFileStreamInformation(
                        fileStreamInformation,
                        isMultipleEntriesPresent,
                        isNoOtherEntriesFollow);
                    break;

                //FileCompressionInformation,
                case 10:
                    NamespaceFscc.FsccFileCompressionInformationResponsePacket fileCompressionInformationResponse
                        = new NamespaceFscc.FsccFileCompressionInformationResponsePacket();
                    fileCompressionInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FileCompressionInformation fileCompressionInformation
                        = fileCompressionInformationResponse.Payload;

                    int compressionFormat = int.Parse(Site.Properties["FompressionFormatForFSCC"]);
                    byte chunkShift = byte.Parse(Site.Properties["ChunkShiftForFSCC"]);
                    byte clusterShift = byte.Parse(Site.Properties["ClusterShiftForFSCC"]);
                    byte clusterSize = byte.Parse(Site.Properties["ClusterSizeForFSCC"]);
                    VerifyDataTypeFileCompressionInformationForOld(
                        fileCompressionInformation,
                        compressionFormat,
                        chunkShift,
                        clusterShift,
                        clusterSize);

                    string typeOfFileSystem = Site.Properties["TypeOfFileSystemForFscc"];
                    byte expectedInitializedClusterShift
                        = byte.Parse(Site.Properties["ExpectedInitializedClusterShiftForFscc"]);
                    VerifyDataTypeFileCompressionInformation(
                        fileCompressionInformation,
                        typeOfFileSystem,
                        expectedInitializedClusterShift
                        );

                    break;

                //FileNetworkOpenInformation,
                case 11:
                    NamespaceFscc.FsccFileNetworkOpenInformationResponsePacket fileNetworkOpenInformationResponse
                        = new NamespaceFscc.FsccFileNetworkOpenInformationResponsePacket();
                    fileNetworkOpenInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FileNetworkOpenInformation fileNetworkOpenInformation
                        = fileNetworkOpenInformationResponse.Payload;

                    int allocationSize = int.Parse(Site.Properties["AllocationSizeForFSCC"]);
                    uint fileAttributes = uint.Parse(Site.Properties["FileAttributesForFSCC"]);
                    VerifyDataTypeFileNetworkOpenInformation(
                        fileNetworkOpenInformation,
                        allocationSize,
                        fileAttributes);
                    break;

                //FileAttributeTagInformation,
                case 12:
                    NamespaceFscc.FsccFileAttributeTagInformationResponsePacket fileAttributeTagInformationResponse
                        = new NamespaceFscc.FsccFileAttributeTagInformationResponsePacket();
                    fileAttributeTagInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FileAttributeTagInformation fileAttributeTagInformation
                        = fileAttributeTagInformationResponse.Payload;

                    uint fileAttributesTag = uint.Parse(Site.Properties["FileAttributesForFSCC"]);
                    VerifyDataTypeFileAttributeTagInformation(fileAttributeTagInformation, fileAttributesTag);
                    break;

                case 13://FilePositionInformation
                    NamespaceFscc.FsccFilePositionInformationResponsePacket filePositionInformationResponse
                        = new NamespaceFscc.FsccFilePositionInformationResponsePacket();
                    filePositionInformationResponse.FromBytes(smbTrans2QueryPathInformationPacket.SmbData.Trans2_Data);
                    NamespaceFscc.FILE_POSITION_INFORMATION filePositionInformation
                        = filePositionInformationResponse.Payload;

                    VerifyDataTypeFilePositionInformation(filePositionInformation);

                    break;
                default:
                    break;
            }
        }
        private SmbPacket CreateTransaction2ResponsePacket(SmbPacket request, SmbHeader smbHeader, Channel channel)
        {
            SmbPacket smbPacket = null;

            if (smbHeader.Status == 0 && channel.Peek <byte>(0) == 0 && channel.Peek <ushort>(1) == 0)
            {
                return(smbPacket);
            }

            SmbTransaction2RequestPacket transaction2Request = request as SmbTransaction2RequestPacket;

            if (transaction2Request == null)
            {
                return(smbPacket);
            }

            // if no setup command. break
            if (transaction2Request.SmbParameters.SetupCount == 0)
            {
                return(smbPacket);
            }

            // decode packet using the setup command
            switch ((Trans2SubCommand)transaction2Request.SmbParameters.Setup[0])
            {
            case Trans2SubCommand.TRANS2_QUERY_FILE_INFORMATION:
                SmbTrans2QueryFileInformationRequestPacket queryFileRequest =
                    transaction2Request as SmbTrans2QueryFileInformationRequestPacket;
                if (queryFileRequest != null)
                {
                    smbPacket = new SmbTrans2QueryFileInformationResponsePacket(
                        queryFileRequest.Trans2Parameters.InformationLevel);
                }
                break;

            case Trans2SubCommand.TRANS2_QUERY_PATH_INFORMATION:
                SmbTrans2QueryPathInformationRequestPacket queryPathRequest =
                    transaction2Request as SmbTrans2QueryPathInformationRequestPacket;
                if (queryPathRequest != null)
                {
                    smbPacket = new SmbTrans2QueryPathInformationResponsePacket(
                        queryPathRequest.Trans2Parameters.InformationLevel);
                }
                break;

            case Trans2SubCommand.TRANS2_SET_FILE_INFORMATION:
                smbPacket = new SmbTrans2SetFileInformationResponsePacket();
                break;

            case Trans2SubCommand.TRANS2_SET_PATH_INFORMATION:
                smbPacket = new SmbTrans2SetPathInformationResponsePacket();
                break;

            case Trans2SubCommand.TRANS2_QUERY_FS_INFORMATION:
                SmbTrans2QueryFsInformationRequestPacket queryFsRequest =
                    transaction2Request as SmbTrans2QueryFsInformationRequestPacket;
                if (queryFsRequest != null)
                {
                    smbPacket = new SmbTrans2QueryFsInformationResponsePacket(
                        queryFsRequest.Trans2Parameters.InformationLevel);
                }
                break;

            case Trans2SubCommand.TRANS2_SET_FS_INFORMATION:
                smbPacket = new SmbTrans2SetFsInformationResponsePacket();
                break;

            case Trans2SubCommand.TRANS2_FIND_FIRST2:
                SmbTrans2FindFirst2RequestPacket first2Request =
                    transaction2Request as SmbTrans2FindFirst2RequestPacket;
                if (first2Request != null)
                {
                    smbPacket = new SmbTrans2FindFirst2ResponsePacket(first2Request.Trans2Parameters.InformationLevel,
                                                                      (first2Request.Trans2Parameters.Flags & Trans2FindFlags.SMB_FIND_RETURN_RESUME_KEYS)
                                                                      == Trans2FindFlags.SMB_FIND_RETURN_RESUME_KEYS);
                }
                break;

            case Trans2SubCommand.TRANS2_FIND_NEXT2:
                SmbTrans2FindNext2RequestPacket next2Request =
                    transaction2Request as SmbTrans2FindNext2RequestPacket;
                if (next2Request != null)
                {
                    smbPacket = new SmbTrans2FindNext2ResponsePacket(next2Request.Trans2Parameters.InformationLevel,
                                                                     (next2Request.Trans2Parameters.Flags & Trans2FindFlags.SMB_FIND_RETURN_RESUME_KEYS)
                                                                     == Trans2FindFlags.SMB_FIND_RETURN_RESUME_KEYS);
                }
                break;

            case Trans2SubCommand.TRANS2_GET_DFS_REFERRAL:
                smbPacket = new SmbTrans2GetDfsReferralResponsePacket();
                break;

            default:
                break;
            }

            return(smbPacket);
        }