void UserMessages::OnMessageEnd_Post() { if (!m_InHook || m_BlockEndPost) { RETURN_META(MRES_IGNORED); } MsgList *pList; MsgIter iter; ListenerInfo *pInfo; pList = &m_msgIntercepts[m_CurId]; for (iter=pList->begin(); iter!=pList->end(); ) { pInfo = (*iter); pInfo->IsHooked = true; pInfo->Callback->OnUserMessageSent(m_CurId); if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } pInfo->IsHooked = false; iter++; } m_InHook = false; pList = &m_msgHooks[m_CurId]; for (iter=pList->begin(); iter!=pList->end(); ) { pInfo = (*iter); pInfo->IsHooked = true; pInfo->Callback->OnUserMessageSent(m_CurId); if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } pInfo->IsHooked = false; iter++; } }
//------------------------------------------------------------------------------------------------- int ConsoleMenu::DeleteMsgs(tty_save_state& tty, MsgList& lst) const { for (;;) { Message *msg(SelectFromMsg(lst)); if (msg) { for (MsgList::iterator itr(lst.begin()); itr != lst.end(); ++itr) { if (*itr == msg) { if (get_yn("Delete msg? (y/n):", true)) { delete *itr; lst.erase(itr); } break; } } } else break; } return lst.size(); }
//------------------------------------------------------------------------------------------------- int ConsoleMenu::DeleteAllMsgs(tty_save_state& tty, MsgList& lst) const { if (lst.size() && get_yn("Delete all msgs? (y/n):", true)) { for_each(lst.begin(), lst.end(), [](const Message *pp){ delete pp; pp = nullptr; }); lst.clear(); } return 0; }
const char* CCrypto::GetMessage( EMsg eMsg, uint8 serverType ) { for ( MsgList::iterator iter = eMsgList.begin() ; iter != eMsgList.end() ; iter++ ) { if ( iter->first == eMsg ) { return iter->second->pchMsgName; } } return NULL; }
bool UserMessages::InternalUnhook(int msg_id, IBitBufUserMessageListener *pListener, bool intercept, bool isNew) #endif { MsgList *pList; MsgIter iter; ListenerInfo *pInfo; bool deleted = false; if (msg_id < 0 || msg_id >= 255) { return false; } pList = (intercept) ? &m_msgIntercepts[msg_id] : &m_msgHooks[msg_id]; for (iter=pList->begin(); iter!=pList->end(); iter++) { pInfo = (*iter); if (pInfo->Callback == pListener && pInfo->IsNew == isNew) { if (pInfo->IsHooked) { pInfo->KillMe = true; return true; } pList->erase(iter); deleted = true; break; } } if (deleted) { _DecRefCounter(); } return deleted; }
void Log::_flushOutlist() { MsgList *outlist = mOutlist; if (!outlist->empty()) { char timeStr[32] = {0}; const char *pTimeStr = 0; for (MsgList::iterator i = outlist->begin(); i != outlist->end(); ++i) { _MSG &msgnode = *i; if (msgnode.time) { struct tm *timeinfo = localtime(&msgnode.time); snprintf(timeStr, sizeof(timeStr), "[%04d/%02d/%d %02d:%02d:%02d]", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); pTimeStr = timeStr; } else { pTimeStr = 0; } for (PrinterList::iterator it = mLogPrinter.begin(); it != mLogPrinter.end(); ++it) { ILogPrinter *obj = *it; if (obj->getLevel() & msgnode.level) { obj->onPrint(msgnode.level, msgnode.time, pTimeStr, msgnode.msg.c_str()); } } } outlist->clear(); } }
int main( int argc, char **argv ) { bool report_mismatches = qstrcmp(getenv("REPORT_MISMATCHES"), "no"); if (argc != 3) { qWarning("usage: %s english-XML translated-XML", argv[0]); exit(1); } MsgList english = parseXML(argv[1]); MsgList translated = parseXML(argv[2]); QMap<QString, int>::ConstIterator eit2 = english.pc.anchors.begin(); QMap<int, QString> errors; while (eit2 != english.pc.anchors.end()) { if (eit2.data() == translated.pc.anchors[eit2.key()]) { QString key = eit2.key(); eit2++; translated.pc.anchors.remove(key); english.pc.anchors.remove(key); } else { errors[eit2.data()] = eit2.key(); eit2++; } } if (report_mismatches && errors.count()) { for (QMap<int, QString>::ConstIterator it = errors.begin(); it != errors.end(); ++it) { if (translated.pc.anchors.contains(it.data())) fprintf(stderr, "id=\"%s\" not in the same paragraphs (%d vs %d)\n", it.data().latin1(), english.pc.anchors[it.data()], translated.pc.anchors[it.data()]); else { fprintf(stderr, "id=\"%s\" not in the translated paragraphs (it's in paragraph %d in english)\n", it.data().latin1(), english.pc.anchors[it.data()]); } } ::exit(1); } MsgList::ConstIterator tit = translated.begin(); for (MsgList::Iterator it = english.begin(); it != english.end() && tit != translated.end(); ++tit, ++it) { (*it).msgstr = (*tit).msgid; } bool have_roles_of_translators = false; bool have_credit_for_translators = false; QMap<QString, int> msgids; int index = 0; for (MsgList::Iterator it = english.begin(); it != english.end(); ) { if ((*it).msgid == "ROLES_OF_TRANSLATORS") { if ((*it).msgstr.length() && !(*it).msgstr.contains("ROLES_OF_TRANSLATORS")) { have_roles_of_translators = true; } else { MsgList::Iterator tmp = it; ++it; english.remove(tmp); } continue; } if ((*it).msgid == "CREDIT_FOR_TRANSLATORS") { if ((*it).msgstr.length() && !(*it).msgstr.contains("CREDIT_FOR_TRANSLATORS")) { have_credit_for_translators = true; } else { MsgList::Iterator tmp = it; ++it; english.remove(tmp); } continue; } if (msgids.contains((*it).msgid)) { english[msgids[(*it).msgid]].lines += (*it).lines; if (english[msgids[(*it).msgid]].msgstr != (*it).msgstr) { fprintf(stderr, "two different translations for \"%s\" (\"%s\" and \"%s\") - choosing first one\n", (*it).msgid.latin1(), english[msgids[(*it).msgid]].msgstr.local8Bit().data(), (*it).msgstr.local8Bit().data()); } MsgList::Iterator tmp = it; it++; english.remove(tmp); } else { msgids.insert((*it).msgid, index); index++; it++; } } int counter = 1; while (tit != translated.end()) { MsgBlock mb; mb.msgid = QString::fromLatin1("appended paragraph %1").arg(counter++); mb.msgstr = (*tit).msgid; mb.lines += (*tit).lines; english.append(mb); tit++; } cout << "#, fuzzy\n"; cout << "msgid \"\"\n"; cout << "msgstr \"\"\n"; cout << "\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n"; cout << "\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n"; cout << "\"Content-Type: text/plain; charset=utf-8\\n\"\n"; for (MsgList::ConstIterator it = english.begin(); it != english.end(); ++it) { cout << "#: "; for (QValueList<BlockInfo>::ConstIterator it2 = (*it).lines.begin(); it2 != (*it).lines.end(); it2++) { if (it2 != (*it).lines.begin()) cout << ", "; cout << "index.docbook:" << (*it2).start_line; } cout << "\n"; outputMsg("msgid", StructureParser::descapeLiterals( (*it).msgid )); outputMsg("msgstr", StructureParser::descapeLiterals( (*it).msgstr )); cout << "\n"; } if ( !getenv( "NO_CREDITS" ) ) { if ( !have_roles_of_translators ) { outputMsg("msgid", "ROLES_OF_TRANSLATORS"); outputMsg("msgstr", "<!--TRANS:ROLES_OF_TRANSLATORS-->"); cout << "\n"; } if ( !have_credit_for_translators) { outputMsg("msgid", "CREDIT_FOR_TRANSLATORS"); outputMsg("msgstr", "<!--TRANS:CREDIT_FOR_TRANSLATORS-->"); cout << "\n"; } } return 0; }
CCrypto::CCrypto() : Encrypt_Detour( NULL ), Decrypt_Detour( NULL ) { CSimpleScan steamClientScan( "steamclient.dll" ); SymmetricEncryptWithIVFn pEncrypt = NULL; bool bEncrypt = steamClientScan.FindFunction( "\x53\x8B\xDC\x83\xEC\x08\x83\xE4\xF0\x83\xC4\x04\x55\x8B\x6B\x04\x89\x6C\x24\x04\x8B\xEC\x64\xA1\x00\x00\x00\x00", "xxxxxxxxxxxxxxxxxxxxxxxxxxxx", (void **)&pEncrypt ); Encrypt_Orig = pEncrypt; g_pLogger->LogConsole( "CCrypto::SymmetricEncryptWithIV = 0x%x\n", Encrypt_Orig ); SymmetricDecryptRecoverIVFn pDecrypt = NULL; bool bDecrypt = steamClientScan.FindFunction( "\x55\x8B\xEC\x81\xEC\x04\x01\x00\x00\x83\x7D\x08\x00\x53", "xxxxxxxxxxxxxx", (void **)&pDecrypt ); Decrypt_Orig = pDecrypt; g_pLogger->LogConsole( "CCrypto::SymmetricDecryptRecoverIV = 0x%x\n", Decrypt_Orig ); char *pGetMessageList = NULL; bool bGetMessageList = steamClientScan.FindFunction( "\xA1\x00\x00\x00\x00\xA8\x01\x75\x00\x83\xC8\x01\xB9\x00\x00\x00\x00\x0056", "x????xxx?xxxx????x", (void **)&pGetMessageList ); if (bGetMessageList) { const uint32 uMessageListStartPtrOffset = 38; const uint32 uMessageListEndPtrOffset = uMessageListStartPtrOffset + 26; MsgInfo_t *pInfos = *(MsgInfo_t **)( pGetMessageList + uMessageListStartPtrOffset ); MsgInfo_t *pEndInfos = *(MsgInfo_t **)( pGetMessageList + uMessageListEndPtrOffset ); uint16 numMessages = ( ( int )pEndInfos - ( int )pInfos ) / sizeof( MsgInfo_t ); g_pLogger->LogConsole( "pGetMessageList = 0x%x\npInfos = 0x%x\nnumMessages = %d\n", pGetMessageList, pInfos, numMessages ); for ( uint16 x = 0 ; x < numMessages; x++ ) { eMsgList.insert( MsgPair( pInfos->eMsg, pInfos ) ); pInfos++; } if ( eMsgList.size() != 0 ) { // should only delete our existing files if we have something new to dump g_pLogger->DeleteFile( "emsg_list.txt", false ); g_pLogger->DeleteFile( "emsg_list_detailed.txt", false ); for ( MsgList::iterator iter = eMsgList.begin() ; iter != eMsgList.end() ; iter++ ) { MsgInfo_t *pInfo = iter->second; g_pLogger->LogFile( "emsg_list.txt", false, "\t%s = %d,\r\n", pInfo->pchMsgName, pInfo->eMsg ); g_pLogger->LogFile( "emsg_list_detailed.txt", false, "\t%s = %d, // flags: %d, server type: %d\r\n", pInfo->pchMsgName, pInfo->eMsg, pInfo->nFlags, pInfo->k_EServerTarget ); } g_pLogger->LogConsole( "Dumped emsg list! (%d messages)\n", eMsgList.size() ); } else { g_pLogger->LogConsole( "Unable to dump emsg list: No messages! (Offset changed?)\n" ); } } else { g_pLogger->LogConsole( "Unable to find GetMessageList.\n" ); } SymmetricEncryptWithIVFn encrypt = CCrypto::SymmetricEncryptWithIV; SymmetricDecryptRecoverIVFn decrypt = CCrypto::SymmetricDecryptRecoverIV; if ( bEncrypt ) { Encrypt_Detour = new CSimpleDetour((void **) &Encrypt_Orig, (void*) encrypt); Encrypt_Detour->Attach(); g_pLogger->LogConsole( "Detoured SymmetricEncryptWithIV!\n" ); } else { g_pLogger->LogConsole( "Unable to hook SymmetricEncryptWithIV: Func scan failed.\n" ); } if ( bDecrypt ) { Decrypt_Detour = new CSimpleDetour((void **) &Decrypt_Orig, (void*) decrypt); Decrypt_Detour->Attach(); g_pLogger->LogConsole( "Detoured SymmetricDecryptRecoverIV!\n" ); } else { g_pLogger->LogConsole( "Unable to hook SymmetricDecryptRecoverIV: Func scan failed.\n" ); } }
void UserMessages::OnMessageEnd_Pre() { if (!m_InHook) { RETURN_META(MRES_IGNORED); } MsgList *pList; MsgIter iter; ListenerInfo *pInfo; ResultType res; bool intercepted = false; bool handled = false; pList = &m_msgIntercepts[m_CurId]; for (iter=pList->begin(); iter!=pList->end(); ) { pInfo = (*iter); pInfo->IsHooked = true; res = pInfo->Callback->InterceptUserMessage(m_CurId, &m_InterceptBuffer, m_CurRecFilter); intercepted = true; switch (res) { case Pl_Stop: { if (pInfo->KillMe) { pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); goto supercede; } pInfo->IsHooked = false; goto supercede; } case Pl_Handled: { handled = true; if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } break; } default: { if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } break; } } pInfo->IsHooked = false; iter++; } if (handled) { goto supercede; } if (intercepted) { bf_write *engine_bfw; engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId); m_ReadBuffer.StartReading(m_InterceptBuffer.GetBasePointer(), m_InterceptBuffer.GetNumBytesWritten()); engine_bfw->WriteBitsFromBuffer(&m_ReadBuffer, m_InterceptBuffer.GetNumBitsWritten()); ENGINE_CALL(MessageEnd)(); } pList = &m_msgHooks[m_CurId]; for (iter=pList->begin(); iter!=pList->end(); ) { pInfo = (*iter); pInfo->IsHooked = true; pInfo->Callback->OnUserMessage(m_CurId, m_OrigBuffer, m_CurRecFilter); if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } pInfo->IsHooked = false; iter++; } RETURN_META((intercepted) ? MRES_SUPERCEDE : MRES_IGNORED); supercede: m_InHook = false; m_BlockEndPost = true; RETURN_META(MRES_SUPERCEDE); }
void UserMessages::OnMessageEnd_Pre() { if (!m_InHook) { UM_RETURN_META(MRES_IGNORED); } MsgList *pList; MsgIter iter; ListenerInfo *pInfo; ResultType res; bool intercepted = false; bool handled = false; pList = &m_msgIntercepts[m_CurId]; for (iter=pList->begin(); iter!=pList->end(); ) { pInfo = (*iter); pInfo->IsHooked = true; #ifdef USE_PROTOBUF_USERMESSAGES res = pInfo->Callback->InterceptUserMessage(m_CurId, m_InterceptBuffer, m_CurRecFilter); #else res = pInfo->Callback->InterceptUserMessage(m_CurId, &m_InterceptBuffer, m_CurRecFilter); #endif intercepted = true; switch (res) { case Pl_Stop: { if (pInfo->KillMe) { pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); goto supercede; } pInfo->IsHooked = false; goto supercede; } case Pl_Handled: { handled = true; if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } break; } default: { if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } break; } } pInfo->IsHooked = false; iter++; } if (!handled && intercepted) { #if SOURCE_ENGINE == SE_CSGO ENGINE_CALL(SendUserMessage)(static_cast<IRecipientFilter &>(*m_CurRecFilter), m_CurId, *m_InterceptBuffer); #else bf_write *engine_bfw; #if SOURCE_ENGINE >= SE_LEFT4DEAD engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId, g_SMAPI->GetUserMessage(m_CurId)); #else engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId); #endif m_ReadBuffer.StartReading(m_InterceptBuffer.GetBasePointer(), m_InterceptBuffer.GetNumBytesWritten()); engine_bfw->WriteBitsFromBuffer(&m_ReadBuffer, m_InterceptBuffer.GetNumBitsWritten()); ENGINE_CALL(MessageEnd)(); #endif // SE_CSGO } { #if SOURCE_ENGINE == SE_CSGO int size = m_OrigBuffer->ByteSize(); uint8 *data = (uint8 *)stackalloc(size); m_OrigBuffer->SerializePartialToArray(data, size); protobuf::Message *pTempMsg = GetMessagePrototype(m_CurId)->New(); pTempMsg->ParsePartialFromArray(data, size); #else bf_write *pTempMsg = m_OrigBuffer; #endif pList = &m_msgHooks[m_CurId]; for (iter=pList->begin(); iter!=pList->end(); ) { pInfo = (*iter); pInfo->IsHooked = true; pInfo->Callback->OnUserMessage(m_CurId, pTempMsg, m_CurRecFilter); if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } pInfo->IsHooked = false; iter++; } #if SOURCE_ENGINE == SE_CSGO delete pTempMsg; #endif } UM_RETURN_META((intercepted) ? MRES_SUPERCEDE : MRES_IGNORED); supercede: m_BlockEndPost = true; UM_RETURN_META(MRES_SUPERCEDE); }