LIST_ENTRY定义一个双向链表的数据结构:
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY;
由函数InitializeListHead (BUEList)进行初始化。
假设需要插入某个数据结构
strct B_U_E{
LIST_ENTRY BUELink;
...
...
} BUE;
然后开始插入BUE的某个实例对象:调用InsertHeadList()函数。
BUE abue = ...
InsertHeadList(&BUEList, &abue->BUELink);
这样就完成插入动作。
现在要从LIST当中读取BUE的某个对象数据。CONTAINING_RECORD 这个宏。
#define CONTAININT_RECORD(address, type, field) \ ((type*)((PCHAR)(address) - (PCHAR)(&((type*)0)->field)))
这个宏用于取得内存中任何结构体的首地址,要提供的参数是:结构体中某个成员(field)的地址address、结构体的类型type、提供地址那个成 员的名字field。
所以,假如我们想读取第一个数据:
Link = BUEList.Flink;
while (Link != &BUEList)
{
bue= CONTAINING_RECORD(Link,BUE, BUELink);
Link = Link->Flink;
}
这样就完成数据的读取操作。
不知道有没有疏漏之处。