include vmm.inc mov esi, CritSecCallback ; points to callback procedure mov edx, RefData ; points to data to pass to callback VMMcall Call_When_Not_Critical |
The Call_When_Not_Critical service installs a critical-section callback procedure. The system calls this procedure whenever a virtual device releases the critical section.
CritSecCallback
Points to the callback procedure to install. For more information about the callback procedure, see the following “Comments” section.
RefData
Points to reference data to pass to the callback procedure.
This service has no return value.
The system does not execute the callback until the current virtual machine's execution priority is less than the Critical_Section_Boost value even if the current virtual machine is not in a critical section. This allows a virtual device to release the critical section, and process any simulated interrupts before the system calls the callback procedure.
Virtual devices can install any number of callback procedures, but the system calls only the most recent procedure on the list when the critical section is released. The system removes the callback procedure from the list as it calls the procedure.
The system calls the callback procedure as follows:
mov ebx, VM ; current VM handle
mov edx, OFFSET32 RefData ; points to reference data
mov ebp, OFFSET32 crs ; points to a Client_Reg_Struc structure
call [CritSecCallback]
The VM parameter specifies a handle identifying the current virtual machine, the RefData parameter points to reference data from the virtual device that installed the callback, and the csr parameter points to a Client_Reg_Struc structure containing the registers of the current virtual machine.
The callback procedure can carry out any operation and can modify the EAX, EBX, ECX, EDX, ESI, EDI, and Flags registers.
It is more convenient to use the Call_Priority_VM_Event service than to call this service directly.
Flags