当前位置: 首页 > news >正文

3.1.1 平衡二叉树中改变区块属性,并分裂区块保持属性一致:MmSplitRegion()

MmSplitRegion函数

//改变区块属性,并分裂区块保持属性一致:

文章目录

  • MmSplitRegion函数
  • MmSplitRegion


MmSplitRegion

//改变区块属性,并分裂区块保持属性一致:


PMM_REGION static
MmSplitRegion(PMM_REGION InitialRegion, PVOID InitialBaseAddress,PVOID StartAddress, ULONG Length, ULONG NewType,ULONG NewProtect, PMADDRESS_SPACE AddressSpace,PMM_ALTER_REGION_FUNC AlterFunc)
{PMM_REGION NewRegion1;PMM_REGION NewRegion2;ULONG InternalLength;/* Allocate this in front otherwise the failure case is too difficult. */NewRegion2 = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_REGION),TAG_MM_REGION);if (NewRegion2 == NULL){return(NULL);}/* Create the new region. */NewRegion1 = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_REGION),TAG_MM_REGION);if (NewRegion1 == NULL){ExFreePool(NewRegion2);return(NULL);}NewRegion1->Type = NewType;NewRegion1->Protect = NewProtect;InternalLength = ((char*)InitialBaseAddress + InitialRegion->Length) - (char*)StartAddress;InternalLength = min(InternalLength, Length);NewRegion1->Length = InternalLength;InsertAfterEntry(&InitialRegion->RegionListEntry,&NewRegion1->RegionListEntry);/** Call our helper function to do the changes on the addresses contained* in the initial region.*/AlterFunc(AddressSpace, StartAddress, InternalLength, InitialRegion->Type,InitialRegion->Protect, NewType, NewProtect);/** If necessary create a new region for the portion of the initial region* beyond the range of addresses to alter.*/if (((char*)InitialBaseAddress + InitialRegion->Length) > ((char*)StartAddress + Length)){NewRegion2->Type = InitialRegion->Type;NewRegion2->Protect = InitialRegion->Protect;NewRegion2->Length = ((char*)InitialBaseAddress + InitialRegion->Length) -((char*)StartAddress + Length);InsertAfterEntry(&NewRegion1->RegionListEntry,&NewRegion2->RegionListEntry);}else{ExFreePool(NewRegion2);}/* Either remove or shrink the initial region. */if (InitialBaseAddress == StartAddress){RemoveEntryList(&InitialRegion->RegionListEntry);ExFreePool(InitialRegion);}else{InitialRegion->Length = (char*)StartAddress - (char*)InitialBaseAddress;}return(NewRegion1);
}

http://www.mrgr.cn/news/59193.html

相关文章:

  • 简单工厂(Simple Factory)
  • 国内大语言模型哪家更好用?
  • Spring Boot框架下的Java多线程
  • 关于 Linux 内核“合规要求”与俄罗斯制裁的一些澄清
  • docker 单节点arm架构服务器安装zookeeper、kafka并测试通信
  • Java全栈经典面试题剖析5】JavaSE高级 -- 集合
  • RHCE笔记
  • 【LeetCode】修炼之路-0008- String to Integer (atoi)【python】
  • 数据结构(8.4_1)——简单选择排序
  • pixhawk 无人机 链接 遥控器
  • CSP-S 2024 游记
  • E - Permute K times 2
  • OpenFeign返回参数统一处理
  • 网络通信与并发编程(六)线程、进程池与线程池
  • 安全见闻1-9---清风
  • 大模型,多模态大模型面试问题记录24/10/25
  • 每日OJ题_牛客_小红的ABC_暴力/找规律_C++_Java
  • 了解AIGC——自然语言处理与生成
  • 大学新生入门编程的推荐路径
  • 神经架构搜索:自动化设计神经网络的方法
  • 深入理解JAVA虚拟机(一)
  • 全面解读 @Transactional 的传播机制:一次搞懂 Spring 事务的各种“传播方式”!
  • 常用设计模式...
  • 【Vulnhub靶场】DC-4
  • 2024高等代数【南昌大学】
  • 用kali入侵 DarkHole_2测试