VirtualBox

Changeset 21644 in vbox for trunk/src/VBox/Additions/WINNT


Ignore:
Timestamp:
Jul 16, 2009 11:54:31 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
50176
Message:

Register guest allocated memory (locked & executable) for patching purposes.

Location:
trunk/src/VBox/Additions/WINNT/VBoxGuest
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuest.cpp

    r21508 r21644  
    17401740    }
    17411741
     1742    /* Allocate locked executable memory that can be used for patching guest code. */
     1743    {
     1744        VMMDevReqPatchMemory *req = NULL;
     1745        int rc = VbglGRAlloc ((VMMDevRequestHeader **)&req, sizeof (VMMDevReqPatchMemory), VMMDevReq_SetPatchMemory);
     1746        if (RT_SUCCESS(rc))
     1747        {
     1748            req->cbPatchMem = VMMDEV_GUEST_DEFAULT_PATCHMEM_SIZE;
     1749
     1750            rc = RTR0MemObjAllocPage(&pDevExt->PatchMemObj, req->cbPatchMem, true /* executable. */);
     1751            if (RT_SUCCESS(rc))
     1752            {
     1753                req->pPatchMem = (RTGCPTR)RTR0MemObjAddress(pDevExt->PatchMemObj);
     1754
     1755                rc = VbglGRPerform (&req->header);
     1756                if (RT_FAILURE(rc) || RT_FAILURE(req->header.rc))
     1757                {
     1758                    dprintf(("VBoxGuest::reserveHypervisorMemory: VMMDevReq_SetPatchMemory error!"
     1759                                "rc = %d, VMMDev rc = %Rrc\n", rc, req->header.rc));
     1760                    RTR0MemObjFree(pDevExt->PatchMemObj, true);
     1761                    pDevExt->PatchMemObj = NULL;
     1762                }
     1763            }
     1764            else
     1765            {
     1766                dprintf(("VBoxGuest::reserveHypervisorMemory: RTR0MemObjAllocPage failed with rc %d\n", rc));
     1767            }
     1768            VbglGRFree (&req->header);
     1769        }
     1770    }
    17421771    return;
    17431772}
     
    17501779VOID unreserveHypervisorMemory(PVBOXGUESTDEVEXT pDevExt)
    17511780{
     1781    /* Remove the locked executable memory range that can be used for patching guest code. */
     1782    if (pDevExt->PatchMemObj)
     1783    {
     1784        VMMDevReqPatchMemory *req = NULL;
     1785        int rc = VbglGRAlloc ((VMMDevRequestHeader **)&req, sizeof (VMMDevReqPatchMemory), VMMDevReq_ClearPatchMemory);
     1786        if (RT_SUCCESS(rc))
     1787        {
     1788            req->cbPatchMem = (uint32_t)RTR0MemObjSize(pDevExt->PatchMemObj);
     1789            req->pPatchMem  = (RTGCPTR)RTR0MemObjAddress(pDevExt->PatchMemObj);
     1790
     1791            rc = VbglGRPerform (&req->header);
     1792            if (RT_FAILURE(rc) || RT_FAILURE(req->header.rc))
     1793            {
     1794                dprintf(("VBoxGuest::reserveHypervisorMemory: VMMDevReq_ClearPatchMemory error!"
     1795                            "rc = %d, VMMDev rc = %Rrc\n", rc, req->header.rc));
     1796                /* We intentially leak the memory object here as there still could
     1797                 * be references to it!!!
     1798                 */
     1799            }
     1800            else
     1801            {
     1802                RTR0MemObjFree(pDevExt->PatchMemObj, true);
     1803            }
     1804        }
     1805    }
     1806
    17521807    VMMDevReqHypervisorInfo *req = NULL;
    17531808
  • trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuest_Internal.h

    r21227 r21644  
    5353
    5454#include <iprt/spinlock.h>
     55#include <iprt/memobj.h>
    5556
    5657#include <VBox/VMMDev.h>
     
    181182    ULONG hypervisorMappingSize;
    182183
     184    /* Patch memory object. */
     185    RTR0MEMOBJ PatchMemObj;
     186
    183187    /* Physical address and length of VMMDev memory */
    184188    PHYSICAL_ADDRESS memoryAddress;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette