940a31980baa349341a82e83e9de8ca727d54875
[reactos.git] / reactos / include / reactos / helper.h
1 #ifndef _HELPER_H
2 #define _HELPER_H
3
4 /* FIXME: clean this mess up and move to NDK */
5 #define ROUNDUP(a,b) ((((a)+(b)-1)/(b))*(b))
6 #define ROUNDDOWN(a,b) (((a)/(b))*(b))
7 #define ROUND_UP ROUNDUP
8 #define ROUND_DOWN ROUNDDOWN
9 #define PAGE_ROUND_DOWN(x) (((ULONG)x)&(~(PAGE_SIZE-1)))
10 #define PAGE_ROUND_UP(x) ( (((ULONG)x)%PAGE_SIZE) ? ((((ULONG)x)&(~(PAGE_SIZE-1)))+PAGE_SIZE) : ((ULONG)x) )
11 #define ABS_VALUE(V) (((V) < 0) ? -(V) : (V))
12 #define RtlRosMin(X,Y) (((X) < (Y))? (X) : (Y))
13 #define RtlRosMin3(X,Y,Z) (((X) < (Y)) ? RtlRosMin(X,Z) : RtlRosMin(Y,Z))
14 #ifndef KEBUGCHECK
15 #define KEBUGCHECKEX(a,b,c,d,e) DbgPrint("KeBugCheckEx at %s:%i\n",__FILE__,__LINE__), KeBugCheckEx(a,b,c,d,e)
16 #define KEBUGCHECK(a) DbgPrint("KeBugCheck at %s:%i\n",__FILE__,__LINE__), KeBugCheck(a)
17 #endif
18 #define EXPORTED __declspec(dllexport)
19 #define IMPORTED __declspec(dllimport)
20
21 /* iterate through the list using a list entry.
22 * elem is set to NULL if the list is run thru without breaking out or if list is empty.
23 */
24 #define LIST_FOR_EACH(elem, list, type, field) \
25 for ((elem) = CONTAINING_RECORD((list)->Flink, type, field); \
26 &(elem)->field != (list) || (elem = NULL); \
27 (elem) = CONTAINING_RECORD((elem)->field.Flink, type, field))
28
29 /* iterate through the list using a list entry, with safety against removal
30 * elem is set to NULL if the list is run thru without breaking out or if list is empty.
31 */
32 #define LIST_FOR_EACH_SAFE(cursor, cursor2, list, type, field) \
33 for ((cursor) = CONTAINING_RECORD((list)->Flink, type, field), \
34 (cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type, field); \
35 &(cursor)->field != (list) || (cursor = NULL); \
36 (cursor) = (cursor2), \
37 (cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type, field))
38
39 #define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + \
40 ((PIMAGE_DOS_HEADER)a)->e_lfanew + \
41 sizeof (IMAGE_NT_SIGNATURE) + \
42 sizeof (IMAGE_FILE_HEADER)))
43 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
44 #define RVA(m, b) ((PVOID)((ULONG_PTR)(b) + (ULONG_PTR)(m)))
45 #define NTSTAT_SEVERITY_SHIFT 30
46 #define NTSTAT_SEVERITY_MASK 0x00000003
47 #define NTSTAT_FACILITY_SHIFT 16
48 #define NTSTAT_FACILITY_MASK 0x00000FFF
49 #define NTSTAT_CUSTOMER_MASK 0x20000000
50 #define NT_SEVERITY(StatCode) (((StatCode) >> NTSTAT_SEVERITY_SHIFT) & NTSTAT_SEVERITY_MASK)
51 #define NT_FACILITY(StatCode) (((StatCode) >> NTSTAT_FACILITY_SHIFT) & NTSTAT_FACILITY_MASK)
52 #define NT_CUSTOMER(StatCode) ((StatCode) & NTSTAT_CUSTOMER_MASK)
53 #define RELATIVE_TIME(wait) (-(wait))
54 #define NANOS_TO_100NS(nanos) (((LONGLONG)(nanos)) / 100)
55 #define MICROS_TO_100NS(micros) (((LONGLONG)(micros)) * NANOS_TO_100NS(1000))
56 #define MILLIS_TO_100NS(milli) (((LONGLONG)(milli)) * MICROS_TO_100NS(1000))
57 #define SECONDS_TO_100NS(seconds) (((LONGLONG)(seconds)) * MILLIS_TO_100NS(1000))
58 #define MINUTES_TO_100NS(minutes) (((LONGLONG)(minutes)) * SECONDS_TO_100NS(60))
59 #define HOURS_TO_100NS(hours) (((LONGLONG)(hours)) * MINUTES_TO_100NS(60))
60 #define UNICODIZE1(x) L##x
61 #define UNICODIZE(x) UNICODIZE1(x)
62 #define InsertAscendingListFIFO(ListHead, NewEntry, Type, ListEntryField, SortField)\
63 {\
64 PLIST_ENTRY current;\
65 \
66 current = (ListHead)->Flink;\
67 while (current != (ListHead))\
68 {\
69 if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField >\
70 (NewEntry)->SortField)\
71 {\
72 break;\
73 }\
74 current = current->Flink;\
75 }\
76 \
77 InsertTailList(current, &((NewEntry)->ListEntryField));\
78 }
79
80 #define InsertDescendingListFIFO(ListHead, NewEntry, Type, ListEntryField, SortField)\
81 {\
82 PLIST_ENTRY current;\
83 \
84 current = (ListHead)->Flink;\
85 while (current != (ListHead))\
86 {\
87 if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField <\
88 (NewEntry)->SortField)\
89 {\
90 break;\
91 }\
92 current = current->Flink;\
93 }\
94 \
95 InsertTailList(current, &((NewEntry)->ListEntryField));\
96 }
97
98 #define InsertAscendingList(ListHead, NewEntry, Type, ListEntryField, SortField)\
99 {\
100 PLIST_ENTRY current;\
101 \
102 current = (ListHead)->Flink;\
103 while (current != (ListHead))\
104 {\
105 if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField >=\
106 (NewEntry)->SortField)\
107 {\
108 break;\
109 }\
110 current = current->Flink;\
111 }\
112 \
113 InsertTailList(current, &((NewEntry)->ListEntryField));\
114 }
115
116 #define InsertDescendingList(ListHead, NewEntry, Type, ListEntryField, SortField)\
117 {\
118 PLIST_ENTRY current;\
119 \
120 current = (ListHead)->Flink;\
121 while (current != (ListHead))\
122 {\
123 if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField <=\
124 (NewEntry)->SortField)\
125 {\
126 break;\
127 }\
128 current = current->Flink;\
129 }\
130 \
131 InsertTailList(current, &((NewEntry)->ListEntryField));\
132 }
133
134 #endif