内核相关数据结构

博客介绍了程序中频繁使用内存时,应使用LookAside结构而非ExAlloctaWithTag。还提及Hash表解决冲突用链式存储,介绍了树中的Avltable(WRK)和RTL_AVL_TABLE g_FIleNameTable(WDK),并对LookAside结构进行分类,有分页和非分页两种。

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

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

 

作为C知道,我将为您介绍一个学生写作助手的示例。这个助手可以帮助学生进行写作构思、语法检查和内容优化。以下是一个简单例子: 假设我们有一个名为"EssayHelper"的学生写作助手,其主要功能包括: 1. 头脑风暴:帮助学生产生写作主题和主要观点 2. 提纲生成:根据输入的主题和观点生成文章结构 3. 语法检查:检查并修正文章中的语法错误 4. 词汇优化:提供更高级的词汇替换建议 5. 引用生成:根据内容自动生成参考文献 以下是这个的Python代码示例: ```python class EssayHelper: def __init__(self, topic): self.topic = topic self.outline = [] self.grammar_errors = [] self.vocabulary_suggestions = {} self.references = [] def brainstorm(self): print(f"正在为{self.topic}生成想法...") # 这里可以添加具体的头脑风暴逻辑 return ["观点1", "观点2", "观点3"] def generate_outline(self, main_points): print("正在生成提纲...") # 这里可以添加具体的提纲生成逻辑 self.outline = ["引言", "主体段落1", "主体段落2", "结论"] def check_grammar(self, text): print("正在检查语法...") # 这里可以添加具体的语法检查逻辑 self.grammar_errors = ["错误1", "错误2"] return self.grammar_errors def suggest_vocabulary(self, text): print("正在优化词汇...") # 这里可以添加具体的词汇优化逻辑 self.vocabulary_suggestions = {"good": "excellent", "bad": "unfavorable"} return self.vocabulary_suggestions def generate_references(self, citations): print("正在生成参考文献...") # 这里可以添加具体的参考文献生成逻辑 self.references = ["参考文献1", "参考文献2"] return self.references # 使用示例 essay = EssayHelper("人工智能") ideas = essay.brainstorm() essay.generate_outline(ideas) errors = essay.check_grammar("这是一个包含错误的句子。") suggestions = essay.suggest_vocabulary("这是一个需要优化的句子。") refs = essay.generate_references(["引用1", "引用2"]) print(f"主题: {essay.topic}") print(f"提纲: {essay.outline}") print(f"语法错误: {errors}") print(f"词汇建议: {suggestions}") print(f"参考文献: {refs}") ``` 这个示例展示了如何创建一个基本的学生写作助手。通过实例化这个并调用其方法,学生可以获得关于他们写作主题的想法、生成文章结构、检查语法错误、获取词汇优化建议以及生成参考文献。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值