内核相关数据结构

85 篇文章 6 订阅
83 篇文章 9 订阅

如果在程序中频繁使用内存,不要用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();

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值