void dpPatcher::unpatchAll() { dpEach(m_patches, [&](const dpPatchData &p){ unpatchImpl(p); }); m_patches.clear(); }
void dpSymbolTable::merge(const dpSymbolTable &v) { dpEach(v.m_symbols, [&](const dpSymbol *sym){ m_symbols.push_back( const_cast<dpSymbol*>(sym) ); }); sort(); }
dpAPI bool dpInitialize(const dpConfig &conf) { if(!g_dpDefaultContext) { DWORD opt = ::SymGetOptions(); opt |= SYMOPT_DEFERRED_LOADS | SYMOPT_LOAD_LINES; opt &= ~SYMOPT_UNDNAME; ::SymSetOptions(opt); ::SymInitialize(::GetCurrentProcess(), NULL, TRUE); dpConfig &g_dpConfig = dpGetConfig(); g_dpConfig = conf; g_dpConfig.starttime = dpGetSystemTime(); dpConfigFile cf; bool config_loaded = false; if((conf.sys_flags&dpE_SysLoadConfig)!=0 && (conf.configfile ? cf.load(conf.configfile) : cf.load())) { config_loaded = true; if(cf.log_flags!=-1) { g_dpConfig.log_flags=cf.log_flags; } if(cf.sys_flags!=-1) { g_dpConfig.sys_flags=cf.sys_flags; } if(cf.vc_ver!=-1) { g_dpConfig.vc_ver=cf.vc_ver; } } g_dpDefaultContext = new dpContext(); if(config_loaded) { if(!cf.loads.empty()) { dpEach(cf.loads, [](const std::string &path){ dpLoad(path.c_str()); }); dpLink(); } dpEach(cf.source_paths, [](const std::string &v){ dpAddSourcePath(v.c_str()); }); dpEach(cf.module_paths, [](const std::string &v){ dpAddModulePath(v.c_str()); }); dpEach(cf.preload_paths, [](const std::string &v){ dpAddPreloadPath(v.c_str()); }); dpEach(cf.msbuild_commands, [](const std::string &v){ dpAddMSBuildCommand(v.c_str()); }); dpEach(cf.build_commands, [](const std::string &v){ dpAddBuildCommand(v.c_str()); }); dpEach(cf.force_host_symbol_patterns, [](const std::string &v){ dpAddForceHostSymbolPattern(v.c_str()); }); if(!cf.source_paths.empty() && (!cf.msbuild_commands.empty() || !cf.build_commands.empty())) { dpStartAutoBuild(); } if(!cf.preload_paths.empty()) { dpStartPreload(); } } if((g_dpConfig.sys_flags & dpE_SysOpenConsole)!=0) { ::AllocConsole(); } if((g_dpConfig.sys_flags & dpE_SysRunCommunicator)!=0) { #ifdef dpWithNetwork dpInitializeNetwork(); #endif // dpWithNetwork bool auto_flush = (g_dpConfig.sys_flags & dpE_SysCommunicatorAutoFlush)!=0; g_dpDefaultContext->runCommunicator(g_dpConfig.communicator_port, auto_flush); } return true; } return false; }
bool dpLoader::link() { dpBuilder::ScopedPreloadLock pl(dpGetBuilder()); if(m_onload_queue.empty()) { return true; } bool ret = true; eachBinaries([&](dpBinary *bin){ if(!bin->link()) { ret=false; } }); if((dpGetConfig().sys_flags&dpE_SysDelayedLink)==0) { if(ret) { dpPrintInfo("link succeeded\n"); } else { dpPrintError("link error\n"); ::DebugBreak(); } } // 有効にされていれば dllexport な関数を自動的に patch if((dpGetConfig().sys_flags&dpE_SysPatchExports)!=0) { dpEach(m_onload_queue, [&](dpBinary *b){ b->eachSymbols([&](dpSymbol *sym){ if(dpIsExportFunction(sym->flags)) { sym->partialLink(); dpGetPatcher()->patch(findHostSymbolByName(sym->name), sym); } }); }); } // OnLoad があれば呼ぶ dpEach(m_onload_queue, [&](dpBinary *b){ b->callHandler(dpE_OnLoad); }); m_onload_queue.clear(); return ret; }
dpBlockAllocator<PageSize, BlockSize>::~dpBlockAllocator() { dpEach(m_pages, [](Page *p){ delete p; }); m_pages.clear(); }
dpTrampolineAllocator::~dpTrampolineAllocator() { dpEach(m_pages, [](Page *p){ delete p; }); m_pages.clear(); }
void dpSanitizePath(std::string &path) { dpEach(path, [](char &c){ if(c=='/') { c='\\'; } }); }