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.
_XchgFreePhysReg
                                                     Up Next Previous
────────────────────────────────────────────────────────────────────────────
 
include vmm.inc
 
VMMcall _XchgFreePhysReg, <LinPgNum, PhysAddr, flags>
 
cmp     eax, 0FFFFFFFFh         ; 0FFFFFFFFh if error
je      not_exchanged
mov     [PageTable], eax        ; previous page table entry
 
The _XchgFreePhysReg service replaces the current physical address in a page
table entry with a new physical address. A virtual device typically uses
this service to compact a free physical region by assigning pages that are
present to adjacent linear addresses (that is, by removing not-present pages
from between present pages).
 
This is an asynchronous service.
 
Parameter  Description
────────────────────────────────────────────────────────────────────────────
 
LinPgNum   Specifies the linear page number of the first page in the region
           to exchange. A linear page number is a linear address shifted
           right by 12 bits. The specified page must be within a free
           physical region previously allocated using the _PageAllocate
           service.
 
PhysAddr   Specifies the physical address to insert into the page table
           entry specified by LinPgNum. This parameter must be a 32-bit
           physical address. If this parameter is zero, the service makes
           the page not present.
 
flags      Specifies the operation flags. This parameter must be set to 0.
 
Return Value
 
The EAX register contains the previous physical address for the specified
page if the service is successful. If the specified page is not present, EAX
contains zero. Otherwise, EAX contains 0FFFFFFFFh to indicate an error, such
as an invalid linear page number.
 
Comments
 
A virtual device typically makes a series of calls to _XchgFreePhysReg,
using the physical address return by one call as the parameter in the next
call. To start the series, the virtual device sets the PhysAddr parameter to
zero, and specifies a page known to be present. This forces the present page
to be not present. The virtual device continues calling the service,
specifying different page numbers, until the service returns 0.
 
This service cannot be used to change the number of pages which were mapped
using the PageFixed value with the _MapFreePhysReg service.
 
The virtual pageswap device uses this service to read ahead and write behind
without having to copy data. Using the _XchgFreePhysReg service in this way
is restricted to the virtual pageswap device.
 
Failure to use this service properly can result in invalid page faults and
loss of pages.
 
Uses
 
EAX
 
See Also
 
_MapFreePhysReg, _PageAllocate