Map_Flat


include vmm.inc

mov     ah, SegOffset    ; client register containing the segment
mov     al, OffOffset    ; client register containing the offset
VMMcall Map_Flat

cmp     eax, -1         ; -1 if error
je      error
mov     [LinAddr], eax  ; ring-0 linear address

Converts the address contained in the specified client registers to a linear address. The given address is either a selector:offset or segment:offset address, depending on the execution mode of the current virtual machine. Uses EAX, Flags.

SegOffset

Offset of the client register containing the segment address or selector.

OffOffset

Offset of the client register containing the offset address. Can be – 1, in which case the offset address is zero.

The SegOffset and OffOffset parameters specify offsets, in bytes, relative to the beginning of the Client_Reg_Struc structure for the current virtual machine.

Before converting an address, Map_Flat checks the current execution mode and, for protected-mode applications, the bitness of the DPMI client. If the virtual machine is running a 32-bit protected mode application, it uses 32-bit address offsets. For V86 and 16-bit protected-mode applications, it uses 16-bit address offsets and ignores the high word if the OffOffset parameter specifies a 32-bit register.

The following example converts the address Client_DS:Client_DX and returns the linear address in EAX:


mov     ax, (Client_DS SHL 8) + Client_DX
VMMcall Map_Flat

It is typically more convenient to use the Client_Ptr_Flat macro instead.

See also Client_Ptr_Flat