VirtualBox

Ignore:
Timestamp:
Apr 24, 2019 4:03:59 PM (6 years ago)
Author:
vboxsync
Message:

IPRT/nt: Implemented offSub & cbSub in the NT versions of rtR0MemObjNativeMapKernel and rtR0MemObjNativeMapUser. Untested+unused, but seems not to interfer with existing usage. bugref:9217

File:
1 edited

Legend:

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

    r78120 r78278  
    7070    /** Used MmAllocatePagesForMdl(). */
    7171    bool                fAllocatedPagesForMdl;
     72    /** Set if this is sub-section of the parent. */
     73    bool                fSubMapping;
    7274    /** Pointer returned by MmSecureVirtualMemory */
    7375    PVOID               pvSecureMem;
     
    184186        case RTR0MEMOBJTYPE_MAPPING:
    185187        {
    186             Assert(pMemNt->cMdls == 0 && pMemNt->Core.pv);
    187188            PRTR0MEMOBJNT pMemNtParent = (PRTR0MEMOBJNT)pMemNt->Core.uRel.Child.pParent;
    188189            Assert(pMemNtParent);
     190            Assert(pMemNt->Core.pv);
     191            Assert((pMemNt->cMdls == 0 && !pMemNt->fSubMapping) || (pMemNt->cMdls == 1 && pMemNt->fSubMapping));
    189192            if (pMemNtParent->cMdls)
    190193            {
     
    192195                Assert(     pMemNt->Core.u.Mapping.R0Process == NIL_RTR0PROCESS
    193196                       ||   pMemNt->Core.u.Mapping.R0Process == RTR0ProcHandleSelf());
    194                 MmUnmapLockedPages(pMemNt->Core.pv, pMemNtParent->apMdls[0]);
     197                if (!pMemNt->cMdls)
     198                    MmUnmapLockedPages(pMemNt->Core.pv, pMemNtParent->apMdls[0]);
     199                else
     200                {
     201                    MmUnmapLockedPages(pMemNt->Core.pv, pMemNt->apMdls[0]);
     202                    IoFreeMdl(pMemNt->apMdls[0]);
     203                    pMemNt->apMdls[0] = NULL;
     204                }
    195205            }
    196206            else
     
    199209                       &&   !pMemNtParent->Core.u.Phys.fAllocated);
    200210                Assert(pMemNt->Core.u.Mapping.R0Process == NIL_RTR0PROCESS);
     211                Assert(!pMemNt->fSubMapping);
    201212                MmUnmapIoSpace(pMemNt->Core.pv, pMemNt->Core.cb);
    202213            }
     
    701712 */
    702713static int rtR0MemObjNtMap(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, void *pvFixed, size_t uAlignment,
    703                            unsigned fProt, RTR0PROCESS R0Process)
     714                           unsigned fProt, RTR0PROCESS R0Process, size_t offSub, size_t cbSub)
    704715{
    705716    int rc = VERR_MAP_FAILED;
     
    747758        }
    748759
     760        /* Create a partial MDL if this is a sub-range request. */
     761        PMDL pMdl;
     762        if (!offSub && !cbSub)
     763            pMdl = pMemNtToMap->apMdls[0];
     764        else
     765        {
     766            pMdl = IoAllocateMdl(NULL, (ULONG)cbSub, FALSE, FALSE, NULL);
     767            if (pMdl)
     768                IoBuildPartialMdl(pMemNtToMap->apMdls[0], pMdl,
     769                                  (uint8_t *)MmGetMdlVirtualAddress(pMemNtToMap->apMdls[0]) + offSub, (ULONG)cbSub);
     770            else
     771            {
     772                IoFreeMdl(pMdl);
     773                return VERR_NO_MEMORY;
     774            }
     775        }
     776
    749777        __try
    750778        {
     
    753781            void *pv;
    754782            if (g_pfnrtMmMapLockedPagesSpecifyCache)
    755                 pv = g_pfnrtMmMapLockedPagesSpecifyCache(pMemNtToMap->apMdls[0],
     783                pv = g_pfnrtMmMapLockedPagesSpecifyCache(pMdl,
    756784                                                         R0Process == NIL_RTR0PROCESS ? KernelMode : UserMode,
    757785                                                         MmCached,
     
    760788                                                         NormalPagePriority);
    761789            else
    762                 pv = MmMapLockedPages(pMemNtToMap->apMdls[0],
    763                                       R0Process == NIL_RTR0PROCESS ? KernelMode : UserMode);
     790                pv = MmMapLockedPages(pMdl, R0Process == NIL_RTR0PROCESS ? KernelMode : UserMode);
    764791            if (pv)
    765792            {
    766793                NOREF(fProt);
    767794
    768                 PRTR0MEMOBJNT pMemNt = (PRTR0MEMOBJNT)rtR0MemObjNew(sizeof(*pMemNt), RTR0MEMOBJTYPE_MAPPING, pv,
    769                                                                     pMemNtToMap->Core.cb);
     795                PRTR0MEMOBJNT pMemNt = (PRTR0MEMOBJNT)rtR0MemObjNew(  !offSub && !cbSub
     796                                                                    ? sizeof(*pMemNt) : RT_UOFFSETOF_DYN(RTR0MEMOBJNT, apMdls[1]),
     797                                                                    RTR0MEMOBJTYPE_MAPPING, pv, pMemNtToMap->Core.cb);
    770798                if (pMemNt)
    771799                {
    772800                    pMemNt->Core.u.Mapping.R0Process = R0Process;
     801                    if (!offSub && !cbSub)
     802                        pMemNt->fSubMapping = false;
     803                    else
     804                    {
     805                        pMemNt->apMdls[0]   = pMdl;
     806                        pMemNt->cMdls       = 1;
     807                        pMemNt->fSubMapping = true;
     808                    }
     809
    773810                    *ppMem = &pMemNt->Core;
    774811                    return VINF_SUCCESS;
     
    776813
    777814                rc = VERR_NO_MEMORY;
    778                 MmUnmapLockedPages(pv, pMemNtToMap->apMdls[0]);
     815                MmUnmapLockedPages(pv, pMdl);
    779816            }
    780817        }
     
    799836        if (R0Process != NIL_RTR0PROCESS)
    800837            return VERR_NOT_SUPPORTED;
     838
     839        /* Cannot sub-mak these (yet). */
     840        AssertMsgReturn(!offSub && !cbSub, ("%#zx %#zx\n", offSub, cbSub), VERR_NOT_SUPPORTED);
     841
    801842
    802843        /** @todo uAlignment */
     
    830871                                          unsigned fProt, size_t offSub, size_t cbSub)
    831872{
    832     AssertMsgReturn(!offSub && !cbSub, ("%#x %#x\n", offSub, cbSub), VERR_NOT_SUPPORTED);
    833     return rtR0MemObjNtMap(ppMem, pMemToMap, pvFixed, uAlignment, fProt, NIL_RTR0PROCESS);
     873    return rtR0MemObjNtMap(ppMem, pMemToMap, pvFixed, uAlignment, fProt, NIL_RTR0PROCESS, offSub, cbSub);
    834874}
    835875
     
    839879{
    840880    AssertReturn(R0Process == RTR0ProcHandleSelf(), VERR_NOT_SUPPORTED);
    841     AssertMsgReturn(!offSub && !cbSub, ("%#zx %#zx\n", offSub, cbSub), VERR_NOT_SUPPORTED); /** @todo implement sub maps */
    842     return rtR0MemObjNtMap(ppMem, pMemToMap, (void *)R3PtrFixed, uAlignment, fProt, R0Process);
     881    return rtR0MemObjNtMap(ppMem, pMemToMap, (void *)R3PtrFixed, uAlignment, fProt, R0Process, offSub, cbSub);
    843882}
    844883
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