1 /******************************************************************************
2 * Runtime Library Functions *
3 ******************************************************************************/
7 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
9 #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x }
14 OUT PLIST_ENTRY ListHead
)
16 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
22 IN CONST LIST_ENTRY
* ListHead
)
24 return (BOOLEAN
)(ListHead
->Flink
== ListHead
);
35 OldFlink
= Entry
->Flink
;
36 OldBlink
= Entry
->Blink
;
37 OldFlink
->Blink
= OldBlink
;
38 OldBlink
->Flink
= OldFlink
;
39 return (BOOLEAN
)(OldFlink
== OldBlink
);
45 IN OUT PLIST_ENTRY ListHead
)
50 Entry
= ListHead
->Flink
;
52 ListHead
->Flink
= Flink
;
53 Flink
->Blink
= ListHead
;
60 IN OUT PLIST_ENTRY ListHead
)
65 Entry
= ListHead
->Blink
;
67 ListHead
->Blink
= Blink
;
68 Blink
->Flink
= ListHead
;
75 IN OUT PLIST_ENTRY ListHead
,
76 IN OUT PLIST_ENTRY Entry
)
79 OldBlink
= ListHead
->Blink
;
80 Entry
->Flink
= ListHead
;
81 Entry
->Blink
= OldBlink
;
82 OldBlink
->Flink
= Entry
;
83 ListHead
->Blink
= Entry
;
89 IN OUT PLIST_ENTRY ListHead
,
90 IN OUT PLIST_ENTRY Entry
)
93 OldFlink
= ListHead
->Flink
;
94 Entry
->Flink
= OldFlink
;
95 Entry
->Blink
= ListHead
;
96 OldFlink
->Blink
= Entry
;
97 ListHead
->Flink
= Entry
;
103 IN OUT PLIST_ENTRY ListHead
,
104 IN OUT PLIST_ENTRY ListToAppend
)
106 PLIST_ENTRY ListEnd
= ListHead
->Blink
;
108 ListHead
->Blink
->Flink
= ListToAppend
;
109 ListHead
->Blink
= ListToAppend
->Blink
;
110 ListToAppend
->Blink
->Flink
= ListHead
;
111 ListToAppend
->Blink
= ListEnd
;
117 IN OUT PSINGLE_LIST_ENTRY ListHead
)
119 PSINGLE_LIST_ENTRY FirstEntry
;
120 FirstEntry
= ListHead
->Next
;
121 if (FirstEntry
!= NULL
) {
122 ListHead
->Next
= FirstEntry
->Next
;
130 IN OUT PSINGLE_LIST_ENTRY ListHead
,
131 IN OUT PSINGLE_LIST_ENTRY Entry
)
133 Entry
->Next
= ListHead
->Next
;
134 ListHead
->Next
= Entry
;
137 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
143 IN PVOID FailedAssertion
,
150 * IN VOID UNALIGNED *Destination,
151 * IN CONST VOID UNALIGNED *Source,
154 #define RtlCopyMemory(Destination, Source, Length) \
155 memcpy(Destination, Source, Length)
157 #define RtlCopyBytes RtlCopyMemory
159 #if defined(_M_AMD64)
163 RtlCopyMemoryNonTemporal(
164 VOID UNALIGNED
*Destination
,
165 CONST VOID UNALIGNED
*Source
,
168 #define RtlCopyMemoryNonTemporal RtlCopyMemory
176 #define RtlEqualLuid(Luid1, Luid2) \
177 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
181 * IN VOID UNALIGNED *Destination,
182 * IN CONST VOID UNALIGNED *Source,
185 #define RtlEqualMemory(Destination, Source, Length) \
186 (!memcmp(Destination, Source, Length))
190 * IN VOID UNALIGNED *Destination,
194 #define RtlFillMemory(Destination, Length, Fill) \
195 memset(Destination, Fill, Length)
197 #define RtlFillBytes RtlFillMemory
202 RtlFreeUnicodeString(
203 IN OUT PUNICODE_STRING UnicodeString
);
209 IN PUNICODE_STRING GuidString
,
215 RtlInitUnicodeString(
216 IN OUT PUNICODE_STRING DestinationString
,
217 IN PCWSTR SourceString OPTIONAL
);
221 * IN VOID UNALIGNED *Destination,
222 * IN CONST VOID UNALIGNED *Source,
225 #define RtlMoveMemory(Destination, Source, Length) \
226 memmove(Destination, Source, Length)
233 OUT PUNICODE_STRING GuidString
);
237 * IN VOID UNALIGNED *Destination,
240 #define RtlZeroMemory(Destination, Length) \
241 memset(Destination, 0, Length)
243 #define RtlZeroBytes RtlZeroMemory
246 #if (NTDDI_VERSION >= NTDDI_WIN2K)
253 IN HANDLE HeapHandle
,
254 IN ULONG Flags OPTIONAL
,
262 IN ULONG Flags OPTIONAL
,
263 IN PVOID BaseAddress
);
269 #ifndef RTL_USE_AVL_TABLES
274 RtlInitializeGenericTable(
275 OUT PRTL_GENERIC_TABLE Table
,
276 IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine
,
277 IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine
,
278 IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine
,
279 IN PVOID TableContext OPTIONAL
);
284 RtlInsertElementGenericTable(
285 IN PRTL_GENERIC_TABLE Table
,
288 OUT PBOOLEAN NewElement OPTIONAL
);
293 RtlInsertElementGenericTableFull(
294 IN PRTL_GENERIC_TABLE Table
,
297 OUT PBOOLEAN NewElement OPTIONAL
,
298 IN PVOID NodeOrParent
,
299 IN TABLE_SEARCH_RESULT SearchResult
);
304 RtlDeleteElementGenericTable(
305 IN PRTL_GENERIC_TABLE Table
,
311 RtlLookupElementGenericTable(
312 IN PRTL_GENERIC_TABLE Table
,
318 RtlLookupElementGenericTableFull(
319 IN PRTL_GENERIC_TABLE Table
,
321 OUT PVOID
*NodeOrParent
,
322 OUT TABLE_SEARCH_RESULT
*SearchResult
);
327 RtlEnumerateGenericTable(
328 IN PRTL_GENERIC_TABLE Table
,
334 RtlEnumerateGenericTableWithoutSplaying(
335 IN PRTL_GENERIC_TABLE Table
,
336 IN OUT PVOID
*RestartKey
);
341 RtlGetElementGenericTable(
342 IN PRTL_GENERIC_TABLE Table
,
348 RtlNumberGenericTableElements(
349 IN PRTL_GENERIC_TABLE Table
);
354 RtlIsGenericTableEmpty(
355 IN PRTL_GENERIC_TABLE Table
);
357 #endif /* !RTL_USE_AVL_TABLES */
359 #define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8
365 IN OUT PRTL_SPLAY_LINKS Links
);
371 IN PRTL_SPLAY_LINKS Links
);
377 IN PRTL_SPLAY_LINKS Links
,
378 IN OUT PRTL_SPLAY_LINKS
*Root
);
384 IN PRTL_SPLAY_LINKS Links
);
389 RtlSubtreePredecessor(
390 IN PRTL_SPLAY_LINKS Links
);
396 IN PRTL_SPLAY_LINKS Links
);
402 IN PRTL_SPLAY_LINKS Links
);
407 RtlPrefixUnicodeString(
408 IN PCUNICODE_STRING String1
,
409 IN PCUNICODE_STRING String2
,
410 IN BOOLEAN CaseInSensitive
);
416 IN OUT PSTRING DestinationString
,
417 IN
const PSTRING SourceString
);
422 RtlUpcaseUnicodeString(
423 IN OUT PUNICODE_STRING DestinationString
,
424 IN PCUNICODE_STRING SourceString
,
425 IN BOOLEAN AllocateDestinationString
);
431 IN OUT PACCESS_MASK AccessMask
,
432 IN PGENERIC_MAPPING GenericMapping
);
437 RtlVolumeDeviceToDosName(
438 IN PVOID VolumeDeviceObject
,
439 OUT PUNICODE_STRING DosName
);
445 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation
);
450 RtlVerifyVersionInfo(
451 IN PRTL_OSVERSIONINFOEXW VersionInfo
,
453 IN ULONGLONG ConditionMask
);
459 IN
const PSTRING String1
,
460 IN
const PSTRING String2
,
461 IN BOOLEAN CaseInSensitive
);
467 OUT PSTRING DestinationString
,
468 IN
const PSTRING SourceString OPTIONAL
);
474 IN
const PSTRING String1
,
475 IN
const PSTRING String2
,
476 IN BOOLEAN CaseInSensitive
);
483 IN ULONG Base OPTIONAL
,
507 IN PRTL_BITMAP BitMapHeader
,
508 IN ULONG StartingIndex
,
515 IN PRTL_BITMAP BitMapHeader
,
516 IN ULONG StartingIndex
,
522 RtlAnsiStringToUnicodeString(
523 IN OUT PUNICODE_STRING DestinationString
,
524 IN PANSI_STRING SourceString
,
525 IN BOOLEAN AllocateDestinationString
);
530 RtlxAnsiStringToUnicodeSize(
531 IN PCANSI_STRING AnsiString
);
533 #define RtlAnsiStringToUnicodeSize(String) ( \
534 NLS_MB_CODE_PAGE_TAG ? \
535 RtlxAnsiStringToUnicodeSize(String) : \
536 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
542 RtlAppendUnicodeStringToString(
543 IN OUT PUNICODE_STRING Destination
,
544 IN PCUNICODE_STRING Source
);
549 RtlAppendUnicodeToString(
550 IN OUT PUNICODE_STRING Destination
,
564 IN PRTL_BITMAP BitMapHeader
);
570 IN PRTL_BITMAP BitMapHeader
,
571 IN ULONG StartingIndex
,
572 IN ULONG NumberToClear
);
578 IN CONST VOID
*Source1
,
579 IN CONST VOID
*Source2
,
585 RtlCompareUnicodeString(
586 IN PCUNICODE_STRING String1
,
587 IN PCUNICODE_STRING String2
,
588 IN BOOLEAN CaseInSensitive
);
593 RtlCompareUnicodeStrings(
595 IN SIZE_T String1Length
,
597 IN SIZE_T String2Length
,
598 IN BOOLEAN CaseInSensitive
);
603 RtlCopyUnicodeString(
604 IN OUT PUNICODE_STRING DestinationString
,
605 IN PCUNICODE_STRING SourceString OPTIONAL
);
610 RtlCreateRegistryKey(
617 RtlCreateSecurityDescriptor(
618 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
624 RtlDeleteRegistryValue(
627 IN PCWSTR ValueName
);
632 RtlEqualUnicodeString(
633 IN CONST UNICODE_STRING
*String1
,
634 IN CONST UNICODE_STRING
*String2
,
635 IN BOOLEAN CaseInSensitive
);
637 #if !defined(_AMD64_) && !defined(_IA64_)
641 RtlExtendedIntegerMultiply(
642 IN LARGE_INTEGER Multiplicand
,
648 RtlExtendedLargeIntegerDivide(
649 IN LARGE_INTEGER Dividend
,
651 OUT PULONG Remainder OPTIONAL
);
654 #if defined(_X86_) || defined(_IA64_)
658 RtlExtendedMagicDivide(
659 IN LARGE_INTEGER Dividend
,
660 IN LARGE_INTEGER MagicDivisor
,
661 IN CCHAR ShiftCount
);
668 IN PANSI_STRING AnsiString
);
674 IN PRTL_BITMAP BitMapHeader
,
675 IN ULONG NumberToFind
,
681 RtlFindClearBitsAndSet(
682 IN PRTL_BITMAP BitMapHeader
,
683 IN ULONG NumberToFind
,
689 RtlFindFirstRunClear(
690 IN PRTL_BITMAP BitMapHeader
,
691 OUT PULONG StartingIndex
);
697 IN PRTL_BITMAP BitMapHeader
,
698 OUT PRTL_BITMAP_RUN RunArray
,
699 IN ULONG SizeOfRunArray
,
700 IN BOOLEAN LocateLongestRuns
);
705 RtlFindLastBackwardRunClear(
706 IN PRTL_BITMAP BitMapHeader
,
708 OUT PULONG StartingRunIndex
);
713 RtlFindLeastSignificantBit(
719 RtlFindLongestRunClear(
720 IN PRTL_BITMAP BitMapHeader
,
721 OUT PULONG StartingIndex
);
726 RtlFindMostSignificantBit(
732 RtlFindNextForwardRunClear(
733 IN PRTL_BITMAP BitMapHeader
,
735 OUT PULONG StartingRunIndex
);
741 IN PRTL_BITMAP BitMapHeader
,
742 IN ULONG NumberToFind
,
748 RtlFindSetBitsAndClear(
749 IN PRTL_BITMAP BitMapHeader
,
750 IN ULONG NumberToFind
,
757 IN OUT PANSI_STRING DestinationString
,
758 IN PCSZ SourceString
);
764 IN PRTL_BITMAP BitMapHeader
,
765 IN PULONG BitMapBuffer
,
766 IN ULONG SizeOfBitMap
);
772 IN OUT PSTRING DestinationString
,
773 IN PCSZ SourceString
);
778 RtlIntegerToUnicodeString(
780 IN ULONG Base OPTIONAL
,
781 IN OUT PUNICODE_STRING String
);
786 RtlInt64ToUnicodeString(
788 IN ULONG Base OPTIONAL
,
789 IN OUT PUNICODE_STRING String
);
792 #define RtlIntPtrToUnicodeString(Value, Base, String) \
793 RtlInt64ToUnicodeString(Value, Base, String)
795 #define RtlIntPtrToUnicodeString(Value, Base, String) \
796 RtlIntegerToUnicodeString(Value, Base, String)
803 #define RtlIsZeroLuid(_L1) \
804 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
809 RtlLengthSecurityDescriptor(
810 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
815 RtlNumberOfClearBits(
816 IN PRTL_BITMAP BitMapHeader
);
822 IN PRTL_BITMAP BitMapHeader
);
827 RtlQueryRegistryValues(
830 IN OUT PRTL_QUERY_REGISTRY_TABLE QueryTable
,
831 IN PVOID Context OPTIONAL
,
832 IN PVOID Environment OPTIONAL
);
834 #define SHORT_SIZE (sizeof(USHORT))
835 #define SHORT_MASK (SHORT_SIZE - 1)
836 #define LONG_SIZE (sizeof(LONG))
837 #define LONGLONG_SIZE (sizeof(LONGLONG))
838 #define LONG_MASK (LONG_SIZE - 1)
839 #define LONGLONG_MASK (LONGLONG_SIZE - 1)
840 #define LOWBYTE_MASK 0x00FF
842 #define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK)
843 #define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK)
844 #define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK)
845 #define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK)
851 IN PRTL_BITMAP BitMapHeader
);
857 IN PRTL_BITMAP BitMapHeader
,
858 IN ULONG StartingIndex
,
859 IN ULONG NumberToSet
);
864 RtlSetDaclSecurityDescriptor(
865 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
866 IN BOOLEAN DaclPresent
,
867 IN PACL Dacl OPTIONAL
,
868 IN BOOLEAN DaclDefaulted OPTIONAL
);
877 #define RtlStoreUlong(Address,Value) \
878 *(ULONG UNALIGNED *)(Address) = (Value)
882 * IN OUT PULONGLONG Address,
885 #define RtlStoreUlonglong(Address,Value) \
886 *(ULONGLONG UNALIGNED *)(Address) = (Value)
890 * IN PUSHORT Address,
893 #define RtlStoreUshort(Address,Value) \
894 *(USHORT UNALIGNED *)(Address) = (Value)
898 * PUSHORT DestinationAddress,
899 * PUSHORT SourceAddress);
901 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
902 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
906 * PULONG DestinationAddress,
907 * PULONG SourceAddress);
909 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
910 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
914 #define RtlStoreUlong(Address,Value) \
915 if ((ULONG_PTR)(Address) & LONG_MASK) { \
916 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
917 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
918 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
919 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
922 *((PULONG)(Address)) = (ULONG) (Value); \
925 #define RtlStoreUlonglong(Address,Value) \
926 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
927 RtlStoreUlong((ULONG_PTR)(Address), \
928 (ULONGLONG)(Value) & 0xFFFFFFFF); \
929 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
930 (ULONGLONG)(Value) >> 32); \
932 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
935 #define RtlStoreUshort(Address,Value) \
936 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
937 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
938 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
941 *((PUSHORT) (Address)) = (USHORT)Value; \
944 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
945 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
947 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
948 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
952 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
955 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
956 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
958 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
959 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
960 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
961 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
965 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
968 #endif /* defined(_AMD64_) */
973 * IN OUT PULONG_PTR Address,
974 * IN ULONG_PTR Value);
976 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value)
978 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
986 IN PTIME_FIELDS TimeFields
,
987 IN PLARGE_INTEGER Time
);
993 IN PLARGE_INTEGER Time
,
994 IN PTIME_FIELDS TimeFields
);
1005 RtlUlonglongByteSwap(
1006 IN ULONGLONG Source
);
1011 RtlUnicodeStringToAnsiString(
1012 IN OUT PANSI_STRING DestinationString
,
1013 IN PCUNICODE_STRING SourceString
,
1014 IN BOOLEAN AllocateDestinationString
);
1019 RtlxUnicodeStringToAnsiSize(
1020 IN PCUNICODE_STRING UnicodeString
);
1022 #define RtlUnicodeStringToAnsiSize(String) ( \
1023 NLS_MB_CODE_PAGE_TAG ? \
1024 RtlxUnicodeStringToAnsiSize(String) : \
1025 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1031 RtlUnicodeStringToInteger(
1032 IN PCUNICODE_STRING String
,
1033 IN ULONG Base OPTIONAL
,
1039 RtlUpcaseUnicodeChar(
1040 IN WCHAR SourceCharacter
);
1051 RtlValidRelativeSecurityDescriptor(
1052 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
1053 IN ULONG SecurityDescriptorLength
,
1054 IN SECURITY_INFORMATION RequiredInformation
);
1059 RtlValidSecurityDescriptor(
1060 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1065 RtlWriteRegistryValue(
1066 IN ULONG RelativeTo
,
1068 IN PCWSTR ValueName
,
1071 IN ULONG ValueLength
);
1075 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
1079 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1083 RtlPrefetchMemoryNonTemporal(
1090 #if (NTDDI_VERSION >= NTDDI_WINXP)
1097 RtlInitializeGenericTableAvl(
1098 OUT PRTL_AVL_TABLE Table
,
1099 IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine
,
1100 IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine
,
1101 IN PRTL_AVL_FREE_ROUTINE FreeRoutine
,
1102 IN PVOID TableContext OPTIONAL
);
1107 RtlInsertElementGenericTableAvl(
1108 IN PRTL_AVL_TABLE Table
,
1110 IN CLONG BufferSize
,
1111 OUT PBOOLEAN NewElement OPTIONAL
);
1116 RtlInsertElementGenericTableFullAvl(
1117 IN PRTL_AVL_TABLE Table
,
1119 IN CLONG BufferSize
,
1120 OUT PBOOLEAN NewElement OPTIONAL
,
1121 IN PVOID NodeOrParent
,
1122 IN TABLE_SEARCH_RESULT SearchResult
);
1127 RtlDeleteElementGenericTableAvl(
1128 IN PRTL_AVL_TABLE Table
,
1134 RtlLookupElementGenericTableAvl(
1135 IN PRTL_AVL_TABLE Table
,
1141 RtlLookupElementGenericTableFullAvl(
1142 IN PRTL_AVL_TABLE Table
,
1144 OUT PVOID
*NodeOrParent
,
1145 OUT TABLE_SEARCH_RESULT
*SearchResult
);
1150 RtlEnumerateGenericTableAvl(
1151 IN PRTL_AVL_TABLE Table
,
1152 IN BOOLEAN Restart
);
1157 RtlEnumerateGenericTableWithoutSplayingAvl(
1158 IN PRTL_AVL_TABLE Table
,
1159 IN OUT PVOID
*RestartKey
);
1164 RtlLookupFirstMatchingElementGenericTableAvl(
1165 IN PRTL_AVL_TABLE Table
,
1167 OUT PVOID
*RestartKey
);
1172 RtlEnumerateGenericTableLikeADirectory(
1173 IN PRTL_AVL_TABLE Table
,
1174 IN PRTL_AVL_MATCH_FUNCTION MatchFunction OPTIONAL
,
1175 IN PVOID MatchData OPTIONAL
,
1177 IN OUT PVOID
*RestartKey
,
1178 IN OUT PULONG DeleteCount
,
1184 RtlGetElementGenericTableAvl(
1185 IN PRTL_AVL_TABLE Table
,
1191 RtlNumberGenericTableElementsAvl(
1192 IN PRTL_AVL_TABLE Table
);
1197 RtlIsGenericTableEmptyAvl(
1198 IN PRTL_AVL_TABLE Table
);
1208 PRTL_BITMAP BitMapHeader
,
1214 RtlDowncaseUnicodeChar(
1215 IN WCHAR SourceCharacter
);
1221 PRTL_BITMAP BitMapHeader
,
1228 IN PRTL_BITMAP BitMapHeader
,
1229 IN ULONG BitNumber
);
1234 RtlHashUnicodeString(
1235 IN CONST UNICODE_STRING
*String
,
1236 IN BOOLEAN CaseInSensitive
,
1237 IN ULONG HashAlgorithm
,
1238 OUT PULONG HashValue
);
1242 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1244 #if (NTDDI_VERSION >= NTDDI_VISTA)
1251 RtlRunOnceInitialize(
1252 OUT PRTL_RUN_ONCE RunOnce
);
1257 RtlRunOnceExecuteOnce(
1258 IN OUT PRTL_RUN_ONCE RunOnce
,
1259 IN PRTL_RUN_ONCE_INIT_FN InitFn
,
1260 IN OUT PVOID Parameter OPTIONAL
,
1261 OUT PVOID
*Context OPTIONAL
);
1266 RtlRunOnceBeginInitialize(
1267 IN OUT PRTL_RUN_ONCE RunOnce
,
1269 OUT PVOID
*Context OPTIONAL
);
1275 IN OUT PRTL_RUN_ONCE RunOnce
,
1277 IN PVOID Context OPTIONAL
);
1283 IN ULONG OSMajorVersion
,
1284 IN ULONG OSMinorVersion
,
1285 IN ULONG SpMajorVersion
,
1286 IN ULONG SpMinorVersion
,
1287 OUT PULONG ReturnedProductType
);
1296 RtlNumberOfSetBitsUlongPtr(
1297 IN ULONG_PTR Target
);
1302 RtlIoDecodeMemIoResource(
1303 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
1304 OUT PULONGLONG Alignment OPTIONAL
,
1305 OUT PULONGLONG MinimumAddress OPTIONAL
,
1306 OUT PULONGLONG MaximumAddress OPTIONAL
);
1311 RtlIoEncodeMemIoResource(
1312 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
1314 IN ULONGLONG Length
,
1315 IN ULONGLONG Alignment
,
1316 IN ULONGLONG MinimumAddress
,
1317 IN ULONGLONG MaximumAddress
);
1322 RtlCmDecodeMemIoResource(
1323 IN
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
*Descriptor
,
1324 OUT PULONGLONG Start OPTIONAL
);
1329 RtlFindClosestEncodableLength(
1330 IN ULONGLONG SourceLength
,
1331 OUT PULONGLONG TargetLength
);
1336 RtlCmEncodeMemIoResource(
1337 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
1339 IN ULONGLONG Length
,
1340 IN ULONGLONG Start
);
1344 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1346 #if (NTDDI_VERSION >= NTDDI_WIN7)
1354 IN OUT PRTL_DYNAMIC_HASH_TABLE
*HashTable OPTIONAL
,
1362 IN PRTL_DYNAMIC_HASH_TABLE HashTable
);
1367 RtlInsertEntryHashTable(
1368 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
1369 IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry
,
1370 IN ULONG_PTR Signature
,
1371 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL
);
1376 RtlRemoveEntryHashTable(
1377 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
1378 IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry
,
1379 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL
);
1382 PRTL_DYNAMIC_HASH_TABLE_ENTRY
1384 RtlLookupEntryHashTable(
1385 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
1386 IN ULONG_PTR Signature
,
1387 OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL
);
1390 PRTL_DYNAMIC_HASH_TABLE_ENTRY
1392 RtlGetNextEntryHashTable(
1393 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
1394 IN PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context
);
1399 RtlInitEnumerationHashTable(
1400 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
1401 OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
);
1404 PRTL_DYNAMIC_HASH_TABLE_ENTRY
1406 RtlEnumerateEntryHashTable(
1407 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
1408 IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
);
1413 RtlEndEnumerationHashTable(
1414 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
1415 IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
);
1420 RtlInitWeakEnumerationHashTable(
1421 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
1422 OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
);
1425 PRTL_DYNAMIC_HASH_TABLE_ENTRY
1427 RtlWeaklyEnumerateEntryHashTable(
1428 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
1429 IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
);
1434 RtlEndWeakEnumerationHashTable(
1435 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
1436 IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
);
1442 IN PRTL_DYNAMIC_HASH_TABLE HashTable
);
1447 RtlContractHashTable(
1448 IN PRTL_DYNAMIC_HASH_TABLE HashTable
);
1458 OUT PCHAR UTF8StringDestination
,
1459 IN ULONG UTF8StringMaxByteCount
,
1460 OUT PULONG UTF8StringActualByteCount
,
1461 IN PCWCH UnicodeStringSource
,
1462 IN ULONG UnicodeStringByteCount
);
1468 OUT PWSTR UnicodeStringDestination
,
1469 IN ULONG UnicodeStringMaxByteCount
,
1470 OUT PULONG UnicodeStringActualByteCount
,
1471 IN PCCH UTF8StringSource
,
1472 IN ULONG UTF8StringByteCount
);
1477 RtlGetEnabledExtendedFeatures(
1478 IN ULONG64 FeatureMask
);
1482 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1486 #if !defined(MIDL_PASS)
1487 /* inline funftions */
1488 //DECLSPEC_DEPRECATED_DDK_WINXP
1492 RtlConvertLongToLargeInteger(
1493 IN LONG SignedInteger
)
1496 ret
.QuadPart
= SignedInteger
;
1500 //DECLSPEC_DEPRECATED_DDK_WINXP
1504 RtlConvertUlongToLargeInteger(
1505 IN ULONG UnsignedInteger
)
1508 ret
.QuadPart
= UnsignedInteger
;
1512 //DECLSPEC_DEPRECATED_DDK_WINXP
1516 RtlLargeIntegerShiftLeft(
1517 IN LARGE_INTEGER LargeInteger
,
1518 IN CCHAR ShiftCount
)
1520 LARGE_INTEGER Result
;
1522 Result
.QuadPart
= LargeInteger
.QuadPart
<< ShiftCount
;
1526 //DECLSPEC_DEPRECATED_DDK_WINXP
1530 RtlLargeIntegerShiftRight(
1531 IN LARGE_INTEGER LargeInteger
,
1532 IN CCHAR ShiftCount
)
1534 LARGE_INTEGER Result
;
1536 Result
.QuadPart
= (ULONG64
)LargeInteger
.QuadPart
>> ShiftCount
;
1540 //DECLSPEC_DEPRECATED_DDK
1544 RtlEnlargedUnsignedDivide(
1545 IN ULARGE_INTEGER Dividend
,
1547 IN OUT PULONG Remainder
)
1550 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
1551 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
1554 //DECLSPEC_DEPRECATED_DDK
1558 RtlLargeIntegerNegate(
1559 IN LARGE_INTEGER Subtrahend
)
1561 LARGE_INTEGER Difference
;
1563 Difference
.QuadPart
= -Subtrahend
.QuadPart
;
1567 //DECLSPEC_DEPRECATED_DDK
1571 RtlLargeIntegerSubtract(
1572 IN LARGE_INTEGER Minuend
,
1573 IN LARGE_INTEGER Subtrahend
)
1575 LARGE_INTEGER Difference
;
1577 Difference
.QuadPart
= Minuend
.QuadPart
- Subtrahend
.QuadPart
;
1581 //DECLSPEC_DEPRECATED_DDK
1585 RtlEnlargedUnsignedMultiply(
1586 IN ULONG Multiplicand
,
1587 IN ULONG Multiplier
)
1590 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1594 //DECLSPEC_DEPRECATED_DDK
1598 RtlEnlargedIntegerMultiply(
1599 IN LONG Multiplicand
,
1603 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1609 RtlInitEmptyAnsiString(
1610 OUT PANSI_STRING AnsiString
,
1612 IN USHORT BufferSize
)
1614 AnsiString
->Length
= 0;
1615 AnsiString
->MaximumLength
= BufferSize
;
1616 AnsiString
->Buffer
= Buffer
;
1621 RtlInitEmptyUnicodeString(
1622 OUT PUNICODE_STRING UnicodeString
,
1624 IN USHORT BufferSize
)
1626 UnicodeString
->Length
= 0;
1627 UnicodeString
->MaximumLength
= BufferSize
;
1628 UnicodeString
->Buffer
= Buffer
;
1632 #if defined(_AMD64_) || defined(_IA64_)
1639 RtlExtendedIntegerMultiply(
1640 IN LARGE_INTEGER Multiplicand
,
1644 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
1651 RtlExtendedLargeIntegerDivide(
1652 IN LARGE_INTEGER Dividend
,
1654 OUT PULONG Remainder OPTIONAL
)
1657 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
1659 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
1667 //DECLSPEC_DEPRECATED_DDK_WINXP
1671 RtlLargeIntegerDivide(
1672 IN LARGE_INTEGER Dividend
,
1673 IN LARGE_INTEGER Divisor
,
1674 OUT PLARGE_INTEGER Remainder OPTIONAL
)
1677 ret
.QuadPart
= Dividend
.QuadPart
/ Divisor
.QuadPart
;
1679 Remainder
->QuadPart
= Dividend
.QuadPart
% Divisor
.QuadPart
;
1685 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1689 RtlLargeIntegerDivide(
1690 IN LARGE_INTEGER Dividend
,
1691 IN LARGE_INTEGER Divisor
,
1692 OUT PLARGE_INTEGER Remainder OPTIONAL
);
1697 #endif /* defined(_AMD64_) || defined(_IA64_) */
1701 #if defined(_AMD64_)
1703 #define MultiplyHigh __mulh
1704 #define UnsignedMultiplyHigh __umulh
1706 //DECLSPEC_DEPRECATED_DDK
1710 RtlExtendedMagicDivide(
1711 IN LARGE_INTEGER Dividend
,
1712 IN LARGE_INTEGER MagicDivisor
,
1713 IN CCHAR ShiftCount
)
1718 Pos
= (Dividend
.QuadPart
>= 0);
1719 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
1720 MagicDivisor
.QuadPart
);
1721 ret64
>>= ShiftCount
;
1722 ret
.QuadPart
= Pos
? ret64
: -ret64
;
1727 //DECLSPEC_DEPRECATED_DDK
1732 IN LARGE_INTEGER Addend1
,
1733 IN LARGE_INTEGER Addend2
)
1736 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
1741 * RtlLargeIntegerAnd(
1742 * IN OUT LARGE_INTEGER Result,
1743 * IN LARGE_INTEGER Source,
1744 * IN LARGE_INTEGER Mask);
1746 #define RtlLargeIntegerAnd(Result, Source, Mask) \
1747 Result.QuadPart = Source.QuadPart & Mask.QuadPart
1749 //DECLSPEC_DEPRECATED_DDK
1753 RtlLargeIntegerArithmeticShift(
1754 IN LARGE_INTEGER LargeInteger
,
1755 IN CCHAR ShiftCount
)
1758 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
1763 * RtlLargeIntegerEqualTo(
1764 * IN LARGE_INTEGER Operand1,
1765 * IN LARGE_INTEGER Operand2);
1767 #define RtlLargeIntegerEqualTo(X,Y) \
1768 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
1772 RtlSecureZeroMemory(
1776 volatile char* vptr
= (volatile char*)Pointer
;
1777 #if defined(_M_AMD64)
1778 __stosb((PUCHAR
)vptr
, 0, Size
);
1780 char * endptr
= (char *)vptr
+ Size
;
1781 while (vptr
< endptr
) {
1788 #if defined(_M_AMD64)
1792 IN PRTL_BITMAP BitMapHeader
,
1793 IN ULONG BitPosition
)
1795 return BitTest64((LONG64 CONST
*)BitMapHeader
->Buffer
, (LONG64
)BitPosition
);
1798 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
1799 #endif /* defined(_M_AMD64) */
1801 #define RtlLargeIntegerGreaterThan(X,Y) ( \
1802 (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
1803 ((X).HighPart > (Y).HighPart) \
1806 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
1807 (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
1808 ((X).HighPart > (Y).HighPart) \
1811 #define RtlLargeIntegerNotEqualTo(X,Y) ( \
1812 (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
1815 #define RtlLargeIntegerLessThan(X,Y) ( \
1816 (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
1817 ((X).HighPart < (Y).HighPart) \
1820 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
1821 (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
1822 ((X).HighPart < (Y).HighPart) \
1825 #define RtlLargeIntegerGreaterThanZero(X) ( \
1826 (((X).HighPart == 0) && ((X).LowPart > 0)) || \
1827 ((X).HighPart > 0 ) \
1830 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
1832 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
1834 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
1836 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
1838 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
1840 #endif /* !defined(MIDL_PASS) */
1842 /* Byte Swap Functions */
1843 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
1844 ((defined(_M_AMD64) || defined(_M_IA64)) \
1845 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
1847 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1848 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1849 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1855 #define ASSERT(exp) \
1857 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
1859 #define ASSERTMSG(msg, exp) \
1861 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
1863 #define RTL_SOFT_ASSERT(exp) \
1865 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
1867 #define RTL_SOFT_ASSERTMSG(msg, exp) \
1869 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
1871 #define RTL_VERIFY(exp) ASSERT(exp)
1872 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
1874 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
1875 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
1877 #if defined(_MSC_VER)
1879 #define NT_ASSERT(exp) \
1881 (__annotation(L"Debug", L"AssertFail", L#exp), \
1882 DbgRaiseAssertionFailure(), FALSE) : TRUE)
1884 #define NT_ASSERTMSG(msg, exp) \
1886 (__annotation(L"Debug", L"AssertFail", L##msg), \
1887 DbgRaiseAssertionFailure(), FALSE) : TRUE)
1889 #define NT_ASSERTMSGW(msg, exp) \
1891 (__annotation(L"Debug", L"AssertFail", msg), \
1892 DbgRaiseAssertionFailure(), FALSE) : TRUE)
1894 #define NT_VERIFY NT_ASSERT
1895 #define NT_VERIFYMSG NT_ASSERTMSG
1896 #define NT_VERIFYMSGW NT_ASSERTMSGW
1900 /* GCC doesn't support __annotation (nor PDB) */
1901 #define NT_ASSERT(exp) \
1902 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
1904 #define NT_ASSERTMSG NT_ASSERT
1905 #define NT_ASSERTMSGW NT_ASSERT
1911 #define ASSERT(exp) ((VOID) 0)
1912 #define ASSERTMSG(msg, exp) ((VOID) 0)
1914 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
1915 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
1917 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
1918 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
1920 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
1921 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
1923 #define NT_ASSERT(exp) ((VOID)0)
1924 #define NT_ASSERTMSG(msg, exp) ((VOID)0)
1925 #define NT_ASSERTMSGW(msg, exp) ((VOID)0)
1927 #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE)
1928 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
1929 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
1933 #define InitializeListHead32(ListHead) (\
1934 (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
1936 #if !defined(_WINBASE_)
1938 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
1942 InitializeSListHead(
1943 OUT PSLIST_HEADER SListHead
);
1949 InitializeSListHead(
1950 OUT PSLIST_HEADER SListHead
)
1953 ULONG64 FeatureBits
;
1957 if (((ULONG_PTR
)SListHead
& 0xf) != 0) {
1958 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT
);
1961 RtlZeroMemory(SListHead
, sizeof(SLIST_HEADER
));
1963 FeatureBits
= __getReg(CV_IA64_CPUID4
);
1964 if ((FeatureBits
& KF_16BYTE_INSTR
) != 0) {
1965 SListHead
->Header16
.HeaderType
= 1;
1966 SListHead
->Header16
.Init
= 1;
1975 #define InterlockedPopEntrySList(Head) \
1976 ExpInterlockedPopEntrySList(Head)
1978 #define InterlockedPushEntrySList(Head, Entry) \
1979 ExpInterlockedPushEntrySList(Head, Entry)
1981 #define InterlockedFlushSList(Head) \
1982 ExpInterlockedFlushSList(Head)
1984 #define QueryDepthSList(Head) \
1985 ExQueryDepthSList(Head)
1987 #else /* !defined(_WIN64) */
1992 InterlockedPopEntrySList(
1993 IN PSLIST_HEADER ListHead
);
1998 InterlockedPushEntrySList(
1999 IN PSLIST_HEADER ListHead
,
2000 IN PSLIST_ENTRY ListEntry
);
2002 #define InterlockedFlushSList(ListHead) \
2003 ExInterlockedFlushSList(ListHead)
2005 #define QueryDepthSList(Head) \
2006 ExQueryDepthSList(Head)
2008 #endif /* !defined(_WIN64) */
2010 #endif /* !defined(_WINBASE_) */
2012 #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
2013 #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
2014 #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \
2015 ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
2016 #define RTL_CONTEXT_OFFSET(Context, Chunk) \
2017 RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
2018 #define RTL_CONTEXT_LENGTH(Context, Chunk) \
2019 RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
2020 #define RTL_CONTEXT_CHUNK(Context, Chunk) \
2021 RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \
2022 (PCONTEXT_EX)(Context + 1), \
2026 RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable
)(
2030 RTLVERLIB_DDI(RtlIsServicePackVersionInstalled
)(
2033 #ifndef RtlIsNtDdiVersionAvailable
2034 #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable
2037 #ifndef RtlIsServicePackVersionInstalled
2038 #define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled
2041 #define RtlInterlockedSetBits(Flags, Flag) \
2042 InterlockedOr((PLONG)(Flags), Flag)
2044 #define RtlInterlockedAndBits(Flags, Flag) \
2045 InterlockedAnd((PLONG)(Flags), Flag)
2047 #define RtlInterlockedClearBits(Flags, Flag) \
2048 RtlInterlockedAndBits(Flags, ~(Flag))
2050 #define RtlInterlockedXorBits(Flags, Flag) \
2051 InterlockedXor(Flags, Flag)
2053 #define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \
2054 (VOID) RtlInterlockedSetBits(Flags, Flag)
2056 #define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \
2057 (VOID) RtlInterlockedAndBits(Flags, Flag)
2059 #define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
2060 RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))
2066 #ifdef RTL_USE_AVL_TABLES
2068 #define RtlInitializeGenericTable RtlInitializeGenericTableAvl
2069 #define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl
2070 #define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl
2071 #define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl
2072 #define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl
2073 #define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl
2074 #define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl
2075 #define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl
2076 #define RtlGetElementGenericTable RtlGetElementGenericTableAvl
2077 #define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl
2078 #define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl
2080 #endif /* RTL_USE_AVL_TABLES */
2082 #define RtlInitializeSplayLinks(Links) { \
2083 PRTL_SPLAY_LINKS _SplayLinks; \
2084 _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
2085 _SplayLinks->Parent = _SplayLinks; \
2086 _SplayLinks->LeftChild = NULL; \
2087 _SplayLinks->RightChild = NULL; \
2090 #define RtlIsLeftChild(Links) \
2091 (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
2093 #define RtlIsRightChild(Links) \
2094 (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
2096 #define RtlRightChild(Links) \
2097 ((PRTL_SPLAY_LINKS)(Links))->RightChild
2099 #define RtlIsRoot(Links) \
2100 (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
2102 #define RtlLeftChild(Links) \
2103 ((PRTL_SPLAY_LINKS)(Links))->LeftChild
2105 #define RtlParent(Links) \
2106 ((PRTL_SPLAY_LINKS)(Links))->Parent
2108 #define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \
2110 PRTL_SPLAY_LINKS _SplayParent; \
2111 PRTL_SPLAY_LINKS _SplayChild; \
2112 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
2113 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
2114 _SplayParent->LeftChild = _SplayChild; \
2115 _SplayChild->Parent = _SplayParent; \
2118 #define RtlInsertAsRightChild(ParentLinks,ChildLinks) \
2120 PRTL_SPLAY_LINKS _SplayParent; \
2121 PRTL_SPLAY_LINKS _SplayChild; \
2122 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
2123 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
2124 _SplayParent->RightChild = _SplayChild; \
2125 _SplayChild->Parent = _SplayParent; \
2128 #if !defined(MIDL_PASS)
2133 RtlConvertLongToLuid(
2139 Temp
.QuadPart
= Val
;
2140 Luid
.LowPart
= Temp
.u
.LowPart
;
2141 Luid
.HighPart
= Temp
.u
.HighPart
;
2148 RtlConvertUlongToLuid(
2158 #endif /* !defined(MIDL_PASS) */
2160 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
2161 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
2162 *CallersAddress = (PVOID)_ReturnAddress(); \
2163 *CallersCaller = NULL;
2165 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2169 RtlGetCallersAddress(
2170 OUT PVOID
*CallersAddress
,
2171 OUT PVOID
*CallersCaller
);
2175 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
2177 #if (NTDDI_VERSION >= NTDDI_WIN7)
2182 RtlInitHashTableContext(
2183 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context
)
2185 Context
->ChainHead
= NULL
;
2186 Context
->PrevLinkage
= NULL
;
2192 RtlInitHashTableContextFromEnumerator(
2193 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context
,
2194 IN PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
)
2196 Context
->ChainHead
= Enumerator
->ChainHead
;
2197 Context
->PrevLinkage
= Enumerator
->HashEntry
.Linkage
.Blink
;
2203 RtlReleaseHashTableContext(
2204 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context
)
2206 UNREFERENCED_PARAMETER(Context
);
2213 RtlTotalBucketsHashTable(
2214 IN PRTL_DYNAMIC_HASH_TABLE HashTable
)
2216 return HashTable
->TableSize
;
2222 RtlNonEmptyBucketsHashTable(
2223 IN PRTL_DYNAMIC_HASH_TABLE HashTable
)
2225 return HashTable
->NonEmptyBuckets
;
2231 RtlEmptyBucketsHashTable(
2232 IN PRTL_DYNAMIC_HASH_TABLE HashTable
)
2234 return HashTable
->TableSize
- HashTable
->NonEmptyBuckets
;
2240 RtlTotalEntriesHashTable(
2241 IN PRTL_DYNAMIC_HASH_TABLE HashTable
)
2243 return HashTable
->NumEntries
;
2249 RtlActiveEnumeratorsHashTable(
2250 IN PRTL_DYNAMIC_HASH_TABLE HashTable
)
2252 return HashTable
->NumEnumerators
;
2255 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
2257 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */