/* convert a symbol into an address */ status_t vmi_translate_sym2v (vmi_instance_t vmi, const access_context_t *ctx, const char *symbol, addr_t *vaddr) { status_t status; addr_t rva = 0; addr_t address = 0; addr_t dtb = 0; switch(ctx->translate_mechanism) { case VMI_TM_PROCESS_PID: if ( VMI_FAILURE == vmi_pid_to_dtb(vmi, ctx->pid, &dtb) ) return VMI_FAILURE; break; case VMI_TM_PROCESS_DTB: dtb = ctx->dtb; break; default: dbprint(VMI_DEBUG_MISC, "sym2v only supported in a virtual context!\n"); return VMI_FAILURE; }; status = sym_cache_get(vmi, ctx->addr, dtb, symbol, &address); if( VMI_FAILURE == status) { if (vmi->os_interface && vmi->os_interface->os_usym2rva) { status = vmi->os_interface->os_usym2rva(vmi, ctx, symbol, &rva); if ( VMI_SUCCESS == status ) { address = canonical_addr(ctx->addr + rva); sym_cache_set(vmi, ctx->addr, dtb, symbol, address); } } } *vaddr = address; return status; }
/* convert a symbol into an address */ addr_t vmi_translate_sym2v (vmi_instance_t vmi, addr_t base_vaddr, vmi_pid_t pid, char *symbol) { status_t status = VMI_FAILURE; addr_t rva = 0; addr_t address = 0; if (VMI_FAILURE == sym_cache_get(vmi, base_vaddr, pid, symbol, &address)) { if (vmi->os_interface && vmi->os_interface->os_usym2rva) { status = vmi->os_interface->os_usym2rva(vmi, base_vaddr, pid, symbol, &rva); if (status == VMI_SUCCESS) { address = base_vaddr + rva; sym_cache_set(vmi, base_vaddr, pid, symbol, address); } } } return address; }
/* convert a kernel symbol into an address */ addr_t vmi_translate_ksym2v (vmi_instance_t vmi, const char *symbol) { status_t status = VMI_FAILURE; addr_t base_vaddr = 0; addr_t address = 0; if (VMI_FAILURE == sym_cache_get(vmi, base_vaddr, 0, symbol, &address)) { if (vmi->os_interface && vmi->os_interface->os_ksym2v) { status = vmi->os_interface->os_ksym2v(vmi, symbol, &base_vaddr, &address); if (status == VMI_SUCCESS) { sym_cache_set(vmi, base_vaddr, 0, symbol, address); } } } return address; }
/* convert a kernel symbol into an address */ status_t vmi_translate_ksym2v (vmi_instance_t vmi, const char *symbol, addr_t *vaddr) { status_t status = VMI_FAILURE; addr_t address = 0; status = sym_cache_get(vmi, 0, 0, symbol, &address); if ( VMI_FAILURE == status ) { if (vmi->os_interface && vmi->os_interface->os_ksym2v) { addr_t _base_vaddr; status = vmi->os_interface->os_ksym2v(vmi, symbol, &_base_vaddr, &address); if ( VMI_SUCCESS == status ) { address = canonical_addr(address); sym_cache_set(vmi, 0, 0, symbol, address); } } } *vaddr = address; return status; }