66 CHAR FileAndLine[128];
69 KmtOk(ActualRange->Start == ExpectedRange->Start, FileAndLine,
70 "[%lu] Start = 0x%I64x, expected 0x%I64x\n",
Index, ActualRange->Start, ExpectedRange->Start);
71 KmtOk(ActualRange->End == ExpectedRange->End, FileAndLine,
72 "[%lu] End = 0x%I64x, expected 0x%I64x\n",
Index, ActualRange->End, ExpectedRange->End);
73 KmtOk(ActualRange->UserData == ExpectedRange->UserData, FileAndLine,
74 "[%lu] UserData = %p, expected %p\n",
Index, ActualRange->UserData, ExpectedRange->UserData);
75 KmtOk(ActualRange->Owner == ExpectedRange->Owner, FileAndLine,
76 "[%lu] Owner = %p, expected %p\n",
Index, ActualRange->Owner, ExpectedRange->Owner);
77 KmtOk(ActualRange->Attributes == ExpectedRange->Attributes, FileAndLine,
78 "[%lu] Attributes = 0x%x, expected 0x%x\n",
Index, ActualRange->Attributes, ExpectedRange->Attributes);
79 KmtOk(ActualRange->Flags == ExpectedRange->Flags, FileAndLine,
80 "[%lu] Flags = 0x%x, expected 0x%x\n",
Index, ActualRange->Flags, ExpectedRange->Flags);
96 CHAR FileAndLine[128];
106 "Padding is 0x%lx\n", (&
Iterator.Stamp)[1]);
109 for (
i = 0;
i < NumRanges;
i++)
116 KmtOk(
Iterator.RangeListHead == &RangeList->ListHead, FileAndLine,
117 "[%lu] Iterator.RangeListHead = %p, expected %p\n",
i,
Iterator.RangeListHead, &RangeList->ListHead);
119 "[%lu] Iterator.MergedHead = %p\n",
i,
Iterator.MergedHead);
121 "[%lu] Iterator.Current = %p, expected %p\n",
i,
Iterator.Current, Range);
123 "[%lu] Iterator.Stamp = %lu, expected %lu\n",
i,
Iterator.Stamp, RangeList->Stamp);
132 "Status = 0x%lx after enumeration\n",
Status);
134 "[%lu] Range = %p\n",
i, Range);
135 KmtOk(
Iterator.RangeListHead == &RangeList->ListHead, FileAndLine,
136 "[%lu] Iterator.RangeListHead = %p, expected %p\n",
i,
Iterator.RangeListHead, &RangeList->ListHead);
138 "[%lu] Iterator.MergedHead = %p\n",
i,
Iterator.MergedHead);
140 "[%lu] Iterator.Current = %p\n",
i,
Iterator.Current);
142 "[%lu] Iterator.Stamp = %lu, expected %lu\n",
i,
Iterator.Stamp, RangeList->Stamp);
148 "Status = 0x%lx after enumeration\n",
Status);
150 "[%lu] Range = %p\n",
i, Range);
151 KmtOk(
Iterator.RangeListHead == &RangeList->ListHead, FileAndLine,
152 "[%lu] Iterator.RangeListHead = %p, expected %p\n",
i,
Iterator.RangeListHead, &RangeList->ListHead);
154 "[%lu] Iterator.MergedHead = %p\n",
i,
Iterator.MergedHead);
156 "[%lu] Iterator.Current = %p\n",
i,
Iterator.Current);
158 "[%lu] Iterator.Stamp = %lu, expected %lu\n",
i,
Iterator.Stamp, RangeList->Stamp);
161#define expect_range_entries(RangeList, NumRanges, Ranges) \
162 ExpectRangeEntryList(__FILE__, __LINE__, RangeList, NumRanges, Ranges)
172 ULONG StartStamp = RangeList->Stamp;
174 Ranges[1].Start = 0x300;
175 Ranges[1].End = 0x2ff;
176 Ranges[1].Attributes = 2;
199 ULONG StartStamp = RangeList->Stamp;
201 Ranges[1].Start = 0x300;
202 Ranges[1].End = 0x300;
203 Ranges[1].Attributes = 0xff;
234 ULONG StartStamp = RangeList->Stamp;
236 Ranges[1].Start = 0x300;
237 Ranges[1].End = 0x400;
238 Ranges[1].Attributes = 2;
270 ULONG StartStamp = RangeList->Stamp;
272#define is_range_available(RangeList, Start, End, pAvail) \
273 RtlIsRangeAvailable(RangeList, \
333 (Ranges[0].
Start + Ranges[0].End) / 2,
341 Ranges[0].End + 0x100,
348 (Ranges[0].
Start + Ranges[0].End) / 2,
349 Ranges[0].End + 0x100,
357 Ranges[0].End + 0x100,
365 Ranges[0].End + 0x100,
413 Ranges[0].End + 0x100,
425 Ranges[0].End + 0x100,
444 ULONG StartStamp = RangeList->Stamp;
447 Ranges[1].Start = 0x180;
448 Ranges[1].End = 0x280;
449 Ranges[1].Attributes = 0;
555 Ranges[1].Start = 0x300;
556 Ranges[1].End = 0x400;
557 Ranges[1].Attributes = 2;
613 Ranges[1].Start = 0x300;
614 Ranges[1].End = 0x400;
615 Ranges[1].Attributes = 0;
646 Ranges[1].Start = 0x500;
647 Ranges[1].End = 0x600;
648 Ranges[1].Attributes = 0;
650 Ranges[1].UserData =
NULL;
651 Ranges[1].Owner =
NULL;
680 Ranges[1].Start = 0x300;
681 Ranges[1].End = 0x400;
682 Ranges[1].Attributes = 0;
689 Ranges[2].Start = 0x500;
690 Ranges[2].End = 0x600;
691 Ranges[2].Attributes = 0;
787 "RangeList.ListHead %p %p %p, expected empty\n",
799 Ranges[0].
Start = 0x100;
800 Ranges[0].
End = 0x200;
828 Stamp = RangeList.
Stamp;
static _Out_opt_ PULONGLONG Start
static NTSTATUS RtlAddRangeWrapper(_Inout_ PRTL_RANGE_LIST RangeList, _In_ const RTL_RANGE *Range, _In_ ULONG Flags)
static void ExpectRangeEntryList(_In_ PCSTR File, _In_ INT Line, _In_ RTL_RANGE_LIST *RangeList, _In_ ULONG NumRanges, _In_reads_(NumRanges) const RTL_RANGE *Ranges)
static void TestAddConflict(_Inout_ PRTL_RANGE_LIST RangeList, _Inout_ PRTL_RANGE Ranges)
static void TestDeleteOwnersRanges(_Inout_ PRTL_RANGE_LIST RangeList, _Inout_ PRTL_RANGE Ranges)
static void TestGetLastRange(_Inout_ PRTL_RANGE_LIST RangeList, _Inout_ PRTL_RANGE Ranges)
static void ExpectRange(_In_ PCSTR File, _In_ INT Line, _In_ ULONG Index, _In_ const RTL_RANGE *ActualRange, _In_ const RTL_RANGE *ExpectedRange)
static void TestFindRange(_Inout_ PRTL_RANGE_LIST RangeList, _Inout_ PRTL_RANGE Ranges)
static void TestStartEqualsEnd(_Inout_ PRTL_RANGE_LIST RangeList, _Inout_ PRTL_RANGE Ranges)
static void TestSharedNullCallback(_Inout_ PRTL_RANGE_LIST RangeList, _Inout_ PRTL_RANGE Ranges)
static BOOLEAN NTAPI KeepConflictCallback(_In_ PVOID Context, _In_ struct _RTL_RANGE *Range)
static BOOLEAN NTAPI IgnoreConflictCallback(_In_ PVOID Context, _In_ struct _RTL_RANGE *Range)
#define expect_range_entries(RangeList, NumRanges, Ranges)
static void TestStartGreaterThanEnd(_Inout_ PRTL_RANGE_LIST RangeList, _Inout_ PRTL_RANGE Ranges)
#define is_range_available(RangeList, Start, End, pAvail)
static void TestIsAvailable(_Inout_ PRTL_RANGE_LIST RangeList, _Inout_ PRTL_RANGE Ranges)
static void TestInvertRangeList(void)
static void TestSharedFlag(_Inout_ PRTL_RANGE_LIST RangeList, _Inout_ PRTL_RANGE Ranges)
#define ok_eq_pointer(value, expected)
#define ok_eq_hex(value, expected)
#define ok_eq_ulong(value, expected)
#define ok_eq_ulonglong(value, expected)
#define ok_eq_bool(value, expected)
#define NT_SUCCESS(StatCode)
#define IsListEmpty(ListHead)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
BOOLEAN BOOLEAN KmtOk(INT Condition, PCSTR FileAndLine, PCSTR Format,...) KMT_FORMAT(ms_printf
BOOLEAN BOOLEAN VOID VOID BOOLEAN BOOLEAN KmtSkip(INT Condition, PCSTR FileAndLine, PCSTR Format,...) KMT_FORMAT(ms_printf
#define KmtInvalidPointer
NTSYSAPI NTSTATUS NTAPI RtlIsRangeAvailable(_In_ PRTL_RANGE_LIST RangeList, _In_ ULONGLONG Start, _In_ ULONGLONG End, _In_ ULONG Flags, _In_ UCHAR AttributeAvailableMask, _In_opt_ PVOID Context, _In_opt_ PRTL_CONFLICT_RANGE_CALLBACK Callback, _Out_ PBOOLEAN Available)
NTSYSAPI NTSTATUS NTAPI RtlDeleteOwnersRanges(_Inout_ PRTL_RANGE_LIST RangeList, _In_ _Maybenull_ PVOID Owner)
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ SaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ OwnerSize PSID Owner
NTSYSAPI NTSTATUS NTAPI RtlDeleteRange(_Inout_ PRTL_RANGE_LIST RangeList, _In_ ULONGLONG Start, _In_ ULONGLONG End, _In_ PVOID Owner)
NTSYSAPI NTSTATUS NTAPI RtlAddRange(_Inout_ PRTL_RANGE_LIST RangeList, _In_ ULONGLONG Start, _In_ ULONGLONG End, _In_ UCHAR Attributes, _In_ ULONG Flags, _In_opt_ PVOID UserData, _In_opt_ PVOID Owner)
NTSYSAPI NTSTATUS NTAPI RtlInvertRangeList(_Out_ PRTL_RANGE_LIST InvertedRangeList, _In_ PRTL_RANGE_LIST RangeList)
NTSYSAPI VOID NTAPI RtlInitializeRangeList(_Out_ PRTL_RANGE_LIST RangeList)
NTSYSAPI NTSTATUS NTAPI RtlGetLastRange(_In_ PRTL_RANGE_LIST RangeList, _Out_ PRTL_RANGE_LIST_ITERATOR Iterator, _Outptr_ PRTL_RANGE *Range)
NTSYSAPI NTSTATUS NTAPI RtlFindRange(_In_ PRTL_RANGE_LIST RangeList, _In_ ULONGLONG Minimum, _In_ ULONGLONG Maximum, _In_ ULONG Length, _In_ ULONG Alignment, _In_ ULONG Flags, _In_ UCHAR AttributeAvailableMask, _In_opt_ PVOID Context, _In_opt_ PRTL_CONFLICT_RANGE_CALLBACK Callback, _Out_ PULONGLONG Start)
NTSYSAPI NTSTATUS NTAPI RtlInvertRangeListEx(_Out_ PRTL_RANGE_LIST InvertedRangeList, _In_ PRTL_RANGE_LIST RangeList, _In_ UCHAR Attributes, _In_opt_ PVOID UserData, _In_opt_ PVOID Owner)
NTSYSAPI NTSTATUS NTAPI RtlGetNextRange(_Inout_ PRTL_RANGE_LIST_ITERATOR Iterator, _Outptr_ PRTL_RANGE *Range, _In_ BOOLEAN MoveForwards)
NTSYSAPI NTSTATUS NTAPI RtlGetFirstRange(_In_ PRTL_RANGE_LIST RangeList, _Out_ PRTL_RANGE_LIST_ITERATOR Iterator, _Outptr_ PRTL_RANGE *Range)
NTSYSAPI VOID NTAPI RtlFreeRangeList(_In_ PRTL_RANGE_LIST RangeList)
#define RTL_RANGE_LIST_ADD_IF_CONFLICT
#define RTL_RANGE_LIST_ADD_SHARED
#define RTL_RANGE_LIST_NULL_CONFLICT_OK
#define RTL_RANGE_LIST_SHARED_OK
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
#define UNREFERENCED_PARAMETER(P)
#define STATUS_NO_MORE_ENTRIES
#define STATUS_RANGE_LIST_CONFLICT
#define STATUS_RANGE_NOT_FOUND
NTSTRSAFEVAPI RtlStringCbPrintfA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,...)
#define RtlFillMemory(Dest, Length, Fill)
struct _LIST_ENTRY * Blink
struct _LIST_ENTRY * Flink
#define STATUS_INVALID_PARAMETER
_In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR Iterator
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
_Must_inspect_result_ _In_ WDFCMRESLIST List
_Must_inspect_result_ _In_ ULONG Flags