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
);
271 IN PRTL_BITMAP BitMapHeader
,
272 IN ULONG StartingIndex
,
279 IN PRTL_BITMAP BitMapHeader
,
280 IN ULONG StartingIndex
,
286 RtlAnsiStringToUnicodeString(
287 IN OUT PUNICODE_STRING DestinationString
,
288 IN PANSI_STRING SourceString
,
289 IN BOOLEAN AllocateDestinationString
);
294 RtlxAnsiStringToUnicodeSize(
295 IN PCANSI_STRING AnsiString
);
297 #define RtlAnsiStringToUnicodeSize(String) ( \
298 NLS_MB_CODE_PAGE_TAG ? \
299 RtlxAnsiStringToUnicodeSize(String) : \
300 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
306 RtlAppendUnicodeStringToString(
307 IN OUT PUNICODE_STRING Destination
,
308 IN PCUNICODE_STRING Source
);
313 RtlAppendUnicodeToString(
314 IN OUT PUNICODE_STRING Destination
,
328 IN PRTL_BITMAP BitMapHeader
);
334 IN PRTL_BITMAP BitMapHeader
,
335 IN ULONG StartingIndex
,
336 IN ULONG NumberToClear
);
342 IN CONST VOID
*Source1
,
343 IN CONST VOID
*Source2
,
349 RtlCompareUnicodeString(
350 IN PCUNICODE_STRING String1
,
351 IN PCUNICODE_STRING String2
,
352 IN BOOLEAN CaseInSensitive
);
357 RtlCompareUnicodeStrings(
359 IN SIZE_T String1Length
,
361 IN SIZE_T String2Length
,
362 IN BOOLEAN CaseInSensitive
);
367 RtlCopyUnicodeString(
368 IN OUT PUNICODE_STRING DestinationString
,
369 IN PCUNICODE_STRING SourceString OPTIONAL
);
374 RtlCreateRegistryKey(
381 RtlCreateSecurityDescriptor(
382 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
388 RtlDeleteRegistryValue(
391 IN PCWSTR ValueName
);
396 RtlEqualUnicodeString(
397 IN CONST UNICODE_STRING
*String1
,
398 IN CONST UNICODE_STRING
*String2
,
399 IN BOOLEAN CaseInSensitive
);
401 #if !defined(_AMD64_) && !defined(_IA64_)
405 RtlExtendedIntegerMultiply(
406 IN LARGE_INTEGER Multiplicand
,
412 RtlExtendedLargeIntegerDivide(
413 IN LARGE_INTEGER Dividend
,
415 OUT PULONG Remainder OPTIONAL
);
418 #if defined(_X86_) || defined(_IA64_)
422 RtlExtendedMagicDivide(
423 IN LARGE_INTEGER Dividend
,
424 IN LARGE_INTEGER MagicDivisor
,
425 IN CCHAR ShiftCount
);
432 IN PANSI_STRING AnsiString
);
438 IN PRTL_BITMAP BitMapHeader
,
439 IN ULONG NumberToFind
,
445 RtlFindClearBitsAndSet(
446 IN PRTL_BITMAP BitMapHeader
,
447 IN ULONG NumberToFind
,
453 RtlFindFirstRunClear(
454 IN PRTL_BITMAP BitMapHeader
,
455 OUT PULONG StartingIndex
);
461 IN PRTL_BITMAP BitMapHeader
,
462 OUT PRTL_BITMAP_RUN RunArray
,
463 IN ULONG SizeOfRunArray
,
464 IN BOOLEAN LocateLongestRuns
);
469 RtlFindLastBackwardRunClear(
470 IN PRTL_BITMAP BitMapHeader
,
472 OUT PULONG StartingRunIndex
);
477 RtlFindLeastSignificantBit(
483 RtlFindLongestRunClear(
484 IN PRTL_BITMAP BitMapHeader
,
485 OUT PULONG StartingIndex
);
490 RtlFindMostSignificantBit(
496 RtlFindNextForwardRunClear(
497 IN PRTL_BITMAP BitMapHeader
,
499 OUT PULONG StartingRunIndex
);
505 IN PRTL_BITMAP BitMapHeader
,
506 IN ULONG NumberToFind
,
512 RtlFindSetBitsAndClear(
513 IN PRTL_BITMAP BitMapHeader
,
514 IN ULONG NumberToFind
,
521 IN OUT PANSI_STRING DestinationString
,
522 IN PCSZ SourceString
);
528 IN PRTL_BITMAP BitMapHeader
,
529 IN PULONG BitMapBuffer
,
530 IN ULONG SizeOfBitMap
);
536 IN OUT PSTRING DestinationString
,
537 IN PCSZ SourceString
);
542 RtlIntegerToUnicodeString(
544 IN ULONG Base OPTIONAL
,
545 IN OUT PUNICODE_STRING String
);
550 RtlInt64ToUnicodeString(
552 IN ULONG Base OPTIONAL
,
553 IN OUT PUNICODE_STRING String
);
556 #define RtlIntPtrToUnicodeString(Value, Base, String) \
557 RtlInt64ToUnicodeString(Value, Base, String)
559 #define RtlIntPtrToUnicodeString(Value, Base, String) \
560 RtlIntegerToUnicodeString(Value, Base, String)
567 #define RtlIsZeroLuid(_L1) \
568 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
573 RtlLengthSecurityDescriptor(
574 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
579 RtlNumberOfClearBits(
580 IN PRTL_BITMAP BitMapHeader
);
586 IN PRTL_BITMAP BitMapHeader
);
591 RtlQueryRegistryValues(
594 IN OUT PRTL_QUERY_REGISTRY_TABLE QueryTable
,
595 IN PVOID Context OPTIONAL
,
596 IN PVOID Environment OPTIONAL
);
598 #define SHORT_SIZE (sizeof(USHORT))
599 #define SHORT_MASK (SHORT_SIZE - 1)
600 #define LONG_SIZE (sizeof(LONG))
601 #define LONGLONG_SIZE (sizeof(LONGLONG))
602 #define LONG_MASK (LONG_SIZE - 1)
603 #define LONGLONG_MASK (LONGLONG_SIZE - 1)
604 #define LOWBYTE_MASK 0x00FF
606 #define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK)
607 #define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK)
608 #define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK)
609 #define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK)
615 IN PRTL_BITMAP BitMapHeader
);
621 IN PRTL_BITMAP BitMapHeader
,
622 IN ULONG StartingIndex
,
623 IN ULONG NumberToSet
);
628 RtlSetDaclSecurityDescriptor(
629 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
630 IN BOOLEAN DaclPresent
,
631 IN PACL Dacl OPTIONAL
,
632 IN BOOLEAN DaclDefaulted OPTIONAL
);
641 #define RtlStoreUlong(Address,Value) \
642 *(ULONG UNALIGNED *)(Address) = (Value)
646 * IN OUT PULONGLONG Address,
649 #define RtlStoreUlonglong(Address,Value) \
650 *(ULONGLONG UNALIGNED *)(Address) = (Value)
654 * IN PUSHORT Address,
657 #define RtlStoreUshort(Address,Value) \
658 *(USHORT UNALIGNED *)(Address) = (Value)
662 * PUSHORT DestinationAddress,
663 * PUSHORT SourceAddress);
665 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
666 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
670 * PULONG DestinationAddress,
671 * PULONG SourceAddress);
673 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
674 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
678 #define RtlStoreUlong(Address,Value) \
679 if ((ULONG_PTR)(Address) & LONG_MASK) { \
680 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
681 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
682 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
683 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
686 *((PULONG)(Address)) = (ULONG) (Value); \
689 #define RtlStoreUlonglong(Address,Value) \
690 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
691 RtlStoreUlong((ULONG_PTR)(Address), \
692 (ULONGLONG)(Value) & 0xFFFFFFFF); \
693 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
694 (ULONGLONG)(Value) >> 32); \
696 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
699 #define RtlStoreUshort(Address,Value) \
700 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
701 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
702 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
705 *((PUSHORT) (Address)) = (USHORT)Value; \
708 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
709 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
711 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
712 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
716 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
719 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
720 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
722 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
723 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
724 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
725 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
729 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
732 #endif /* defined(_AMD64_) */
737 * IN OUT PULONG_PTR Address,
738 * IN ULONG_PTR Value);
740 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value)
742 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
750 IN PTIME_FIELDS TimeFields
,
751 IN PLARGE_INTEGER Time
);
757 IN PLARGE_INTEGER Time
,
758 IN PTIME_FIELDS TimeFields
);
769 RtlUlonglongByteSwap(
770 IN ULONGLONG Source
);
775 RtlUnicodeStringToAnsiString(
776 IN OUT PANSI_STRING DestinationString
,
777 IN PCUNICODE_STRING SourceString
,
778 IN BOOLEAN AllocateDestinationString
);
783 RtlxUnicodeStringToAnsiSize(
784 IN PCUNICODE_STRING UnicodeString
);
786 #define RtlUnicodeStringToAnsiSize(String) ( \
787 NLS_MB_CODE_PAGE_TAG ? \
788 RtlxUnicodeStringToAnsiSize(String) : \
789 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
795 RtlUnicodeStringToInteger(
796 IN PCUNICODE_STRING String
,
797 IN ULONG Base OPTIONAL
,
803 RtlUpcaseUnicodeChar(
804 IN WCHAR SourceCharacter
);
815 RtlValidRelativeSecurityDescriptor(
816 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
817 IN ULONG SecurityDescriptorLength
,
818 IN SECURITY_INFORMATION RequiredInformation
);
823 RtlValidSecurityDescriptor(
824 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
829 RtlWriteRegistryValue(
835 IN ULONG ValueLength
);
837 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
839 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
843 RtlPrefetchMemoryNonTemporal(
848 #if (NTDDI_VERSION >= NTDDI_WINXP)
854 PRTL_BITMAP BitMapHeader
,
860 RtlDowncaseUnicodeChar(
861 IN WCHAR SourceCharacter
);
867 PRTL_BITMAP BitMapHeader
,
874 IN PRTL_BITMAP BitMapHeader
,
880 RtlHashUnicodeString(
881 IN CONST UNICODE_STRING
*String
,
882 IN BOOLEAN CaseInSensitive
,
883 IN ULONG HashAlgorithm
,
884 OUT PULONG HashValue
);
886 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
888 #if (NTDDI_VERSION >= NTDDI_VISTA)
893 RtlNumberOfSetBitsUlongPtr(
894 IN ULONG_PTR Target
);
899 RtlIoDecodeMemIoResource(
900 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
901 OUT PULONGLONG Alignment OPTIONAL
,
902 OUT PULONGLONG MinimumAddress OPTIONAL
,
903 OUT PULONGLONG MaximumAddress OPTIONAL
);
908 RtlIoEncodeMemIoResource(
909 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
912 IN ULONGLONG Alignment
,
913 IN ULONGLONG MinimumAddress
,
914 IN ULONGLONG MaximumAddress
);
919 RtlCmDecodeMemIoResource(
920 IN
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
*Descriptor
,
921 OUT PULONGLONG Start OPTIONAL
);
926 RtlFindClosestEncodableLength(
927 IN ULONGLONG SourceLength
,
928 OUT PULONGLONG TargetLength
);
933 RtlCmEncodeMemIoResource(
934 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
939 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
941 #if (NTDDI_VERSION >= NTDDI_WIN7)
947 OUT PCHAR UTF8StringDestination
,
948 IN ULONG UTF8StringMaxByteCount
,
949 OUT PULONG UTF8StringActualByteCount
,
950 IN PCWCH UnicodeStringSource
,
951 IN ULONG UnicodeStringByteCount
);
957 OUT PWSTR UnicodeStringDestination
,
958 IN ULONG UnicodeStringMaxByteCount
,
959 OUT PULONG UnicodeStringActualByteCount
,
960 IN PCCH UTF8StringSource
,
961 IN ULONG UTF8StringByteCount
);
966 RtlGetEnabledExtendedFeatures(
967 IN ULONG64 FeatureMask
);
969 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
971 #if !defined(MIDL_PASS)
972 /* inline funftions */
973 //DECLSPEC_DEPRECATED_DDK_WINXP
977 RtlConvertLongToLargeInteger(
978 IN LONG SignedInteger
)
981 ret
.QuadPart
= SignedInteger
;
985 //DECLSPEC_DEPRECATED_DDK_WINXP
989 RtlConvertUlongToLargeInteger(
990 IN ULONG UnsignedInteger
)
993 ret
.QuadPart
= UnsignedInteger
;
997 //DECLSPEC_DEPRECATED_DDK_WINXP
1001 RtlLargeIntegerShiftLeft(
1002 IN LARGE_INTEGER LargeInteger
,
1003 IN CCHAR ShiftCount
)
1005 LARGE_INTEGER Result
;
1007 Result
.QuadPart
= LargeInteger
.QuadPart
<< ShiftCount
;
1011 //DECLSPEC_DEPRECATED_DDK_WINXP
1015 RtlLargeIntegerShiftRight(
1016 IN LARGE_INTEGER LargeInteger
,
1017 IN CCHAR ShiftCount
)
1019 LARGE_INTEGER Result
;
1021 Result
.QuadPart
= (ULONG64
)LargeInteger
.QuadPart
>> ShiftCount
;
1025 //DECLSPEC_DEPRECATED_DDK
1029 RtlEnlargedUnsignedDivide(
1030 IN ULARGE_INTEGER Dividend
,
1032 IN OUT PULONG Remainder
)
1035 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
1036 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
1039 //DECLSPEC_DEPRECATED_DDK
1043 RtlLargeIntegerNegate(
1044 IN LARGE_INTEGER Subtrahend
)
1046 LARGE_INTEGER Difference
;
1048 Difference
.QuadPart
= -Subtrahend
.QuadPart
;
1052 //DECLSPEC_DEPRECATED_DDK
1056 RtlLargeIntegerSubtract(
1057 IN LARGE_INTEGER Minuend
,
1058 IN LARGE_INTEGER Subtrahend
)
1060 LARGE_INTEGER Difference
;
1062 Difference
.QuadPart
= Minuend
.QuadPart
- Subtrahend
.QuadPart
;
1066 //DECLSPEC_DEPRECATED_DDK
1070 RtlEnlargedUnsignedMultiply(
1071 IN ULONG Multiplicand
,
1072 IN ULONG Multiplier
)
1075 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1079 //DECLSPEC_DEPRECATED_DDK
1083 RtlEnlargedIntegerMultiply(
1084 IN LONG Multiplicand
,
1088 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
1094 RtlInitEmptyAnsiString(
1095 OUT PANSI_STRING AnsiString
,
1097 IN USHORT BufferSize
)
1099 AnsiString
->Length
= 0;
1100 AnsiString
->MaximumLength
= BufferSize
;
1101 AnsiString
->Buffer
= Buffer
;
1106 RtlInitEmptyUnicodeString(
1107 OUT PUNICODE_STRING UnicodeString
,
1109 IN USHORT BufferSize
)
1111 UnicodeString
->Length
= 0;
1112 UnicodeString
->MaximumLength
= BufferSize
;
1113 UnicodeString
->Buffer
= Buffer
;
1116 #if defined(_AMD64_) || defined(_IA64_)
1120 RtlExtendedIntegerMultiply(
1121 IN LARGE_INTEGER Multiplicand
,
1125 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
1132 RtlExtendedLargeIntegerDivide(
1133 IN LARGE_INTEGER Dividend
,
1135 OUT PULONG Remainder OPTIONAL
)
1138 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
1140 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
1145 #if defined(_AMD64_)
1147 #define MultiplyHigh __mulh
1148 #define UnsignedMultiplyHigh __umulh
1150 //DECLSPEC_DEPRECATED_DDK
1154 RtlExtendedMagicDivide(
1155 IN LARGE_INTEGER Dividend
,
1156 IN LARGE_INTEGER MagicDivisor
,
1157 IN CCHAR ShiftCount
)
1162 Pos
= (Dividend
.QuadPart
>= 0);
1163 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
1164 MagicDivisor
.QuadPart
);
1165 ret64
>>= ShiftCount
;
1166 ret
.QuadPart
= Pos
? ret64
: -ret64
;
1171 //DECLSPEC_DEPRECATED_DDK
1176 IN LARGE_INTEGER Addend1
,
1177 IN LARGE_INTEGER Addend2
)
1180 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
1185 * RtlLargeIntegerAnd(
1186 * IN OUT LARGE_INTEGER Result,
1187 * IN LARGE_INTEGER Source,
1188 * IN LARGE_INTEGER Mask);
1190 #define RtlLargeIntegerAnd(Result, Source, Mask) \
1191 Result.QuadPart = Source.QuadPart & Mask.QuadPart
1193 //DECLSPEC_DEPRECATED_DDK
1197 RtlLargeIntegerArithmeticShift(
1198 IN LARGE_INTEGER LargeInteger
,
1199 IN CCHAR ShiftCount
)
1202 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
1207 * RtlLargeIntegerEqualTo(
1208 * IN LARGE_INTEGER Operand1,
1209 * IN LARGE_INTEGER Operand2);
1211 #define RtlLargeIntegerEqualTo(X,Y) \
1212 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
1216 RtlSecureZeroMemory(
1220 volatile char* vptr
= (volatile char*)Pointer
;
1221 #if defined(_M_AMD64)
1222 __stosb((PUCHAR
)vptr
, 0, Size
);
1224 char * endptr
= (char *)vptr
+ Size
;
1225 while (vptr
< endptr
) {
1232 #if defined(_M_AMD64)
1236 IN PRTL_BITMAP BitMapHeader
,
1237 IN ULONG BitPosition
)
1239 return BitTest64((LONG64 CONST
*)BitMapHeader
->Buffer
, (LONG64
)BitPosition
);
1242 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
1243 #endif /* defined(_M_AMD64) */
1245 #define RtlLargeIntegerGreaterThan(X,Y) ( \
1246 (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
1247 ((X).HighPart > (Y).HighPart) \
1250 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
1251 (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
1252 ((X).HighPart > (Y).HighPart) \
1255 #define RtlLargeIntegerNotEqualTo(X,Y) ( \
1256 (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
1259 #define RtlLargeIntegerLessThan(X,Y) ( \
1260 (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
1261 ((X).HighPart < (Y).HighPart) \
1264 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
1265 (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
1266 ((X).HighPart < (Y).HighPart) \
1269 #define RtlLargeIntegerGreaterThanZero(X) ( \
1270 (((X).HighPart == 0) && ((X).LowPart > 0)) || \
1271 ((X).HighPart > 0 ) \
1274 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
1276 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
1278 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
1280 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
1282 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
1284 #endif /* !defined(MIDL_PASS) */
1286 /* Byte Swap Functions */
1287 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
1288 ((defined(_M_AMD64) || defined(_M_IA64)) \
1289 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
1291 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1292 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1293 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1299 #define ASSERT(exp) \
1301 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
1303 #define ASSERTMSG(msg, exp) \
1305 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
1307 #define RTL_SOFT_ASSERT(exp) \
1309 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
1311 #define RTL_SOFT_ASSERTMSG(msg, exp) \
1313 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
1315 #define RTL_VERIFY(exp) ASSERT(exp)
1316 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
1318 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
1319 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
1321 #if defined(_MSC_VER)
1323 #define NT_ASSERT(exp) \
1325 (__annotation(L"Debug", L"AssertFail", L#exp), \
1326 DbgRaiseAssertionFailure(), FALSE) : TRUE)
1328 #define NT_ASSERTMSG(msg, exp) \
1330 (__annotation(L"Debug", L"AssertFail", L##msg), \
1331 DbgRaiseAssertionFailure(), FALSE) : TRUE)
1333 #define NT_ASSERTMSGW(msg, exp) \
1335 (__annotation(L"Debug", L"AssertFail", msg), \
1336 DbgRaiseAssertionFailure(), FALSE) : TRUE)
1338 #define NT_VERIFY NT_ASSERT
1339 #define NT_VERIFYMSG NT_ASSERTMSG
1340 #define NT_VERIFYMSGW NT_ASSERTMSGW
1344 /* GCC doesn't support __annotation (nor PDB) */
1345 #define NT_ASSERT(exp) \
1346 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
1348 #define NT_ASSERTMSG NT_ASSERT
1349 #define NT_ASSERTMSGW NT_ASSERT
1355 #define ASSERT(exp) ((VOID) 0)
1356 #define ASSERTMSG(msg, exp) ((VOID) 0)
1358 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
1359 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
1361 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
1362 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
1364 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
1365 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
1367 #define NT_ASSERT(exp) ((VOID)0)
1368 #define NT_ASSERTMSG(msg, exp) ((VOID)0)
1369 #define NT_ASSERTMSGW(msg, exp) ((VOID)0)
1371 #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE)
1372 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
1373 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
1377 #define InitializeListHead32(ListHead) (\
1378 (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
1380 #if !defined(_WINBASE_)
1382 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
1386 InitializeSListHead(
1387 OUT PSLIST_HEADER SListHead
);
1393 InitializeSListHead(
1394 OUT PSLIST_HEADER SListHead
)
1397 ULONG64 FeatureBits
;
1401 if (((ULONG_PTR
)SListHead
& 0xf) != 0) {
1402 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT
);
1405 RtlZeroMemory(SListHead
, sizeof(SLIST_HEADER
));
1407 FeatureBits
= __getReg(CV_IA64_CPUID4
);
1408 if ((FeatureBits
& KF_16BYTE_INSTR
) != 0) {
1409 SListHead
->Header16
.HeaderType
= 1;
1410 SListHead
->Header16
.Init
= 1;
1419 #define InterlockedPopEntrySList(Head) \
1420 ExpInterlockedPopEntrySList(Head)
1422 #define InterlockedPushEntrySList(Head, Entry) \
1423 ExpInterlockedPushEntrySList(Head, Entry)
1425 #define InterlockedFlushSList(Head) \
1426 ExpInterlockedFlushSList(Head)
1428 #define QueryDepthSList(Head) \
1429 ExQueryDepthSList(Head)
1431 #else /* !defined(_WIN64) */
1436 InterlockedPopEntrySList(
1437 IN PSLIST_HEADER ListHead
);
1442 InterlockedPushEntrySList(
1443 IN PSLIST_HEADER ListHead
,
1444 IN PSLIST_ENTRY ListEntry
);
1446 #define InterlockedFlushSList(ListHead) \
1447 ExInterlockedFlushSList(ListHead)
1449 #define QueryDepthSList(Head) \
1450 ExQueryDepthSList(Head)
1452 #endif /* !defined(_WIN64) */
1454 #endif /* !defined(_WINBASE_) */
1456 #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
1457 #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
1458 #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \
1459 ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
1460 #define RTL_CONTEXT_OFFSET(Context, Chunk) \
1461 RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
1462 #define RTL_CONTEXT_LENGTH(Context, Chunk) \
1463 RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
1464 #define RTL_CONTEXT_CHUNK(Context, Chunk) \
1465 RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \
1466 (PCONTEXT_EX)(Context + 1), \
1470 RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable
)(
1474 RTLVERLIB_DDI(RtlIsServicePackVersionInstalled
)(
1477 #ifndef RtlIsNtDdiVersionAvailable
1478 #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable
1481 #ifndef RtlIsServicePackVersionInstalled
1482 #define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled
1485 #define RtlInterlockedSetBits(Flags, Flag) \
1486 InterlockedOr((PLONG)(Flags), Flag)
1488 #define RtlInterlockedAndBits(Flags, Flag) \
1489 InterlockedAnd((PLONG)(Flags), Flag)
1491 #define RtlInterlockedClearBits(Flags, Flag) \
1492 RtlInterlockedAndBits(Flags, ~(Flag))
1494 #define RtlInterlockedXorBits(Flags, Flag) \
1495 InterlockedXor(Flags, Flag)
1497 #define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \
1498 (VOID) RtlInterlockedSetBits(Flags, Flag)
1500 #define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \
1501 (VOID) RtlInterlockedAndBits(Flags, Flag)
1503 #define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
1504 RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))