public Smb2SessionSetupResponsePacket CreateSessionSetupResponse(
            Smb2Endpoint endpoint,
            ulong messageId,
            ulong sessionId,
            SessionFlags_Values sessionFlags
            )
        {
            //This is for re-authenticate. the state is used to indicate user that
            //the authenticate process in not complete.
            if (context.globalSessionTable.ContainsKey(sessionId))
            {
                context.globalSessionTable[sessionId].state = SessionState.InProgress;
            }

            Smb2SessionSetupResponsePacket packet = new Smb2SessionSetupResponsePacket();

            SetHeader(packet, 0, endpoint, messageId);

            packet.Header.SessionId = sessionId;
            packet.PayLoad.StructureSize = SESSION_SETUP_Response_StructureSize_Values.V1;
            packet.PayLoad.SessionFlags = sessionFlags;

            Smb2SessionSetupRequestPacket requestPacket = context.FindRequestPacket(endpoint.EndpointId, messageId)
                as Smb2SessionSetupRequestPacket;

            if (context.connectionList[endpoint.EndpointId].gss == null)
            {
                context.connectionList[endpoint.EndpointId].gss = new SspiServerSecurityContext(
                    context.connectionList[endpoint.EndpointId].packageType,
                    context.connectionList[endpoint.EndpointId].credential,
                    null,
                    context.connectionList[endpoint.EndpointId].contextAttribute,
                    SecurityTargetDataRepresentation.SecurityNativeDrep);

                context.connectionList[endpoint.EndpointId].gss.Accept(requestPacket.PayLoad.Buffer);
            }
            else
            {
                context.connectionList[endpoint.EndpointId].gss.Accept(requestPacket.PayLoad.Buffer);
            }

            if (context.connectionList[endpoint.EndpointId].gss.NeedContinueProcessing)
            {
                packet.Header.Status = (uint)Smb2Status.STATUS_MORE_PROCESSING_REQUIRED;
            }

            packet.PayLoad.Buffer = context.connectionList[endpoint.EndpointId].gss.Token;

            packet.PayLoad.SecurityBufferOffset = Smb2Consts.SecurityBufferOffsetInSessionSetup;
            packet.PayLoad.SecurityBufferLength = (ushort)packet.PayLoad.Buffer.Length;

            packet.Sign();

            return packet;
        }