如果在程序中频繁使用内存,不要用ExAlloctaWithTag,使用LookAside结构
typedef struct _MYDATA
{
int value;
WCHAR NameBuffer[MAX_PATH];
}MYDATA,*PMYDATA
//list_entry
typedef struct _LIST_ENTRY
{
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
WCHAR NameBuffer[MAX_PATH];
}LIST_ENTRY,*PLIST_ENTRY
//就是在普通结构体插入一个链表节点
typedef struct _MYDATA_LIST_ENTRY
{
int value;
LIST_ENTRY Entry;
WCHAR NameBuffer[MAX_PATH];
}MYDATA,*PMYDATA
//定义个链表头结点
LIST_ENTRY listHead;
PLIST_ENTRY plistHead=&listHead;//指向头结点,这时候是entry地址,不是这个结构体的起始地址
//然后结构就串起来了,找每个结构体头部可以通过偏移
偏移可以通过宏CONTAINING_RECORD得到
//宏定义
#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \
(ULONG_PTR)(&((type *)0)->field)))
//所以计算成员在结构体的偏移,可以写个宏
#define offsetof(s,m) (size_t)&(((s*)0)->m)
使用方法
LIST_ENTRY listHead;//头指针
PMYDATA_LIST_ENTRY tmpEntry=NULL;//必须自己初始化
InitializeListHead(&listHead);//初始化
InsertHeadList(&listHead,&tmpEntry->Entry);//往节点头插入
InsertTailList(&listHead,&tmpEntry->Entry);//往尾节点头插入
RemoveHeadList(&listHead);//头部删除
RemoveTailList(&listHead);//尾部删除
IsListEmpty(&listHead);//判断是否为空
RemoveEntryList(&listHead);//尾部删除
/*
void InsertHeadList(
PLIST_ENTRY ListHead,
__drv_aliasesMem PLIST_ENTRY Entry
);
void InsertTailList(
PLIST_ENTRY ListHead,
__drv_aliasesMem PLIST_ENTRY Entry
);
*/
//遍历
for(plist=plistHead->Flink,plist!=plistHead.plist=plist->Flink)
{
dataEntry=CONTAINING_RECORD(plist,MYDATA_LIST_ENTRY,Entry);
}
Hash表
解决Hash表冲突,使用链式存储。冲突的串起来。
树
Avltable(WRK)
RTL_AVL_TABLE g_FIleNameTable;(WDK)
LookAside结构
频繁使用分配内存
分类
PAGE_LOOKASIDE_LIST分页
NPAGED_LOOKASIDE_LIST非分页
//初始化
NTSTATUS ExInitializeLookasideListEx(
PLOOKASIDE_LIST_EX Lookaside,
PALLOCATE_FUNCTION_EX Allocate,
PFREE_FUNCTION_EX Free,
POOL_TYPE PoolType,
ULONG Flags,
SIZE_T Size,
ULONG Tag,
USHORT Depth
);
//从中使用
PVOID ExAllocateFromLookasideListEx(
PLOOKASIDE_LIST_EX Lookaside
);
//释放
void ExFreeToLookasideListEx(
PLOOKASIDE_LIST_EX Lookaside,
PVOID Entry
);
//释放
ExDeletePagedLookasideListEx();