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

来源:互联网 发布:阿里云阿里巴巴矢量图 编辑:程序博客网 时间:2024/06/05 16:20

一: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的链表

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



原创粉丝点击