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. bccomp比较大小注意

    2015年12月15日 14:18:56 星期二 echo bccomp('1', '1.01', 2); // -1 echo bccomp('1', '1.01', 3); // -1 echo ...

  2. 14. javacript高级程序设计-表单

    1. 表单脚本 1.1 基础知识 <from>元素表示表单: l acceptCharset:服务器能处理的字符集 l action:接受请求的URL l elements:表单中所有控件 ...

  3. 调试WebService

    1.运行WebService的调用程序 2.浏览器中运行asmx,这一步是为了让w3wp.exe出现在下一步的列表中 3.“工具”或“调试”菜单-->附加到进程 (MS为什么把同一功能放在不同的 ...

  4. Effective C++ -----条款29:为“异常安全”而努力是值得的

    异常安全函数(Exception-safe functions)即使发生异常也不会泄露资源或允许任何数据结构败坏.这样的函数区分为三种可能的保证:基本型.强烈型.不抛异常型. “强烈保证”往往能够以c ...

  5. 加载ComboBox控件

    /// <summary> /// 加载公司 /// </summary> /// <param name="cbbCompany">Combo ...

  6. mysql探究之null与not null

    相信很多用了mysql很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问: 1.我字段类型是not null,为什么我可以插入空值 2.为毛not null的效率比null高 3.判断字段 ...

  7. 根据OSG中的ref_ptr和Reference简化的智能指针

    main.cpp测试代码 #include "TestSmartPointer" void fun() { SP<TestSmartPointer> sp1=new T ...

  8. October 13th 2016 Week 42nd Thursday

    If the world seems cold to you, kindle fires to warm it. 若世界以寒相待,请点燃火堆以温暖相报. Kindle fires to warm th ...

  9. July 7th, Week 28th Thursday, 2016

    The 79th Anniversary of Anti-Japan War Difficulties vanish when faced bodly. 勇敢面对困难,困难自会退让. The best ...

  10. 多线程编程4 - NSOperationQueue

    一.简介 一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的.也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步 ...