range.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#ifndef _RANGE_
00022
#define _RANGE_
00023
00024
00025
00026
00027
00028
#if DBG && !defined(NTOS_KERNEL_RUNTIME)
00029
#include <stdio.h>
00030
#endif
00031
00032
#undef MAX_ULONGLONG
00033 #define MAX_ULONGLONG ((ULONGLONG)-1)
00034
00035 #define RTL_RANGE_LIST_ENTRY_TAG 'elRR'
00036 #define RTL_RANGE_LIST_MISC_TAG 'mlRR'
00037
00038
#if DBG
00039
#define DEBUG_PRINT(Level, Message) \
00040
if (Level <= RtlRangeDebugLevel) DbgPrint Message
00041
#else
00042 #define DEBUG_PRINT(Level, Message)
00043
#endif // DBG
00044
00045
00046
00047
00048
00049 #define RTLP_RANGE_LIST_ENTRY_MERGED 0x0001
00050
00051 typedef struct _RTLP_RANGE_LIST_ENTRY {
00052
00053
00054
00055
00056 ULONGLONG
Start;
00057 ULONGLONG
End;
00058
00059
union {
00060
00061
00062
00063
00064
struct {
00065
00066
00067
00068
00069 PVOID
UserData;
00070
00071
00072
00073
00074 PVOID
Owner;
00075
00076 } Allocated;
00077
00078
00079
00080
00081
struct {
00082
00083
00084
00085
00086 LIST_ENTRY
ListHead;
00087
00088 } Merged;
00089
00090 };
00091
00092
00093
00094
00095 UCHAR
Attributes;
00096
00097
00098
00099
00100 UCHAR
PublicFlags;
00101
00102
00103
00104
00105 USHORT PrivateFlags;
00106
00107
00108
00109
00110 LIST_ENTRY
ListEntry;
00111
00112 }
RTLP_RANGE_LIST_ENTRY, *
PRTLP_RANGE_LIST_ENTRY;
00113
00114
00115
00116
00117
00118
00119 #define MERGED(Entry) (BOOLEAN)((Entry)->PrivateFlags & RTLP_RANGE_LIST_ENTRY_MERGED)
00120 #define SHARED(Entry) (BOOLEAN)((Entry)->PublicFlags & RTL_RANGE_SHARED)
00121 #define CONFLICT(Entry) (BOOLEAN)((Entry)->PublicFlags & RTL_RANGE_CONFLICT)
00122
00123
00124
00125
00126
00127 #define FOR_ALL_IN_LIST(Type, Head, Current) \
00128
for((Current) = CONTAINING_RECORD((Head)->Flink, Type, ListEntry); \
00129
(Head) != &(Current)->ListEntry; \
00130
(Current) = CONTAINING_RECORD((Current)->ListEntry.Flink, \
00131
Type, \
00132
ListEntry) \
00133
)
00134
00135 #define FOR_ALL_IN_LIST_SAFE(Type, Head, Current, Next) \
00136
for((Current) = CONTAINING_RECORD((Head)->Flink, Type, ListEntry), \
00137
(Next) = CONTAINING_RECORD((Current)->ListEntry.Flink, \
00138
Type, ListEntry); \
00139
(Head) != &(Current)->ListEntry; \
00140
(Current) = (Next), \
00141
(Next) = CONTAINING_RECORD((Current)->ListEntry.Flink, \
00142
Type, ListEntry) \
00143
)
00144
00145
00146 #define FOR_REST_IN_LIST(Type, Head, Current) \
00147
for(; \
00148
(Head) != &(Current)->ListEntry; \
00149
(Current) = CONTAINING_RECORD((Current)->ListEntry.Flink, \
00150
Type, \
00151
ListEntry) \
00152
)
00153
00154 #define FOR_REST_IN_LIST_SAFE(Type, Head, Current, Next) \
00155
for((Next) = CONTAINING_RECORD((Current)->ListEntry.Flink, \
00156
Type, ListEntry); \
00157
(Head) != &(Current)->ListEntry; \
00158
(Current) = (Next), \
00159
(Next) = CONTAINING_RECORD((Current)->ListEntry.Flink, \
00160
Type, ListEntry) \
00161
)
00162
00163
00164
00165
00166
00167 #define FOR_ALL_IN_LIST_BACKWARDS(Type, Head, Current) \
00168
for((Current) = CONTAINING_RECORD((Head)->Blink, Type, ListEntry); \
00169
(Head) != &(Current)->ListEntry; \
00170
(Current) = CONTAINING_RECORD((Current)->ListEntry.Blink, \
00171
Type, \
00172
ListEntry) \
00173
)
00174
00175 #define FOR_ALL_IN_LIST_SAFE_BACKWARDS(Type, Head, Current, Next) \
00176
for((Current) = CONTAINING_RECORD((Head)->Blink, Type, ListEntry), \
00177
(Next) = CONTAINING_RECORD((Current)->ListEntry.Blink, \
00178
Type, ListEntry); \
00179
(Head) != &(Current)->ListEntry; \
00180
(Current) = (Next), \
00181
(Next) = CONTAINING_RECORD((Current)->ListEntry.Blink, \
00182
Type, ListEntry) \
00183
)
00184
00185
00186 #define FOR_REST_IN_LIST_BACKWARDS(Type, Head, Current) \
00187
for(; \
00188
(Head) != &(Current)->ListEntry; \
00189
(Current) = CONTAINING_RECORD((Current)->ListEntry.Blink, \
00190
Type, \
00191
ListEntry) \
00192
)
00193
00194 #define FOR_REST_IN_LIST_SAFE_BACKWARDS(Type, Head, Current, Next) \
00195
for((Next) = CONTAINING_RECORD((Current)->ListEntry.Blink, \
00196
Type, ListEntry); \
00197
(Head) != &(Current)->ListEntry; \
00198
(Current) = (Next), \
00199
(Next) = CONTAINING_RECORD((Current)->ListEntry.Blink, \
00200
Type, ListEntry) \
00201
)
00202
00203
00204
00205
00206
00207 #define LAST_IN_LIST(ListHead, Entry) \
00208
( (Entry)->ListEntry.Flink == ListHead )
00209
00210 #define FIRST_IN_LIST(ListHead, Entry) \
00211
( (Entry)->ListEntry.Blink == ListHead )
00212
00213
00214 #define RANGE_DISJOINT(a,b) \
00215
( ((a)->Start < (b)->Start && (a)->End < (b)->Start) \
00216
||((b)->Start < (a)->Start && (b)->End < (a)->Start) )
00217
00218 #define RANGE_INTERSECT(a,b) \
00219
!RANGE_DISJOINT((a),(b))
00220
00221 #define RANGE_LIMITS_DISJOINT(s1,e1,s2,e2) \
00222
( ((s1) < (s2) && (e1) < (s2)) \
00223
||((s2) < (s1) && (e2) < (s1)) )
00224
00225 #define RANGE_LIMITS_INTERSECT(s1,e1,s2,e2) \
00226
!RANGE_LIMITS_DISJOINT((s1),(e1),(s2),(e2))
00227
00228 #define RANGE_LIST_ENTRY_FROM_LIST_ENTRY(Entry) \
00229
CONTAINING_RECORD((Entry), RTLP_RANGE_LIST_ENTRY, ListEntry)
00230
00231 #define RANGE_LIST_FROM_LIST_HEAD(Head) \
00232
CONTAINING_RECORD((Head), RTL_RANGE_LIST, ListHead)
00233
00234 #define FOR_REST_OF_RANGES(_Iterator, _Current, _Forward) \
00235
for ((_Current) = (PRTL_RANGE)(_Iterator)->Current; \
00236
(_Current) != NULL; \
00237
RtlGetNextRange((_Iterator), &(_Current), (_Forward)) \
00238
)
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248 #define InsertEntryList(Previous, Entry) { \
00249
PLIST_ENTRY _EX_Next = (Previous)->Flink; \
00250
PLIST_ENTRY _EX_Previous = (Previous); \
00251
(Entry)->Flink = _EX_Next; \
00252
(Entry)->Blink = _EX_Previous; \
00253
_EX_Next->Blink = (Entry); \
00254
_EX_Previous->Flink = (Entry); \
00255
}
00256
00257
00258
00259
00260
#endif
Generated on Sat May 15 19:41:36 2004 for test by
1.3.7