1. typedef struct _REPROTECT_CONTEXT
  2. {
  3. PMDL   Mdl;
  4. PUCHAR LockedVa;
  5. } REPROTECT_CONTEXT, * PREPROTECT_CONTEXT;
  6. NTSTATUS
  7. MmLockVaForWrite(
  8. __in PVOID Va,
  9. __in ULONG Length,
  10. __out PREPROTECT_CONTEXT ReprotectContext
  11. )
  12. {
  13. NTSTATUS Status;
  14. Status = STATUS_SUCCESS;
  15. ReprotectContext->Mdl      = 0;
  16. ReprotectContext->LockedVa = 0;
  17. ReprotectContext->Mdl = IoAllocateMdl(
  18. Va,
  19. Length,
  20. FALSE,
  21. FALSE,
  22. 0
  23. );
  24. if (!ReprotectContext->Mdl)
  25. {
  26. return STATUS_INSUFFICIENT_RESOURCES;
  27. }
  28. //
  29. // Retrieve a locked VA mapping.
  30. //
  31. __try
  32. {
  33. MmProbeAndLockPages(
  34. ReprotectContext->Mdl,
  35. KernelMode,
  36. IoModifyAccess
  37. );
  38. }
  39. __except (EXCEPTION_EXECUTE_HANDLER)
  40. {
  41. return GetExceptionCode();
  42. }
  43. ReprotectContext->LockedVa = (PUCHAR)MmMapLockedPagesSpecifyCache(
  44. ReprotectContext->Mdl,
  45. KernelMode,
  46. MmCached,
  47. 0,
  48. FALSE,
  49. NormalPagePriority
  50. );
  51. if (!ReprotectContext->LockedVa)
  52. {
  53. IoFreeMdl(
  54. ReprotectContext->Mdl
  55. );
  56. ReprotectContext->Mdl = 0;
  57. return STATUS_ACCESS_VIOLATION;
  58. }
  59. //
  60. // Reprotect.
  61. //
  62. Status = MmProtectMdlSystemAddress(
  63. ReprotectContext->Mdl,
  64. PAGE_EXECUTE_READWRITE
  65. );
  66. if (!NT_SUCCESS(Status))
  67. {
  68. MmUnmapLockedPages(
  69. ReprotectContext->LockedVa,
  70. ReprotectContext->Mdl
  71. );
  72. MmUnlockPages(
  73. ReprotectContext->Mdl
  74. );
  75. IoFreeMdl(
  76. ReprotectContext->Mdl
  77. );
  78. ReprotectContext->LockedVa = 0;
  79. ReprotectContext->Mdl      = 0;
  80. }
  81. return Status;
  82. }
  83. NTSTATUS
  84. MmUnlockVaForWrite(
  85. __in PREPROTECT_CONTEXT ReprotectContext
  86. )
  87. {
  88. if (ReprotectContext->LockedVa)
  89. {
  90. MmUnmapLockedPages(
  91. ReprotectContext->LockedVa,
  92. ReprotectContext->Mdl
  93. );
  94. MmUnlockPages(
  95. ReprotectContext->Mdl
  96. );
  97. IoFreeMdl(
  98. ReprotectContext->Mdl
  99. );
  100. ReprotectContext->LockedVa = 0;
  101. ReprotectContext->Mdl      = 0;
  102. }
  103. return STATUS_SUCCESS;
  104. }

标准MDL方法修改Page、NonPage内存的属性的更多相关文章

  1. Linux内存描述之内存页面page–Linux内存管理(四)

    服务器体系与共享存储器架构 日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDriver ...

  2. [置顶] IOS7状态栏StatusBar官方标准适配方法

    IOS7状态栏StatusBar官方标准适配方法 hello,大家好,ios7正式版已经发布,相信大家都在以各种方式来适配ios7. 如果你已经下载了xcode5,正准备使用,你会发现各种布局的改变. ...

  3. 修改linux共享内存大小

    这是实际linux系统显示的实际数据: beijibing@bjb-desktop:/proc/sys/kernel$ cat shmmax  33554432 beijibing@bjb-deskt ...

  4. ObjC如何通过runtime修改Ivar的内存管理方式

    ObjC如何通过runtime修改Ivar的内存管理方式 为什么要这么做? 在iOS 9之前,UITableView(或者更确切的说是 UIScrollView)有一个众所周知的问题: propert ...

  5. ORACLE_修改实例的内存大小

    注:本文来源于:星火spark  <Oracle的实例占用内存调整> ORACLE_修改实例的内存大小 一:修改oracle数据库实例内存大小脚本 ---- 1.操作 (oracle使用内 ...

  6. Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, ...

  7. IOS7状态栏StatusBar官方标准适配方法

    IOS7状态栏StatusBar官方标准适配方法 hello,大家好,ios7正式版已经发布,相信大家都在以各种方式来适配ios7. 如果你已经下载了xcode5,正准备使用,你会发现各种布局的改变. ...

  8. Virtualbox修改虚拟机分配内存的大小

    起因:因为虚拟机刚开始分配的内存太小,导致太卡, 解决方法:修改虚拟机分配内存的大小 方法一:必须在关闭ubuntu的前提下进行,否则无法修改 点击设置 系统选项 主板中的内存大小 之后开启即可 方法 ...

  9. JVM存储位置分配——java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配

    Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”. 根据“Java ...

随机推荐

  1. mybatis xml 大于 小于

    当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序 ...

  2. poj1155

    题意:给定一个树形图,节点数量3000.叶子节点是用户,每个用户如果能看上电视会交一定的电视费.看上电视的条件是从根到该用户的路径全部被修好,修每条边有一个费用.在不亏损(用户交钱总额>=修路总 ...

  3. 数据结构——B树、B+树

    B树和B+树主要应用于外排序,对于外排序,从硬盘读取的时间要远远大于遍历树的时间,因此要想办法减少从硬盘读取的时间. B树(有时也叫B-树) M阶B树定义如下: 是一种多路搜索树(并不是二叉的):1. ...

  4. drupal记录(一)

    翻译包下载网址:locallize.drupal.org 中文模块 local 自动下载模块 L10n_update 第三方menu菜单 admin menu,menu bar 打开这个后要关闭系统自 ...

  5. 【leetcode】First Missing Positive(hard) ☆

    Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0]  ...

  6. Debian下查看系统版本信息命令汇总

    Debian下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等等,整个CPU信息一目了然. 1.odoo@debian64:~$ uname -a(Debian查看版本当前操 ...

  7. Yahoo!网站性能最佳体验的34条黄金守则(转载)

    1.       尽量减少HTTP请求次数  终端用户响应的时间中,有80%用于下载各项内容.这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通过减少页面中的元素可以减少HTTP请求的次数 ...

  8. bnu24252 海盗分赃

    题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=24252 这是四川2012年省赛的一道题,背景:海盗分宝藏.大概题意:给你N种价值的物品,物品有两 ...

  9. JS 获取浏览器窗口大小

    JS 获取浏览器窗口大小 <script> // 获取窗口宽度 if (windows.innerWidth) { winWidth = windows.innerWidth; } els ...

  10. 16.迭代器模式(Iterator Pattern)

    using System; namespace ConsoleApplication9 { class Program { /// <summary> /// 迭代器模式提供了一种方法顺序 ...