END_TEST #if ENABLE_KVM == 1 /* test vmi_get_dgvma */ // we use vmi_read_va() to verify vmi_get_dgvma() START_TEST (test_vmi_get_dgvma) { vmi_instance_t vmi = NULL; vmi_init(&vmi, VMI_AUTO | VMI_INIT_COMPLETE, get_testvm()); vmi_shm_snapshot_create(vmi); addr_t va = 0x0; size_t count = 4096; unsigned long max_size = 0xffff; void *buf_readva = malloc(count); void *buf_dgvma = NULL; for (; va + count <= max_size; va += count) { size_t read_va = vmi_read_va(vmi, va, 0, buf_readva, count); size_t read_dgvma = vmi_get_dgvma(vmi, va, 0, &buf_dgvma, count); fail_unless(read_va == read_dgvma, "vmi_get_dgvma(0x%"PRIx64 ") read size %d dosn't conform to %d of vmi_read_va()", va, read_dgvma, read_va); int cmp = memcmp(buf_readva, buf_dgvma, read_va); fail_unless(0 == cmp, "vmi_get_dgvma(0x%"PRIx64 ") contents dosn't conform to vmi_read_va()", va); } free(buf_readva); vmi_shm_snapshot_destroy(vmi); vmi_destroy(vmi); }
END_TEST /* test vmi_get_dgpma */ // we use vmi_read_pa() to verify vmi_get_dgpma() START_TEST (test_vmi_get_dgpma) { vmi_instance_t vmi = NULL; vmi_init(&vmi, VMI_AUTO | VMI_INIT_COMPLETE, get_testvm()); vmi_shm_snapshot_create(vmi); addr_t pa = 0x1000; // just because vmi_read_page() deny to fetch frame 0. size_t count = 4096; unsigned long max_size = vmi_get_max_physical_address(vmi); void *buf_readpa = malloc(count); void *buf_dgpma = NULL; for (; pa + count <= max_size; pa += count) { size_t read_pa = vmi_read_pa(vmi, pa, buf_readpa, count); size_t read_dgpma = vmi_get_dgpma(vmi, pa, &buf_dgpma, count); if (read_pa == 0 && read_dgpma == 0) { continue; } fail_unless(read_pa == read_dgpma, "vmi_get_dgpma(0x%"PRIx64 ") read size %d dosn't conform to %d of vmi_read_pa()", pa, read_dgpma, read_pa); int cmp = memcmp(buf_readpa, buf_dgpma, read_pa); fail_unless(0 == cmp, "vmi_get_dgpma(0x%"PRIx64 ") contents dosn't conform to vmi_read_pa()", pa); } free(buf_readpa); vmi_shm_snapshot_destroy(vmi); vmi_destroy(vmi); }
int main (int argc, char **argv) { /* this is the VM or file that we are looking at */ if (argc != 2) { printf("Usage: %s <vmname>\n", argv[0]); return 1; } #if ENABLE_SHM_SNAPSHOT == 1 vmi_instance_t vmi; addr_t list_head = 0, current_list_entry = 0, next_list_entry = 0; addr_t current_process = 0; char *procname = NULL; vmi_pid_t pid = 0; unsigned long tasks_offset, pid_offset, name_offset; char *name = argv[1]; /* initialize the libvmi library */ if (vmi_init(&vmi, VMI_AUTO | VMI_INIT_COMPLETE, name) == VMI_FAILURE) { printf("Failed to init LibVMI library.\n"); return 1; } /* init the offset values */ if (VMI_OS_LINUX == vmi_get_ostype(vmi)) { tasks_offset = vmi_get_offset(vmi, "linux_tasks"); name_offset = vmi_get_offset(vmi, "linux_name"); pid_offset = vmi_get_offset(vmi, "linux_pid"); /* NOTE: * name_offset is no longer hard-coded. Rather, it is now set * via libvmi.conf. */ } else if (VMI_OS_WINDOWS == vmi_get_ostype(vmi)) { tasks_offset = vmi_get_offset(vmi, "win_tasks"); if (0 == tasks_offset) { printf("Failed to find win_tasks\n"); goto error_exit; } name_offset = vmi_get_offset(vmi, "win_pname"); if (0 == name_offset) { printf("Failed to find win_pname\n"); goto error_exit; } pid_offset = vmi_get_offset(vmi, "win_pid"); if (0 == pid_offset) { printf("Failed to find win_pid\n"); goto error_exit; } } /* create a shm-snapshot */ if (vmi_shm_snapshot_create(vmi) != VMI_SUCCESS) { printf("Failed to shm-snapshot VM\n"); goto error_exit; } /* demonstrate name and id accessors */ list_processes(vmi, current_process, list_head, tasks_offset, current_list_entry, next_list_entry, pid_offset, pid, procname, name_offset); error_exit: if (procname) free(procname); /* destroy the shm-snapshot, and return live mode */ vmi_shm_snapshot_destroy(vmi); /* cleanup any memory associated with the LibVMI instance */ vmi_destroy(vmi); return 0; #else printf("Error : this example should only run after ./configure --enable-shm-snapshot.\n"); return 1; // error #endif }