Geoff Chappell - Software Analyst
This function provides access to the Virtual DOS Application (VDA) interface for creating and managing virtual machines in Windows/386. It is known only in versions 2.03, 2.10 and 2.11. The means of access in version 2.01 is int 2Fh function 1600h.
The implementation is in the Virtual DOS Machine Manager (VDMM), loaded from WIN386.386 (distributed as *.386). It executes in protected mode as a virtual-8086 monitor and exposes the interrupt to virtual-8086 callers only.
The function uses registers for both input and output. Segment registers are for real-mode addressing only.
ax | 1601h |
bx | bl is interrupt number for mouse, else bx is FFFFh |
es:di | return address for VDA calls |
The input for bx is conveniently what the MouseGetIntVect function, as exported from MOUSE.DRV, returns in ax.
The input for es:di is given in anticipation of getting back an address in es:di. Executing at the output address will appear to the virtual-8086 caller like a jmp to the input address, after a transition to and from the 32-bit system in ring 0. The simplest use is to execute the output address by a far call which is then balanced by a far ret at the input address. Symbol tables in the various WIN386.386 binaries name the output address as VDA_Call_Adrs, VDA presumably standing for Virtual DOS Application.
al | FFh |
es:di | address of entry point for VDA calls |
The entry point takes input in ax. The high byte selects a system component—what would in later Windows versions be either the Virtual Machine Manager (VMM) or a separate Virtual Device Driver (VxD)—and the low byte is then a function number. Interpretation of other registers depends on the component and function numbers. The very many valid combinations are presented separately, as the Windows/386 VDA Interface.
The function fails, in the sense of leaving registers unchanged, unless called from the System VM.