VirtualBox

Changeset 4725 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
Sep 12, 2007 10:12:31 AM (17 years ago)
Author:
vboxsync
Message:

Use MmSecureVirtualMemory to have some limited protection with usermode allocations

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r0drv/nt/memobj-r0drv-nt.cpp

    r4671 r4725  
    6161    bool                fAllocatedPagesForMdl;
    6262#endif
     63    /** Pointer returned by MmSecureVirtualMemory */
     64    PVOID               pvSecureMem;
    6365    /** The number of PMDLs (memory descriptor lists) in the array. */
    6466    uint32_t            cMdls;
     
    8486                MmUnmapLockedPages(pMemNt->Core.pv, pMemNt->apMdls[0]);
    8587                pMemNt->Core.pv = NULL;
     88                if (pMemNt->pvSecureMem)
     89                {
     90                    MmUnsecureVirtualMemory(pMemNt->pvSecureMem);
     91                    pMemNt->pvSecureMem = NULL;
     92                }
    8693
    8794                MmFreePagesFromMdl(pMemNt->apMdls[0]);
     
    133140
    134141        case RTR0MEMOBJTYPE_LOCK:
     142            if (pMemNt->pvSecureMem)
     143            {
     144                MmUnsecureVirtualMemory(pMemNt->pvSecureMem);
     145                pMemNt->pvSecureMem = NULL;
     146            }
    135147            for (uint32_t i = 0; i < pMemNt->cMdls; i++)
    136148            {
     
    523535        {
    524536            MmProbeAndLockPages(pMdl, R0Process == NIL_RTR0PROCESS ? KernelMode : UserMode, IoModifyAccess);
     537
    525538            pMemNt->apMdls[iMdl] = pMdl;
    526539            pMemNt->cMdls++;
     
    531544            rc = VERR_LOCK_FAILED;
    532545            break;
     546        }
     547
     548        if (R0Process != NIL_RTR0PROCESS )
     549        {
     550            /* Make sure the user process can't change the allocation. */
     551            pMemNt->pvSecureMem = MmSecureVirtualMemory(pv, cb, PAGE_READWRITE);
     552            if (!pMemNt->pvSecureMem)
     553            {
     554                rc = VERR_NO_MEMORY;
     555                break;
     556            }
    533557        }
    534558
     
    554578        pMemNt->apMdls[iMdl] = NULL;
    555579    }
     580    if (pMemNt->pvSecureMem)
     581    {
     582        MmUnsecureVirtualMemory(pMemNt->pvSecureMem);
     583        pMemNt->pvSecureMem = NULL;
     584    }
     585
    556586    rtR0MemObjDelete(&pMemNt->Core);
    557     return VERR_LOCK_FAILED;
     587    return rc;
    558588}
    559589
     
    661691            rc = VERR_MAP_FAILED;
    662692        }
     693
    663694    }
    664695    else
Note: See TracChangeset for help on using the changeset viewer.

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