bool CLoadModule::LoadModule(const char* pModulePath, const char* pModuleName, const char* pModuleParam) { string strModuleName = (string)pModuleName; //确定这个模块是否被注册过 _ModuleInfo* pCurr = m_mapModuleInfo.SearchMapData(strModuleName); if(NULL != pCurr) { //如果被注册过,先卸载现有的,再重新装载 UnLoadModule(strModuleName.c_str()); } _ModuleInfo* pModuleInfo = new _ModuleInfo(); if(NULL == pModuleInfo) { OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadMoudle] new _ModuleInfo is error!\n")); return false; } //记录模块参数 pModuleInfo->strModuleParam = (string)pModuleParam; //开始注册模块函数 if(false == LoadModuleInfo(strModuleName, pModuleInfo, pModulePath)) { SAFE_DELETE(pModuleInfo); return false; } //查找此模块是否已经被注册,有则把信息老信息清理 _ModuleInfo* pOldModuleInfo = m_mapModuleInfo.SearchMapData(strModuleName); if(NULL != pOldModuleInfo) { //关闭副本 ACE_OS::dlclose(pOldModuleInfo->hModule); m_mapModuleInfo.DelMapData(strModuleName, true); } //将注册成功的模块,加入到map中 if(false == m_mapModuleInfo.AddMapData(pModuleInfo->GetName(), pModuleInfo)) { OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadMoudle] m_mapModuleInfo.AddMapData error!\n")); SAFE_DELETE(pModuleInfo); return false; } //开始调用模块初始化动作 int nRet = pModuleInfo->LoadModuleData(App_ServerObject::instance()); if(nRet != 0) { OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadModuleInfo] strModuleName = %s, Execute Function LoadModuleData is error!\n", strModuleName.c_str())); SAFE_DELETE(pModuleInfo); return false; } OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadMoudle] Begin Load ModuleName[%s] OK!\n", pModuleInfo->GetName())); return true; }
bool CLoadModule::LoadModule(const char* szModulePath, const char* szResourceName) { vector<string> vecModuleName; string strModuleName; //将字符串数组解析成单一的模块名称 ParseModule(szResourceName, vecModuleName); sprintf_safe(m_szModulePath, MAX_BUFF_200, "%s", szModulePath); for(uint16 i = 0; i < (uint16)vecModuleName.size(); i++) { strModuleName = vecModuleName[i]; OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadMoudle] Begin Load ModuleName[%s]!\n", strModuleName.c_str())); //确定这个模块是否被注册过 _ModuleInfo* pCurr = m_mapModuleInfo.SearchMapData(strModuleName); if(NULL != pCurr) { //如果被注册过,先卸载现有的,再重新装载 UnLoadModule(strModuleName.c_str()); } _ModuleInfo* pModuleInfo = new _ModuleInfo(); if(NULL == pModuleInfo) { OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadMoudle] new _ModuleInfo is error!\n")); return false; } //开始注册模块 if(false == LoadModuleInfo(strModuleName, pModuleInfo)) { SAFE_DELETE(pModuleInfo); return false; } //将注册成功的模块,加入到map中 if(false == m_mapModuleInfo.AddMapData(pModuleInfo->GetName(), pModuleInfo)) { OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadMoudle] m_mapModuleInfo.AddMapData error!\n")); SAFE_DELETE(pModuleInfo); return false; } OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadMoudle] Begin Load ModuleName[%s] OK!\n", strModuleName.c_str())); } return true; }
bool Pdb::RunToException() { DR_LOG("RunToException"); LLOG("RUN TO EXCEPTION"); TimeStop ts; bool disasfocus = disas.HasFocus(); bool locked = false; bool frestored = false; invalidpage.Clear(); mempage.Clear(); int opn = 0; for(;;) { if(terminated) { if(locked) Unlock(); return false; } opn++; DR_LOG("WaitForDebugEvent"); if(WaitForDebugEvent(&event, 0)) { DR_LOG("WaitForDebugEvent ended"); debug_threadid = event.dwThreadId; opn = 0; running = false; switch(event.dwDebugEventCode) { case EXCEPTION_DEBUG_EVENT: { DR_LOG("EXCEPTION_DEBUG_EVENT"); LLOG("Exception: " << FormatIntHex(event.u.Exception.ExceptionRecord.ExceptionCode) << " at: " << FormatIntHex(event.u.Exception.ExceptionRecord.ExceptionAddress) << " first: " << event.u.Exception.dwFirstChance); SaveForeground(); const EXCEPTION_RECORD& x = event.u.Exception.ExceptionRecord; if(findarg(x.ExceptionCode, EXCEPTION_BREAKPOINT, EXCEPTION_SINGLE_STEP, STATUS_WX86_BREAKPOINT, STATUS_WX86_SINGLE_STEP) < 0) { LLOG("Non-debug EXCEPTION"); if(event.u.Exception.dwFirstChance) { LLOG("First chance " << FormatIntHex(x.ExceptionCode)); break; } String desc = Format("Exception: [* %lX] at [* %16llX]&", (int64)x.ExceptionCode, (int64)x.ExceptionAddress); for(int i = 0; i < __countof(ex_desc); i++) if(ex_desc[i].code == x.ExceptionCode) desc << "[* " << DeQtf(ex_desc[i].text) << "]&"; if(x.ExceptionCode == EXCEPTION_ACCESS_VIOLATION) { desc << (x.ExceptionInformation[0] ? "[*@3 writing]" : "[*@4 reading]"); desc << Format(" at [* %08llX]", (int64)x.ExceptionInformation[1]); } ToForeground(); PromptOK(desc); } #ifdef CPU_64 if(!win64 && x.ExceptionCode == EXCEPTION_BREAKPOINT && !break_running) // Ignore x64 breakpoint in wow64 break; #endif if(break_running) debug_threadid = mainThreadId; break_running = false; ToForeground(); if(disasfocus) disas.SetFocus(); if(locked) Unlock(); if(refreshmodules) LoadModuleInfo(); LLOG("event.dwThreadId = " << event.dwThreadId); bool isbreakpoint = findarg(x.ExceptionCode, EXCEPTION_BREAKPOINT, STATUS_WX86_BREAKPOINT) >= 0; for(int i = 0; i < threads.GetCount(); i++) { Thread& t = threads[i]; (Context&)t = ReadContext(threads[i].hThread); if(event.dwThreadId == threads.GetKey(i)) { LLOG("Setting current context"); if(isbreakpoint #ifdef CPU_64 && bp_set.Find((win64 ? t.context64.Rip : t.context32.Eip) - 1) >= 0 #else && bp_set.Find(t.context32.Eip - 1) >= 0 #endif ) // We have stopped at breakpoint, need to move address back #ifdef CPU_64 if(win64) t.context64.Rip--; else #endif t.context32.Eip--; context = t; } } RemoveBp(); return true; } case CREATE_THREAD_DEBUG_EVENT: DR_LOG("CREATE_THREAD_DEBUG_EVENT"); LLOG("Create thread: " << event.dwThreadId); AddThread(event.dwThreadId, event.u.CreateThread.hThread); break; case EXIT_THREAD_DEBUG_EVENT: DR_LOG("EXIT_THREAD_DEBUG_EVENT"); LLOG("Exit thread: " << event.dwThreadId); RemoveThread(event.dwThreadId); break; case CREATE_PROCESS_DEBUG_EVENT: DR_LOG("CREATE_PROCESS_DEBUG_EVENT"); LLOG("Create process: " << event.dwProcessId); processid = event.dwProcessId; AddThread(event.dwThreadId, event.u.CreateProcessInfo.hThread); CloseHandle(event.u.CreateProcessInfo.hFile); CloseHandle(event.u.CreateProcessInfo.hProcess); break; case EXIT_PROCESS_DEBUG_EVENT: DR_LOG("EXIT_PROCESS_DEBUG_EVENT"); LLOG("Exit process: " << event.dwProcessId); if(locked) Unlock(); terminated = true; return false; case LOAD_DLL_DEBUG_EVENT: { DR_LOG("LOAD_DLL_DEBUG_EVENT"); LLOG("Load dll: " << event.u.LoadDll.lpBaseOfDll); CloseHandle(event.u.LoadDll.hFile); refreshmodules = true; break; } case UNLOAD_DLL_DEBUG_EVENT: DR_LOG("UNLOAD_DLL_DEBUG_EVENT"); LLOG("UnLoad dll: " << event.u.UnloadDll.lpBaseOfDll); refreshmodules = true; break; case RIP_EVENT: DR_LOG("RIP_EVENT"); LLOG("RIP!"); Exclamation("Process being debugged died unexpectedly!"); terminated = true; if(locked) Unlock(); return false; } DR_LOG("ContinueDebugEvent"); ContinueDebugEvent(event.dwProcessId, event.dwThreadId, DBG_EXCEPTION_NOT_HANDLED); running = true; } if(ts.Elapsed() > 200) { DR_LOG("ts.Elpsed() > 200"); if(!lock) { Lock(); locked = true; } if(!frestored) { RestoreForeground(); frestored = true; } } if(lock) { DR_LOG("GuiSleep"); GuiSleep(opn < 1000 ? 0 : 100); Ctrl::ProcessEvents(); } else { DR_LOG("Sleep"); Sleep(opn < 1000 ? 0 : 100); } } }
bool CLoadModule::LoadModule(const char* pModulePath, const char* pResourceName) { vector<string> vecModuleName; string strModuleName; //将字符串数组解析成单一的模块名称 ParseModule(pResourceName, vecModuleName); sprintf_safe(m_szModulePath, MAX_BUFF_200, "%s", pModulePath); for(uint16 i = 0; i < (uint16)vecModuleName.size(); i++) { strModuleName = vecModuleName[i]; OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadMoudle] Begin Load ModuleName[%s]!\n", strModuleName.c_str())); //确定这个模块是否被注册过 _ModuleInfo* pCurr = m_mapModuleInfo.SearchMapData(strModuleName); if(NULL != pCurr) { //如果被注册过,先卸载现有的,再重新装载 UnLoadModule(strModuleName.c_str()); } _ModuleInfo* pModuleInfo = new _ModuleInfo(); if(NULL == pModuleInfo) { OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadMoudle] new _ModuleInfo is error!\n")); return false; } //开始注册模块函数 if(false == LoadModuleInfo(strModuleName, pModuleInfo, m_szModulePath)) { SAFE_DELETE(pModuleInfo); return false; } //查找此模块是否已经被注册,有则把信息老信息清理 _ModuleInfo* pOldModuleInfo = m_mapModuleInfo.SearchMapData(strModuleName); if(NULL != pOldModuleInfo) { //关闭副本 ACE_OS::dlclose(pOldModuleInfo->hModule); m_mapModuleInfo.DelMapData(strModuleName, true); } //将注册成功的模块,加入到map中 if(false == m_mapModuleInfo.AddMapData(pModuleInfo->GetName(), pModuleInfo)) { OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadMoudle] m_mapModuleInfo.AddMapData error!\n")); SAFE_DELETE(pModuleInfo); return false; } //开始调用模块初始化动作 int nRet = pModuleInfo->LoadModuleData(App_ServerObject::instance()); if(nRet != 0) { OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadModuleInfo] strModuleName = %s, Execute Function LoadModuleData is error!\n", strModuleName.c_str())); return false; } OUR_DEBUG((LM_ERROR, "[CLoadModule::LoadMoudle] Begin Load ModuleName[%s] OK!\n", strModuleName.c_str())); } return true; }