Virtual Devices (3.1) (vdag31qh.hlp) (
Table of Contents;
Topic list)
Important Notice
The pages on this site contain documentation for very old MS-DOS software,
purely for historical purposes.
If you're looking for up-to-date documentation, particularly for programming,
you should not rely on the information found here, as it will be woefully
out of date.
Install_V86_Break_Point
◄Up► ◄Next► ◄Previous►
────────────────────────────────────────────────────────────────────────────
include vmm.inc
mov eax, BreakAddr ; break point address
mov edx, OFFSET32 RefData ; points to reference data
mov esi, OFFSET32 Callback ; points to callback procedure to install
VMMcall Install_V86_Break_Point
jc not_installed
The Install_V86_Break_Point service inserts a break point in V86 memory of
the current virtual machine and installs a break-point callback procedure to
receive control when the break point occurs. A virtual device, such as the
virtual MS-DOS manager, can use this service to place patches in the BIOS.
Parameter Description
────────────────────────────────────────────────────────────────────────────
BreakAddr Specifies the V86 address to place the break point. The address
must be specified as a segment:offset pair and must specify RAM.
Once installed, the break point must not be moved.
RefData Points to reference data to be passed to the callback procedure.
Callback Points to the callback procedure to install. See the Comments
section for more information about this procedure.
Return Value
The carry flag is clear if the service is successful. Otherwise, the carry
flag is set to indicate an error.
Comments
Virtual devices typically place V86 break points in global virtual device
memory during device initialization. For example, the XMS driver in the
virtual V86MMGR device inserts a breakpoint in the real-mode XMS driver
during device initialization. Thereafter, all calls to the real-mode XMS
driver are intercepted by the virtual XMS driver.
The segment address specified when installing a V86 break point must be the
segment address in the CS register when the virtual machine executes the
break point. For example, if the break point is placed at 0100:0000 but the
virtual machine executes the break point at the address 00FF:0010h, an error
occurs even though the virtual machine executed a valid break point.
When the virtual machine executes the break point, the system calls the
callback procedure as follows:
mov eax, BreakAddr ; address of breakpoint
mov ebx, VM ; current VM handle
mov edx, OFFSET32 RefData ; points to reference data
mov esi, BreakLinAddr ; linear address of break point
mov ebp, OFFSET32 crs ; points to a Client_Reg_Struc
The BreakAddr parameter is the V86 address of the break point. VM is a
handle identifying the current virtual machine and RefData points to the
reference data specified when the callback procedure was installed. The
BreakLinAddr parameter specified the linear address of the break point and
crs points to a Client_Reg_Struc structure containing the register values
for the specified virtual machine.
The Client_CS and Client_IP registers contain the address of the break
point. The virtual device must change these registers to prevent the break
point from being executed again when the virtual machine resumes. A virtual
device can change the register by simulating the instruction that was
patched, incrementing the Client_IP register past the patch, jumping to
another address using the Simulate_Far_Jmp service, or returning from an
interrupt handler using the Simulate_Iret service.
When the virtual device receives the System_Exit message, it must remove any
break point that it placed in global V86 code, that is, code loaded before
Windows was loaded. The virtual device can remove a V86 break point using
the Remove_V86_Break_Point service.
Uses
Flags
See Also
Remove_V86_Break_Point
♦