• 记两个用于修改用户态内存的函数


    //用于在LoadImageRoutine中使用,修改用户态内存
    PMDL MapUserModeAddrWritable(PVOID BaseAddr,ULONG Length, PVOID *pNewAddr);
    VOID UnmapMemory(PVOID pAddr, PMDL pMdl);
    
    PMDL MapUserModeAddrWritable(PVOID BaseAddr,ULONG Length, PVOID *pNewAddr)
    {
        PVOID pMapedAddr = NULL ;
        //创建一个MDL
        PMDL pMdl = IoAllocateMdl(BaseAddr,Length,FALSE,FALSE,NULL);
        if (pMdl == NULL)
        {
            dprintf("pMDL == NULL
    ");
            return NULL;
        }
        
        __try
        {
            MmProbeAndLockPages(pMdl,UserMode,IoReadAccess);
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            dprintf("MmProbeAndLockPages exception. Code  = 0x%08X
    ",GetExceptionCode());
            IoFreeMdl(pMdl);
            return NULL;
        }
        
        
        pMapedAddr = MmMapLockedPagesSpecifyCache(pMdl,KernelMode,MmCached,NULL,FALSE,NormalPagePriority);
        if (!pMapedAddr)
        {
            dprintf("pMapedAdd == NULL
    ");
            MmUnlockPages(pMdl);
            IoFreeMdl(pMdl);
            return NULL;
        }
        
        *pNewAddr = pMapedAddr ;
        return pMdl;
        
    }
    
    VOID UnmapMemory(PVOID pAddr, PMDL pMdl)
    {
        if (pAddr != NULL)
        {
            MmUnmapLockedPages(pAddr,pMdl);
        }
        
        if (pMdl != NULL)
        {
            MmUnlockPages(pMdl);
            IoFreeMdl(pMdl);
        }
        
    }
  • 相关阅读:
    第六章学习小结
    malloc iOS
    iOS事件传递机制
    对 runloop 的理解
    深恶痛绝重写setter和getter
    数据库常见问题总结
    iOS多应用自动打包
    一段文字中包含多种语言时行间距问题
    一个成熟应用的排版方案
    Flask纪要
  • 原文地址:https://www.cnblogs.com/achillis/p/5256573.html
Copyright © 2020-2023  润新知