DR_EXPORT void dr_init(client_id_t id) { int i = 0; int j = 0; drmgr_init(); dr_enable_console_printing(); setupInsPasses(); doCommandLineArgProcessing(id); DEBUG_PRINT("argument length - %d\n", argument_length); for (i = 0; i < argument_length; i++){ DEBUG_PRINT("\"%s - %s\"\n", arguments[i].name, arguments[i].arguments); } dr_register_nudge_event(nudge_event, id); /*if (log_mode){ populate_conv_filename(global_logfilename, logdir, "global", NULL); global_logfile = dr_open_file(global_logfilename, DR_FILE_WRITE_OVERWRITE); DR_ASSERT(global_logfile != INVALID_FILE); }*/ //dr_messagebox("client id - %d\n", id); DEBUG_PRINT("%s is starting\n", dr_get_application_name()); /* if you are using it only for photoshop do no instrument other exes */ if (strcmp(exec, "photoshop") == 0){ DEBUG_PRINT("photoshop detected only instrumenting Photoshop.exe\n"); if(strcmp(dr_get_application_name(), "Photoshop.exe") != 0){ return; } DEBUG_PRINT("starting to instrument Photoshop.exe\n"); } for( i=0 ; i<argument_length; i++){ for( j=0; j<pass_length; j++){ if(strcmp(arguments[i].name,ins_pass[j].name) == 0){ //we can now register the call backs DEBUG_PRINT("%s - registered\n", arguments[i].name); DEBUG_PRINT("%s - initializing...\n", arguments[i].name); ins_pass[j].init_func(id,arguments[i].name, arguments[i].arguments); DEBUG_PRINT("%s - initialized\n", arguments[i].name); //register thread events if(ins_pass[j].thread_init != NULL) drmgr_register_thread_init_event(ins_pass[j].thread_init); if(ins_pass[j].thread_exit != NULL) drmgr_register_thread_exit_event(ins_pass[j].thread_exit); //register bb events if(ins_pass[j].app2app_bb != NULL) drmgr_register_bb_app2app_event(ins_pass[j].app2app_bb, &ins_pass[j].priority); if(ins_pass[j].instrumentation_bb != NULL || ins_pass[j].analysis_bb != NULL) drmgr_register_bb_instrumentation_event(ins_pass[j].analysis_bb, ins_pass[j].instrumentation_bb, &ins_pass[j].priority); if (ins_pass[j].module_load != NULL) drmgr_register_module_load_event_ex(ins_pass[j].module_load, &ins_pass[j].priority); if (ins_pass[j].module_unload != NULL) drmgr_register_module_unload_event_ex(ins_pass[j].module_unload, &ins_pass[j].priority); } } } dr_register_exit_event(process_exit_routine_call); }
DR_EXPORT drmf_status_t drsymcache_init(client_id_t client_id, const char *symcache_dir_in, size_t modsize_cache_threshold) { #ifdef WINDOWS module_data_t *mod; #endif drmf_status_t res; drmgr_priority_t pri_mod_load_cache = {sizeof(pri_mod_load_cache), DRMGR_PRIORITY_NAME_DRSYMCACHE, NULL, NULL, DRMGR_PRIORITY_MODLOAD_DRSYMCACHE_READ}; drmgr_priority_t pri_mod_unload_cache = {sizeof(pri_mod_unload_cache), DRMGR_PRIORITY_NAME_DRSYMCACHE, NULL, NULL, DRMGR_PRIORITY_MODUNLOAD_DRSYMCACHE}; drmgr_priority_t pri_mod_save_cache = {sizeof(pri_mod_save_cache), DRMGR_PRIORITY_NAME_DRSYMCACHE_SAVE, NULL, NULL, DRMGR_PRIORITY_MODLOAD_DRSYMCACHE_SAVE}; /* handle multiple sets of init/exit calls */ int count = dr_atomic_add32_return_sum(&symcache_init_count, 1); if (count > 1) return DRMF_WARNING_ALREADY_INITIALIZED; res = drmf_check_version(client_id); if (res != DRMF_SUCCESS) return res; drmgr_init(); drmgr_register_module_load_event_ex(symcache_module_load, &pri_mod_load_cache); drmgr_register_module_unload_event_ex(symcache_module_unload, &pri_mod_unload_cache); drmgr_register_module_load_event_ex(symcache_module_load_save, &pri_mod_save_cache); initialized = true; op_modsize_cache_threshold = modsize_cache_threshold; hashtable_init_ex(&symcache_table, SYMCACHE_MASTER_TABLE_HASH_BITS, IF_WINDOWS_ELSE(HASH_STRING_NOCASE, HASH_STRING), true/*strdup*/, false/*!synch*/, symcache_free_entry, NULL, NULL); symcache_lock = dr_mutex_create(); dr_snprintf(symcache_dir, BUFFER_SIZE_ELEMENTS(symcache_dir), "%s", symcache_dir_in); NULL_TERMINATE_BUFFER(symcache_dir); if (!dr_directory_exists(symcache_dir)) { if (!dr_create_dir(symcache_dir)) { /* check again in case of a race (i#616) */ if (!dr_directory_exists(symcache_dir)) { NOTIFY_ERROR("Unable to create symcache dir %s"NL, symcache_dir); ASSERT(false, "unable to create symcache dir"); dr_abort(); } } } #ifdef WINDOWS /* It's common for tools to query ntdll in their init routines so we add it * early here */ mod = dr_lookup_module_by_name("ntdll.dll"); if (mod != NULL) { symcache_module_load(dr_get_current_drcontext(), mod, true); dr_free_module_data(mod); } #endif return DRMF_SUCCESS; }