Exemplo n.º 1
0
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);
		
}
Exemplo n.º 2
0
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;
}