Services whose names are of the form Cancel_XX_Event must be used only to cancel events scheduled by the corresponding Schedule_XX_Event or Call_XX_Event service. It is an error to pass (for example) a thread event handle to Cancel_VM_Event.
Services which cancel events also allow zero to be passed as the event handle, which is simply ignored. The standard paradigm for scheduling, processing, and cancelling events is as follows:
Scheduling the event:
mov esi, OFFSET32 MyEvent VMMcall Schedule_Global_Event mov hMyEvent, esi ; Save handle for cancellation
Processing the event:
BeginProc MyEvent mov hMyEvent, 0 ; VERY FIRST THING is ; to zero out the handle ; . ; . Do other event stuff ; . ret ; Finished with the event EndProc MyEvent
Cancelling the event:
xor esi, esi ; Atomically set hMyEvent to 0 xchg hMyEvent, esi ; and retrieve previous value VMMcall Cancel_Global_Event ; Cancel if still outstanding