Drakvuf uses vmi_swap_events to replace old event (Breakpoint guard RW) to new event with according rights (_mem_event.inaccess).
Then, it deletes the old event using vmi_clear_event.
I think the problem is the current implementation of _vmi_clearevent, it calls _clear_memevent who resets page access rights and removes the page from vmi->mem_events.
So, both events are removed (from _vmi->memevents) and the page right is reset however the breakpoint will still trigger thanks to the interrupt.
When you register a BREAKPOINT then a MEMACCESS on the same page, the MEMACCESS event won't work.
POC :
Drakvuf uses vmi_swap_events to replace old event (Breakpoint guard RW) to new event with according rights (_mem_event.inaccess). Then, it deletes the old event using vmi_clear_event.
I think the problem is the current implementation of _vmi_clearevent, it calls _clear_memevent who resets page access rights and removes the page from vmi->mem_events.
So, both events are removed (from _vmi->memevents) and the page right is reset however the breakpoint will still trigger thanks to the interrupt.