博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ring0 - 链表
阅读量:6628 次
发布时间:2019-06-25

本文共 2503 字,大约阅读时间需要 8 分钟。

//一般驱动层不使用数据结构,一般Ring3层

双向链表可以将链表形成一个环.BLINK指针指向前一个元素,FLINK指针指向下一个元素.

typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;

初始化
双向链表都是以一个链表头作为链表的第一个元素.初始化链表头就是把Flink和Blink都指向自己,此时就是空链.使用InitializeListHead函数.

 

1 #include 
2 3 typedef struct _ITEM_ 4 { 5 union 6 { 7 LIST_ENTRY ListEntry; 8 SINGLE_LIST_ENTRY SingleListEntry; 9 }u; 10 ULONG ItemData; 11 }ITEM,*PITEM; 12 13 14 void SingleListTest();//单链表 15 void ListTest();//双链表 16 17 VOID DriverUnload(PDRIVER_OBJECT DriverObject); 18 19 20 21 22 23 24 25 #include "List.h" 26 27 //bp List!DriverEntry 28 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath) 29 { 30 NTSTATUS Status = STATUS_SUCCESS; 31 PDEVICE_OBJECT DeviceObject = NULL; 32 33 DriverObject->DriverUnload = DriverUnload; 34 35 36 //ListTest();//双向链表 37 SingleListTest();//单链表 38 39 40 41 return Status; 42 } 43 44 45 void ListTest() 46 { 47 LIST_ENTRY ListHead; 48 PITEM Item = NULL; 49 50 ULONG i = 0; 51 52 //初始化链表 53 InitializeListHead(&ListHead); 54 55 for (i = 0; i < 10; i++) 56 { 57 Item = (PITEM) 58 ExAllocatePool(PagedPool, sizeof(ITEM)); 59 Item->ItemData = i; 60 InsertHeadList(&ListHead, &Item->u.ListEntry); 61 } 62 63 while (!IsListEmpty(&ListHead)) 64 { 65 PLIST_ENTRY ListEntry = RemoveTailList(&ListHead); 66 67 DbgPrint("%d\r\n", ((PITEM)ListEntry)->ItemData); 68 ExFreePool((PITEM)ListEntry); 69 } 70 } 71 72 void SingleListTest() 73 { 74 SINGLE_LIST_ENTRY ListHead; 75 76 PITEM Item = NULL; 77 ULONG i = 0; 78 //初始化链表 79 InitializeListHead(&ListHead); 80 for (i = 0; i < 10; i++) 81 { 82 Item = (PITEM) 83 ExAllocatePool(PagedPool, sizeof(ITEM)); 84 Item->ItemData = i; 85 PushEntryList(&ListHead, &Item->u.SingleListEntry); 86 } 87 88 while (!IsListEmpty(&ListHead)) 89 { 90 PSINGLE_LIST_ENTRY ListEntry = PopEntryList(&ListHead); 91 92 DbgPrint("%d\n", ((PITEM)ListEntry)->ItemData); 93 ExFreePool((PITEM)ListEntry); 94 } 95 96 } 97 98 99 100 VOID DriverUnload(PDRIVER_OBJECT DriverObject)101 {102 DbgPrint("DriverUnload()\r\n");103 }

 

转载于:https://www.cnblogs.com/1228073191Blog/p/7500595.html

你可能感兴趣的文章
怎样获取Web应用程序的路径
查看>>
xcode crash 查找 EXC_BAD_ACCESS 问题根源的方法
查看>>
使用java.util.concurrent.ThreadFactory来创建线程
查看>>
中国大数据科技传播联盟在京成立
查看>>
xargs 命令
查看>>
awk——报告生成器
查看>>
oracle 体系结构
查看>>
Nginx+Keepalived搭建高可用负载均衡集群
查看>>
VS2015 正式版中为什么没有了函数前面引用提示了?
查看>>
windows 系统的安装和虚拟机共享文件夹
查看>>
arp协议的混乱引发的思考--一个实例
查看>>
Why Public Cloud is Not a Security Concern
查看>>
配置XenDesktop一例报错-序列不包含任何元素
查看>>
javascript理解数组和数字排序
查看>>
微软同步框架入门之五--使用WCF同步远程数据
查看>>
Last-Modified、If-Modified-Since 实现缓存和 OutputCache 的区别
查看>>
理解SQL代理错误日志
查看>>
Multipart Internet Mail Extensions (MIME)
查看>>
C# WinForm控件之Dock顺序调整
查看>>
中控科技 ZK Software的售后服务真像一坨屎,技术人员嚣张
查看>>