// Public nt-lite DDK intrusive list declarations. #pragma once #include // Doubly-linked intrusive list node. typedef struct LIST_ENTRY { struct LIST_ENTRY* Fwd; struct LIST_ENTRY* Bwd; } LIST_ENTRY; #define LIST_INIT(head) ((head)->Fwd = (head)->Bwd = (head)) #define LIST_IS_EMPTY(head) ((head)->Fwd == (head)) // Recover the containing struct pointer from an embedded list node. #define CONTAINING_RECORD(ptr, type, member) \ ((type*)((char*)(ptr) - offsetof(type, member))) // Inserts a node at the tail of a list. static inline void ListInsertTail(LIST_ENTRY* head, LIST_ENTRY* node) { node->Bwd = head->Bwd; node->Fwd = head; head->Bwd->Fwd = node; head->Bwd = node; } // Inserts a node at the head of a list. static inline void ListInsertHead(LIST_ENTRY* head, LIST_ENTRY* node) { node->Fwd = head->Fwd; node->Bwd = head; head->Fwd->Bwd = node; head->Fwd = node; } // Removes a node from its current list. static inline void ListRemove(LIST_ENTRY* node) { node->Bwd->Fwd = node->Fwd; node->Fwd->Bwd = node->Bwd; node->Fwd = node->Bwd = node; } // Removes and returns the first node in a list, or NULL when empty. static inline LIST_ENTRY* ListPopHead(LIST_ENTRY* head) { if (LIST_IS_EMPTY(head)) return (LIST_ENTRY*)0; LIST_ENTRY* node = head->Fwd; ListRemove(node); return node; }