DR_EXPORT void dr_init(client_id_t id) { drmgr_priority_t priority = {sizeof(priority), "drmgr-test", NULL, NULL, 0}; drmgr_priority_t priority4 = {sizeof(priority), "drmgr-test4", NULL, NULL, 0}; drmgr_priority_t sys_pri_A = {sizeof(priority), "drmgr-test-A", NULL, NULL, 10}; drmgr_priority_t sys_pri_B = {sizeof(priority), "drmgr-test-B", "drmgr-test-A", NULL, 5}; bool ok; drmgr_init(); dr_register_exit_event(event_exit); drmgr_register_thread_init_event(event_thread_init); drmgr_register_thread_exit_event(event_thread_exit); ok = drmgr_register_bb_instrumentation_event(event_bb_analysis, event_bb_insert, &priority); CHECK(ok, "drmgr register bb failed"); /* check register/unregister instrumentation_ex */ ok = drmgr_register_bb_instrumentation_ex_event(event_bb4_app2app, event_bb4_analysis, event_bb4_insert2, event_bb4_instru2instru, NULL); CHECK(ok, "drmgr_register_bb_instrumentation_ex_event failed"); ok = drmgr_unregister_bb_instrumentation_ex_event(event_bb4_app2app, event_bb4_analysis, event_bb4_insert2, event_bb4_instru2instru); CHECK(ok, "drmgr_unregister_bb_instrumentation_ex_event failed"); /* test data passing among all 4 phases */ ok = drmgr_register_bb_instrumentation_ex_event(event_bb4_app2app, event_bb4_analysis, event_bb4_insert, event_bb4_instru2instru, &priority4); tls_idx = drmgr_register_tls_field(); CHECK(tls_idx != -1, "drmgr_register_tls_field failed"); cls_idx = drmgr_register_cls_field(event_thread_context_init, event_thread_context_exit); CHECK(cls_idx != -1, "drmgr_register_tls_field failed"); dr_register_filter_syscall_event(event_filter_syscall); ok = drmgr_register_pre_syscall_event_ex(event_pre_sys_A, &sys_pri_A) && drmgr_register_pre_syscall_event_ex(event_pre_sys_B, &sys_pri_B); CHECK(ok, "drmgr register sys failed"); ok = drmgr_register_post_syscall_event_ex(event_post_sys_A, &sys_pri_A) && drmgr_register_post_syscall_event_ex(event_post_sys_B, &sys_pri_B); CHECK(ok, "drmgr register sys failed"); syslock = dr_mutex_create(); ok = drmgr_register_bb_app2app_event(one_time_bb_event, NULL); CHECK(ok, "drmgr app2app registration failed"); }
DR_EXPORT void dr_init(client_id_t id) { client_id = id; dr_fprintf(STDERR, "thank you for testing the client interface\n"); drmgr_init(); cls_idx = drmgr_register_cls_field(event_thread_context_init, event_thread_context_exit); ASSERT(cls_idx != -1); dr_register_nudge_event(event_nudge, id); dr_register_filter_syscall_event(event_filter_syscall); drmgr_register_pre_syscall_event(event_pre_syscall); drmgr_register_post_syscall_event(event_post_syscall); dr_register_exit_event(event_exit); #ifdef WINDOWS sysnum_CreateProcess = get_sysnum("NtCreateProcess"); ASSERT(sysnum_CreateProcess != -1); /* not asserting on these since added later */ sysnum_CreateProcessEx = get_sysnum("NtCreateProcessEx"); sysnum_CreateUserProcess = get_sysnum("NtCreateUserProcess"); sysnum_ResumeThread = get_sysnum("NtResumeThread"); ASSERT(sysnum_ResumeThread != -1); #endif }
DR_EXPORT void dr_init(client_id_t id) { drsys_options_t ops = { sizeof(ops), 0, }; drmgr_init(); if (drsys_init(id, &ops) != DRMF_SUCCESS) ASSERT(false, "drsys failed to init"); dr_register_exit_event(exit_event); dr_register_filter_syscall_event(event_filter_syscall); drmgr_register_pre_syscall_event(event_pre_syscall); drmgr_register_post_syscall_event(event_post_syscall); if (drsys_filter_all_syscalls() != DRMF_SUCCESS) ASSERT(false, "drsys_filter_all_syscalls should never fail"); test_static_queries(); test_static_iterator(); /* XXX: it would be nice to do deeper tests: * + drsys_filter_syscall() and have an app that makes both filtered * and unfiltered syscalls * + have app make specific syscall w/ specific args and ensure * they match up */ }
drcovlib_status_t drcovlib_init(drcovlib_options_t *ops) { int count = dr_atomic_add32_return_sum(&drcovlib_init_count, 1); if (count > 1) return DRCOVLIB_SUCCESS; if (ops->struct_size != sizeof(options)) return DRCOVLIB_ERROR_INVALID_PARAMETER; if ((ops->flags & (~(DRCOVLIB_DUMP_AS_TEXT|DRCOVLIB_THREAD_PRIVATE))) != 0) return DRCOVLIB_ERROR_INVALID_PARAMETER; if (TEST(DRCOVLIB_THREAD_PRIVATE, ops->flags)) { if (!dr_using_all_private_caches()) return DRCOVLIB_ERROR_INVALID_SETUP; drcov_per_thread = true; } options = *ops; if (options.logdir != NULL) dr_snprintf(logdir, BUFFER_SIZE_ELEMENTS(logdir), "%s", ops->logdir); else /* default */ dr_snprintf(logdir, BUFFER_SIZE_ELEMENTS(logdir), "."); NULL_TERMINATE_BUFFER(logdir); options.logdir = logdir; if (options.native_until_thread > 0) go_native = true; drmgr_init(); drx_init(); /* We follow a simple model of the caller requesting the coverage dump, * either via calling the exit routine, using its own soft_kills nudge, or * an explicit dump call for unusual cases. This means that drx's * soft_kills remains inside the outer later, i.e., the drcov client. This * is the easiest approach for coordinating soft_kills among many libraries. * Thus, we do *not* register for an exit event here. */ drmgr_register_thread_init_event(event_thread_init); drmgr_register_thread_exit_event(event_thread_exit); drmgr_register_bb_instrumentation_event(event_basic_block_analysis, NULL, NULL); dr_register_filter_syscall_event(event_filter_syscall); drmgr_register_pre_syscall_event(event_pre_syscall); #ifdef UNIX dr_register_fork_init_event(event_fork); #endif tls_idx = drmgr_register_tls_field(); if (tls_idx == -1) return DRCOVLIB_ERROR; return event_init(); }
DR_EXPORT void dr_init(client_id_t id) { drsys_options_t ops = { sizeof(ops), 0, }; drmgr_init(); if (drsys_init(id, &ops) != DRMF_SUCCESS) ASSERT(false, "drsys failed to init"); dr_register_exit_event(exit_event); dr_register_filter_syscall_event(event_filter_syscall); drmgr_register_pre_syscall_event(event_pre_syscall); drmgr_register_post_syscall_event(event_post_syscall); if (drsys_filter_all_syscalls() != DRMF_SUCCESS) ASSERT(false, "drsys_filter_all_syscalls should never fail"); }
static bool drmgr_cls_init(void) { /* For callback init we watch for KiUserCallbackDispatcher. * For callback exit we watch for NtCallbackReturn or int 0x2b. */ static int cls_initialized; /* 0=not tried; >0=success; <0=failure */ module_data_t *data; module_handle_t ntdll_lib; app_pc addr_cbret; drmgr_priority_t priority = {sizeof(priority), "drmgr_cls", NULL, NULL, 0}; if (cls_initialized > 0) return true; else if (cls_initialized < 0) return false; cls_initialized = -1; if (!drmgr_register_bb_instrumentation_event(drmgr_event_bb_analysis, drmgr_event_bb_insert, &priority)) return false; dr_register_filter_syscall_event(drmgr_event_filter_syscall); data = dr_lookup_module_by_name("ntdll.dll"); if (data == NULL) { /* fatal error: something is really wrong w/ underlying DR */ return false; } ntdll_lib = data->handle; dr_free_module_data(data); addr_KiCallback = (app_pc) dr_get_proc_address(ntdll_lib, "KiUserCallbackDispatcher"); if (addr_KiCallback == NULL) return false; /* should not happen */ /* the wrapper is not good enough for two reasons: one, we want to swap * contexts at the last possible moment, not prior to executing a few * instrs; second, we'll miss hand-rolled syscalls */ addr_cbret = (app_pc) dr_get_proc_address(ntdll_lib, "NtCallbackReturn"); if (addr_cbret == NULL) return false; /* should not happen */ sysnum_NtCallbackReturn = drmgr_decode_sysnum_from_wrapper(addr_cbret); if (sysnum_NtCallbackReturn == -1) return false; /* should not happen */ cls_initialized = 1; return true; }
DR_EXPORT void dr_init(client_id_t id) { uint i = 0; uint const_arrays_num; drsys_options_t ops = { sizeof(ops), 0, }; dr_set_client_name("Dr. STrace", "http://drmemory.org/issues"); #ifdef WINDOWS dr_enable_console_printing(); #endif options_init(id); drsym_init(0); drmgr_init(); drx_init(); if (drsys_init(id, &ops) != DRMF_SUCCESS) ASSERT(false, "drsys failed to init"); dr_register_exit_event(exit_event); dr_register_filter_syscall_event(event_filter_syscall); drmgr_register_pre_syscall_event(event_pre_syscall); drmgr_register_post_syscall_event(event_post_syscall); if (drsys_filter_all_syscalls() != DRMF_SUCCESS) ASSERT(false, "drsys_filter_all_syscalls should never fail"); open_log_file(); const_arrays_num = get_const_arrays_num(); hashtable_init(&nconsts_table, HASHTABLE_BITSIZE, HASH_STRING, false); while (i < const_arrays_num) { const_values_t *named_consts = const_struct_array[i]; bool res = hashtable_add(&nconsts_table, (void *) named_consts[0].const_name, (void *) named_consts); if (!res) ASSERT(false, "drstrace failed to add to hashtable"); i++; } }
DR_EXPORT void dr_init(client_id_t id) { drmgr_init(); write_sysnum = get_write_sysnum(); dr_register_filter_syscall_event(event_filter_syscall); drmgr_register_pre_syscall_event(event_pre_syscall); drmgr_register_post_syscall_event(event_post_syscall); dr_register_exit_event(event_exit); tcls_idx = drmgr_register_cls_field(event_thread_context_init, event_thread_context_exit); DR_ASSERT(tcls_idx != -1); #ifdef SHOW_RESULTS if (dr_is_notify_on()) { # ifdef WINDOWS /* ask for best-effort printing to cmd window. must be called in dr_init(). */ dr_enable_console_printing(); # endif dr_fprintf(STDERR, "Client strace is running\n"); } #endif }
DR_EXPORT void dr_client_main(client_id_t id, int argc, const char *argv[]) { dr_set_client_name("DynamoRIO Sample Client 'syscall'", "http://dynamorio.org/issues"); drmgr_init(); write_sysnum = get_write_sysnum(); dr_register_filter_syscall_event(event_filter_syscall); drmgr_register_pre_syscall_event(event_pre_syscall); drmgr_register_post_syscall_event(event_post_syscall); dr_register_exit_event(event_exit); tcls_idx = drmgr_register_cls_field(event_thread_context_init, event_thread_context_exit); DR_ASSERT(tcls_idx != -1); #ifdef SHOW_RESULTS if (dr_is_notify_on()) { # ifdef WINDOWS /* ask for best-effort printing to cmd window. must be called at init. */ dr_enable_console_printing(); # endif dr_fprintf(STDERR, "Client syscall is running\n"); } #endif }
DR_EXPORT void dr_init(client_id_t id) { const char *option; option = dr_get_options(id); fi_printf("the passed option to this client: %s\n", option); sid = atoi(option); fi_printf("sid: %d\n", sid); init_log_file(); dr_register_filter_syscall_event(pre_syscall_filter); drmgr_init(); tls_idx = drmgr_register_tls_field(); drmgr_register_pre_syscall_event(pre_syscall); drmgr_register_post_syscall_event(post_syscall); drmgr_register_thread_init_event(thread_init_event); drmgr_register_thread_exit_event(thread_exit_event); jfile_fds[0] = -1; jfile_fds[1] = -1; }