Windows驱动3. 内存管理

Windows驱动3. 内存管理

在驱动开发中, 通常不能使用C运行库中的内存分配函数, 如 malloc, free, new, delete.
内核模式中有自己的内存分配函数

内存管理函数

函数C库对应描述

ExAllocatePool2

malloc

分配内存

ExFreePool

free

释放内存

RtlEqualMemory

memcmp

比较内存

RtlCopyMemory

memcpy

复制内存

RtlFillMemory

memset

填充内存

RtlZeroMemory

memset

清零内存

RtlMoveMemory

memmove

移动内存

块表 ExInitializePagedLookasideList

块表非常类似与ObjectPool, 用于快速分配和回收obj, 但是内存并不会被回收

1
2
3
4
5
6
7
8
9
10
11
12
13
PAGED_LOOKASIDE_LIST lookasideList;
// 初始化 PAGED_LOOKASIDE_LIST
ExInitializePagedLookasideList(&lookasideList, NULL, NULL, 0, sizeof(MyObject), 'tag', 0);

// 使用 Lookaside List
MyObject* obj = ExAllocateFromPagedLookasideList(&lookasideList);
// ... 使用 obj ...

// 完成使用后,返回 Lookaside List
ExFreeToPagedLookasideList(&lookasideList, obj);

// 删除 Lookaside List
ExDeletePagedLookasideList(&lookasideList);

C++中的内存管理

在C++中, 不能使用原生的 newdelete , 需要对这两个操作符进行重载, 从而符合内核中的管理内存方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void* operator new(size_t size)
{
KdPrint(("new operator\n"));
return ExAllocatePool(NonPagedPool, size);
}

void* operator new(size_t size, POOL_TYPE poolType)
{
KdPrint(("new operator\n"));
return ExAllocatePool(poolType, size);
}

void operator delete(void* p)
{
KdPrint(("delete operator\n"));
ExFreePool(p);
}

Windows驱动3. 内存管理
https://simonkimi.githubio.io/2024/08/02/Windows驱动3-内存管理/
作者
simonkimi
发布于
2024年8月2日
许可协议