list.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #ifndef LIST_H_INCLUDED
  2. #define LIST_H_INCLUDED
  3. #include <windows.h>
  4. #ifndef FORCEINLINE
  5. #define FORCEINLINE __inline__
  6. #endif // FORCEINLINE
  7. #if !defined(_LIST_ENTRY_DEFINED) && !defined(_MSC_VER)
  8. typedef struct _LIST_ENTRY {
  9. struct _LIST_ENTRY *Flink;
  10. struct _LIST_ENTRY *Blink;
  11. } LIST_ENTRY, *PLIST_ENTRY;
  12. #endif // _LIST_ENTRY_DEFINED
  13. FORCEINLINE
  14. VOID
  15. InitializeListHead(
  16. OUT PLIST_ENTRY ListHead)
  17. {
  18. ListHead->Flink = ListHead->Blink = ListHead;
  19. }
  20. FORCEINLINE
  21. BOOLEAN
  22. IsListEmpty(
  23. IN CONST LIST_ENTRY * ListHead)
  24. {
  25. return (BOOLEAN)(ListHead->Flink == ListHead);
  26. }
  27. FORCEINLINE
  28. BOOLEAN
  29. RemoveEntryList(
  30. IN PLIST_ENTRY Entry)
  31. {
  32. PLIST_ENTRY OldFlink;
  33. PLIST_ENTRY OldBlink;
  34. OldFlink = Entry->Flink;
  35. OldBlink = Entry->Blink;
  36. OldFlink->Blink = OldBlink;
  37. OldBlink->Flink = OldFlink;
  38. return (BOOLEAN)(OldFlink == OldBlink);
  39. }
  40. FORCEINLINE
  41. PLIST_ENTRY
  42. RemoveHeadList(
  43. IN OUT PLIST_ENTRY ListHead)
  44. {
  45. PLIST_ENTRY Flink;
  46. PLIST_ENTRY Entry;
  47. Entry = ListHead->Flink;
  48. Flink = Entry->Flink;
  49. ListHead->Flink = Flink;
  50. Flink->Blink = ListHead;
  51. return Entry;
  52. }
  53. FORCEINLINE
  54. PLIST_ENTRY
  55. RemoveTailList(
  56. IN OUT PLIST_ENTRY ListHead)
  57. {
  58. PLIST_ENTRY Blink;
  59. PLIST_ENTRY Entry;
  60. Entry = ListHead->Blink;
  61. Blink = Entry->Blink;
  62. ListHead->Blink = Blink;
  63. Blink->Flink = ListHead;
  64. return Entry;
  65. }
  66. FORCEINLINE
  67. VOID
  68. InsertTailList(
  69. IN OUT PLIST_ENTRY ListHead,
  70. IN OUT PLIST_ENTRY Entry)
  71. {
  72. PLIST_ENTRY OldBlink;
  73. OldBlink = ListHead->Blink;
  74. Entry->Flink = ListHead;
  75. Entry->Blink = OldBlink;
  76. OldBlink->Flink = Entry;
  77. ListHead->Blink = Entry;
  78. }
  79. FORCEINLINE
  80. VOID
  81. InsertHeadList(
  82. IN OUT PLIST_ENTRY ListHead,
  83. IN OUT PLIST_ENTRY Entry)
  84. {
  85. PLIST_ENTRY OldFlink;
  86. OldFlink = ListHead->Flink;
  87. Entry->Flink = OldFlink;
  88. Entry->Blink = ListHead;
  89. OldFlink->Blink = Entry;
  90. ListHead->Flink = Entry;
  91. }
  92. FORCEINLINE
  93. VOID
  94. AppendTailList(
  95. IN OUT PLIST_ENTRY ListHead,
  96. IN OUT PLIST_ENTRY ListToAppend)
  97. {
  98. PLIST_ENTRY ListEnd = ListHead->Blink;
  99. ListHead->Blink->Flink = ListToAppend;
  100. ListHead->Blink = ListToAppend->Blink;
  101. ListToAppend->Blink->Flink = ListHead;
  102. ListToAppend->Blink = ListEnd;
  103. }
  104. #endif // LIST_H_INCLUDED