3 Copyright (c) Alex Ionescu. All rights reserved.
11 Function definitions for the Run-Time Library
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
44 IN PLIST_ENTRY ListHead
47 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
53 IN PLIST_ENTRY ListHead
,
58 OldFlink
= ListHead
->Flink
;
59 Entry
->Flink
= OldFlink
;
60 Entry
->Blink
= ListHead
;
61 OldFlink
->Blink
= Entry
;
62 ListHead
->Flink
= Entry
;
68 IN PLIST_ENTRY ListHead
,
73 OldBlink
= ListHead
->Blink
;
74 Entry
->Flink
= ListHead
;
75 Entry
->Blink
= OldBlink
;
76 OldBlink
->Flink
= Entry
;
77 ListHead
->Blink
= Entry
;
83 IN
const LIST_ENTRY
* ListHead
86 return (BOOLEAN
)(ListHead
->Flink
== ListHead
);
92 PSINGLE_LIST_ENTRY ListHead
95 PSINGLE_LIST_ENTRY FirstEntry
;
96 FirstEntry
= ListHead
->Next
;
97 if (FirstEntry
!= NULL
) {
98 ListHead
->Next
= FirstEntry
->Next
;
107 PSINGLE_LIST_ENTRY ListHead
,
108 PSINGLE_LIST_ENTRY Entry
111 Entry
->Next
= ListHead
->Next
;
112 ListHead
->Next
= Entry
;
118 IN PLIST_ENTRY Entry
)
120 PLIST_ENTRY OldFlink
;
121 PLIST_ENTRY OldBlink
;
123 OldFlink
= Entry
->Flink
;
124 OldBlink
= Entry
->Blink
;
125 OldFlink
->Blink
= OldBlink
;
126 OldBlink
->Flink
= OldFlink
;
127 return (BOOLEAN
)(OldFlink
== OldBlink
);
133 IN PLIST_ENTRY ListHead
)
138 Entry
= ListHead
->Flink
;
139 Flink
= Entry
->Flink
;
140 ListHead
->Flink
= Flink
;
141 Flink
->Blink
= ListHead
;
148 IN PLIST_ENTRY ListHead
)
153 Entry
= ListHead
->Blink
;
154 Blink
= Entry
->Blink
;
155 ListHead
->Blink
= Blink
;
156 Blink
->Flink
= ListHead
;
161 // Unicode string macros
165 RtlInitEmptyUnicodeString(OUT PUNICODE_STRING UnicodeString
,
167 IN USHORT BufferSize
)
169 UnicodeString
->Length
= 0;
170 UnicodeString
->MaximumLength
= BufferSize
;
171 UnicodeString
->Buffer
= Buffer
;
177 #define RtlEqualLuid(L1, L2) (((L1)->HighPart == (L2)->HighPart) && \
178 ((L1)->LowPart == (L2)->LowPart))
182 RtlConvertUlongToLuid(ULONG Ulong
)
186 TempLuid
.LowPart
= Ulong
;
187 TempLuid
.HighPart
= 0;
197 #define ASSERT( exp ) \
199 (RtlAssert( #exp, __FILE__, __LINE__, NULL ),FALSE) : \
202 #define ASSERTMSG( msg, exp ) \
204 (RtlAssert( #exp, __FILE__, __LINE__, msg ),FALSE) : \
209 #define ASSERT( exp ) ((void) 0)
210 #define ASSERTMSG( msg, exp ) ((void) 0)
215 #ifdef NTOS_KERNEL_RUNTIME
218 // Executing RTL functions at DISPATCH_LEVEL or higher will result in a
221 #define RTL_PAGED_CODE PAGED_CODE
226 // This macro does nothing in user mode
228 #define RTL_PAGED_CODE NOP_FUNCTION
233 // RTL Splay Tree Functions
239 IN PRTL_SPLAY_LINKS Links
245 RtlDelete(IN PRTL_SPLAY_LINKS Links
252 IN PRTL_SPLAY_LINKS Links
,
253 OUT PRTL_SPLAY_LINKS
*Root
260 IN PRTL_SPLAY_LINKS Links
266 RtlSubtreePredecessor(
267 IN PRTL_SPLAY_LINKS Links
274 IN PRTL_SPLAY_LINKS Links
281 IN PRTL_SPLAY_LINKS Links
284 #define RtlIsLeftChild(Links) \
285 (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
287 #define RtlIsRightChild(Links) \
288 (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
290 #define RtlRightChild(Links) \
291 ((PRTL_SPLAY_LINKS)(Links))->RightChild
293 #define RtlIsRoot(Links) \
294 (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
296 #define RtlLeftChild(Links) \
297 ((PRTL_SPLAY_LINKS)(Links))->LeftChild
299 #define RtlParent(Links) \
300 ((PRTL_SPLAY_LINKS)(Links))->Parent
302 #define RtlInitializeSplayLinks(Links) \
304 PRTL_SPLAY_LINKS _SplayLinks; \
305 _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
306 _SplayLinks->Parent = _SplayLinks; \
307 _SplayLinks->LeftChild = NULL; \
308 _SplayLinks->RightChild = NULL; \
311 #define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \
313 PRTL_SPLAY_LINKS _SplayParent; \
314 PRTL_SPLAY_LINKS _SplayChild; \
315 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
316 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
317 _SplayParent->LeftChild = _SplayChild; \
318 _SplayChild->Parent = _SplayParent; \
321 #define RtlInsertAsRightChild(ParentLinks,ChildLinks) \
323 PRTL_SPLAY_LINKS _SplayParent; \
324 PRTL_SPLAY_LINKS _SplayChild; \
325 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
326 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
327 _SplayParent->RightChild = _SplayChild; \
328 _SplayChild->Parent = _SplayParent; \
333 // Error and Exception Functions
338 RtlAddVectoredExceptionHandler(
339 IN ULONG FirstHandler
,
340 IN PVECTORED_EXCEPTION_HANDLER VectoredHandler
347 IN PVOID FailedAssertion
,
356 RtlSetUnhandledExceptionFilter(
357 IN PVOID TopLevelExceptionFilter
364 OUT PCONTEXT ContextRecord
384 RtlEncodeSystemPointer(
391 RtlDecodeSystemPointer(
398 RtlDispatchException(
399 IN PEXCEPTION_RECORD ExceptionRecord
,
406 RtlNtStatusToDosError(
413 RtlSetLastWin32ErrorAndNtStatusFromNtStatus(
421 IN PEXCEPTION_RECORD ExceptionRecord
434 RtlUnhandledExceptionFilter(
435 IN
struct _EXCEPTION_POINTERS
* ExceptionInfo
442 IN PVOID TargetFrame OPTIONAL
,
443 IN PVOID TargetIp OPTIONAL
,
444 IN PEXCEPTION_RECORD ExceptionRecord OPTIONAL
,
454 RtlLogStackBackTrace(
465 IN HANDLE HeapHandle
,
475 IN PVOID BaseAddress OPTIONAL
,
476 IN SIZE_T SizeToReserve OPTIONAL
,
477 IN SIZE_T SizeToCommit OPTIONAL
,
478 IN PVOID Lock OPTIONAL
,
479 IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL
486 IN HANDLE HeapHandle
,
504 IN PVOID BaseAddress OPTIONAL
,
505 IN SIZE_T SizeToReserve OPTIONAL
,
506 IN SIZE_T SizeToCommit OPTIONAL
,
507 IN PVOID Lock OPTIONAL
,
508 IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL
532 IN HANDLE HeapHandle
,
556 IN PVOID BaseAddress
,
557 OUT PVOID
*UserValue
,
568 IN BOOLEAN ResetCounters
,
569 OUT PRTL_HEAP_TAG_INFO HeapTagInfo
595 OUT PRTL_HEAP_USAGE Usage
610 IN PVOID BaseAddress
,
620 IN PVOID MemoryPointer
632 #define RtlGetProcessHeap() (NtCurrentPeb()->ProcessHeap)
635 // Security Functions
640 RtlAbsoluteToSelfRelativeSD(
641 IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor
,
642 IN OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor
,
643 IN PULONG BufferLength
649 RtlAddAccessAllowedAce(
652 ACCESS_MASK AccessMask
,
659 RtlAddAccessAllowedAceEx(
661 IN ULONG dwAceRevision
,
663 IN ACCESS_MASK AccessMask
,
670 RtlAddAccessAllowedObjectAce(
672 IN ULONG dwAceRevision
,
674 IN ACCESS_MASK AccessMask
,
675 IN GUID
*ObjectTypeGuid OPTIONAL
,
676 IN GUID
*InheritedObjectTypeGuid OPTIONAL
,
683 RtlAddAccessDeniedAce(
686 ACCESS_MASK AccessMask
,
693 RtlAddAccessDeniedAceEx(
697 IN ACCESS_MASK AccessMask
,
704 RtlAddAccessDeniedObjectAce(
706 IN ULONG dwAceRevision
,
708 IN ACCESS_MASK AccessMask
,
709 IN GUID
*ObjectTypeGuid OPTIONAL
,
710 IN GUID
*InheritedObjectTypeGuid OPTIONAL
,
720 ULONG StartingAceIndex
,
728 RtlAddAuditAccessAce(
731 ACCESS_MASK AccessMask
,
744 OUT PVOID
*ReturnedState
750 RtlAddAuditAccessAceEx(
754 IN ACCESS_MASK AccessMask
,
763 RtlAddAuditAccessObjectAce(
767 IN ACCESS_MASK AccessMask
,
768 IN GUID
*ObjectTypeGuid OPTIONAL
,
769 IN GUID
*InheritedObjectTypeGuid OPTIONAL
,
782 IN ULONG MandatoryFlags
,
792 IN BOOLEAN ForThread
,
793 OUT PBOOLEAN OldValue
799 RtlAllocateAndInitializeSid(
800 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
801 IN UCHAR SubAuthorityCount
,
802 IN ULONG SubAuthority0
,
803 IN ULONG SubAuthority1
,
804 IN ULONG SubAuthority2
,
805 IN ULONG SubAuthority3
,
806 IN ULONG SubAuthority4
,
807 IN ULONG SubAuthority5
,
808 IN ULONG SubAuthority6
,
809 IN ULONG SubAuthority7
,
816 RtlAreAllAccessesGranted(
817 ACCESS_MASK GrantedAccess
,
818 ACCESS_MASK DesiredAccess
824 RtlAreAnyAccessesGranted(
825 ACCESS_MASK GrantedAccess
,
826 ACCESS_MASK DesiredAccess
840 RtlCopyLuidAndAttributesArray(
842 PLUID_AND_ATTRIBUTES Src
,
843 PLUID_AND_ATTRIBUTES Dest
849 RtlCopySidAndAttributesArray(
851 PSID_AND_ATTRIBUTES Src
,
853 PSID_AND_ATTRIBUTES Dest
,
855 PVOID
* RemainingSidArea
,
856 PULONG RemainingSidAreaSize
862 RtlConvertSidToUnicodeString(
863 OUT PUNICODE_STRING DestinationString
,
865 IN BOOLEAN AllocateDestinationString
889 RtlCreateSecurityDescriptor(
890 OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
897 RtlCreateSecurityDescriptorRelative(
898 OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor
,
953 RtlGetControlSecurityDescriptor(
954 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
955 OUT PSECURITY_DESCRIPTOR_CONTROL Control
,
962 RtlGetDaclSecurityDescriptor(
963 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
964 OUT PBOOLEAN DaclPresent
,
966 OUT PBOOLEAN DaclDefaulted
972 RtlGetSaclSecurityDescriptor(
973 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
974 OUT PBOOLEAN SaclPresent
,
976 OUT PBOOLEAN SaclDefaulted
982 RtlGetGroupSecurityDescriptor(
983 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
985 OUT PBOOLEAN GroupDefaulted
991 RtlGetOwnerSecurityDescriptor(
992 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
994 OUT PBOOLEAN OwnerDefaulted
1000 RtlGetSecurityDescriptorRMControl(
1001 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
1002 OUT PUCHAR RMControl
1006 PSID_IDENTIFIER_AUTHORITY
1008 RtlIdentifierAuthoritySid(PSID Sid
);
1013 RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
);
1020 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
1021 IN UCHAR SubAuthorityCount
1027 RtlLengthRequiredSid(IN ULONG SubAuthorityCount
);
1032 RtlLengthSid(IN PSID Sid
);
1037 RtlMakeSelfRelativeSD(
1038 IN PSECURITY_DESCRIPTOR AbsoluteSD
,
1039 OUT PSECURITY_DESCRIPTOR SelfRelativeSD
,
1040 IN OUT PULONG BufferLength
);
1046 PACCESS_MASK AccessMask
,
1047 PGENERIC_MAPPING GenericMapping
1053 RtlQueryInformationAcl(
1056 ULONG InformationLength
,
1057 ACL_INFORMATION_CLASS InformationClass
1063 RtlReleasePrivilege(
1064 IN PVOID ReturnedState
1070 RtlSelfRelativeToAbsoluteSD(
1071 IN PSECURITY_DESCRIPTOR SelfRelativeSD
,
1072 OUT PSECURITY_DESCRIPTOR AbsoluteSD
,
1073 IN PULONG AbsoluteSDSize
,
1079 IN PULONG OwnerSize
,
1080 IN PSID PrimaryGroup
,
1081 IN PULONG PrimaryGroupSize
1087 RtlSelfRelativeToAbsoluteSD2(
1088 IN OUT PSECURITY_DESCRIPTOR SelfRelativeSD
,
1089 OUT PULONG BufferSize
1095 RtlSetAttributesSecurityDescriptor(
1096 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1097 IN SECURITY_DESCRIPTOR_CONTROL Control
,
1104 RtlSetControlSecurityDescriptor(
1105 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
1106 IN SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest
,
1107 IN SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet
1113 RtlSetDaclSecurityDescriptor (
1114 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1115 IN BOOLEAN DaclPresent
,
1117 IN BOOLEAN DaclDefaulted
1123 RtlSetGroupSecurityDescriptor(
1124 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1126 IN BOOLEAN GroupDefaulted
1132 RtlSetInformationAcl(
1135 ULONG InformationLength
,
1136 ACL_INFORMATION_CLASS InformationClass
1142 RtlSetOwnerSecurityDescriptor(
1143 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1145 IN BOOLEAN OwnerDefaulted
1151 RtlSetSaclSecurityDescriptor(
1152 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1153 IN BOOLEAN SaclPresent
,
1155 IN BOOLEAN SaclDefaulted
1161 RtlSetSecurityDescriptorRMControl(
1162 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
1169 RtlSubAuthorityCountSid(
1178 IN ULONG SubAuthority
1184 RtlValidRelativeSecurityDescriptor(
1185 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
1186 IN ULONG SecurityDescriptorLength
,
1187 IN SECURITY_INFORMATION RequiredInformation
1193 RtlValidSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
1198 RtlValidSid(IN PSID Sid
);
1203 RtlValidAcl(PACL Acl
);
1208 RtlDeleteSecurityObject(
1209 IN PSECURITY_DESCRIPTOR
*ObjectDescriptor
1215 RtlNewSecurityObject(
1216 IN PSECURITY_DESCRIPTOR ParentDescriptor
,
1217 IN PSECURITY_DESCRIPTOR CreatorDescriptor
,
1218 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
1219 IN BOOLEAN IsDirectoryObject
,
1221 IN PGENERIC_MAPPING GenericMapping
1227 RtlQuerySecurityObject(
1228 IN PSECURITY_DESCRIPTOR ObjectDescriptor
,
1229 IN SECURITY_INFORMATION SecurityInformation
,
1230 OUT PSECURITY_DESCRIPTOR ResultantDescriptor
,
1231 IN ULONG DescriptorLength
,
1232 OUT PULONG ReturnLength
1238 RtlSetSecurityObject(
1239 IN SECURITY_INFORMATION SecurityInformation
,
1240 IN PSECURITY_DESCRIPTOR ModificationDescriptor
,
1241 OUT PSECURITY_DESCRIPTOR
*ObjectsSecurityDescriptor
,
1242 IN PGENERIC_MAPPING GenericMapping
,
1247 // Single-Character Functions
1252 RtlLargeIntegerToChar(
1253 IN PLARGE_INTEGER Value
,
1262 RtlUpperChar(CHAR Source
);
1267 RtlUpcaseUnicodeChar(WCHAR Source
);
1272 RtlDowncaseUnicodeChar(IN WCHAR Source
);
1287 RtlIntegerToUnicode(
1289 IN ULONG Base OPTIONAL
,
1290 IN ULONG Length OPTIONAL
,
1291 IN OUT LPWSTR String
1297 RtlIntegerToUnicodeString(
1300 IN OUT PUNICODE_STRING String
1313 // Byte Swap Functions
1315 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \
1316 ((defined(_M_AMD64) || \
1317 defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
1319 unsigned short __cdecl
_byteswap_ushort(unsigned short);
1320 unsigned long __cdecl
_byteswap_ulong (unsigned long);
1321 unsigned __int64 __cdecl
_byteswap_uint64(unsigned __int64
);
1322 #pragma intrinsic(_byteswap_ushort)
1323 #pragma intrinsic(_byteswap_ulong)
1324 #pragma intrinsic(_byteswap_uint64)
1325 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1326 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1327 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1334 RtlUshortByteSwap(IN USHORT Source
);
1339 RtlUlongByteSwap(IN ULONG Source
);
1344 RtlUlonglongByteSwap(IN ULONGLONG Source
);
1349 // Unicode->Ansi String Functions
1354 RtlxUnicodeStringToAnsiSize(IN PCUNICODE_STRING UnicodeString
);
1356 #ifdef NTOS_MODE_USER
1358 #define RtlUnicodeStringToAnsiSize(STRING) ( \
1359 NLS_MB_CODE_PAGE_TAG ? \
1360 RtlxUnicodeStringToAnsiSize(STRING) : \
1361 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1369 RtlUnicodeStringToAnsiString(
1370 PANSI_STRING DestinationString
,
1371 PCUNICODE_STRING SourceString
,
1372 BOOLEAN AllocateDestinationString
1376 // Unicode->OEM String Functions
1381 RtlUpcaseUnicodeStringToOemString(
1382 POEM_STRING DestinationString
,
1383 PCUNICODE_STRING SourceString
,
1384 BOOLEAN AllocateDestinationString
1390 RtlUpcaseUnicodeStringToCountedOemString(
1391 IN OUT POEM_STRING DestinationString
,
1392 IN PCUNICODE_STRING SourceString
,
1393 IN BOOLEAN AllocateDestinationString
1399 RtlUnicodeStringToOemString(
1400 POEM_STRING DestinationString
,
1401 PCUNICODE_STRING SourceString
,
1402 BOOLEAN AllocateDestinationString
1408 RtlUpcaseUnicodeToOemN(
1412 PWCHAR UnicodeString
,
1419 RtlxUnicodeStringToOemSize(IN PCUNICODE_STRING UnicodeString
);
1421 #ifdef NTOS_MODE_USER
1423 #define RtlUnicodeStringToOemSize(STRING) ( \
1424 NLS_MB_OEM_CODE_PAGE_TAG ? \
1425 RtlxUnicodeStringToOemSize(STRING) : \
1426 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1429 #define RtlUnicodeStringToCountedOemSize(STRING) ( \
1430 (ULONG)(RtlUnicodeStringToOemSize(STRING) - sizeof(ANSI_NULL)) \
1442 PWCHAR UnicodeString
,
1447 // Unicode->MultiByte String Functions
1452 RtlUnicodeToMultiByteN(
1456 PWCHAR UnicodeString
,
1463 RtlUpcaseUnicodeToMultiByteN(
1467 PWCHAR UnicodeString
,
1474 RtlUnicodeToMultiByteSize(
1476 PWCHAR UnicodeString
,
1483 RtlxOemStringToUnicodeSize(IN PCOEM_STRING OemString
);
1486 // OEM to Unicode Functions
1491 RtlOemStringToUnicodeString(
1492 PUNICODE_STRING DestinationString
,
1493 PCOEM_STRING SourceString
,
1494 BOOLEAN AllocateDestinationString
1501 PWSTR UnicodeString
,
1502 ULONG MaxBytesInUnicodeString
,
1503 PULONG BytesInUnicodeString
,
1505 ULONG BytesInOemString
1508 #ifdef NTOS_MODE_USER
1510 #define RtlOemStringToUnicodeSize(STRING) ( \
1511 NLS_MB_OEM_CODE_PAGE_TAG ? \
1512 RtlxOemStringToUnicodeSize(STRING) : \
1513 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1516 #define RtlOemStringToCountedUnicodeSize(STRING) ( \
1517 (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
1523 // Ansi->Unicode String Functions
1528 RtlxAnsiStringToUnicodeSize(
1529 PCANSI_STRING AnsiString
1535 RtlAnsiStringToUnicodeString(
1536 PUNICODE_STRING DestinationString
,
1537 PCANSI_STRING SourceString
,
1538 BOOLEAN AllocateDestinationString
1541 #ifdef NTOS_MODE_USER
1543 #define RtlAnsiStringToUnicodeSize(STRING) ( \
1544 NLS_MB_CODE_PAGE_TAG ? \
1545 RtlxAnsiStringToUnicodeSize(STRING) : \
1546 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1554 RtlCreateUnicodeStringFromAsciiz(
1555 OUT PUNICODE_STRING Destination
,
1560 // Unicode String Functions
1565 RtlAppendUnicodeToString(
1566 PUNICODE_STRING Destination
,
1573 RtlAppendUnicodeStringToString(
1574 PUNICODE_STRING Destination
,
1575 PCUNICODE_STRING Source
1581 RtlCompareUnicodeString(
1582 PCUNICODE_STRING String1
,
1583 PCUNICODE_STRING String2
,
1584 BOOLEAN CaseInsensitive
1590 RtlCopyUnicodeString(
1591 PUNICODE_STRING DestinationString
,
1592 PCUNICODE_STRING SourceString
1598 RtlCreateUnicodeString(
1599 PUNICODE_STRING DestinationString
,
1603 #ifdef NTOS_MODE_USER
1608 RtlDowncaseUnicodeString(
1609 IN OUT PUNICODE_STRING UniDest
,
1610 IN PCUNICODE_STRING UniSource
,
1611 IN BOOLEAN AllocateDestinationString
1619 RtlDuplicateUnicodeString(
1621 IN PCUNICODE_STRING SourceString
,
1622 OUT PUNICODE_STRING DestinationString
1628 RtlEqualUnicodeString(
1629 PCUNICODE_STRING String1
,
1630 PCUNICODE_STRING String2
,
1631 BOOLEAN CaseInsensitive
1637 RtlFindCharInUnicodeString(
1639 IN PUNICODE_STRING SearchString
,
1640 IN PCUNICODE_STRING MatchString
,
1641 OUT PUSHORT Position
1647 RtlFreeUnicodeString(IN PUNICODE_STRING UnicodeString
);
1652 RtlHashUnicodeString(
1653 IN CONST UNICODE_STRING
*String
,
1654 IN BOOLEAN CaseInSensitive
,
1655 IN ULONG HashAlgorithm
,
1656 OUT PULONG HashValue
1662 RtlInitUnicodeString(
1663 IN OUT PUNICODE_STRING DestinationString
,
1664 IN PCWSTR SourceString
1670 RtlInitUnicodeStringEx(
1671 OUT PUNICODE_STRING DestinationString
,
1672 IN PCWSTR SourceString OPTIONAL
1688 PCANSI_STRING String1
,
1689 PCANSI_STRING String2
,
1690 BOOLEAN CaseInsensitive
1696 RtlPrefixUnicodeString(
1697 PCUNICODE_STRING String1
,
1698 PCUNICODE_STRING String2
,
1699 BOOLEAN CaseInsensitive
1705 RtlUpcaseUnicodeString(
1706 PUNICODE_STRING DestinationString
,
1707 PCUNICODE_STRING SourceString
,
1708 BOOLEAN AllocateDestinationString
1714 RtlUnicodeStringToInteger(
1715 PCUNICODE_STRING String
,
1723 RtlValidateUnicodeString(
1725 IN PCUNICODE_STRING String
1729 // Ansi String Functions
1734 RtlFreeAnsiString(IN PANSI_STRING AnsiString
);
1740 PANSI_STRING DestinationString
,
1745 // OEM String Functions
1750 RtlFreeOemString(IN POEM_STRING OemString
);
1753 // MultiByte->Unicode String Functions
1758 RtlMultiByteToUnicodeN(
1759 PWCHAR UnicodeString
,
1769 RtlMultiByteToUnicodeSize(
1781 RtlAddAtomToAtomTable(
1782 IN PRTL_ATOM_TABLE AtomTable
,
1792 IN OUT PRTL_ATOM_TABLE
*AtomTable
1798 RtlDeleteAtomFromAtomTable(
1799 IN PRTL_ATOM_TABLE AtomTable
,
1806 RtlDestroyAtomTable(IN PRTL_ATOM_TABLE AtomTable
);
1811 RtlQueryAtomInAtomTable(
1812 IN PRTL_ATOM_TABLE AtomTable
,
1814 IN OUT PULONG RefCount OPTIONAL
,
1815 IN OUT PULONG PinCount OPTIONAL
,
1816 IN OUT PWSTR AtomName OPTIONAL
,
1817 IN OUT PULONG NameLength OPTIONAL
1823 RtlPinAtomInAtomTable(
1824 IN PRTL_ATOM_TABLE AtomTable
,
1831 RtlLookupAtomInAtomTable(
1832 IN PRTL_ATOM_TABLE AtomTable
,
1844 IN PVOID Destination
,
1850 // Process Management Functions
1855 RtlAcquirePebLock(VOID
);
1860 RtlCreateProcessParameters (
1861 OUT PRTL_USER_PROCESS_PARAMETERS
*ProcessParameters
,
1862 IN PUNICODE_STRING ImagePathName OPTIONAL
,
1863 IN PUNICODE_STRING DllPath OPTIONAL
,
1864 IN PUNICODE_STRING CurrentDirectory OPTIONAL
,
1865 IN PUNICODE_STRING CommandLine OPTIONAL
,
1866 IN PWSTR Environment OPTIONAL
,
1867 IN PUNICODE_STRING WindowTitle OPTIONAL
,
1868 IN PUNICODE_STRING DesktopInfo OPTIONAL
,
1869 IN PUNICODE_STRING ShellInfo OPTIONAL
,
1870 IN PUNICODE_STRING RuntimeInfo OPTIONAL
1876 RtlCreateUserProcess(
1877 IN PUNICODE_STRING ImageFileName
,
1878 IN ULONG Attributes
,
1879 IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
,
1880 IN PSECURITY_DESCRIPTOR ProcessSecutityDescriptor OPTIONAL
,
1881 IN PSECURITY_DESCRIPTOR ThreadSecurityDescriptor OPTIONAL
,
1882 IN HANDLE ParentProcess OPTIONAL
,
1883 IN BOOLEAN CurrentDirectory
,
1884 IN HANDLE DebugPort OPTIONAL
,
1885 IN HANDLE ExceptionPort OPTIONAL
,
1886 OUT PRTL_USER_PROCESS_INFORMATION ProcessInfo
1892 RtlCreateUserThread(
1893 IN HANDLE ProcessHandle
,
1894 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
1895 IN BOOLEAN CreateSuspended
,
1896 IN ULONG StackZeroBits
,
1897 IN SIZE_T StackReserve
,
1898 IN SIZE_T StackCommit
,
1899 IN PTHREAD_START_ROUTINE StartAddress
,
1901 IN OUT PHANDLE ThreadHandle
,
1902 IN OUT PCLIENT_ID ClientId
1906 PRTL_USER_PROCESS_PARAMETERS
1908 RtlDeNormalizeProcessParams(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
);
1913 RtlDestroyProcessParameters(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
);
1918 RtlExitUserThread(NTSTATUS Status
);
1923 RtlInitializeContext(
1924 IN HANDLE ProcessHandle
,
1925 OUT PCONTEXT ThreadContext
,
1926 IN PVOID ThreadStartParam OPTIONAL
,
1927 IN PTHREAD_START_ROUTINE ThreadStartAddress
,
1928 IN PINITIAL_TEB InitialTeb
1932 PRTL_USER_PROCESS_PARAMETERS
1934 RtlNormalizeProcessParams(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
);
1939 RtlReleasePebLock(VOID
);
1944 RtlSetProcessIsCritical(
1945 IN BOOLEAN NewValue
,
1946 OUT PBOOLEAN OldValue OPTIONAL
,
1947 IN BOOLEAN IsWinlogon
1950 #define NtCurrentPeb() (NtCurrentTeb()->ProcessEnvironmentBlock)
1953 // Thread Pool Functions
1959 IN WORKERCALLBACKFUNC Function
,
1960 IN PVOID Context OPTIONAL
,
1965 // Environment/Path Functions
1970 RtlCreateEnvironment(
1978 RtlComputePrivatizedDllName_U(
1979 IN PUNICODE_STRING DllName
,
1980 OUT PUNICODE_STRING RealName
,
1981 OUT PUNICODE_STRING LocalName
1987 RtlDestroyEnvironment(
1988 IN PWSTR Environment
1994 RtlDoesFileExists_U(
2001 RtlDoesFileExists_UstrEx(
2002 IN PCUNICODE_STRING FileName
,
2003 IN BOOLEAN SucceedIfBusy
2009 RtlDetermineDosPathNameType_U(
2016 RtlDetermineDosPathNameType_Ustr(
2017 IN PCUNICODE_STRING Path
2026 IN PCWSTR Extension
,
2027 IN ULONG BufferSize
,
2035 RtlDosPathNameToNtPathName_U(
2036 IN PCWSTR DosPathName
,
2037 OUT PUNICODE_STRING NtPathName
,
2038 OUT PCWSTR
*NtFileNamePart
,
2039 OUT CURDIR
*DirectoryInfo
2045 RtlExpandEnvironmentStrings_U(
2047 PUNICODE_STRING Source
,
2048 PUNICODE_STRING Destination
,
2055 RtlGetCurrentDirectory_U(
2056 ULONG MaximumLength
,
2063 RtlGetFullPathName_U(
2067 OUT PWSTR
*ShortName
2073 RtlGetFullPathName_Ustr(
2074 IN PUNICODE_STRING FileName
,
2077 OUT PWSTR
*ShortName
,
2078 OUT PBOOLEAN InvalidName
,
2079 OUT RTL_PATH_TYPE
*PathType
2085 RtlIsDosDeviceName_U(
2092 RtlIsDosDeviceName_Ustr(
2093 IN PUNICODE_STRING Name
2100 RtlIsNameLegalDOS8Dot3(
2101 IN PCUNICODE_STRING Name
,
2102 IN OUT POEM_STRING OemName OPTIONAL
,
2103 IN OUT PBOOLEAN NameContainsSpaces OPTIONAL
2109 RtlQueryEnvironmentVariable_U(
2111 PUNICODE_STRING Name
,
2112 PUNICODE_STRING Value
2118 RtlSetCurrentDirectory_U(
2119 IN PUNICODE_STRING name
2125 RtlSetEnvironmentVariable(
2127 PUNICODE_STRING Name
,
2128 PUNICODE_STRING Value
2132 // Critical Section/Resource Functions
2137 RtlDeleteCriticalSection (
2138 IN PRTL_CRITICAL_SECTION CriticalSection
2144 RtlEnterCriticalSection(
2145 IN PRTL_CRITICAL_SECTION CriticalSection
2151 RtlInitializeCriticalSection(
2152 IN PRTL_CRITICAL_SECTION CriticalSection
2158 RtlInitializeCriticalSectionAndSpinCount(
2159 IN PRTL_CRITICAL_SECTION CriticalSection
,
2166 RtlLeaveCriticalSection(
2167 IN PRTL_CRITICAL_SECTION CriticalSection
2173 RtlTryEnterCriticalSection(
2174 IN PRTL_CRITICAL_SECTION CriticalSection
2180 RtlpUnWaitCriticalSection(
2181 IN PRTL_CRITICAL_SECTION CriticalSection
2187 RtlpWaitForCriticalSection(
2188 IN PRTL_CRITICAL_SECTION CriticalSection
2194 RtlAcquireResourceExclusive(
2195 IN PRTL_RESOURCE Resource
,
2202 RtlAcquireResourceShared(
2203 IN PRTL_RESOURCE Resource
,
2210 RtlConvertExclusiveToShared(
2211 IN PRTL_RESOURCE Resource
2217 RtlConvertSharedToExclusive(
2218 IN PRTL_RESOURCE Resource
2225 IN PRTL_RESOURCE Resource
2232 IN PRTL_RESOURCE Resource
2238 RtlInitializeResource(
2239 IN PRTL_RESOURCE Resource
2246 IN PRTL_RESOURCE Resource
2250 // Compression Functions
2256 IN USHORT CompressionFormatAndEngine
,
2257 IN PUCHAR UncompressedBuffer
,
2258 IN ULONG UncompressedBufferSize
,
2259 OUT PUCHAR CompressedBuffer
,
2260 IN ULONG CompressedBufferSize
,
2261 IN ULONG UncompressedChunkSize
,
2262 OUT PULONG FinalCompressedSize
,
2269 RtlDecompressBuffer(
2270 IN USHORT CompressionFormat
,
2271 OUT PUCHAR UncompressedBuffer
,
2272 IN ULONG UncompressedBufferSize
,
2273 IN PUCHAR CompressedBuffer
,
2274 IN ULONG CompressedBufferSize
,
2275 OUT PULONG FinalUncompressedSize
2281 RtlGetCompressionWorkSpaceSize(
2282 IN USHORT CompressionFormatAndEngine
,
2283 OUT PULONG CompressBufferWorkSpaceSize
,
2284 OUT PULONG CompressFragmentWorkSpaceSize
2288 // Debug Info Functions
2291 PRTL_DEBUG_INFORMATION
2293 RtlCreateQueryDebugBuffer(
2295 IN BOOLEAN EventPair
2301 RtlDestroyQueryDebugBuffer(IN PRTL_DEBUG_INFORMATION DebugBuffer
);
2306 RtlQueryProcessDebugInformation(
2308 IN ULONG DebugInfoClassMask
,
2309 IN OUT PRTL_DEBUG_INFORMATION DebugBuffer
2319 IN PRTL_BITMAP BitMapHeader
,
2320 IN ULONG StartingIndex
,
2328 IN PRTL_BITMAP BitMapHeader
,
2329 IN ULONG StartingIndex
,
2337 IN PRTL_BITMAP BitMapHeader
,
2338 IN ULONG StartingIndex
,
2339 IN ULONG NumberToClear
2346 IN PRTL_BITMAP BitMapHeader
,
2347 IN ULONG NumberToFind
,
2354 RtlFindClearBitsAndSet(
2355 IN PRTL_BITMAP BitMapHeader
,
2356 IN ULONG NumberToFind
,
2363 RtlFindNextForwardRunClear(
2364 IN PRTL_BITMAP BitMapHeader
,
2366 IN PULONG StartingRunIndex
2372 RtlInitializeBitMap(
2373 IN PRTL_BITMAP BitMapHeader
,
2374 IN PULONG BitMapBuffer
,
2375 IN ULONG SizeOfBitMap
2382 IN PRTL_BITMAP BitMapHeader
2389 PRTL_BITMAP BitMapHeader
,
2397 IN PRTL_BITMAP BitMapHeader
,
2398 IN ULONG StartingIndex
,
2399 IN ULONG NumberToSet
2411 WAITORTIMERCALLBACKFUNC Callback
,
2421 RtlCreateTimerQueue(PHANDLE TimerQueue
);
2429 HANDLE CompletionEvent
2445 RtlDeleteTimerQueueEx(
2447 HANDLE CompletionEvent
2453 RtlDeleteTimerQueue(HANDLE TimerQueue
);
2460 InterlockedPushListSList(
2461 IN PSLIST_HEADER ListHead
,
2462 IN PSLIST_ENTRY List
,
2463 IN PSLIST_ENTRY ListEnd
,
2468 // Range List functions
2473 RtlFreeRangeList(IN PRTL_RANGE_LIST RangeList
);
2489 IN ULONG ComponentId
,
2500 IN ULONG MaximumResponseLength
2511 DbgLoadImageSymbols(
2512 IN PANSI_STRING Name
,
2514 IN ULONG_PTR ProcessId
2519 DbgUnLoadImageSymbols(
2520 IN PANSI_STRING Name
,
2522 IN ULONG_PTR ProcessId
2526 // Generic Table Functions
2528 #if defined(NTOS_MODE_USER) || defined(_NTIFS_)
2531 RtlInsertElementGenericTable(
2532 IN PRTL_GENERIC_TABLE Table
,
2534 IN ULONG BufferSize
,
2535 OUT PBOOLEAN NewElement OPTIONAL
2540 RtlInsertElementGenericTableFull(
2541 IN PRTL_GENERIC_TABLE Table
,
2543 IN ULONG BufferSize
,
2544 OUT PBOOLEAN NewElement OPTIONAL
,
2545 IN PVOID NodeOrParent
,
2546 IN TABLE_SEARCH_RESULT SearchResult
2551 RtlIsGenericTableEmpty(
2552 IN PRTL_GENERIC_TABLE Table
2557 RtlLookupElementGenericTableFull(
2558 IN PRTL_GENERIC_TABLE Table
,
2560 OUT PVOID
*NodeOrParent
,
2561 OUT TABLE_SEARCH_RESULT
*SearchResult
2566 // Handle Table Functions
2569 PRTL_HANDLE_TABLE_ENTRY
2572 IN PRTL_HANDLE_TABLE HandleTable
,
2579 RtlDestroyHandleTable(IN PRTL_HANDLE_TABLE HandleTable
);
2585 IN PRTL_HANDLE_TABLE HandleTable
,
2586 IN PRTL_HANDLE_TABLE_ENTRY Handle
2592 RtlInitializeHandleTable(
2594 IN ULONG HandleSize
,
2595 IN PRTL_HANDLE_TABLE HandleTable
2602 IN PRTL_HANDLE_TABLE HandleTable
,
2603 IN PRTL_HANDLE_TABLE_ENTRY Handle
2609 RtlIsValidIndexHandle(
2610 IN PRTL_HANDLE_TABLE HandleTable
,
2612 OUT PRTL_HANDLE_TABLE_ENTRY
*Handle
2622 IN PVOID BaseAddress
,
2626 OUT PRTL_MESSAGE_RESOURCE_ENTRY
*MessageResourceEntry
2632 RtlGetNtGlobalFlags(VOID
);
2637 RtlImageDirectoryEntryToData(
2639 BOOLEAN MappedAsImage
,
2648 PIMAGE_NT_HEADERS NtHeader
,
2651 PIMAGE_SECTION_HEADER
*SectionHeader
2657 RtlImageNtHeader(IN PVOID BaseAddress
);
2664 IN PVOID BaseAddress
,
2666 IN PIMAGE_NT_HEADERS
*NtHeader
2670 PIMAGE_SECTION_HEADER
2672 RtlImageRvaToSection(
2673 PIMAGE_NT_HEADERS NtHeader
,
2681 LdrRelocateImageWithBias(
2682 IN PVOID NewAddress
,
2683 IN LONGLONG AdditionalBias
,
2691 // Activation Context Functions
2693 #ifdef NTOS_MODE_USER
2697 RtlActivateActivationContextUnsafeFast(
2698 IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame
,
2705 RtlAllocateActivationContextStack(
2712 RtlGetActiveActivationContext(
2719 RtlReleaseActivationContext(
2726 RtlDeactivateActivationContextUnsafeFast(
2727 IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame
2733 RtlDosApplyFileIsolationRedirection_Ustr(
2735 IN PUNICODE_STRING OriginalName
,
2736 IN PUNICODE_STRING Extension
,
2737 IN OUT PUNICODE_STRING RedirectedName
,
2738 IN OUT PUNICODE_STRING RedirectedName2
,
2739 IN OUT PUNICODE_STRING
*OriginalName2
,
2748 RtlFindActivationContextSectionString(
2751 IN ULONG SectionType
,
2752 IN PUNICODE_STRING SectionName
,
2758 // Registry Functions
2763 RtlCheckRegistryKey(
2771 RtlCreateRegistryKey(
2772 IN ULONG RelativeTo
,
2779 RtlFormatCurrentUserKeyPath(
2780 IN OUT PUNICODE_STRING KeyPath
2787 OUT HANDLE KeyHandle
,
2788 IN ACCESS_MASK DesiredAccess
,
2789 IN POBJECT_ATTRIBUTES ObjectAttributes
,
2797 IN ACCESS_MASK DesiredAccess
,
2798 OUT PHANDLE KeyHandle
2804 RtlQueryRegistryValues(
2805 IN ULONG RelativeTo
,
2807 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
2809 IN PVOID Environment
2815 RtlWriteRegistryValue(
2831 IN PUSHORT AnsiTableBase
,
2832 IN PUSHORT OemTableBase
,
2833 IN PUSHORT CaseTableBase
,
2834 OUT PNLSTABLEINFO NlsTable
2840 RtlInitCodePageTable(
2841 IN PUSHORT TableBase
,
2842 OUT PCPTABLEINFO CodePageTable
2848 RtlResetRtlTranslations(IN PNLSTABLEINFO NlsTable
);
2850 #if defined(NTOS_MODE_USER) && !defined(NO_RTL_INLINES)
2853 // Misc conversion functions
2858 RtlConvertLongToLargeInteger(
2862 LARGE_INTEGER Result
;
2864 Result
.QuadPart
= SignedInteger
;
2871 RtlEnlargedIntegerMultiply(
2876 LARGE_INTEGER Product
;
2878 Product
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2885 RtlEnlargedUnsignedDivide(
2886 IN ULARGE_INTEGER Dividend
,
2888 IN PULONG Remainder OPTIONAL
2893 Quotient
= (ULONG
)(Dividend
.QuadPart
/ Divisor
);
2895 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2904 RtlEnlargedUnsignedMultiply(
2909 LARGE_INTEGER Product
;
2911 Product
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2927 IN USHORT PartialCrc
,
2933 // Network Functions
2938 RtlIpv4StringToAddressW(
2941 OUT PWCHAR Terminator
,
2942 OUT
struct in_addr
*Addr
2948 RtlIpv6StringToAddressA(
2950 OUT PCHAR
*Terminator
,
2951 OUT
struct in6_addr
*Addr
2957 RtlIpv6StringToAddressW(
2959 OUT PCHAR
*Terminator
,
2960 OUT
struct in6_addr
*Addr
2966 RtlIpv6StringToAddressExA(
2967 IN PCHAR AddressString
,
2968 IN
struct in6_addr
*Address
,
2976 RtlIpv6StringToAddressExW(
2977 IN PWCHAR AddressName
,
2978 IN
struct in6_addr
*Address
,
2990 RtlQueryTimeZoneInformation(PRTL_TIME_ZONE_INFORMATION TimeZoneInformation
);
2995 RtlSecondsSince1970ToTime(
2996 IN ULONG SecondsSince1970
,
2997 OUT PLARGE_INTEGER Time
3003 RtlSetTimeZoneInformation(PRTL_TIME_ZONE_INFORMATION TimeZoneInformation
);
3008 RtlTimeFieldsToTime(
3009 PTIME_FIELDS TimeFields
,
3016 RtlTimeToTimeFields(
3017 PLARGE_INTEGER Time
,
3018 PTIME_FIELDS TimeFields
3024 RtlSystemTimeToLocalTime(
3025 IN PLARGE_INTEGER SystemTime
,
3026 OUT PLARGE_INTEGER LocalTime
3030 // Version Functions
3035 RtlVerifyVersionInfo(
3036 IN PRTL_OSVERSIONINFOEXW VersionInfo
,
3038 IN ULONGLONG ConditionMask
3044 RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation
);
3049 RtlGetNtProductType(OUT PNT_PRODUCT_TYPE ProductType
);
3052 // Secure Memory Functions
3054 #ifdef NTOS_MODE_USER
3058 RtlRegisterSecureMemoryCacheCallback(
3059 IN PRTL_SECURE_MEMORY_CACHE_CALLBACK Callback
);
3064 RtlFlushSecureMemoryCache(
3065 IN PVOID MemoryCache
,
3066 IN OPTIONAL SIZE_T MemoryLength