Bitdefender Hypervisor Memory Introspection
hlist.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 Bitdefender
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 #ifndef _HLIST_H_
6 #define _HLIST_H_
7 
9 // NOT sufficiently tested, use at your own risk //
11 
12 #include "introdefs.h"
13 
14 
15 typedef struct _HLIST_ENTRY
16 {
17  struct _HLIST_ENTRY *Next;
18  struct _HLIST_ENTRY **PPrev;
19 } HLIST_ENTRY;
20 
21 
22 typedef struct _HLIST_HEAD
23 {
25 } HLIST_HEAD;
26 
27 
28 static inline void
30 {
31  Head->First = NULL;
32 }
33 
34 
35 static inline BOOLEAN
37 {
38  return !Head->First;
39 }
40 
41 
42 static inline void
44 {
45  HLIST_ENTRY *next = Entry->Next;
46  HLIST_ENTRY **pprev = Entry->PPrev;
47 
48  *pprev = next;
49  if (next)
50  {
51  next->PPrev = pprev;
52  }
53 }
54 
55 
56 static inline void
58 {
59  HLIST_ENTRY *first = Head->First;
60  Entry->Next = first;
61 
62  if (first)
63  {
64  first->PPrev = &Entry->Next;
65  }
66 
67  Head->First = Entry;
68  Entry->PPrev = &Head->First;
69 }
70 
71 
72 //
73 // Exported convenient versions.
74 // These could be a lot easier if MSVC supported typeof(), but each file could define
75 // a generic macro around them (see lixprocess.c)
76 //
77 
78 #define HLIST_HEAD_INIT { .First = NULL }
79 
80 #define hlist_for_each(_head, _struct_type, _var) _hlist_for_each(_head, _struct_type, Link, _var)
81 #define hlist_for_each_var(_head, _struct_type, _var) _hlist_for_each_var(_head, _struct_type, Link, _var)
82 
83 #define hlist_for_each_link(_head, _struct_type, _member, _var) _hlist_for_each(_head, _struct_type, _member, _var)
84 #define hlist_for_each_link_var(_head, _struct_type, _member, _var) _hlist_for_each_var(_head, _struct_type, _member, _var)
85 
86 // Doesn't make sense to have a "var" version for these (you want to remove elements after all)
87 #define hlist_for_each_safe(_head, _struct_type, _var) _hlist_for_each_safe(_head, _struct_type, Link, _var)
88 #define hlist_for_each_link_safe(_head, _struct_type, _member, _var) _hlist_for_each_safe(_head, _struct_type, _member, _var)
89 
90 
91 //
92 // RAW versions, use only if really needed
93 //
94 #define _next_h(_var, _member) _var->_member.Next
95 #define _next_hentry(_var, _member, _type) _var ? CONTAINING_RECORD(_next_h(_var, _member), _type, _member) : _var
96 
97 #define _hlist_for_each(_head, _type, _member, _var) \
98  for (_type *_var = CONTAINING_RECORD((_head).First, _type, _member); \
99  _var; \
100  _var = _next_hentry(_var, _member, _type))
101 
102 #define _hlist_for_each_var(_head, _type, _member, _var) \
103  for (_var = CONTAINING_RECORD((_head).First, _type, _member); \
104  _var; \
105  _var = _next_hentry(_var, _member, _type))
106 
107 // Can remove entry while parsing the list
108 #define _hlist_for_each_safe(_head, _type, _member, _var) \
109  for (_type *_var = CONTAINING_RECORD((_head).First, _type, _member), *_n = _next_hentry(_var, _member, _type); \
110  _var; \
111  _var = _n, _n = _next_hentry(_var, _member, _type))
112 
113 #endif // _HLIST_H_
_Bool BOOLEAN
Definition: intro_types.h:58
struct _HLIST_ENTRY * Next
Definition: hlist.h:17
HLIST_ENTRY * First
Definition: hlist.h:24
static void HListRemoveEntry(HLIST_ENTRY *Entry)
Definition: hlist.h:43
static void HlistInitalizeHead(HLIST_HEAD *Head)
Definition: hlist.h:29
static BOOLEAN HListIsEmpty(const HLIST_HEAD *Head)
Definition: hlist.h:36
struct _HLIST_HEAD HLIST_HEAD
struct _HLIST_ENTRY ** PPrev
Definition: hlist.h:18
static void HListInsert(HLIST_HEAD *Head, HLIST_ENTRY *Entry)
Definition: hlist.h:57
struct _HLIST_ENTRY HLIST_ENTRY