ListEntry 链表图解,及解析 InsertTailList & RemoveHeadList&RemoveEntryList函数

本文详细解释了如何使用ListEntry进行链表操作,包括NPROT_INSERT_TAIL_LIST宏的实现,以及如何通过CONTAINING_RECORD宏获取IRP结构体的首地址。重点讨论了在PendedReads链表中插入、获取和删除IRP项的过程。

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



一:NPROT_INSERT_TAIL_LIST(&pOpenContext->PendedReads, &pIrp->Tail.Overlay.ListEntry);

 

#define NPROT_INSERT_TAIL_LIST(_pList, _pEnt)InsertTailList(_pList, _pEnt)

 

二:pIrpEntry =pOpenContext->PendedReads.Flink

 

三:pIrp == CONTAINING_RECORD(pIrpEntry, IRP,Tail.Overlay.ListEntry)

 

PendedReads是一个LIST_ENTRY结构体链表的表头结点

 

pIrpEntry是位于IRP结构体中的地址值

 

Tail.Overlay.ListEntry返回了它对IRP结构体首地址的距离,因为结构体的第一个成员位于低地址,所以首地址低于pIrpEntry

所以用pIrpEntry减去Tail.Overlay.ListEntry 返回了它对IRP结构体首地址的距离就得到了IRP的首地址

这个链表串联的是包含的LIST_ENTRYListEntry;的IRP结构体

 

宏CONTAINING_RECORD的作用是用结构成员中的LIST_ENTRY的地址减去它距离结构体第一个成员的距离得到结构体首地址

 

IRP 结构

sdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值