2022年驱动笔记在驱动中使用链表 .pdf

上传人:Q****o 文档编号:31709934 上传时间:2022-08-08 格式:PDF 页数:3 大小:47.70KB
返回 下载 相关 举报
2022年驱动笔记在驱动中使用链表 .pdf_第1页
第1页 / 共3页
2022年驱动笔记在驱动中使用链表 .pdf_第2页
第2页 / 共3页
点击查看更多>>
资源描述

《2022年驱动笔记在驱动中使用链表 .pdf》由会员分享,可在线阅读,更多相关《2022年驱动笔记在驱动中使用链表 .pdf(3页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、【驱动笔记 2】在驱动中使用链表学习各种高级外挂制作技术, 马上去百度搜索魔鬼作坊 ,点击第一个站进入,快速成为做挂达人。在驱动程序的开发中经常需要用到链表,常见的链表有单向链表和双向链表,我们只介绍双向链表的使用方法,DDK 为我们提供了标准的双向链表LIST_ENTRY ,但这个链表里面没有数据,不能直接使用,我们需要自己定义一个结构体类型,然后将LIST_ENTRY作为结构体的一个子域,如下所示:typedefstruct_MYDATASTRUCTULONGnumber;LIST_ENTRYListEntry; MYDATASTRUCT,*PMYDATASTRUCT;实际上把 LIST_

2、ENTRY放在结构体的第一个子域才是较好的做法,此处我们不过多地关心,反正用法都是大同小异。下面我们就在驱动程序中创建一个链表,使用刚刚定义的结构体作为节点类型。代码如下所示:VOIDLinkListTest()LIST_ENTRYlinkListHead;/ 链表PMYDATASTRUCTpData;/ 节点数据ULONGi = 0;/ 计数/初始化InitializeListHead(&linkListHead);/向链表中插入10个元素KdPrint(ProcessListBegininserttolink list);for (i=0; inumber= i;/ 将其作为一个节点插入链

3、表InsertHeadList(&linkListHead,&pData-ListEntry);/ 从链表中取出所有数据并显示KdPrint(ProcessListBeginremovefromlink listn);while(!IsListEmpty(&linkListHead)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 3 页 - - - - - - - - - / 取出一个节点PLIST_ENTRYpEntry= RemoveTailList(&linkLis

4、tHead);/ 获取节点内容pData= CONTAINING_RECORD(pEntry,MYDATASTRUCT,ListEntry);KdPrint(%dn,pData-number);/ 释放节点,ExAllocatePool必须与 ExFreePool成对使用ExFreePool(pData);上述代码可以正常地通过编译并运行,但其中存在着一个很大的隐患:它不是多线程安全的。如果有多个线程同时操作同一个链表的话,可能会引发不可预料的后果,我们可以通过使用自旋锁来避免,修改后的代码如下所示:VOIDLinkListTest()LIST_ENTRYlinkListHead;/ 链表PM

5、YDATASTRUCTpData;/ 节点数据ULONGi = 0;/ 计数KSPIN_LOCKspin_lock;/ 自旋锁KIRQLirql;/ 中断级别/ 初始化InitializeListHead(&linkListHead);KeInitializeSpinLock(&spin_lock);/向链表中插入10个元素KdPrint(ProcessListBegininserttolink list);/ 锁定,注意这里的irql 是个指针KeAcquireSpinLock(&spin_lock,&irql);for (i=0; inumber= i;InsertHeadList(&li

6、nkListHead,&pData-ListEntry);/ 解锁,注意这里的irql 不是指针名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 3 页 - - - - - - - - - KeReleaseSpinLock(&spin_lock,irql);/从链表中取出所有数据并显示KdPrint(ProcessListBeginremovefrom link listn);/ 锁定KeAcquireSpinLock(&spin_lock,&irql);while(!I

7、sListEmpty(&linkListHead)PLIST_ENTRYpEntry= RemoveTailList(&linkListHead);pData= CONTAINING_RECORD(pEntry,MYDATASTRUCT,ListEntry);KdPrint(%dn,pData-number);ExFreePool(pData);/ 解锁KeReleaseSpinLock(&spin_lock,irql);上述代码介绍了自旋锁的使用方法,但需要注意的是:上面这段代码在实际应用中是没有任何价值的。因为在上述代码我们定义的锁是一个局部变量,被分配在栈中,这样每个线程在调用该函数的时

8、候,都会重新初始化一个锁,因此这个锁就失去了本来的作用。在实际的编程中,我们应该把锁定义成一个全局变量,或者静态(static )变量,或者将其创建在堆空间中。另外, 我们还可以为每个链表都定义并初始化一个锁,在需要向该链表插入或移除节点时不使用前面介绍的普通函数,而是使用如下方法:ExInterlockedInsertHeadList(&linkListHead,&pData-ListEntry,&spin_lock);pData= (PMYDATASTRUCT)ExInterlockedRemoveHeadList(&linkListHead,&spin_lock);此时在向链表中插入或移除节点时会自动调用关联的锁进行加锁操作,有效地保证了多线程安全性。上述代码的运行效果如下图所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 3 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁