VDD_Set_Sleep_Flag_Addr

Call With

EAX contains the Ring 0 linear address of the display driver's "InSrcBLT flag".

Return Values

No registers are destroyed. Nothing is returned.

Remarks

Many hardware BLTers cannot be interrupted for physical hardware changes while their BLT engine is waiting for data to be fed to it from the host CPU (for example, during a Memory-To-Screen bitblt operation). Because the VDD operates pre-emptively, it may be asked to change the hardware state of the card while the display driver is feeding data to the hardware BLTer. If this is the case on your display hardware, your mini-VDD must register the address of a byte lengthed flag which is referred to as InSrcBLT.

InSrcBLT must be in your display driver's fixed data segment. It should be set to 0 when not performing a memory-to-screen BLT, but should be set to FFh right before the hardware BLTer will become busy waiting for data from the host. It should then be reset to 0 after the hardware BLTer is done receiving data and is again "not busy". Your display driver should pass the address of this flag to the VDD_REGISTER_DISPLAY_DRIVER_INFO function when it first enables. Then the mini-VDD should hook REGISTER_DISPLAY_DRIVER and get the address of InSrcBLT. It should convert this address from a ring 3 Selector:Offset address to a ring 0 linear address using the VMM service Map_Flat. It should then call VDD_Set_Sleep_Flag_Addr with the linear address in EAX. The Main VDD will then check this flag and will disallow other VM's from running when the InSrcBLT flag indicates that the display hardware is busy. In this way, hardware lockups due to the BLTer being unexpectedly interrupted are avoided.