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

一: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

IRP 结构

dfs

IRP 结构

 

IRP 结构

 

 

 

 

 

 

 

 

第一个成员

<---------

CONTAINING_RECORD作用是返回到这里

 

 

 

 

 

 

 

 

 

ListEntry

<--------->

ListEntry

<--------->

ListEntry

<--------->

ListEntry

<--------->

PendedReads 表头 |相当于一个IRP的链表

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值