windows内核驱动-------内核模式与用户模式内存映射

本文详细介绍了内核驱动中几个关键API函数,如内存分配和释放(ExAllocatePoolWithTag,ExFreePoolWithTag,IoAllocateMdl,IoFreeMdl),以及内存映射(MmBuildMdlForNonPagedPool,MmMapLockedPagesSpecifyCache)及其对应操作。特别强调了在应用程序生命周期中正确处理内存映射的时机,如在DeviceIoControl和fileclose回调中的内存回收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内核驱动中,调用API函数:

ExAllocatePoolWithTag,分配内存。对应的释放内存函数:ExFreePoolWithTag

IoAllocateMdl,给定缓冲区的起始地址和长度, IoAllocateMdl 例程分配内存描述符列表 (MDL) 足以映射缓冲区。对应的释放MDL函数:IoFreeMdl。

MmBuildMdlForNonPagedPoolMmBuildMdlForNonPagedPool 例程接收指定非分页虚拟内存缓冲区的 MDL,并更新它以描述基础物理页。

MmMapLockedPagesSpecifyCache,MmMapLockedPagesSpecifyCache 例程将 MDL 描述的物理页面映射到虚拟地址,并使调用方能够指定用于创建映射的缓存属性。对应的解映射函数:MmUnmapLockedPages。

PVOID MmMapLockedPagesSpecifyCache(
  [in]           PMDL                                                                          MemoryDescriptorList,
  [in]           __drv_strictType(KPROCESSOR_MODE / enum _MODE,__drv_typeConst)KPROCESSOR_MODE AccessMode,
  [in]           __drv_strictTypeMatch(__drv_typeCond)MEMORY_CACHING_TYPE                      CacheType,
  [in, optional] PVOID                                                                         RequestedAddress,
  [in]           ULONG                                                                         BugCheckOnFailure,
  [in]           ULONG                                                                         Priority
);

如果MmMapLockedPagesSpecifyCache成功执行,MmMapLockedPagesSpecifyCache 返回映射页面的起始地址。参数2选择UserMode,映射为用户模式虚拟地址。

应用程序通过DeviceIoControl获得映射页面起始地址,由此完成映射。

MmMapLockedPagesSpecifyCache应在应用程序打开设备后框架调用的EVT_WDF_DEVICE_FILE_CREATE 回调函数中调用。

注意,映射完内存,在应用程序还没有退出时热插拔设备的情况下,内存的回收应在应用程序关闭对应的回调函数file close中进行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值