示例#1
0
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();
}
示例#3
0
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='\\'; }
    });
}