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