#include <rtl.h>
#include <debug.h>
Go to the source code of this file.
|
| NTSTATUS NTAPI | RtlAddRange (IN OUT PRTL_RANGE_LIST RangeList, IN ULONGLONG Start, IN ULONGLONG End, IN UCHAR Attributes, IN ULONG Flags, IN PVOID UserData OPTIONAL, IN PVOID Owner OPTIONAL) |
| |
| NTSTATUS NTAPI | RtlCopyRangeList (OUT PRTL_RANGE_LIST CopyRangeList, IN PRTL_RANGE_LIST RangeList) |
| |
| NTSTATUS NTAPI | RtlDeleteOwnersRanges (IN OUT PRTL_RANGE_LIST RangeList, IN PVOID Owner) |
| |
| NTSTATUS NTAPI | RtlDeleteRange (IN OUT PRTL_RANGE_LIST RangeList, IN ULONGLONG Start, IN ULONGLONG End, IN PVOID Owner) |
| |
| 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 PVOID Context OPTIONAL, IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL, OUT PULONGLONG Start) |
| |
| VOID NTAPI | RtlFreeRangeList (IN PRTL_RANGE_LIST RangeList) |
| |
| NTSTATUS NTAPI | RtlGetFirstRange (IN PRTL_RANGE_LIST RangeList, OUT PRTL_RANGE_LIST_ITERATOR Iterator, OUT PRTL_RANGE *Range) |
| |
| NTSTATUS NTAPI | RtlGetNextRange (IN OUT PRTL_RANGE_LIST_ITERATOR Iterator, OUT PRTL_RANGE *Range, IN BOOLEAN MoveForwards) |
| |
| VOID NTAPI | RtlInitializeRangeList (IN OUT PRTL_RANGE_LIST RangeList) |
| |
| NTSTATUS NTAPI | RtlInvertRangeList (OUT PRTL_RANGE_LIST InvertedRangeList, IN PRTL_RANGE_LIST RangeList) |
| |
| NTSTATUS NTAPI | RtlIsRangeAvailable (IN PRTL_RANGE_LIST RangeList, IN ULONGLONG Start, IN ULONGLONG End, IN ULONG Flags, IN UCHAR AttributeAvailableMask, IN PVOID Context OPTIONAL, IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL, OUT PBOOLEAN Available) |
| |
| NTSTATUS NTAPI | RtlMergeRangeLists (OUT PRTL_RANGE_LIST MergedRangeList, IN PRTL_RANGE_LIST RangeList1, IN PRTL_RANGE_LIST RangeList2, IN ULONG Flags) |
| |
◆ NDEBUG
◆ PRTL_RANGE_ENTRY
◆ RTL_RANGE_ENTRY
◆ RtlAddRange()
Definition at line 52 of file rangelist.c.
59{
61
64
67
68
70 if (RangeEntry ==
NULL)
72
73
79
83
84
85 if (RangeList->Count == 0)
86 {
89 RangeList->Count++;
90 RangeList->Stamp++;
92 }
93 else
94 {
95
96 Entry = RangeList->ListHead.Flink;
97 while (
Entry != &RangeList->ListHead)
98 {
101 {
102
103 DPRINT(
"Insert before current\n");
106
107 RangeList->Count++;
108 RangeList->Stamp++;
110 }
111
112
114 }
115
119 RangeList->Count++;
120 RangeList->Stamp++;
122 }
123
125
127}
PVOID NTAPI RtlpAllocateMemory(ULONG Bytes, ULONG Tag)
VOID NTAPI RtlpFreeMemory(PVOID Mem, ULONG Tag)
#define InsertTailList(ListHead, Entry)
_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
#define RTL_RANGE_LIST_ADD_SHARED
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
_Must_inspect_result_ _In_ ULONG Flags
Referenced by RtlInvertRangeList(), and RtlMergeRangeLists().
◆ RtlCopyRangeList()
Definition at line 148 of file rangelist.c.
150{
154
155 CopyRangeList->Flags = RangeList->Flags;
156
157 Entry = RangeList->ListHead.Flink;
158 while (
Entry != &RangeList->ListHead)
159 {
161
163 if (NewEntry ==
NULL)
165
169
172
173 CopyRangeList->Count++;
174
176 }
177
178 CopyRangeList->Stamp++;
179
181}
#define RtlCopyMemory(Destination, Source, Length)
Referenced by RtlMergeRangeLists().
◆ RtlDeleteOwnersRanges()
Definition at line 203 of file rangelist.c.
205{
208
209 Entry = RangeList->ListHead.Flink;
210 while (
Entry != &RangeList->ListHead)
211 {
214 {
217
218 RangeList->Count--;
219 RangeList->Stamp++;
220 }
221
223 }
224
226}
#define RemoveEntryList(Entry)
◆ RtlDeleteRange()
Definition at line 249 of file rangelist.c.
253{
256
257 Entry = RangeList->ListHead.Flink;
258 while (
Entry != &RangeList->ListHead)
259 {
264 {
266
268
269 RangeList->Count--;
270 RangeList->Stamp++;
272 }
273
275 }
276
278}
#define STATUS_RANGE_NOT_FOUND
◆ RtlFindRange()
Definition at line 310 of file rangelist.c.
320{
326
328 {
330 }
331
333 {
336 }
337
339 Entry = RangeList->ListHead.Blink;
340 while (
Entry != &RangeList->ListHead)
341 {
343
344 RangeMax = NextEntry ? (NextEntry->
Range.
Start - 1) : Maximum;
345 if (RangeMax + (
Length - 1) < Minimum)
346 {
348 }
349
351 if (RangeMin < Minimum ||
352 (RangeMax - RangeMin) < (
Length - 1))
353 {
355 }
356
357 DPRINT(
"RangeMax: %I64x\n", RangeMax);
358 DPRINT(
"RangeMin: %I64x\n", RangeMin);
359
360 if (RangeMin > CurrentEntry->
Range.
End)
361 {
364 }
365
366 NextEntry = CurrentEntry;
368 }
369
370 RangeMax = NextEntry ? (NextEntry->
Range.
Start - 1) : Maximum;
371 if (RangeMax + (
Length - 1) < Minimum)
372 {
374 }
375
377 if (RangeMin < Minimum ||
378 (RangeMax - RangeMin) < (
Length - 1))
379 {
381 }
382
383 DPRINT(
"RangeMax: %I64x\n", RangeMax);
384 DPRINT(
"RangeMin: %I64x\n", RangeMin);
385
387
389}
#define IsListEmpty(ListHead)
#define ROUND_DOWN(n, align)
_In_ ULONG _In_ ULONG _In_ ULONG Length
◆ RtlFreeRangeList()
Definition at line 409 of file rangelist.c.
410{
413
415 {
418
421
423 }
424
425 RangeList->Flags = 0;
426 RangeList->Count = 0;
427}
#define RemoveHeadList(ListHead)
◆ RtlGetFirstRange()
Definition at line 449 of file rangelist.c.
452{
453 Iterator->RangeListHead = &RangeList->ListHead;
456
458 {
462 }
463
464 Iterator->Current = RangeList->ListHead.Flink;
466
468}
#define STATUS_NO_MORE_ENTRIES
struct _RTL_RANGE_ENTRY * PRTL_RANGE_ENTRY
_In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR Iterator
Referenced by RtlMergeRangeLists().
◆ RtlGetNextRange()
Definition at line 491 of file rangelist.c.
494{
497
501
503 {
506 }
507
508 if (MoveForwards)
509 {
511 }
512 else
513 {
515 }
516
518 {
522 }
523
526
528}
STDMETHOD() Next(THIS_ ULONG celt, IAssociationElement *pElement, ULONG *pceltFetched) PURE
Referenced by RtlMergeRangeLists().
◆ RtlInitializeRangeList()
Definition at line 548 of file rangelist.c.
549{
551 RangeList->Flags = 0;
552 RangeList->Count = 0;
553 RangeList->Stamp = 0;
554}
#define InitializeListHead(ListHead)
◆ RtlInvertRangeList()
Definition at line 575 of file rangelist.c.
577{
582
583
585 Entry = RangeList->ListHead.Flink;
586 while (
Entry != &RangeList->ListHead)
587 {
589
590 if (Previous ==
NULL)
591 {
593 {
597 0,
598 0,
603 }
604 }
605 else
606 {
608 {
612 0,
613 0,
618 }
619 }
620
621 Previous = Current;
623 }
624
625
626 if (Previous ==
NULL)
627 {
628
630 }
631
632
634 {
638 0,
639 0,
644 }
645
647}
#define NT_SUCCESS(StatCode)
NTSTATUS NTAPI RtlAddRange(IN OUT PRTL_RANGE_LIST RangeList, IN ULONGLONG Start, IN ULONGLONG End, IN UCHAR Attributes, IN ULONG Flags, IN PVOID UserData OPTIONAL, IN PVOID Owner OPTIONAL)
◆ RtlIsRangeAvailable()
Definition at line 677 of file rangelist.c.
685{
688
690
691 Entry = RangeList->ListHead.Flink;
692 while (
Entry != &RangeList->ListHead)
693 {
695
700 {
702 {
705 }
706 else
707 {
709 }
710 }
711
713 }
714
716}
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
◆ RtlMergeRangeLists()
Definition at line 739 of file rangelist.c.
743{
747
748
750 RangeList1);
753
754
757 &Range);
760
762 {
771 break;
772
774 &Range,
777 break;
778 }
779
781}
NTSTATUS NTAPI RtlGetFirstRange(IN PRTL_RANGE_LIST RangeList, OUT PRTL_RANGE_LIST_ITERATOR Iterator, OUT PRTL_RANGE *Range)
NTSTATUS NTAPI RtlCopyRangeList(OUT PRTL_RANGE_LIST CopyRangeList, IN PRTL_RANGE_LIST RangeList)
NTSTATUS NTAPI RtlGetNextRange(IN OUT PRTL_RANGE_LIST_ITERATOR Iterator, OUT PRTL_RANGE *Range, IN BOOLEAN MoveForwards)