                              Wine Documentation                               
Prev                       Chapter 2. Debugging Wine                       Next
-------------------------------------------------------------------------------

2.4. Useful memory addresses

Written by Andreas Mohr <amohr@codeweavers.com>

Wine uses several different kinds of memory addresses.

Win32/"normal" Wine addresses/Linux: linear addresses.
   
    Linear addresses can be everything from 0x0 up to 0xffffffff. In Wine on
    Linux they are often around e.g. 0x08000000, 0x00400000 (std. Win32 program
    load address), 0x40000000. Every Win32 process has its own private 4GB
    address space (that is, from 0x0 up to 0xffffffff).
   
Win16 "enhanced mode": segmented addresses.
   
    These are the "normal" Win16 addresses, called SEGPTR. They have a segment:
    offset notation, e.g. 0x01d7:0x0012. The segment part usually is a
    "selector", which *always* has the lowest 3 bits set. Some sample selectors
    are 0x1f7, 0x16f, 0x8f. If these bits are set except for the lowest bit, as
    e.g. with 0x1f6,xi then it might be a handle to global memory. Just set the
    lowest bit to get the selector in these cases. A selector kind of "points"
    to a certain linear (see above) base address. It has more or less three
    important attributes: segment base address, segment limit, segment access
    rights.
   
    Example:
   
    Selector 0x1f7 (0x40320000, 0x0000ffff, r-x) So 0x1f7 has a base address of
    0x40320000, the segment's last address is 0x4032ffff (limit 0xffff), and
    it's readable and executable. So an address of 0x1f7:0x2300 would be the
    linear address of 0x40322300.
   
DOS/Win16 "standard mode"
   
    They, too, have a segment:offset notation. But they are completely
    different from "normal" Win16 addresses, as they just represent at most 1MB
    of memory: The segment part can be anything from 0 to 0xffff, and it's the
    same with the offset part.
   
    Now the strange thing is the calculation that's behind these addresses:
    Just calculate segment*16 + offset in order to get a "linear DOS" address.
    So e.g. 0x0f04:0x3628 results in 0xf040 + 0x3628 = 0x12668. And the highest
    address you can get is 0xfffff (1MB), of course. In Wine, this "linear DOS"
    address of 0x12668 has to be added to the linear base address of the
    corresponding DOS memory allocated for dosmod in order to get the true
    linear address of a DOS seg:offs address. And make sure that you're doing
    this in the correct process with the correct linear address space, of
    course ;-)
   
-------------------------------------------------------------------------------
Prev                                  Home                                 Next
Using the Wine Debugger                Up                         Configuration
