/// <summary>
 /// Handle re-authenticate event
 /// </summary>
 /// <param name="packet">The session setup response packet</param>
 /// <param name="connectionId">Used to find the connection</param>
 private void HandleReAuthenticateEvent(Smb2SessionSetupResponsePacket packet, int connectionId)
 {
     if (packet.Header.Status == 0)
     {
         globalSessionTable[packet.GetSessionId()].state = SessionState.Valid;
     }
 }
        /// <summary>
        /// Handle the event of authenticate
        /// </summary>
        /// <param name="packet">The session setup response packet</param>
        /// <param name="connectionId">Used to find the connection</param>
        private void HandleNewAuthenticateEvent(Smb2SessionSetupResponsePacket packet, int connectionId)
        {
            if (!globalSessionTable.ContainsKey(packet.GetSessionId()))
            {
                Smb2ServerSession session = new Smb2ServerSession();

                session.connection = connectionList[connectionId];
                session.state = SessionState.InProgress;
                session.securityContext = null;
                session.sessionId = packet.GetSessionId();
                session.openTable = new Dictionary<FILEID, Smb2ServerOpen>();
                session.treeConnectTable = new Dictionary<uint, Smb2ServerTreeConnect>();

                globalSessionTable.Add(session.sessionId, session);
            }

            Smb2SessionSetupRequestPacket requestPacket = FindRequestPacket(connectionId, packet.Header.MessageId)
                as Smb2SessionSetupRequestPacket;

            if (packet.Header.Status == 0)
            {
                if (connectionList[connectionId].clientCapabilities == 0)
                {
                    connectionList[connectionId].clientCapabilities = requestPacket.PayLoad.Capabilities;
                }

                if (((packet.PayLoad.SessionFlags & SessionFlags_Values.SESSION_FLAG_IS_GUEST) == SessionFlags_Values.SESSION_FLAG_IS_GUEST)
                    || ((packet.PayLoad.SessionFlags & SessionFlags_Values.SESSION_FLAG_IS_NULL) == SessionFlags_Values.SESSION_FLAG_IS_NULL))
                {
                    //should sign set to false. do not need to set it manually.
                }
                else
                {
                    if (((requestPacket.PayLoad.SecurityMode & SESSION_SETUP_Request_SecurityMode_Values.NEGOTIATE_SIGNING_REQUIRED)
                        == SESSION_SETUP_Request_SecurityMode_Values.NEGOTIATE_SIGNING_REQUIRED) && (this.requireMessageSigning ||
                        connectionList[connectionId].shouldSign))
                    {
                        globalSessionTable[packet.GetSessionId()].shouldSign = true;
                    }
                }

                globalSessionTable[packet.GetSessionId()].sessionKey = connectionList[connectionId].gss.SessionKey;
                globalSessionTable[packet.GetSessionId()].state = SessionState.Valid;
                //Set it to null because if another authentiate request arrives, gss must be
                //set to a new one. set to null as a flag to indicate gss must re-construct.

                //release gss, set to null
                connectionList[connectionId].ReleaseSspiServer();
            }
        }