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

//用于在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\n");
        return NULL;
    }

    __try
    {
        MmProbeAndLockPages(pMdl,UserMode,IoReadAccess);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        dprintf("MmProbeAndLockPages exception. Code  = 0x%08X\n",GetExceptionCode());
        IoFreeMdl(pMdl);
        return NULL;
    }

    pMapedAddr = MmMapLockedPagesSpecifyCache(pMdl,KernelMode,MmCached,NULL,FALSE,NormalPagePriority);
    if (!pMapedAddr)
    {
        dprintf("pMapedAdd == NULL\n");
        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);
    }

}
时间: 2024-11-05 06:30:42

记两个用于修改用户态内存的函数的相关文章

mysqladmin命令用于修改用户密码

                   mysqladmin命令用于修改用户密码. mysqladmin命令格式:mysqladmin -u 用户名 -p 旧密码 password 新密码 1) 给root加个密码ab12首先在DOS下进入目录mysql\bin,然后键入以下命令:    mysqladmin -u root -password ab12注:因为开始时root没有密码,所以-p 旧密码一项就可以省略了. 2) 再将root的密码改为djg345    mysqladmin -u r

修改进程占用内存SetProcessWorkingSetSize函数(多篇相关文章值得学习)

物理内存和虚拟内存 物理内存,在应用中,自然是顾名思义,物理上,真实的插在板子上的内存是多大就是多大了.看机器配置的时候,看的就是这个物理内存. 如果执行的程序很大或很多,就会导致物理内存消耗殆尽.为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张. 一个程序,不可避免地要用到虚拟内存,因为不频繁执行或者已经很久没有执行的代码,没有必要留在物理内存中,只会造成浪费;放在虚拟内存中,等执行这部分

多线程之:用户态和内核态的区别

一:大话版用户态和内核态 (1)用户态和内核态的概念? --->内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序--->用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 (2)为什么需要用户态和内核态? --->由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 :用

linux 用户态 内核态

http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例子 C代码 1.     void testfork(){   2.     if(0 = = fork()){   3.     printf(“create new process suc

用户态和内核态的区别(转)

内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序. 用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取. 为什么要有用户态和内核态? 由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态和内核态. 用户态与内核态的切换 所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些

内核态(Kernel Mode)与用户态(User Mode)

内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序 用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 为什么要有用户态和内核态 由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态 和 内核态 用户态与内核态的切换 所有用户程序都是运行在用户态的, 但是有时候程序确

Linux-内核态与用户态

内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序 用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 为什么要有用户态和内核态 由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态 和 内核态 用户态与内核态的切换 所有用户程序都是运行在用户态的, 但是有时候程序确

cpu与寄存器,内核态与用户态及如何切换

cpu:相当于计算机的大脑负责运算和发送命令: 寄存器:寄存器是cpu当中的一个有限存储部件,cpu从内存调用数据时,寄存器会将从内存调用的数据进行更新在寄存器中以一个字或变量进行存储. 寄存器总共分为四种: 1.通用寄存器:用来保存变量与临时结果 2.程序寄存器:保存了将要取下的一条指令的内存地址 3.堆栈指针:它指向内存当前栈的顶端.该栈包含已经进入但是还没有退出的每个过程中的一个框架.在一个过程的堆栈框架中保存了有关输入参数,局部变量以及那写没有及时保存在寄存器中的临时变量. 4.程序状态

用户态内核态

Q:怎么从用户态切换到内核态 A:用户程序调用系统调用的时候,用户程序先将系统调用号放入eax,执行int0x80指令触发中断,中断发生时,cpu切入内核态,从 用户栈 切换到 内核栈 ,在 内核栈 中依次压入用户态的寄存器,也就是保护现场,根据中断号在中断向量表中查找对应的中断处理程序,并调用它. 中断 中断:操作系统是通过中断来从用户态切换到内核态 中断分两种: 硬件中断:电源掉电,键盘被按下 软件中断:i386下是 int 指令 linux上系统调用的中断号是0x80,而windows上是