使用LIST_ENTRY
在实际的编程中,我们需要自己定义链表的节点,并把节点的第一个成员设置为LIST_ENTRY类型的变量(不一定放在第一位,但通常是这样);此外,我们还需要一个LIST_ENTRY类型的链表头,用InitializeListHead来初始化链表头。
使用InsertHeadList往链表中插入节点。
InsertHeadList(&my_list_head,(PLIST_ENTRY)&my_file_infor);
其他函数:
IsListEmpty,判断链表是否为空
InsertHeadList,从链表头部插入节点
InsertTailList,从链表尾部插入节点
RemoveHeadList,从链表头部删除节点
RemoveTailList,从链表尾部删除节点
WDK还定义了一个宏,CONTAINING_RECORD,作用是通过LIST_ENTRY结构的指针找到这个结构所在的节点的指针。定义如下:
#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) – \
(ULONG_PTR)(&((type *)0)->field)))