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;
}
这样就完成数据的读取操作。
不知道有没有疏漏之处。
分享到:
相关推荐
InsertHeadList和CONTAINING_RECORD - **InsertHeadList**:将指定的元素插入到链表头部。 - **CONTAINING_RECORD**:获取指向包含特定类型的记录的指针。 #### 33. 疑问:为何无线网卡无法发送数据? - **常见...
5. `InsertHeadList(List_Entry)`:将新节点插入到链表的头部。 通过这些基本操作,开发者可以构建更复杂的数据结构,如向量、队列或栈,以满足EFI环境中各种数据存储的需求。尽管EFI仅支持双向链表,但其灵活性...
在Windows驱动程序开发中,内存管理是至关重要的一个环节,因为它直接影响到驱动程序的稳定性和效率。本篇文章将深入探讨内核模式驱动程序中的内存管理,包括内存分页、内存分配函数以及链表的使用。 首先,我们来...
在IT安全领域,进程断链隐藏是一种高级的技术,主要用于防止恶意软件分析或杀毒软件的...对于IT专业人员,特别是安全研究人员和逆向工程师来说,理解和掌握这些技术至关重要,可以帮助他们更好地防御和对抗潜在的威胁。
同时,Windows API提供了一些处理链表的函数,如`InsertHeadList`、`RemoveEntryList`等,这些可以帮助开发者构建自己的链表数据结构。 **C/C++中的链表实现** C和C++没有内置的链表数据结构,因此开发者需要自定义...
`InsertHeadList`和`InsertTailList`来插入节点;`RemoveEntryList`来删除节点。 3. **使用自旋锁** - 自旋锁是一种轻量级的同步机制,适用于保护短时间内的临界区。 - 使用`KeInitializeSpinLock`初始化自旋锁;...