`
yexin218
  • 浏览: 970722 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

InsertHeadList和CONTAINING_RECORD

阅读更多

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;
         }

 这样就完成数据的读取操作。

 不知道有没有疏漏之处。

分享到:
评论

相关推荐

    Filter驱动开发笔记

    InsertHeadList和CONTAINING_RECORD - **InsertHeadList**:将指定的元素插入到链表头部。 - **CONTAINING_RECORD**:获取指向包含特定类型的记录的指针。 #### 33. 疑问:为何无线网卡无法发送数据? - **常见...

    EFIHowto,动态增长数据结构的使用.pdf

    5. `InsertHeadList(List_Entry)`:将新节点插入到链表的头部。 通过这些基本操作,开发者可以构建更复杂的数据结构,如向量、队列或栈,以满足EFI环境中各种数据存储的需求。尽管EFI仅支持双向链表,但其灵活性...

    Windows驅動程式開發(3)

    在Windows驱动程序开发中,内存管理是至关重要的一个环节,因为它直接影响到驱动程序的稳定性和效率。本篇文章将深入探讨内核模式驱动程序中的内存管理,包括内存分页、内存分配函数以及链表的使用。 首先,我们来...

    进程断链隐藏_r0_进程保护_进程断链隐藏_断链隐藏_驱动_

    在IT安全领域,进程断链隐藏是一种高级的技术,主要用于防止恶意软件分析或杀毒软件的...对于IT专业人员,特别是安全研究人员和逆向工程师来说,理解和掌握这些技术至关重要,可以帮助他们更好地防御和对抗潜在的威胁。

    Linked-List.zip_Windows编程_C/C++_

    同时,Windows API提供了一些处理链表的函数,如`InsertHeadList`、`RemoveEntryList`等,这些可以帮助开发者构建自己的链表数据结构。 **C/C++中的链表实现** C和C++没有内置的链表数据结构,因此开发者需要自定义...

    Windows下设备驱动的开发方法

    `InsertHeadList`和`InsertTailList`来插入节点;`RemoveEntryList`来删除节点。 3. **使用自旋锁** - 自旋锁是一种轻量级的同步机制,适用于保护短时间内的临界区。 - 使用`KeInitializeSpinLock`初始化自旋锁;...

Global site tag (gtag.js) - Google Analytics