Changeset 21644 in vbox for trunk/src/VBox/Additions/WINNT
- Timestamp:
- Jul 16, 2009 11:54:31 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 50176
- Location:
- trunk/src/VBox/Additions/WINNT/VBoxGuest
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuest.cpp
r21508 r21644 1740 1740 } 1741 1741 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 } 1742 1771 return; 1743 1772 } … … 1750 1779 VOID unreserveHypervisorMemory(PVBOXGUESTDEVEXT pDevExt) 1751 1780 { 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 1752 1807 VMMDevReqHypervisorInfo *req = NULL; 1753 1808 -
trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuest_Internal.h
r21227 r21644 53 53 54 54 #include <iprt/spinlock.h> 55 #include <iprt/memobj.h> 55 56 56 57 #include <VBox/VMMDev.h> … … 181 182 ULONG hypervisorMappingSize; 182 183 184 /* Patch memory object. */ 185 RTR0MEMOBJ PatchMemObj; 186 183 187 /* Physical address and length of VMMDev memory */ 184 188 PHYSICAL_ADDRESS memoryAddress;
Note:
See TracChangeset
for help on using the changeset viewer.