驱动中使用链表sys

本文深入探讨了在驱动程序开发中如何使用链表结构sys进行数据管理,包括链表的基本概念、创建、插入、删除及遍历等操作,并通过实例解析其在实际驱动程序中的应用。
摘要由CSDN通过智能技术生成
#include <ntddk.h>

//给节点定义一个结构类型,这里定义为结构体类型
typedef struct _strNode{
	LIST_ENTRY Entry;    //Windows自己提供的 LIST_ENTRY结构双向循环链表
	int x;              //调用LIST_ENTRY 结构时,一定要把它写在第一位,数据域写在它的下面,不然会导致蓝屏!!
	int y;
}Node, *pNode;

//建立链表
pNode SetNode(void){

	pNode Head, A;   // 定义两个结构体的指针类型变量;

	Head = (pNode)ExAllocatePool(PagedPool, sizeof(Node));   //实例化一个Head 的结构体对象并在分页内存中分配空间

	//LIST_ENTRY的结构表头必须要用InitializeListHead初始化
	InitializeListHead(&Head->Entry);

	Head->x = 0;
	Head->y = 0;  //给头节点的两个数据域赋值

	//下面开始向链表中插入5个元素(节点)并给对应的节点的数据域赋值
	for (int i = 1; i <= 5; i++){

		A = (pNode)ExAllocatePool(PagedPool, sizeof(Node));   //实例化节点 A ,在分页内存中分配空间

		//给数据域赋值
		A->x = i;
		A->y = i + 1;

		//由于LIST_ENTRY 结构已是双向循环链表形式,所以这里就不用自己进行循环指向设定了
		InsertHeadList(&Head->Entry, &A->Entry);  //参数一:被插入的节点,参数二:要插入的节点
	}
	return Head;
}

//打印出双向循环链表的数据和节点地址
void GetPrint(pNode head){
	pNode temp;
	temp = head;
	if (temp != NULL){
		do{
			DbgPrint("节点 %d = %x,Next = %x, prior = %x, x = %d, y = %d \n",
				temp->x, temp, temp->Entry.Flink, temp->Entry.Blink, temp->x, temp->y);
			temp = (pNode)temp->Entry.Blink;   //强制将 "_LIST_ENTRY *" 类型下的成员转换为 "pNode " 指针类型
		} while (!(temp == head));
	}
	return;
}
//驱动程序函数入口
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pUnicodeString)
{
	//打印字符串
	KdPrint(("PNDGMCSY--加载"));
	//卸载例程的回调函数
	pDriverObject->DriverUnload = DDK_Unload;

	//创建设备对象
	CreateMyDevice(pDriverObject);

	MemoryOpe();

	//注册派遣函数
	pDriverObject->MajorFunction[IRP_MJ_CREATE] = ddk_DispatchRoutine;
	pDriverObject->MajorFunction[IRP_MJ_CLOSE] = ddk_DispatchRoutine;
	pDriverObject->MajorFunction[IRP_MJ_READ] = ddk_DispatchRoutine;
	pDriverObject->MajorFunction[IRP_MJ_WRITE] = ddk_DispatchRoutine;
	pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ddk_DispatchRoutine;

	/*MemoryOpe();*/
	GetPrint(SetNode()); // 调用双向循环链表函数

	return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值