windows 内核 内存映射的函数和例子
时间: 2023-12-22 18:04:33 浏览: 201
Windows 内核提供了一些函数来进行内存映射,其中最常用的是 `MmMapLockedPagesSpecifyCache` 和 `MmUnmapLockedPages`。
下面是一个使用 `MmMapLockedPagesSpecifyCache` 函数进行内存映射的示例代码:
```
NTSTATUS MapMemory(PMDL Mdl, PVOID* MappedAddress) {
PHYSICAL_ADDRESS HighestAcceptableAddress = { 0xFFFFFFFF, 0 };
ULONG_PTR NumberOfBytesToMap = MmGetMdlByteCount(Mdl);
*MappedAddress = MmMapLockedPagesSpecifyCache(
Mdl,
KernelMode,
MmCached,
NULL,
FALSE,
NormalPagePriority
);
if (*MappedAddress == NULL) {
return STATUS_UNSUCCESSFUL;
}
return STATUS_SUCCESS;
}
```
这个函数接收一个 `PMDL` 参数,它包含了需要映射的内存页面的信息。函数还接收一个 `PVOID*` 类型的指针,用于返回内存映射的基地址。
函数调用 `MmMapLockedPagesSpecifyCache` 来进行内存映射操作。该函数的第一个参数是一个 `PMDL` 结构,第二个参数指定了映射的访问权限,第三个参数指定了映射的缓存类型,第四个参数是一个可选的虚拟地址,它指定了映射的虚拟地址。如果该参数为 NULL,Windows 内核会自动选择一个虚拟地址。最后两个参数指定了映射的优先级和是否等待映射完成。
如果映射成功,函数返回 `STATUS_SUCCESS`,同时将映射的基地址存储在传入的 `PVOID*` 指针中。如果映射失败,函数返回 `STATUS_UNSUCCESSFUL`。
另外,使用 `MmUnmapLockedPages` 函数可以取消内存映射。示例代码如下:
```
VOID UnmapMemory(PVOID MappedAddress) {
MmUnmapLockedPages(MappedAddress, NULL);
}
```
该函数接收一个内存映射的地址,调用 `MmUnmapLockedPages` 函数来取消内存映射。该函数的第一个参数是内存映射的基地址,第二个参数是一个可选的 `PMDL` 参数,它指定了需要取消映射的页面。如果该参数为 NULL,则取消映射的是整个映射区域。
阅读全文