status_t register_mem_event(vmi_instance_t vmi, vmi_event_t *event)
{
    if ( event->mem_event.generic )
        return register_mem_event_generic(vmi, event);
    else
        return register_mem_event_on_gfn(vmi, event);
}
static status_t register_mem_event_generic(vmi_instance_t vmi, vmi_event_t *event)
{
    if ( event->mem_event.gfn != ~0ULL ) {
        dbprint(VMI_DEBUG_EVENTS, "GFN must be ~0 for generic mem event types.\n");
        return VMI_FAILURE;
    }
 
    if ( g_hash_table_size(vmi->mem_events_on_gfn) ) {
        dbprint(VMI_DEBUG_EVENTS, "You already have page specific mem event handlers registered.\n");
        return VMI_FAILURE;
    }
 
    if ( g_hash_table_lookup(vmi->mem_events_generic, &event->mem_event.in_access) ) {
        dbprint(VMI_DEBUG_EVENTS, "An event is already registered for this tpye of access violation\n");
        return VMI_FAILURE;
    }
 
    gint *access = g_slice_new(gint);
    *access = event->mem_event.in_access;
 
    g_hash_table_insert_compat(vmi->mem_events_generic, access, event);
    return VMI_SUCCESS;
}

🌱 Back to Garden