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; }