飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3263|回复: 3

[C/C++] LIST_ENTRY 双向循环链表操作代码

  [复制链接]

该用户从未签到

发表于 2019-11-21 18:36:03 | 显示全部楼层 |阅读模式
链表是内核开发中经常遇到的一个数据结构,主要是双向循环链表;要使用链表,需要用到一个LIST_ENTRY的结构,其定义如下:


  1. typedef struct _LIST_ENTRY {
  2.     struct _LIST_ENTRY  *Flink;    // 指向下一个节点
  3.     struct _LIST_ENTRY  *Blink;    // 指向前一个节点
  4. } LIST_ENTRY, *PLIST_ENTRY;
复制代码

11.png

  1. FORCEINLINE VOID InitializeListHead(
  2.     _Out_ PLIST_ENTRY ListHead
  3.     )
  4. {
  5.     ListHead->Flink = ListHead->Blink = ListHead;
  6. }

  7. _Check_return_ FORCEINLINE BOOLEAN IsListEmpty(
  8.     _In_ PLIST_ENTRY ListHead
  9.     )
  10. {
  11.     return ListHead->Flink == ListHead;
  12. }

  13. FORCEINLINE BOOLEAN RemoveEntryList(
  14.     _In_ PLIST_ENTRY Entry
  15.     )
  16. {
  17.     PLIST_ENTRY Blink;
  18.     PLIST_ENTRY Flink;

  19.     Flink = Entry->Flink;
  20.     Blink = Entry->Blink;
  21.     Blink->Flink = Flink;
  22.     Flink->Blink = Blink;

  23.     return Flink == Blink;
  24. }

  25. FORCEINLINE PLIST_ENTRY RemoveHeadList(
  26.     _Inout_ PLIST_ENTRY ListHead
  27.     )
  28. {
  29.     PLIST_ENTRY Flink;
  30.     PLIST_ENTRY Entry;

  31.     Entry = ListHead->Flink;
  32.     Flink = Entry->Flink;
  33.     ListHead->Flink = Flink;
  34.     Flink->Blink = ListHead;

  35.     return Entry;
  36. }

  37. FORCEINLINE PLIST_ENTRY RemoveTailList(
  38.     _Inout_ PLIST_ENTRY ListHead
  39.     )
  40. {
  41.     PLIST_ENTRY Blink;
  42.     PLIST_ENTRY Entry;

  43.     Entry = ListHead->Blink;
  44.     Blink = Entry->Blink;
  45.     ListHead->Blink = Blink;
  46.     Blink->Flink = ListHead;

  47.     return Entry;
  48. }

  49. FORCEINLINE VOID InsertTailList(
  50.     _Inout_ PLIST_ENTRY ListHead,
  51.     _Inout_ PLIST_ENTRY Entry
  52.     )
  53. {
  54.     PLIST_ENTRY Blink;

  55.     Blink = ListHead->Blink;
  56.     Entry->Flink = ListHead;
  57.     Entry->Blink = Blink;
  58.     Blink->Flink = Entry;
  59.     ListHead->Blink = Entry;
  60. }

  61. FORCEINLINE VOID InsertHeadList(
  62.     _Inout_ PLIST_ENTRY ListHead,
  63.     _Inout_ PLIST_ENTRY Entry
  64.     )
  65. {
  66.     PLIST_ENTRY Flink;

  67.     Flink = ListHead->Flink;
  68.     Entry->Flink = Flink;
  69.     Entry->Blink = ListHead;
  70.     Flink->Blink = Entry;
  71.     ListHead->Flink = Entry;
  72. }

  73. FORCEINLINE VOID AppendTailList(
  74.     _Inout_ PLIST_ENTRY ListHead,
  75.     _Inout_ PLIST_ENTRY ListToAppend
  76.     )
  77. {
  78.     PLIST_ENTRY ListEnd = ListHead->Blink;

  79.     ListHead->Blink->Flink = ListToAppend;
  80.     ListHead->Blink = ListToAppend->Blink;
  81.     ListToAppend->Blink->Flink = ListHead;
  82.     ListToAppend->Blink = ListEnd;
  83. }

  84. FORCEINLINE PSINGLE_LIST_ENTRY PopEntryList(
  85.     _Inout_ PSINGLE_LIST_ENTRY ListHead
  86.     )
  87. {
  88.     PSINGLE_LIST_ENTRY FirstEntry;

  89.     FirstEntry = ListHead->Next;

  90.     if (FirstEntry)
  91.         ListHead->Next = FirstEntry->Next;

  92.     return FirstEntry;
  93. }

  94. FORCEINLINE VOID PushEntryList(
  95.     _Inout_ PSINGLE_LIST_ENTRY ListHead,
  96.     _Inout_ PSINGLE_LIST_ENTRY Entry
  97.     )
  98. {
  99.     Entry->Next = ListHead->Next;
  100.     ListHead->Next = Entry;
  101. }

复制代码

评分

参与人数 1威望 +1 飘云币 +1 收起 理由
zhczf + 1 + 1 PYG有你更精彩!

查看全部评分

PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-6-16 14:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2019-11-22 10:12:37 | 显示全部楼层
    这是准备断链的节奏啊,O(∩_∩)O哈哈~

    点评

    补上~  详情 回复 发表于 2019-11-22 17:32
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2019-11-22 17:32:34 | 显示全部楼层
    飘云 发表于 2019-11-22 10:12
    这是准备断链的节奏啊,O(∩_∩)O哈哈~


    补上~

    1. VOID NsBreakAwayFromMemoryOrderModuleList(PWCHAR szFullDllName)
    2. {
    3.     PTEB   pTeb = NtCurrentTeb();
    4.     PPEB   pPeb = pTeb->ProcessEnvironmentBlock;
    5.     PPEB_LDR_DATA Ldr = pPeb->Ldr;
    6.     LIST_ENTRY* Head = NULL;
    7.     LIST_ENTRY* entry = NULL;

    8.     Head = Ldr->InLoadOrderModuleList.Flink;
    9.     entry = Head->Flink;
    10.     while (entry != Head)
    11.     {
    12.         PLDR_DATA_TABLE_ENTRY item = (PLDR_DATA_TABLE_ENTRY)entry;
    13.         if (CheckDllPatch(&item->FullDllName, szFullDllName))
    14.             RemoveEntryList(entry);
    15.         entry = entry->Flink;
    16.     }

    17.     Head = Ldr->InMemoryOrderModuleList.Flink;
    18.     entry = Head->Flink;
    19.     while (entry != Head)
    20.     {
    21.         PLDR_DATA_TABLE_ENTRY item = \
    22.             (PLDR_DATA_TABLE_ENTRY)CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);
    23.         if (CheckDllPatch(&item->FullDllName, szFullDllName))
    24.             RemoveEntryList(entry);
    25.         entry = entry->Flink;
    26.     }

    27.     Head = Ldr->InInitializationOrderModuleList.Flink;
    28.     entry = Head->Flink;
    29.     while (entry != Head)
    30.     {
    31.         PLDR_DATA_TABLE_ENTRY item = \
    32.             (PLDR_DATA_TABLE_ENTRY)CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderLinks);;
    33.         if (CheckDllPatch(&item->FullDllName, szFullDllName))
    34.             RemoveEntryList(entry);
    35.         entry = entry->Flink;
    36.     }
    37. }

    复制代码


    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表