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 PRTL_BITMAP BitMapHeader
,
254 IN ULONG StartingIndex
,
261 IN PRTL_BITMAP BitMapHeader
,
262 IN ULONG StartingIndex
,
268 RtlAnsiStringToUnicodeString(
269 IN OUT PUNICODE_STRING DestinationString
,
270 IN PANSI_STRING SourceString
,
271 IN BOOLEAN AllocateDestinationString
);
276 RtlxAnsiStringToUnicodeSize(
277 IN PCANSI_STRING AnsiString
);
279 #define RtlAnsiStringToUnicodeSize(String) ( \
280 NLS_MB_CODE_PAGE_TAG ? \
281 RtlxAnsiStringToUnicodeSize(String) : \
282 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
288 RtlAppendUnicodeStringToString(
289 IN OUT PUNICODE_STRING Destination
,
290 IN PCUNICODE_STRING Source
);
295 RtlAppendUnicodeToString(
296 IN OUT PUNICODE_STRING Destination
,
310 IN PRTL_BITMAP BitMapHeader
);
316 IN PRTL_BITMAP BitMapHeader
,
317 IN ULONG StartingIndex
,
318 IN ULONG NumberToClear
);
324 IN CONST VOID
*Source1
,
325 IN CONST VOID
*Source2
,
331 RtlCompareUnicodeString(
332 IN PCUNICODE_STRING String1
,
333 IN PCUNICODE_STRING String2
,
334 IN BOOLEAN CaseInSensitive
);
339 RtlCompareUnicodeStrings(
341 IN SIZE_T String1Length
,
343 IN SIZE_T String2Length
,
344 IN BOOLEAN CaseInSensitive
);
349 RtlCopyUnicodeString(
350 IN OUT PUNICODE_STRING DestinationString
,
351 IN PCUNICODE_STRING SourceString OPTIONAL
);
356 RtlCreateRegistryKey(
363 RtlCreateSecurityDescriptor(
364 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
370 RtlDeleteRegistryValue(
373 IN PCWSTR ValueName
);
378 RtlEqualUnicodeString(
379 IN CONST UNICODE_STRING
*String1
,
380 IN CONST UNICODE_STRING
*String2
,
381 IN BOOLEAN CaseInSensitive
);
383 #if !defined(_AMD64_) && !defined(_IA64_)
387 RtlExtendedIntegerMultiply(
388 IN LARGE_INTEGER Multiplicand
,
394 RtlExtendedLargeIntegerDivide(
395 IN LARGE_INTEGER Dividend
,
397 OUT PULONG Remainder OPTIONAL
);
400 #if defined(_X86_) || defined(_IA64_)
404 RtlExtendedMagicDivide(
405 IN LARGE_INTEGER Dividend
,
406 IN LARGE_INTEGER MagicDivisor
,
407 IN CCHAR ShiftCount
);
414 IN PANSI_STRING AnsiString
);
420 IN PRTL_BITMAP BitMapHeader
,
421 IN ULONG NumberToFind
,
427 RtlFindClearBitsAndSet(
428 IN PRTL_BITMAP BitMapHeader
,
429 IN ULONG NumberToFind
,
435 RtlFindFirstRunClear(
436 IN PRTL_BITMAP BitMapHeader
,
437 OUT PULONG StartingIndex
);
443 IN PRTL_BITMAP BitMapHeader
,
444 OUT PRTL_BITMAP_RUN RunArray
,
445 IN ULONG SizeOfRunArray
,
446 IN BOOLEAN LocateLongestRuns
);
451 RtlFindLastBackwardRunClear(
452 IN PRTL_BITMAP BitMapHeader
,
454 OUT PULONG StartingRunIndex
);
459 RtlFindLeastSignificantBit(
465 RtlFindLongestRunClear(
466 IN PRTL_BITMAP BitMapHeader
,
467 OUT PULONG StartingIndex
);
472 RtlFindMostSignificantBit(
478 RtlFindNextForwardRunClear(
479 IN PRTL_BITMAP BitMapHeader
,
481 OUT PULONG StartingRunIndex
);
487 IN PRTL_BITMAP BitMapHeader
,
488 IN ULONG NumberToFind
,
494 RtlFindSetBitsAndClear(
495 IN PRTL_BITMAP BitMapHeader
,
496 IN ULONG NumberToFind
,
503 IN OUT PANSI_STRING DestinationString
,
504 IN PCSZ SourceString
);
510 IN PRTL_BITMAP BitMapHeader
,
511 IN PULONG BitMapBuffer
,
512 IN ULONG SizeOfBitMap
);
518 IN OUT PSTRING DestinationString
,
519 IN PCSZ SourceString
);
524 RtlIntegerToUnicodeString(
526 IN ULONG Base OPTIONAL
,
527 IN OUT PUNICODE_STRING String
);
532 RtlInt64ToUnicodeString(
534 IN ULONG Base OPTIONAL
,
535 IN OUT PUNICODE_STRING String
);
538 #define RtlIntPtrToUnicodeString(Value, Base, String) \
539 RtlInt64ToUnicodeString(Value, Base, String)
541 #define RtlIntPtrToUnicodeString(Value, Base, String) \
542 RtlIntegerToUnicodeString(Value, Base, String)
549 #define RtlIsZeroLuid(_L1) \
550 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
555 RtlLengthSecurityDescriptor(
556 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
561 RtlNumberOfClearBits(
562 IN PRTL_BITMAP BitMapHeader
);
568 IN PRTL_BITMAP BitMapHeader
);
573 RtlQueryRegistryValues(
576 IN OUT PRTL_QUERY_REGISTRY_TABLE QueryTable
,
577 IN PVOID Context OPTIONAL
,
578 IN PVOID Environment OPTIONAL
);
580 #define SHORT_SIZE (sizeof(USHORT))
581 #define SHORT_MASK (SHORT_SIZE - 1)
582 #define LONG_SIZE (sizeof(LONG))
583 #define LONGLONG_SIZE (sizeof(LONGLONG))
584 #define LONG_MASK (LONG_SIZE - 1)
585 #define LONGLONG_MASK (LONGLONG_SIZE - 1)
586 #define LOWBYTE_MASK 0x00FF
588 #define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK)
589 #define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK)
590 #define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK)
591 #define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK)
597 IN PRTL_BITMAP BitMapHeader
);
603 IN PRTL_BITMAP BitMapHeader
,
604 IN ULONG StartingIndex
,
605 IN ULONG NumberToSet
);
610 RtlSetDaclSecurityDescriptor(
611 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
612 IN BOOLEAN DaclPresent
,
613 IN PACL Dacl OPTIONAL
,
614 IN BOOLEAN DaclDefaulted OPTIONAL
);
623 #define RtlStoreUlong(Address,Value) \
624 *(ULONG UNALIGNED *)(Address) = (Value)
628 * IN OUT PULONGLONG Address,
631 #define RtlStoreUlonglong(Address,Value) \
632 *(ULONGLONG UNALIGNED *)(Address) = (Value)
636 * IN PUSHORT Address,
639 #define RtlStoreUshort(Address,Value) \
640 *(USHORT UNALIGNED *)(Address) = (Value)
644 * PUSHORT DestinationAddress,
645 * PUSHORT SourceAddress);
647 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
648 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
652 * PULONG DestinationAddress,
653 * PULONG SourceAddress);
655 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
656 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
660 #define RtlStoreUlong(Address,Value) \
661 if ((ULONG_PTR)(Address) & LONG_MASK) { \
662 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
663 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
664 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
665 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
668 *((PULONG)(Address)) = (ULONG) (Value); \
671 #define RtlStoreUlonglong(Address,Value) \
672 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
673 RtlStoreUlong((ULONG_PTR)(Address), \
674 (ULONGLONG)(Value) & 0xFFFFFFFF); \
675 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
676 (ULONGLONG)(Value) >> 32); \
678 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
681 #define RtlStoreUshort(Address,Value) \
682 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
683 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
684 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
687 *((PUSHORT) (Address)) = (USHORT)Value; \
690 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
691 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
693 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
694 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
698 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
701 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
702 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
704 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
705 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
706 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
707 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
711 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
714 #endif /* defined(_AMD64_) */
719 * IN OUT PULONG_PTR Address,
720 * IN ULONG_PTR Value);
722 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value)
724 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
731 IN PTIME_FIELDS TimeFields
,
732 IN PLARGE_INTEGER Time
);
738 IN PLARGE_INTEGER Time
,
739 IN PTIME_FIELDS TimeFields
);
750 RtlUlonglongByteSwap(
751 IN ULONGLONG Source
);
756 RtlUnicodeStringToAnsiString(
757 IN OUT PANSI_STRING DestinationString
,
758 IN PCUNICODE_STRING SourceString
,
759 IN BOOLEAN AllocateDestinationString
);
764 RtlxUnicodeStringToAnsiSize(
765 IN PCUNICODE_STRING UnicodeString
);
767 #define RtlUnicodeStringToAnsiSize(String) ( \
768 NLS_MB_CODE_PAGE_TAG ? \
769 RtlxUnicodeStringToAnsiSize(String) : \
770 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
776 RtlUnicodeStringToInteger(
777 IN PCUNICODE_STRING String
,
778 IN ULONG Base OPTIONAL
,
784 RtlUpcaseUnicodeChar(
785 IN WCHAR SourceCharacter
);
796 RtlValidRelativeSecurityDescriptor(
797 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
798 IN ULONG SecurityDescriptorLength
,
799 IN SECURITY_INFORMATION RequiredInformation
);
804 RtlValidSecurityDescriptor(
805 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
810 RtlWriteRegistryValue(
816 IN ULONG ValueLength
);
821 #ifndef RTL_USE_AVL_TABLES
826 RtlInitializeGenericTable(
827 OUT PRTL_GENERIC_TABLE Table
,
828 IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine
,
829 IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine
,
830 IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine
,
831 IN PVOID TableContext OPTIONAL
);
836 RtlInsertElementGenericTable(
837 IN PRTL_GENERIC_TABLE Table
,
840 OUT PBOOLEAN NewElement OPTIONAL
);
845 RtlInsertElementGenericTableFull(
846 IN PRTL_GENERIC_TABLE Table
,
849 OUT PBOOLEAN NewElement OPTIONAL
,
850 IN PVOID NodeOrParent
,
851 IN TABLE_SEARCH_RESULT SearchResult
);
856 RtlDeleteElementGenericTable(
857 IN PRTL_GENERIC_TABLE Table
,
863 RtlLookupElementGenericTable(
864 IN PRTL_GENERIC_TABLE Table
,
870 RtlLookupElementGenericTableFull(
871 IN PRTL_GENERIC_TABLE Table
,
873 OUT PVOID
*NodeOrParent
,
874 OUT TABLE_SEARCH_RESULT
*SearchResult
);
879 RtlEnumerateGenericTable(
880 IN PRTL_GENERIC_TABLE Table
,
886 RtlEnumerateGenericTableWithoutSplaying(
887 IN PRTL_GENERIC_TABLE Table
,
888 IN OUT PVOID
*RestartKey
);
893 RtlGetElementGenericTable(
894 IN PRTL_GENERIC_TABLE Table
,
900 RtlNumberGenericTableElements(
901 IN PRTL_GENERIC_TABLE Table
);
906 RtlIsGenericTableEmpty(
907 IN PRTL_GENERIC_TABLE Table
);
909 #endif /* !RTL_USE_AVL_TABLES */
911 #define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8
917 IN OUT PRTL_SPLAY_LINKS Links
);
923 IN PRTL_SPLAY_LINKS Links
);
929 IN PRTL_SPLAY_LINKS Links
,
930 IN OUT PRTL_SPLAY_LINKS
*Root
);
936 IN PRTL_SPLAY_LINKS Links
);
941 RtlSubtreePredecessor(
942 IN PRTL_SPLAY_LINKS Links
);
948 IN PRTL_SPLAY_LINKS Links
);
954 IN PRTL_SPLAY_LINKS Links
);
959 RtlPrefixUnicodeString(
960 IN PCUNICODE_STRING String1
,
961 IN PCUNICODE_STRING String2
,
962 IN BOOLEAN CaseInSensitive
);
968 IN OUT PSTRING DestinationString
,
969 IN
const PSTRING SourceString
);
974 RtlUpcaseUnicodeString(
975 IN OUT PUNICODE_STRING DestinationString
,
976 IN PCUNICODE_STRING SourceString
,
977 IN BOOLEAN AllocateDestinationString
);
983 IN OUT PACCESS_MASK AccessMask
,
984 IN PGENERIC_MAPPING GenericMapping
);
989 RtlVolumeDeviceToDosName(
990 IN PVOID VolumeDeviceObject
,
991 OUT PUNICODE_STRING DosName
);
997 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation
);
1002 RtlVerifyVersionInfo(
1003 IN PRTL_OSVERSIONINFOEXW VersionInfo
,
1005 IN ULONGLONG ConditionMask
);
1011 IN
const PSTRING String1
,
1012 IN
const PSTRING String2
,
1013 IN BOOLEAN CaseInSensitive
);
1019 OUT PSTRING DestinationString
,
1020 IN
const PSTRING SourceString OPTIONAL
);
1026 IN
const PSTRING String1
,
1027 IN
const PSTRING String2
,
1028 IN BOOLEAN CaseInSensitive
);
1035 IN ULONG Base OPTIONAL
,
1059 IN HANDLE HeapHandle
,
1060 IN ULONG Flags OPTIONAL
,
1067 IN PVOID HeapHandle
,
1068 IN ULONG Flags OPTIONAL
,
1069 IN PVOID BaseAddress
);
1075 OUT PCONTEXT ContextRecord
);
1081 IN OUT PULONG Seed
);
1086 RtlCreateUnicodeString(
1087 OUT PUNICODE_STRING DestinationString
,
1088 IN PCWSTR SourceString
);
1093 RtlAppendStringToString(
1094 IN OUT PSTRING Destination
,
1095 IN
const STRING
*Source
);
1100 RtlOemStringToUnicodeString(
1101 IN OUT PUNICODE_STRING DestinationString
,
1102 IN PCOEM_STRING SourceString
,
1103 IN BOOLEAN AllocateDestinationString
);
1108 RtlUnicodeStringToOemString(
1109 IN OUT POEM_STRING DestinationString
,
1110 IN PCUNICODE_STRING SourceString
,
1111 IN BOOLEAN AllocateDestinationString
);
1116 RtlUpcaseUnicodeStringToOemString(
1117 IN OUT POEM_STRING DestinationString
,
1118 IN PCUNICODE_STRING SourceString
,
1119 IN BOOLEAN AllocateDestinationString
);
1124 RtlOemStringToCountedUnicodeString(
1125 IN OUT PUNICODE_STRING DestinationString
,
1126 IN PCOEM_STRING SourceString
,
1127 IN BOOLEAN AllocateDestinationString
);
1132 RtlUnicodeStringToCountedOemString(
1133 IN OUT POEM_STRING DestinationString
,
1134 IN PCUNICODE_STRING SourceString
,
1135 IN BOOLEAN AllocateDestinationString
);
1140 RtlUpcaseUnicodeStringToCountedOemString(
1141 IN OUT POEM_STRING DestinationString
,
1142 IN PCUNICODE_STRING SourceString
,
1143 IN BOOLEAN AllocateDestinationString
);
1148 RtlDowncaseUnicodeString(
1149 IN OUT PUNICODE_STRING UniDest
,
1150 IN PCUNICODE_STRING UniSource
,
1151 IN BOOLEAN AllocateDestinationString
);
1157 IN OUT POEM_STRING OemString
);
1162 RtlxUnicodeStringToOemSize(
1163 IN PCUNICODE_STRING UnicodeString
);
1168 RtlxOemStringToUnicodeSize(
1169 IN PCOEM_STRING OemString
);
1174 RtlMultiByteToUnicodeN(
1175 OUT PWCH UnicodeString
,
1176 IN ULONG MaxBytesInUnicodeString
,
1177 OUT PULONG BytesInUnicodeString OPTIONAL
,
1178 IN
const CHAR
*MultiByteString
,
1179 IN ULONG BytesInMultiByteString
);
1184 RtlMultiByteToUnicodeSize(
1185 OUT PULONG BytesInUnicodeString
,
1186 IN
const CHAR
*MultiByteString
,
1187 IN ULONG BytesInMultiByteString
);
1192 RtlUnicodeToMultiByteSize(
1193 OUT PULONG BytesInMultiByteString
,
1194 IN PCWCH UnicodeString
,
1195 IN ULONG BytesInUnicodeString
);
1200 RtlUnicodeToMultiByteN(
1201 OUT PCHAR MultiByteString
,
1202 IN ULONG MaxBytesInMultiByteString
,
1203 OUT PULONG BytesInMultiByteString OPTIONAL
,
1204 IN PWCH UnicodeString
,
1205 IN ULONG BytesInUnicodeString
);
1210 RtlUpcaseUnicodeToMultiByteN(
1211 OUT PCHAR MultiByteString
,
1212 IN ULONG MaxBytesInMultiByteString
,
1213 OUT PULONG BytesInMultiByteString OPTIONAL
,
1214 IN PCWCH UnicodeString
,
1215 IN ULONG BytesInUnicodeString
);
1221 OUT PWSTR UnicodeString
,
1222 IN ULONG MaxBytesInUnicodeString
,
1223 OUT PULONG BytesInUnicodeString OPTIONAL
,
1225 IN ULONG BytesInOemString
);
1231 OUT PCHAR OemString
,
1232 IN ULONG MaxBytesInOemString
,
1233 OUT PULONG BytesInOemString OPTIONAL
,
1234 IN PCWCH UnicodeString
,
1235 IN ULONG BytesInUnicodeString
);
1240 RtlUpcaseUnicodeToOemN(
1241 OUT PCHAR OemString
,
1242 IN ULONG MaxBytesInOemString
,
1243 OUT PULONG BytesInOemString OPTIONAL
,
1244 IN PCWCH UnicodeString
,
1245 IN ULONG BytesInUnicodeString
);
1247 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
1251 RtlGenerate8dot3Name(
1252 IN PCUNICODE_STRING Name
,
1253 IN BOOLEAN AllowExtendedCharacters
,
1254 IN OUT PGENERATE_NAME_CONTEXT Context
,
1255 IN OUT PUNICODE_STRING Name8dot3
);
1260 RtlGenerate8dot3Name(
1261 IN PCUNICODE_STRING Name
,
1262 IN BOOLEAN AllowExtendedCharacters
,
1263 IN OUT PGENERATE_NAME_CONTEXT Context
,
1264 IN OUT PUNICODE_STRING Name8dot3
);
1270 RtlIsNameLegalDOS8Dot3(
1271 IN PCUNICODE_STRING Name
,
1272 IN OUT POEM_STRING OemName OPTIONAL
,
1273 IN OUT PBOOLEAN NameContainsSpaces OPTIONAL
);
1278 RtlIsValidOemCharacter(
1279 IN OUT PWCHAR Char
);
1285 OUT PPREFIX_TABLE PrefixTable
);
1291 IN PPREFIX_TABLE PrefixTable
,
1293 OUT PPREFIX_TABLE_ENTRY PrefixTableEntry
);
1299 IN PPREFIX_TABLE PrefixTable
,
1300 IN PPREFIX_TABLE_ENTRY PrefixTableEntry
);
1306 IN PPREFIX_TABLE PrefixTable
,
1307 IN PSTRING FullName
);
1312 RtlInitializeUnicodePrefix(
1313 OUT PUNICODE_PREFIX_TABLE PrefixTable
);
1318 RtlInsertUnicodePrefix(
1319 IN PUNICODE_PREFIX_TABLE PrefixTable
,
1320 IN PUNICODE_STRING Prefix
,
1321 OUT PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry
);
1326 RtlRemoveUnicodePrefix(
1327 IN PUNICODE_PREFIX_TABLE PrefixTable
,
1328 IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry
);
1331 PUNICODE_PREFIX_TABLE_ENTRY
1333 RtlFindUnicodePrefix(
1334 IN PUNICODE_PREFIX_TABLE PrefixTable
,
1335 IN PUNICODE_STRING FullName
,
1336 IN ULONG CaseInsensitiveIndex
);
1339 PUNICODE_PREFIX_TABLE_ENTRY
1341 RtlNextUnicodePrefix(
1342 IN PUNICODE_PREFIX_TABLE PrefixTable
,
1343 IN BOOLEAN Restart
);
1348 RtlCompareMemoryUlong(
1356 RtlTimeToSecondsSince1980(
1357 IN PLARGE_INTEGER Time
,
1358 OUT PULONG ElapsedSeconds
);
1363 RtlSecondsSince1980ToTime(
1364 IN ULONG ElapsedSeconds
,
1365 OUT PLARGE_INTEGER Time
);
1370 RtlTimeToSecondsSince1970(
1371 IN PLARGE_INTEGER Time
,
1372 OUT PULONG ElapsedSeconds
);
1377 RtlSecondsSince1970ToTime(
1378 IN ULONG ElapsedSeconds
,
1379 OUT PLARGE_INTEGER Time
);
1404 RtlLengthRequiredSid(
1405 IN ULONG SubAuthorityCount
);
1416 RtlAllocateAndInitializeSid(
1417 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
1418 IN UCHAR SubAuthorityCount
,
1419 IN ULONG SubAuthority0
,
1420 IN ULONG SubAuthority1
,
1421 IN ULONG SubAuthority2
,
1422 IN ULONG SubAuthority3
,
1423 IN ULONG SubAuthority4
,
1424 IN ULONG SubAuthority5
,
1425 IN ULONG SubAuthority6
,
1426 IN ULONG SubAuthority7
,
1434 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
1435 IN UCHAR SubAuthorityCount
);
1442 IN ULONG SubAuthority
);
1455 IN PSID Destination
,
1461 RtlConvertSidToUnicodeString(
1462 IN OUT PUNICODE_STRING UnicodeString
,
1464 IN BOOLEAN AllocateDestinationString
);
1470 OUT PLUID DestinationLuid
,
1471 IN PLUID SourceLuid
);
1479 IN ULONG AclRevision
);
1486 IN ULONG AceRevision
,
1487 IN ULONG StartingAceIndex
,
1489 IN ULONG AceListLength
);
1509 RtlAddAccessAllowedAce(
1511 IN ULONG AceRevision
,
1512 IN ACCESS_MASK AccessMask
,
1518 RtlAddAccessAllowedAceEx(
1520 IN ULONG AceRevision
,
1522 IN ACCESS_MASK AccessMask
,
1528 RtlCreateSecurityDescriptorRelative(
1529 OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor
,
1535 RtlGetDaclSecurityDescriptor(
1536 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
1537 OUT PBOOLEAN DaclPresent
,
1539 OUT PBOOLEAN DaclDefaulted
);
1544 RtlSetOwnerSecurityDescriptor(
1545 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1546 IN PSID Owner OPTIONAL
,
1547 IN BOOLEAN OwnerDefaulted
);
1552 RtlGetOwnerSecurityDescriptor(
1553 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
1555 OUT PBOOLEAN OwnerDefaulted
);
1560 RtlNtStatusToDosError(
1561 IN NTSTATUS Status
);
1566 RtlCustomCPToUnicodeN(
1567 IN PCPTABLEINFO CustomCP
,
1568 OUT PWCH UnicodeString
,
1569 IN ULONG MaxBytesInUnicodeString
,
1570 OUT PULONG BytesInUnicodeString OPTIONAL
,
1571 IN PCH CustomCPString
,
1572 IN ULONG BytesInCustomCPString
);
1577 RtlUnicodeToCustomCPN(
1578 IN PCPTABLEINFO CustomCP
,
1579 OUT PCH CustomCPString
,
1580 IN ULONG MaxBytesInCustomCPString
,
1581 OUT PULONG BytesInCustomCPString OPTIONAL
,
1582 IN PWCH UnicodeString
,
1583 IN ULONG BytesInUnicodeString
);
1588 RtlUpcaseUnicodeToCustomCPN(
1589 IN PCPTABLEINFO CustomCP
,
1590 OUT PCH CustomCPString
,
1591 IN ULONG MaxBytesInCustomCPString
,
1592 OUT PULONG BytesInCustomCPString OPTIONAL
,
1593 IN PWCH UnicodeString
,
1594 IN ULONG BytesInUnicodeString
);
1599 RtlInitCodePageTable(
1600 IN PUSHORT TableBase
,
1601 IN OUT PCPTABLEINFO CodePageTable
);
1605 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
1609 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1613 RtlPrefetchMemoryNonTemporal(
1620 #if (NTDDI_VERSION >= NTDDI_WINXP)
1628 PRTL_BITMAP BitMapHeader
,
1634 RtlDowncaseUnicodeChar(
1635 IN WCHAR SourceCharacter
);
1641 PRTL_BITMAP BitMapHeader
,
1648 IN PRTL_BITMAP BitMapHeader
,
1649 IN ULONG BitNumber
);
1654 RtlHashUnicodeString(
1655 IN CONST UNICODE_STRING
*String
,
1656 IN BOOLEAN CaseInSensitive
,
1657 IN ULONG HashAlgorithm
,
1658 OUT PULONG HashValue
);
1667 RtlInitializeGenericTableAvl(
1668 OUT PRTL_AVL_TABLE Table
,
1669 IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine
,
1670 IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine
,
1671 IN PRTL_AVL_FREE_ROUTINE FreeRoutine
,
1672 IN PVOID TableContext OPTIONAL
);
1677 RtlInsertElementGenericTableAvl(
1678 IN PRTL_AVL_TABLE Table
,
1680 IN CLONG BufferSize
,
1681 OUT PBOOLEAN NewElement OPTIONAL
);
1686 RtlInsertElementGenericTableFullAvl(
1687 IN PRTL_AVL_TABLE Table
,
1689 IN CLONG BufferSize
,
1690 OUT PBOOLEAN NewElement OPTIONAL
,
1691 IN PVOID NodeOrParent
,
1692 IN TABLE_SEARCH_RESULT SearchResult
);
1697 RtlDeleteElementGenericTableAvl(
1698 IN PRTL_AVL_TABLE Table
,
1704 RtlLookupElementGenericTableAvl(
1705 IN PRTL_AVL_TABLE Table
,
1711 RtlLookupElementGenericTableFullAvl(
1712 IN PRTL_AVL_TABLE Table
,
1714 OUT PVOID
*NodeOrParent
,
1715 OUT TABLE_SEARCH_RESULT
*SearchResult
);
1720 RtlEnumerateGenericTableAvl(
1721 IN PRTL_AVL_TABLE Table
,
1722 IN BOOLEAN Restart
);
1727 RtlEnumerateGenericTableWithoutSplayingAvl(
1728 IN PRTL_AVL_TABLE Table
,
1729 IN OUT PVOID
*RestartKey
);
1734 RtlLookupFirstMatchingElementGenericTableAvl(
1735 IN PRTL_AVL_TABLE Table
,
1737 OUT PVOID
*RestartKey
);
1742 RtlEnumerateGenericTableLikeADirectory(
1743 IN PRTL_AVL_TABLE Table
,
1744 IN PRTL_AVL_MATCH_FUNCTION MatchFunction OPTIONAL
,
1745 IN PVOID MatchData OPTIONAL
,
1747 IN OUT PVOID
*RestartKey
,
1748 IN OUT PULONG DeleteCount
,
1754 RtlGetElementGenericTableAvl(
1755 IN PRTL_AVL_TABLE Table
,
1761 RtlNumberGenericTableElementsAvl(
1762 IN PRTL_AVL_TABLE Table
);
1767 RtlIsGenericTableEmptyAvl(
1768 IN PRTL_AVL_TABLE Table
);
1778 IN PVOID HeapBase OPTIONAL
,
1779 IN SIZE_T ReserveSize OPTIONAL
,
1780 IN SIZE_T CommitSize OPTIONAL
,
1781 IN PVOID Lock OPTIONAL
,
1782 IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL
);
1788 IN PVOID HeapHandle
);
1793 RtlCaptureStackBackTrace(
1794 IN ULONG FramesToSkip
,
1795 IN ULONG FramesToCapture
,
1796 OUT PVOID
*BackTrace
,
1797 OUT PULONG BackTraceHash OPTIONAL
);
1803 IN OUT PULONG Seed
);
1808 RtlInitUnicodeStringEx(
1809 OUT PUNICODE_STRING DestinationString
,
1810 IN PCWSTR SourceString OPTIONAL
);
1815 RtlValidateUnicodeString(
1817 IN PCUNICODE_STRING String
);
1822 RtlDuplicateUnicodeString(
1824 IN PCUNICODE_STRING SourceString
,
1825 OUT PUNICODE_STRING DestinationString
);
1830 RtlGetCompressionWorkSpaceSize(
1831 IN USHORT CompressionFormatAndEngine
,
1832 OUT PULONG CompressBufferWorkSpaceSize
,
1833 OUT PULONG CompressFragmentWorkSpaceSize
);
1839 IN USHORT CompressionFormatAndEngine
,
1840 IN PUCHAR UncompressedBuffer
,
1841 IN ULONG UncompressedBufferSize
,
1842 OUT PUCHAR CompressedBuffer
,
1843 IN ULONG CompressedBufferSize
,
1844 IN ULONG UncompressedChunkSize
,
1845 OUT PULONG FinalCompressedSize
,
1846 IN PVOID WorkSpace
);
1851 RtlDecompressBuffer(
1852 IN USHORT CompressionFormat
,
1853 OUT PUCHAR UncompressedBuffer
,
1854 IN ULONG UncompressedBufferSize
,
1855 IN PUCHAR CompressedBuffer
,
1856 IN ULONG CompressedBufferSize
,
1857 OUT PULONG FinalUncompressedSize
);
1862 RtlDecompressFragment(
1863 IN USHORT CompressionFormat
,
1864 OUT PUCHAR UncompressedFragment
,
1865 IN ULONG UncompressedFragmentSize
,
1866 IN PUCHAR CompressedBuffer
,
1867 IN ULONG CompressedBufferSize
,
1868 IN ULONG FragmentOffset
,
1869 OUT PULONG FinalUncompressedSize
,
1870 IN PVOID WorkSpace
);
1876 IN USHORT CompressionFormat
,
1877 IN OUT PUCHAR
*CompressedBuffer
,
1878 IN PUCHAR EndOfCompressedBufferPlus1
,
1879 OUT PUCHAR
*ChunkBuffer
,
1880 OUT PULONG ChunkSize
);
1886 IN USHORT CompressionFormat
,
1887 IN OUT PUCHAR
*CompressedBuffer
,
1888 IN PUCHAR EndOfCompressedBufferPlus1
,
1889 OUT PUCHAR
*ChunkBuffer
,
1890 IN ULONG ChunkSize
);
1895 RtlDecompressChunks(
1896 OUT PUCHAR UncompressedBuffer
,
1897 IN ULONG UncompressedBufferSize
,
1898 IN PUCHAR CompressedBuffer
,
1899 IN ULONG CompressedBufferSize
,
1900 IN PUCHAR CompressedTail
,
1901 IN ULONG CompressedTailSize
,
1902 IN PCOMPRESSED_DATA_INFO CompressedDataInfo
);
1908 IN PUCHAR UncompressedBuffer
,
1909 IN ULONG UncompressedBufferSize
,
1910 OUT PUCHAR CompressedBuffer
,
1911 IN ULONG CompressedBufferSize
,
1912 IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo
,
1913 IN ULONG CompressedDataInfoLength
,
1914 IN PVOID WorkSpace
);
1917 PSID_IDENTIFIER_AUTHORITY
1919 RtlIdentifierAuthoritySid(
1925 RtlSubAuthorityCountSid(
1931 RtlNtStatusToDosErrorNoTeb(
1932 IN NTSTATUS Status
);
1937 RtlCreateSystemVolumeInformationFolder(
1938 IN PCUNICODE_STRING VolumeRootPath
);
1940 #if defined(_M_AMD64)
1944 RtlFillMemoryUlong (
1945 OUT PVOID Destination
,
1949 PULONG Address
= (PULONG
)Destination
;
1950 if ((Length
/= 4) != 0) {
1951 if (((ULONG64
)Address
& 4) != 0) {
1953 if ((Length
-= 1) == 0) {
1958 __stosq((PULONG64
)(Address
), Pattern
| ((ULONG64
)Pattern
<< 32), Length
/ 2);
1959 if ((Length
& 1) != 0) Address
[Length
- 1] = Pattern
;
1964 #define RtlFillMemoryUlonglong(Destination, Length, Pattern) \
1965 __stosq((PULONG64)(Destination), Pattern, (Length) / 8)
1973 OUT PVOID Destination
,
1980 RtlFillMemoryUlonglong(
1981 OUT PVOID Destination
,
1983 IN ULONGLONG Pattern
);
1985 #endif /* defined(_M_AMD64) */
1988 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1991 #if (NTDDI_VERSION >= NTDDI_WS03)
1995 RtlInitAnsiStringEx(
1996 OUT PANSI_STRING DestinationString
,
1997 IN PCSZ SourceString OPTIONAL
);
2000 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
2005 RtlGetSaclSecurityDescriptor(
2006 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
2007 OUT PBOOLEAN SaclPresent
,
2009 OUT PBOOLEAN SaclDefaulted
);
2014 RtlSetGroupSecurityDescriptor(
2015 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
2016 IN PSID Group OPTIONAL
,
2017 IN BOOLEAN GroupDefaulted OPTIONAL
);
2022 RtlGetGroupSecurityDescriptor(
2023 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
2025 OUT PBOOLEAN GroupDefaulted
);
2030 RtlAbsoluteToSelfRelativeSD(
2031 IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor
,
2032 OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor OPTIONAL
,
2033 IN OUT PULONG BufferLength
);
2038 RtlSelfRelativeToAbsoluteSD(
2039 IN PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor
,
2040 OUT PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor OPTIONAL
,
2041 IN OUT PULONG AbsoluteSecurityDescriptorSize
,
2042 OUT PACL Dacl OPTIONAL
,
2043 IN OUT PULONG DaclSize
,
2044 OUT PACL Sacl OPTIONAL
,
2045 IN OUT PULONG SaclSize
,
2046 OUT PSID Owner OPTIONAL
,
2047 IN OUT PULONG OwnerSize
,
2048 OUT PSID PrimaryGroup OPTIONAL
,
2049 IN OUT PULONG PrimaryGroupSize
);
2051 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
2054 #if (NTDDI_VERSION >= NTDDI_VISTA)
2060 RtlNumberOfSetBitsUlongPtr(
2061 IN ULONG_PTR Target
);
2066 RtlIoDecodeMemIoResource(
2067 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
2068 OUT PULONGLONG Alignment OPTIONAL
,
2069 OUT PULONGLONG MinimumAddress OPTIONAL
,
2070 OUT PULONGLONG MaximumAddress OPTIONAL
);
2075 RtlIoEncodeMemIoResource(
2076 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
2078 IN ULONGLONG Length
,
2079 IN ULONGLONG Alignment
,
2080 IN ULONGLONG MinimumAddress
,
2081 IN ULONGLONG MaximumAddress
);
2086 RtlCmDecodeMemIoResource(
2087 IN
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
*Descriptor
,
2088 OUT PULONGLONG Start OPTIONAL
);
2093 RtlFindClosestEncodableLength(
2094 IN ULONGLONG SourceLength
,
2095 OUT PULONGLONG TargetLength
);
2100 RtlCmEncodeMemIoResource(
2101 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
2103 IN ULONGLONG Length
,
2104 IN ULONGLONG Start
);
2112 RtlRunOnceInitialize(
2113 OUT PRTL_RUN_ONCE RunOnce
);
2118 RtlRunOnceExecuteOnce(
2119 IN OUT PRTL_RUN_ONCE RunOnce
,
2120 IN PRTL_RUN_ONCE_INIT_FN InitFn
,
2121 IN OUT PVOID Parameter OPTIONAL
,
2122 OUT PVOID
*Context OPTIONAL
);
2127 RtlRunOnceBeginInitialize(
2128 IN OUT PRTL_RUN_ONCE RunOnce
,
2130 OUT PVOID
*Context OPTIONAL
);
2136 IN OUT PRTL_RUN_ONCE RunOnce
,
2138 IN PVOID Context OPTIONAL
);
2144 IN ULONG OSMajorVersion
,
2145 IN ULONG OSMinorVersion
,
2146 IN ULONG SpMajorVersion
,
2147 IN ULONG SpMinorVersion
,
2148 OUT PULONG ReturnedProductType
);
2157 IN PCWSTR SourceString
,
2158 IN LONG SourceStringLength
,
2159 OUT PWSTR DestinationString
,
2160 IN OUT PLONG DestinationStringLength
);
2165 RtlIsNormalizedString(
2167 IN PCWSTR SourceString
,
2168 IN LONG SourceStringLength
,
2169 OUT PBOOLEAN Normalized
);
2176 IN PCWSTR SourceString
,
2177 IN LONG SourceStringLength
,
2178 OUT PWSTR DestinationString
,
2179 IN OUT PLONG DestinationStringLength
);
2186 IN PCWSTR SourceString
,
2187 IN LONG SourceStringLength
,
2188 OUT PWSTR DestinationString
,
2189 IN OUT PLONG DestinationStringLength
);
2194 RtlIdnToNameprepUnicode(
2196 IN PCWSTR SourceString
,
2197 IN LONG SourceStringLength
,
2198 OUT PWSTR DestinationString
,
2199 IN OUT PLONG DestinationStringLength
);
2204 RtlCreateServiceSid(
2205 IN PUNICODE_STRING ServiceName
,
2206 OUT PSID ServiceSid
,
2207 IN OUT PULONG ServiceSidLength
);
2212 RtlCompareAltitudes(
2213 IN PCUNICODE_STRING Altitude1
,
2214 IN PCUNICODE_STRING Altitude2
);
2218 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
2220 #if (NTDDI_VERSION >= NTDDI_WIN7)
2227 OUT PCHAR UTF8StringDestination
,
2228 IN ULONG UTF8StringMaxByteCount
,
2229 OUT PULONG UTF8StringActualByteCount
,
2230 IN PCWCH UnicodeStringSource
,
2231 IN ULONG UnicodeStringByteCount
);
2237 OUT PWSTR UnicodeStringDestination
,
2238 IN ULONG UnicodeStringMaxByteCount
,
2239 OUT PULONG UnicodeStringActualByteCount
,
2240 IN PCCH UTF8StringSource
,
2241 IN ULONG UTF8StringByteCount
);
2246 RtlGetEnabledExtendedFeatures(
2247 IN ULONG64 FeatureMask
);
2256 IN OUT PRTL_DYNAMIC_HASH_TABLE
*HashTable OPTIONAL
,
2264 IN PRTL_DYNAMIC_HASH_TABLE HashTable
);
2269 RtlInsertEntryHashTable(
2270 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
2271 IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry
,
2272 IN ULONG_PTR Signature
,
2273 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL
);
2278 RtlRemoveEntryHashTable(
2279 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
2280 IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry
,
2281 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL
);
2284 PRTL_DYNAMIC_HASH_TABLE_ENTRY
2286 RtlLookupEntryHashTable(
2287 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
2288 IN ULONG_PTR Signature
,
2289 OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL
);
2292 PRTL_DYNAMIC_HASH_TABLE_ENTRY
2294 RtlGetNextEntryHashTable(
2295 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
2296 IN PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context
);
2301 RtlInitEnumerationHashTable(
2302 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
2303 OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
);
2306 PRTL_DYNAMIC_HASH_TABLE_ENTRY
2308 RtlEnumerateEntryHashTable(
2309 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
2310 IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
);
2315 RtlEndEnumerationHashTable(
2316 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
2317 IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
);
2322 RtlInitWeakEnumerationHashTable(
2323 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
2324 OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
);
2327 PRTL_DYNAMIC_HASH_TABLE_ENTRY
2329 RtlWeaklyEnumerateEntryHashTable(
2330 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
2331 IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
);
2336 RtlEndWeakEnumerationHashTable(
2337 IN PRTL_DYNAMIC_HASH_TABLE HashTable
,
2338 IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
);
2344 IN PRTL_DYNAMIC_HASH_TABLE HashTable
);
2349 RtlContractHashTable(
2350 IN PRTL_DYNAMIC_HASH_TABLE HashTable
);
2358 OUT PCHAR UTF8StringDestination
,
2359 IN ULONG UTF8StringMaxByteCount
,
2360 OUT PULONG UTF8StringActualByteCount
,
2361 IN PCWCH UnicodeStringSource
,
2362 IN ULONG UnicodeStringByteCount
);
2368 OUT PWSTR UnicodeStringDestination
,
2369 IN ULONG UnicodeStringMaxByteCount
,
2370 OUT PULONG UnicodeStringActualByteCount
,
2371 IN PCCH UTF8StringSource
,
2372 IN ULONG UTF8StringByteCount
);
2378 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
2381 OUT ULONG
*NumChanges
);
2386 RtlCreateVirtualAccountSid(
2387 IN PCUNICODE_STRING Name
,
2388 IN ULONG BaseSubAuthority
,
2390 IN OUT PULONG SidLength
);
2393 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
2397 #if !defined(MIDL_PASS)
2398 /* inline funftions */
2399 //DECLSPEC_DEPRECATED_DDK_WINXP
2403 RtlConvertLongToLargeInteger(
2404 IN LONG SignedInteger
)
2407 ret
.QuadPart
= SignedInteger
;
2411 //DECLSPEC_DEPRECATED_DDK_WINXP
2415 RtlConvertUlongToLargeInteger(
2416 IN ULONG UnsignedInteger
)
2419 ret
.QuadPart
= UnsignedInteger
;
2423 //DECLSPEC_DEPRECATED_DDK_WINXP
2427 RtlLargeIntegerShiftLeft(
2428 IN LARGE_INTEGER LargeInteger
,
2429 IN CCHAR ShiftCount
)
2431 LARGE_INTEGER Result
;
2433 Result
.QuadPart
= LargeInteger
.QuadPart
<< ShiftCount
;
2437 //DECLSPEC_DEPRECATED_DDK_WINXP
2441 RtlLargeIntegerShiftRight(
2442 IN LARGE_INTEGER LargeInteger
,
2443 IN CCHAR ShiftCount
)
2445 LARGE_INTEGER Result
;
2447 Result
.QuadPart
= (ULONG64
)LargeInteger
.QuadPart
>> ShiftCount
;
2451 //DECLSPEC_DEPRECATED_DDK
2455 RtlEnlargedUnsignedDivide(
2456 IN ULARGE_INTEGER Dividend
,
2458 IN OUT PULONG Remainder
)
2461 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2462 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
2465 //DECLSPEC_DEPRECATED_DDK
2469 RtlLargeIntegerNegate(
2470 IN LARGE_INTEGER Subtrahend
)
2472 LARGE_INTEGER Difference
;
2474 Difference
.QuadPart
= -Subtrahend
.QuadPart
;
2478 //DECLSPEC_DEPRECATED_DDK
2482 RtlLargeIntegerSubtract(
2483 IN LARGE_INTEGER Minuend
,
2484 IN LARGE_INTEGER Subtrahend
)
2486 LARGE_INTEGER Difference
;
2488 Difference
.QuadPart
= Minuend
.QuadPart
- Subtrahend
.QuadPart
;
2492 //DECLSPEC_DEPRECATED_DDK
2496 RtlEnlargedUnsignedMultiply(
2497 IN ULONG Multiplicand
,
2498 IN ULONG Multiplier
)
2501 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2505 //DECLSPEC_DEPRECATED_DDK
2509 RtlEnlargedIntegerMultiply(
2510 IN LONG Multiplicand
,
2514 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2520 RtlInitEmptyAnsiString(
2521 OUT PANSI_STRING AnsiString
,
2523 IN USHORT BufferSize
)
2525 AnsiString
->Length
= 0;
2526 AnsiString
->MaximumLength
= BufferSize
;
2527 AnsiString
->Buffer
= Buffer
;
2532 RtlInitEmptyUnicodeString(
2533 OUT PUNICODE_STRING UnicodeString
,
2535 IN USHORT BufferSize
)
2537 UnicodeString
->Length
= 0;
2538 UnicodeString
->MaximumLength
= BufferSize
;
2539 UnicodeString
->Buffer
= Buffer
;
2543 #if defined(_AMD64_) || defined(_IA64_)
2550 RtlExtendedIntegerMultiply(
2551 IN LARGE_INTEGER Multiplicand
,
2555 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
2562 RtlExtendedLargeIntegerDivide(
2563 IN LARGE_INTEGER Dividend
,
2565 OUT PULONG Remainder OPTIONAL
)
2568 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
2570 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2578 //DECLSPEC_DEPRECATED_DDK_WINXP
2582 RtlLargeIntegerDivide(
2583 IN LARGE_INTEGER Dividend
,
2584 IN LARGE_INTEGER Divisor
,
2585 OUT PLARGE_INTEGER Remainder OPTIONAL
)
2588 ret
.QuadPart
= Dividend
.QuadPart
/ Divisor
.QuadPart
;
2590 Remainder
->QuadPart
= Dividend
.QuadPart
% Divisor
.QuadPart
;
2596 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2600 RtlLargeIntegerDivide(
2601 IN LARGE_INTEGER Dividend
,
2602 IN LARGE_INTEGER Divisor
,
2603 OUT PLARGE_INTEGER Remainder OPTIONAL
);
2608 #endif /* defined(_AMD64_) || defined(_IA64_) */
2612 #if defined(_AMD64_)
2614 #define MultiplyHigh __mulh
2615 #define UnsignedMultiplyHigh __umulh
2617 //DECLSPEC_DEPRECATED_DDK
2621 RtlExtendedMagicDivide(
2622 IN LARGE_INTEGER Dividend
,
2623 IN LARGE_INTEGER MagicDivisor
,
2624 IN CCHAR ShiftCount
)
2629 Pos
= (Dividend
.QuadPart
>= 0);
2630 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
2631 MagicDivisor
.QuadPart
);
2632 ret64
>>= ShiftCount
;
2633 ret
.QuadPart
= Pos
? ret64
: -ret64
;
2638 //DECLSPEC_DEPRECATED_DDK
2643 IN LARGE_INTEGER Addend1
,
2644 IN LARGE_INTEGER Addend2
)
2647 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
2652 * RtlLargeIntegerAnd(
2653 * IN OUT LARGE_INTEGER Result,
2654 * IN LARGE_INTEGER Source,
2655 * IN LARGE_INTEGER Mask);
2657 #define RtlLargeIntegerAnd(Result, Source, Mask) \
2658 Result.QuadPart = Source.QuadPart & Mask.QuadPart
2660 //DECLSPEC_DEPRECATED_DDK
2664 RtlLargeIntegerArithmeticShift(
2665 IN LARGE_INTEGER LargeInteger
,
2666 IN CCHAR ShiftCount
)
2669 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
2674 * RtlLargeIntegerEqualTo(
2675 * IN LARGE_INTEGER Operand1,
2676 * IN LARGE_INTEGER Operand2);
2678 #define RtlLargeIntegerEqualTo(X,Y) \
2679 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
2683 RtlSecureZeroMemory(
2687 volatile char* vptr
= (volatile char*)Pointer
;
2688 #if defined(_M_AMD64)
2689 __stosb((PUCHAR
)vptr
, 0, Size
);
2691 char * endptr
= (char *)vptr
+ Size
;
2692 while (vptr
< endptr
) {
2699 #if defined(_M_AMD64)
2703 IN PRTL_BITMAP BitMapHeader
,
2704 IN ULONG BitPosition
)
2706 return BitTest64((LONG64 CONST
*)BitMapHeader
->Buffer
, (LONG64
)BitPosition
);
2709 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
2710 #endif /* defined(_M_AMD64) */
2712 #define RtlLargeIntegerGreaterThan(X,Y) ( \
2713 (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
2714 ((X).HighPart > (Y).HighPart) \
2717 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
2718 (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
2719 ((X).HighPart > (Y).HighPart) \
2722 #define RtlLargeIntegerNotEqualTo(X,Y) ( \
2723 (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
2726 #define RtlLargeIntegerLessThan(X,Y) ( \
2727 (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
2728 ((X).HighPart < (Y).HighPart) \
2731 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
2732 (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
2733 ((X).HighPart < (Y).HighPart) \
2736 #define RtlLargeIntegerGreaterThanZero(X) ( \
2737 (((X).HighPart == 0) && ((X).LowPart > 0)) || \
2738 ((X).HighPart > 0 ) \
2741 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
2743 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
2745 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
2747 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
2749 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
2751 #endif /* !defined(MIDL_PASS) */
2753 /* Byte Swap Functions */
2754 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
2755 ((defined(_M_AMD64) || defined(_M_IA64)) \
2756 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
2758 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
2759 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
2760 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
2766 #define ASSERT(exp) \
2768 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
2770 #define ASSERTMSG(msg, exp) \
2772 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
2774 #define RTL_SOFT_ASSERT(exp) \
2776 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
2778 #define RTL_SOFT_ASSERTMSG(msg, exp) \
2780 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
2782 #define RTL_VERIFY(exp) ASSERT(exp)
2783 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
2785 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
2786 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
2788 #if defined(_MSC_VER)
2790 #define NT_ASSERT(exp) \
2792 (__annotation(L"Debug", L"AssertFail", L#exp), \
2793 DbgRaiseAssertionFailure(), FALSE) : TRUE)
2795 #define NT_ASSERTMSG(msg, exp) \
2797 (__annotation(L"Debug", L"AssertFail", L##msg), \
2798 DbgRaiseAssertionFailure(), FALSE) : TRUE)
2800 #define NT_ASSERTMSGW(msg, exp) \
2802 (__annotation(L"Debug", L"AssertFail", msg), \
2803 DbgRaiseAssertionFailure(), FALSE) : TRUE)
2805 #define NT_VERIFY NT_ASSERT
2806 #define NT_VERIFYMSG NT_ASSERTMSG
2807 #define NT_VERIFYMSGW NT_ASSERTMSGW
2811 /* GCC doesn't support __annotation (nor PDB) */
2812 #define NT_ASSERT(exp) \
2813 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
2815 #define NT_ASSERTMSG NT_ASSERT
2816 #define NT_ASSERTMSGW NT_ASSERT
2822 #define ASSERT(exp) ((VOID) 0)
2823 #define ASSERTMSG(msg, exp) ((VOID) 0)
2825 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
2826 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
2828 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
2829 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
2831 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
2832 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
2834 #define NT_ASSERT(exp) ((VOID)0)
2835 #define NT_ASSERTMSG(msg, exp) ((VOID)0)
2836 #define NT_ASSERTMSGW(msg, exp) ((VOID)0)
2838 #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE)
2839 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
2840 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
2844 #define InitializeListHead32(ListHead) (\
2845 (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
2847 #if !defined(_WINBASE_)
2849 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
2853 InitializeSListHead(
2854 OUT PSLIST_HEADER SListHead
);
2860 InitializeSListHead(
2861 OUT PSLIST_HEADER SListHead
)
2864 ULONG64 FeatureBits
;
2868 if (((ULONG_PTR
)SListHead
& 0xf) != 0) {
2869 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT
);
2872 RtlZeroMemory(SListHead
, sizeof(SLIST_HEADER
));
2874 FeatureBits
= __getReg(CV_IA64_CPUID4
);
2875 if ((FeatureBits
& KF_16BYTE_INSTR
) != 0) {
2876 SListHead
->Header16
.HeaderType
= 1;
2877 SListHead
->Header16
.Init
= 1;
2886 #define InterlockedPopEntrySList(Head) \
2887 ExpInterlockedPopEntrySList(Head)
2889 #define InterlockedPushEntrySList(Head, Entry) \
2890 ExpInterlockedPushEntrySList(Head, Entry)
2892 #define InterlockedFlushSList(Head) \
2893 ExpInterlockedFlushSList(Head)
2895 #define QueryDepthSList(Head) \
2896 ExQueryDepthSList(Head)
2898 #else /* !defined(_WIN64) */
2903 InterlockedPopEntrySList(
2904 IN PSLIST_HEADER ListHead
);
2909 InterlockedPushEntrySList(
2910 IN PSLIST_HEADER ListHead
,
2911 IN PSLIST_ENTRY ListEntry
);
2913 #define InterlockedFlushSList(ListHead) \
2914 ExInterlockedFlushSList(ListHead)
2916 #define QueryDepthSList(Head) \
2917 ExQueryDepthSList(Head)
2919 #endif /* !defined(_WIN64) */
2921 #endif /* !defined(_WINBASE_) */
2923 #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
2924 #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
2925 #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \
2926 ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
2927 #define RTL_CONTEXT_OFFSET(Context, Chunk) \
2928 RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
2929 #define RTL_CONTEXT_LENGTH(Context, Chunk) \
2930 RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
2931 #define RTL_CONTEXT_CHUNK(Context, Chunk) \
2932 RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \
2933 (PCONTEXT_EX)(Context + 1), \
2937 RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable
)(
2941 RTLVERLIB_DDI(RtlIsServicePackVersionInstalled
)(
2944 #ifndef RtlIsNtDdiVersionAvailable
2945 #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable
2948 #ifndef RtlIsServicePackVersionInstalled
2949 #define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled
2952 #define RtlInterlockedSetBits(Flags, Flag) \
2953 InterlockedOr((PLONG)(Flags), Flag)
2955 #define RtlInterlockedAndBits(Flags, Flag) \
2956 InterlockedAnd((PLONG)(Flags), Flag)
2958 #define RtlInterlockedClearBits(Flags, Flag) \
2959 RtlInterlockedAndBits(Flags, ~(Flag))
2961 #define RtlInterlockedXorBits(Flags, Flag) \
2962 InterlockedXor(Flags, Flag)
2964 #define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \
2965 (VOID) RtlInterlockedSetBits(Flags, Flag)
2967 #define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \
2968 (VOID) RtlInterlockedAndBits(Flags, Flag)
2970 #define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
2971 RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))
2977 #ifdef RTL_USE_AVL_TABLES
2979 #define RtlInitializeGenericTable RtlInitializeGenericTableAvl
2980 #define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl
2981 #define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl
2982 #define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl
2983 #define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl
2984 #define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl
2985 #define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl
2986 #define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl
2987 #define RtlGetElementGenericTable RtlGetElementGenericTableAvl
2988 #define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl
2989 #define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl
2991 #endif /* RTL_USE_AVL_TABLES */
2993 #define RtlInitializeSplayLinks(Links) { \
2994 PRTL_SPLAY_LINKS _SplayLinks; \
2995 _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
2996 _SplayLinks->Parent = _SplayLinks; \
2997 _SplayLinks->LeftChild = NULL; \
2998 _SplayLinks->RightChild = NULL; \
3001 #define RtlIsLeftChild(Links) \
3002 (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
3004 #define RtlIsRightChild(Links) \
3005 (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
3007 #define RtlRightChild(Links) \
3008 ((PRTL_SPLAY_LINKS)(Links))->RightChild
3010 #define RtlIsRoot(Links) \
3011 (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
3013 #define RtlLeftChild(Links) \
3014 ((PRTL_SPLAY_LINKS)(Links))->LeftChild
3016 #define RtlParent(Links) \
3017 ((PRTL_SPLAY_LINKS)(Links))->Parent
3019 #define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \
3021 PRTL_SPLAY_LINKS _SplayParent; \
3022 PRTL_SPLAY_LINKS _SplayChild; \
3023 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
3024 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
3025 _SplayParent->LeftChild = _SplayChild; \
3026 _SplayChild->Parent = _SplayParent; \
3029 #define RtlInsertAsRightChild(ParentLinks,ChildLinks) \
3031 PRTL_SPLAY_LINKS _SplayParent; \
3032 PRTL_SPLAY_LINKS _SplayChild; \
3033 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
3034 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
3035 _SplayParent->RightChild = _SplayChild; \
3036 _SplayChild->Parent = _SplayParent; \
3039 #if !defined(MIDL_PASS)
3044 RtlConvertLongToLuid(
3050 Temp
.QuadPart
= Val
;
3051 Luid
.LowPart
= Temp
.u
.LowPart
;
3052 Luid
.HighPart
= Temp
.u
.HighPart
;
3059 RtlConvertUlongToLuid(
3069 #endif /* !defined(MIDL_PASS) */
3071 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
3072 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
3073 *CallersAddress = (PVOID)_ReturnAddress(); \
3074 *CallersCaller = NULL;
3076 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3080 RtlGetCallersAddress(
3081 OUT PVOID
*CallersAddress
,
3082 OUT PVOID
*CallersCaller
);
3086 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
3088 #if (NTDDI_VERSION >= NTDDI_WIN7)
3093 RtlInitHashTableContext(
3094 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context
)
3096 Context
->ChainHead
= NULL
;
3097 Context
->PrevLinkage
= NULL
;
3103 RtlInitHashTableContextFromEnumerator(
3104 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context
,
3105 IN PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator
)
3107 Context
->ChainHead
= Enumerator
->ChainHead
;
3108 Context
->PrevLinkage
= Enumerator
->HashEntry
.Linkage
.Blink
;
3114 RtlReleaseHashTableContext(
3115 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context
)
3117 UNREFERENCED_PARAMETER(Context
);
3124 RtlTotalBucketsHashTable(
3125 IN PRTL_DYNAMIC_HASH_TABLE HashTable
)
3127 return HashTable
->TableSize
;
3133 RtlNonEmptyBucketsHashTable(
3134 IN PRTL_DYNAMIC_HASH_TABLE HashTable
)
3136 return HashTable
->NonEmptyBuckets
;
3142 RtlEmptyBucketsHashTable(
3143 IN PRTL_DYNAMIC_HASH_TABLE HashTable
)
3145 return HashTable
->TableSize
- HashTable
->NonEmptyBuckets
;
3151 RtlTotalEntriesHashTable(
3152 IN PRTL_DYNAMIC_HASH_TABLE HashTable
)
3154 return HashTable
->NumEntries
;
3160 RtlActiveEnumeratorsHashTable(
3161 IN PRTL_DYNAMIC_HASH_TABLE HashTable
)
3163 return HashTable
->NumEnumerators
;
3166 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
3168 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
3173 #define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1
3174 #define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2
3176 #define RtlUnicodeStringToOemSize(STRING) (NLS_MB_OEM_CODE_PAGE_TAG ? \
3177 RtlxUnicodeStringToOemSize(STRING) : \
3178 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
3181 #define RtlOemStringToUnicodeSize(STRING) ( \
3182 NLS_MB_OEM_CODE_PAGE_TAG ? \
3183 RtlxOemStringToUnicodeSize(STRING) : \
3184 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
3187 #define RtlOemStringToCountedUnicodeSize(STRING) ( \
3188 (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
3191 #define RtlOffsetToPointer(B,O) ((PCHAR)(((PCHAR)(B)) + ((ULONG_PTR)(O))))
3192 #define RtlPointerToOffset(B,P) ((ULONG)(((PCHAR)(P)) - ((PCHAR)(B))))