3 Copyright (c) Alex Ionescu. All rights reserved.
11 Function definitions for the Run-Time Library
15 Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
37 IN PLIST_ENTRY ListHead
40 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
46 IN PLIST_ENTRY ListHead
,
51 OldFlink
= ListHead
->Flink
;
52 Entry
->Flink
= OldFlink
;
53 Entry
->Blink
= ListHead
;
54 OldFlink
->Blink
= Entry
;
55 ListHead
->Flink
= Entry
;
61 IN PLIST_ENTRY ListHead
,
66 OldBlink
= ListHead
->Blink
;
67 Entry
->Flink
= ListHead
;
68 Entry
->Blink
= OldBlink
;
69 OldBlink
->Flink
= Entry
;
70 ListHead
->Blink
= Entry
;
76 IN
const LIST_ENTRY
* ListHead
79 return (BOOLEAN
)(ListHead
->Flink
== ListHead
);
85 PSINGLE_LIST_ENTRY ListHead
88 PSINGLE_LIST_ENTRY FirstEntry
;
89 FirstEntry
= ListHead
->Next
;
90 if (FirstEntry
!= NULL
) {
91 ListHead
->Next
= FirstEntry
->Next
;
100 PSINGLE_LIST_ENTRY ListHead
,
101 PSINGLE_LIST_ENTRY Entry
104 Entry
->Next
= ListHead
->Next
;
105 ListHead
->Next
= Entry
;
111 IN PLIST_ENTRY Entry
)
113 PLIST_ENTRY OldFlink
;
114 PLIST_ENTRY OldBlink
;
116 OldFlink
= Entry
->Flink
;
117 OldBlink
= Entry
->Blink
;
118 OldFlink
->Blink
= OldBlink
;
119 OldBlink
->Flink
= OldFlink
;
120 return (BOOLEAN
)(OldFlink
== OldBlink
);
126 IN PLIST_ENTRY ListHead
)
131 Entry
= ListHead
->Flink
;
132 Flink
= Entry
->Flink
;
133 ListHead
->Flink
= Flink
;
134 Flink
->Blink
= ListHead
;
141 IN PLIST_ENTRY ListHead
)
146 Entry
= ListHead
->Blink
;
147 Blink
= Entry
->Blink
;
148 ListHead
->Blink
= Blink
;
149 Blink
->Flink
= ListHead
;
156 #define RtlEqualLuid(L1, L2) (((L1)->HighPart == (L2)->HighPart) && \
157 ((L1)->LowPart == (L2)->LowPart))
162 // RTL Splay Tree Functions
167 RtlSplay(PRTL_SPLAY_LINKS Links
);
172 RtlDelete(PRTL_SPLAY_LINKS Links
);
178 PRTL_SPLAY_LINKS Links
,
179 PRTL_SPLAY_LINKS
*Root
185 RtlSubtreeSuccessor(PRTL_SPLAY_LINKS Links
);
190 RtlSubtreePredecessor(PRTL_SPLAY_LINKS Links
);
195 RtlRealSuccessor(PRTL_SPLAY_LINKS Links
);
200 RtlRealPredecessor(PRTL_SPLAY_LINKS Links
);
202 #define RtlIsLeftChild(Links) \
203 (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
205 #define RtlIsRightChild(Links) \
206 (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
208 #define RtlRightChild(Links) \
209 ((PRTL_SPLAY_LINKS)(Links))->RightChild
211 #define RtlIsRoot(Links) \
212 (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
214 #define RtlLeftChild(Links) \
215 ((PRTL_SPLAY_LINKS)(Links))->LeftChild
217 #define RtlParent(Links) \
218 ((PRTL_SPLAY_LINKS)(Links))->Parent
220 #define RtlInitializeSplayLinks(Links) \
222 PRTL_SPLAY_LINKS _SplayLinks; \
223 _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
224 _SplayLinks->Parent = _SplayLinks; \
225 _SplayLinks->LeftChild = NULL; \
226 _SplayLinks->RightChild = NULL; \
229 #define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \
231 PRTL_SPLAY_LINKS _SplayParent; \
232 PRTL_SPLAY_LINKS _SplayChild; \
233 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
234 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
235 _SplayParent->LeftChild = _SplayChild; \
236 _SplayChild->Parent = _SplayParent; \
239 #define RtlInsertAsRightChild(ParentLinks,ChildLinks) \
241 PRTL_SPLAY_LINKS _SplayParent; \
242 PRTL_SPLAY_LINKS _SplayChild; \
243 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
244 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
245 _SplayParent->RightChild = _SplayChild; \
246 _SplayChild->Parent = _SplayParent; \
250 // Error and Exception Functions
255 RtlAddVectoredExceptionHandler(
256 IN ULONG FirstHandler
,
257 IN PVECTORED_EXCEPTION_HANDLER VectoredHandler
264 PVOID FailedAssertion
,
273 RtlCaptureContext(OUT PCONTEXT ContextRecord
);
278 RtlEncodePointer(IN PVOID Pointer
);
283 RtlDecodePointer(IN PVOID Pointer
);
288 RtlDispatchException(
289 IN PEXCEPTION_RECORD ExceptionRecord
,
296 RtlNtStatusToDosError(IN NTSTATUS Status
);
301 RtlRaiseException(IN PEXCEPTION_RECORD ExceptionRecord
);
306 RtlRaiseStatus(NTSTATUS Status
);
311 RtlUnhandledExceptionFilter(struct _EXCEPTION_POINTERS
* ExceptionInfo
);
317 IN PVOID TargetFrame OPTIONAL
,
318 IN PVOID TargetIp OPTIONAL
,
319 IN PEXCEPTION_RECORD ExceptionRecord OPTIONAL
,
330 IN HANDLE HeapHandle
,
340 IN PVOID BaseAddress OPTIONAL
,
341 IN SIZE_T SizeToReserve OPTIONAL
,
342 IN SIZE_T SizeToCommit OPTIONAL
,
343 IN PVOID Lock OPTIONAL
,
344 IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL
357 RtlDestroyHeap(HANDLE hheap
);
363 IN HANDLE HeapHandle
,
386 RtlLockHeap(IN HANDLE Heap
);
390 RtlUnlockHeap(IN HANDLE Heap
);
397 IN PVOID MemoryPointer
408 #define RtlGetProcessHeap() (NtCurrentPeb()->ProcessHeap)
411 // Security Functions
416 RtlAbsoluteToSelfRelativeSD(
417 IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor
,
418 IN OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor
,
419 IN PULONG BufferLength
425 RtlAddAccessAllowedAce(
428 ACCESS_MASK AccessMask
,
434 RtlAddAccessAllowedAceEx(
436 IN ULONG dwAceRevision
,
444 RtlAddAccessDeniedAce(
447 ACCESS_MASK AccessMask
,
453 RtlAddAccessDeniedAceEx(
457 IN ACCESS_MASK AccessMask
,
463 RtlAddAuditAccessAceEx(
467 IN ACCESS_MASK AccessMask
,
479 ULONG StartingAceIndex
,
486 RtlAddAuditAccessAce(
489 ACCESS_MASK AccessMask
,
500 IN BOOLEAN ForThread
,
501 OUT PBOOLEAN OldValue
507 RtlAllocateAndInitializeSid(
508 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
509 IN UCHAR SubAuthorityCount
,
510 IN ULONG SubAuthority0
,
511 IN ULONG SubAuthority1
,
512 IN ULONG SubAuthority2
,
513 IN ULONG SubAuthority3
,
514 IN ULONG SubAuthority4
,
515 IN ULONG SubAuthority5
,
516 IN ULONG SubAuthority6
,
517 IN ULONG SubAuthority7
,
523 RtlAreAllAccessesGranted(
524 ACCESS_MASK GrantedAccess
,
525 ACCESS_MASK DesiredAccess
530 RtlAreAnyAccessesGranted(
531 ACCESS_MASK GrantedAccess
,
532 ACCESS_MASK DesiredAccess
545 RtlCopyLuidAndAttributesArray(
547 PLUID_AND_ATTRIBUTES Src
,
548 PLUID_AND_ATTRIBUTES Dest
553 RtlCopySidAndAttributesArray(
555 PSID_AND_ATTRIBUTES Src
,
557 PSID_AND_ATTRIBUTES Dest
,
559 PVOID
* RemainingSidArea
,
560 PULONG RemainingSidAreaSize
565 RtlConvertSidToUnicodeString(
566 OUT PUNICODE_STRING DestinationString
,
568 IN BOOLEAN AllocateDestinationString
592 RtlCreateSecurityDescriptor(
593 PSECURITY_DESCRIPTOR SecurityDescriptor
,
600 RtlCreateSecurityDescriptorRelative(
601 PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor
,
654 RtlGetControlSecurityDescriptor(
655 PSECURITY_DESCRIPTOR SecurityDescriptor
,
656 PSECURITY_DESCRIPTOR_CONTROL Control
,
663 RtlGetDaclSecurityDescriptor(
664 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
665 OUT PBOOLEAN DaclPresent
,
667 OUT PBOOLEAN DaclDefaulted
673 RtlGetSaclSecurityDescriptor(
674 PSECURITY_DESCRIPTOR SecurityDescriptor
,
675 PBOOLEAN SaclPresent
,
677 PBOOLEAN SaclDefaulted
683 RtlGetGroupSecurityDescriptor(
684 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
686 OUT PBOOLEAN GroupDefaulted
692 RtlGetOwnerSecurityDescriptor(
693 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
695 OUT PBOOLEAN OwnerDefaulted
701 RtlGetSecurityDescriptorRMControl(
702 PSECURITY_DESCRIPTOR SecurityDescriptor
,
707 PSID_IDENTIFIER_AUTHORITY
709 RtlIdentifierAuthoritySid(PSID Sid
);
714 RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
);
721 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
722 IN UCHAR SubAuthorityCount
728 RtlLengthRequiredSid(IN ULONG SubAuthorityCount
);
733 RtlLengthSid(IN PSID Sid
);
739 PACCESS_MASK AccessMask
,
740 PGENERIC_MAPPING GenericMapping
746 RtlQueryInformationAcl(
749 ULONG InformationLength
,
750 ACL_INFORMATION_CLASS InformationClass
756 RtlSelfRelativeToAbsoluteSD(
757 IN PSECURITY_DESCRIPTOR SelfRelativeSD
,
758 OUT PSECURITY_DESCRIPTOR AbsoluteSD
,
759 IN PULONG AbsoluteSDSize
,
766 IN PSID PrimaryGroup
,
767 IN PULONG PrimaryGroupSize
773 RtlSelfRelativeToAbsoluteSD2(
774 IN OUT PSECURITY_DESCRIPTOR SelfRelativeSD
,
775 OUT PULONG BufferSize
781 RtlSetControlSecurityDescriptor(
782 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
783 IN SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest
,
784 IN SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet
790 RtlSetDaclSecurityDescriptor (
791 PSECURITY_DESCRIPTOR SecurityDescriptor
,
794 BOOLEAN DaclDefaulted
800 RtlSetGroupSecurityDescriptor(
801 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
803 IN BOOLEAN GroupDefaulted
809 RtlSetInformationAcl(
812 ULONG InformationLength
,
813 ACL_INFORMATION_CLASS InformationClass
819 RtlSetOwnerSecurityDescriptor(
820 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
822 IN BOOLEAN OwnerDefaulted
828 RtlSetSaclSecurityDescriptor(
829 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
830 IN BOOLEAN SaclPresent
,
832 IN BOOLEAN SaclDefaulted
838 RtlSetSecurityDescriptorRMControl(
839 PSECURITY_DESCRIPTOR SecurityDescriptor
,
846 RtlSubAuthorityCountSid(
855 IN ULONG SubAuthority
861 RtlValidRelativeSecurityDescriptor(
862 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
863 IN ULONG SecurityDescriptorLength
,
864 IN SECURITY_INFORMATION RequiredInformation
870 RtlValidSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
875 RtlValidSid(IN PSID Sid
);
880 RtlValidAcl(PACL Acl
);
885 RtlDeleteSecurityObject(
886 IN PSECURITY_DESCRIPTOR
*ObjectDescriptor
892 RtlNewSecurityObject(
893 IN PSECURITY_DESCRIPTOR ParentDescriptor
,
894 IN PSECURITY_DESCRIPTOR CreatorDescriptor
,
895 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
896 IN BOOLEAN IsDirectoryObject
,
898 IN PGENERIC_MAPPING GenericMapping
904 RtlQuerySecurityObject(
905 IN PSECURITY_DESCRIPTOR ObjectDescriptor
,
906 IN SECURITY_INFORMATION SecurityInformation
,
907 OUT PSECURITY_DESCRIPTOR ResultantDescriptor
,
908 IN ULONG DescriptorLength
,
909 OUT PULONG ReturnLength
915 RtlSetSecurityObject(
916 IN SECURITY_INFORMATION SecurityInformation
,
917 IN PSECURITY_DESCRIPTOR ModificationDescriptor
,
918 OUT PSECURITY_DESCRIPTOR
*ObjectsSecurityDescriptor
,
919 IN PGENERIC_MAPPING GenericMapping
,
924 // Single-Character Functions
929 RtlLargeIntegerToChar(
930 IN PLARGE_INTEGER Value
,
939 RtlUpperChar(CHAR Source
);
944 RtlUpcaseUnicodeChar(WCHAR Source
);
949 RtlDowncaseUnicodeChar(IN WCHAR Source
);
966 IN ULONG Base OPTIONAL
,
967 IN ULONG Length OPTIONAL
,
974 RtlIntegerToUnicodeString(
977 IN OUT PUNICODE_STRING String
990 // Byte Swap Functions
992 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \
993 ((defined(_M_AMD64) || \
994 defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
996 unsigned short __cdecl
_byteswap_ushort(unsigned short);
997 unsigned long __cdecl
_byteswap_ulong (unsigned long);
998 unsigned __int64 __cdecl
_byteswap_uint64(unsigned __int64
);
999 #pragma intrinsic(_byteswap_ushort)
1000 #pragma intrinsic(_byteswap_ulong)
1001 #pragma intrinsic(_byteswap_uint64)
1002 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1003 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1004 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1010 RtlUshortByteSwap(IN USHORT Source
);
1014 RtlUlongByteSwap(IN ULONG Source
);
1018 RtlUlonglongByteSwap(IN ULONGLONG Source
);
1023 // Unicode->Ansi String Functions
1028 RtlxUnicodeStringToAnsiSize(IN PCUNICODE_STRING UnicodeString
);
1030 #ifdef NTOS_MODE_USER
1032 #define RtlUnicodeStringToAnsiSize(STRING) ( \
1033 NLS_MB_CODE_PAGE_TAG ? \
1034 RtlxUnicodeStringToAnsiSize(STRING) : \
1035 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1043 RtlUnicodeStringToAnsiString(
1044 PANSI_STRING DestinationString
,
1045 PCUNICODE_STRING SourceString
,
1046 BOOLEAN AllocateDestinationString
1050 // Unicode->OEM String Functions
1055 RtlUpcaseUnicodeStringToOemString(
1056 POEM_STRING DestinationString
,
1057 PCUNICODE_STRING SourceString
,
1058 BOOLEAN AllocateDestinationString
1064 RtlUpcaseUnicodeStringToCountedOemString(
1065 IN OUT POEM_STRING DestinationString
,
1066 IN PCUNICODE_STRING SourceString
,
1067 IN BOOLEAN AllocateDestinationString
1073 RtlUnicodeStringToOemString(
1074 POEM_STRING DestinationString
,
1075 PCUNICODE_STRING SourceString
,
1076 BOOLEAN AllocateDestinationString
1082 RtlUpcaseUnicodeToOemN(
1086 PWCHAR UnicodeString
,
1093 RtlxUnicodeStringToOemSize(IN PCUNICODE_STRING UnicodeString
);
1095 #ifdef NTOS_MODE_USER
1097 #define RtlUnicodeStringToOemSize(STRING) ( \
1098 NLS_MB_OEM_CODE_PAGE_TAG ? \
1099 RtlxUnicodeStringToOemSize(STRING) : \
1100 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1103 #define RtlUnicodeStringToCountedOemSize(STRING) ( \
1104 (ULONG)(RtlUnicodeStringToOemSize(STRING) - sizeof(ANSI_NULL)) \
1116 PWCHAR UnicodeString
,
1121 // Unicode->MultiByte String Functions
1126 RtlUnicodeToMultiByteN(
1130 PWCHAR UnicodeString
,
1137 RtlUpcaseUnicodeToMultiByteN(
1141 PWCHAR UnicodeString
,
1148 RtlUnicodeToMultiByteSize(
1150 PWCHAR UnicodeString
,
1157 RtlxOemStringToUnicodeSize(IN PCOEM_STRING OemString
);
1160 // OEM to Unicode Functions
1165 RtlOemStringToUnicodeString(
1166 PUNICODE_STRING DestinationString
,
1167 PCOEM_STRING SourceString
,
1168 BOOLEAN AllocateDestinationString
1175 PWSTR UnicodeString
,
1176 ULONG MaxBytesInUnicodeString
,
1177 PULONG BytesInUnicodeString
,
1179 ULONG BytesInOemString
1182 #ifdef NTOS_MODE_USER
1184 #define RtlOemStringToUnicodeSize(STRING) ( \
1185 NLS_MB_OEM_CODE_PAGE_TAG ? \
1186 RtlxOemStringToUnicodeSize(STRING) : \
1187 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1190 #define RtlOemStringToCountedUnicodeSize(STRING) ( \
1191 (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
1197 // Ansi->Unicode String Functions
1202 RtlxAnsiStringToUnicodeSize(
1203 PCANSI_STRING AnsiString
1209 RtlAnsiStringToUnicodeString(
1210 PUNICODE_STRING DestinationString
,
1211 PCANSI_STRING SourceString
,
1212 BOOLEAN AllocateDestinationString
1215 #ifdef NTOS_MODE_USER
1217 #define RtlAnsiStringToUnicodeSize(STRING) ( \
1218 NLS_MB_CODE_PAGE_TAG ? \
1219 RtlxAnsiStringToUnicodeSize(STRING) : \
1220 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1228 RtlCreateUnicodeStringFromAsciiz(
1229 OUT PUNICODE_STRING Destination
,
1234 // Unicode String Functions
1239 RtlAppendUnicodeToString(
1240 PUNICODE_STRING Destination
,
1247 RtlAppendUnicodeStringToString(
1248 PUNICODE_STRING Destination
,
1249 PCUNICODE_STRING Source
1255 RtlCompareUnicodeString(
1256 PCUNICODE_STRING String1
,
1257 PCUNICODE_STRING String2
,
1258 BOOLEAN CaseInsensitive
1264 RtlCopyUnicodeString(
1265 PUNICODE_STRING DestinationString
,
1266 PCUNICODE_STRING SourceString
1272 RtlCreateUnicodeString(
1273 PUNICODE_STRING DestinationString
,
1277 #ifdef NTOS_MODE_USER
1282 RtlDowncaseUnicodeString(
1283 IN OUT PUNICODE_STRING UniDest
,
1284 IN PCUNICODE_STRING UniSource
,
1285 IN BOOLEAN AllocateDestinationString
1293 RtlDuplicateUnicodeString(
1295 IN PCUNICODE_STRING SourceString
,
1296 OUT PUNICODE_STRING DestinationString
1302 RtlEqualUnicodeString(
1303 PCUNICODE_STRING String1
,
1304 PCUNICODE_STRING String2
,
1305 BOOLEAN CaseInsensitive
1311 RtlFreeUnicodeString(IN PUNICODE_STRING UnicodeString
);
1316 RtlHashUnicodeString(
1317 IN CONST UNICODE_STRING
*String
,
1318 IN BOOLEAN CaseInSensitive
,
1319 IN ULONG HashAlgorithm
,
1320 OUT PULONG HashValue
1326 RtlInitUnicodeString(
1327 IN OUT PUNICODE_STRING DestinationString
,
1328 IN PCWSTR SourceString
);
1343 PCANSI_STRING String1
,
1344 PCANSI_STRING String2
,
1345 BOOLEAN CaseInsensitive
1351 RtlPrefixUnicodeString(
1352 PCUNICODE_STRING String1
,
1353 PCUNICODE_STRING String2
,
1354 BOOLEAN CaseInsensitive
1360 RtlUpcaseUnicodeString(
1361 PUNICODE_STRING DestinationString
,
1362 PCUNICODE_STRING SourceString
,
1363 BOOLEAN AllocateDestinationString
1369 RtlUnicodeStringToInteger(
1370 PCUNICODE_STRING String
,
1376 // Ansi String Functions
1381 RtlFreeAnsiString(IN PANSI_STRING AnsiString
);
1387 PANSI_STRING DestinationString
,
1392 // OEM String Functions
1397 RtlFreeOemString(IN POEM_STRING OemString
);
1400 // MultiByte->Unicode String Functions
1405 RtlMultiByteToUnicodeN(
1406 PWCHAR UnicodeString
,
1416 RtlMultiByteToUnicodeSize(
1428 RtlAddAtomToAtomTable(
1429 IN PRTL_ATOM_TABLE AtomTable
,
1439 IN OUT PRTL_ATOM_TABLE
*AtomTable
1445 RtlDeleteAtomFromAtomTable(
1446 IN PRTL_ATOM_TABLE AtomTable
,
1453 RtlDestroyAtomTable(IN PRTL_ATOM_TABLE AtomTable
);
1458 RtlQueryAtomInAtomTable(
1459 IN PRTL_ATOM_TABLE AtomTable
,
1461 IN OUT PULONG RefCount OPTIONAL
,
1462 IN OUT PULONG PinCount OPTIONAL
,
1463 IN OUT PWSTR AtomName OPTIONAL
,
1464 IN OUT PULONG NameLength OPTIONAL
1470 RtlPinAtomInAtomTable(
1471 IN PRTL_ATOM_TABLE AtomTable
,
1478 RtlLookupAtomInAtomTable(
1479 IN PRTL_ATOM_TABLE AtomTable
,
1491 IN PVOID Destination
,
1497 // Process Management Functions
1502 RtlAcquirePebLock(VOID
);
1507 RtlCreateProcessParameters (
1508 OUT PRTL_USER_PROCESS_PARAMETERS
*ProcessParameters
,
1509 IN PUNICODE_STRING ImagePathName OPTIONAL
,
1510 IN PUNICODE_STRING DllPath OPTIONAL
,
1511 IN PUNICODE_STRING CurrentDirectory OPTIONAL
,
1512 IN PUNICODE_STRING CommandLine OPTIONAL
,
1513 IN PWSTR Environment OPTIONAL
,
1514 IN PUNICODE_STRING WindowTitle OPTIONAL
,
1515 IN PUNICODE_STRING DesktopInfo OPTIONAL
,
1516 IN PUNICODE_STRING ShellInfo OPTIONAL
,
1517 IN PUNICODE_STRING RuntimeInfo OPTIONAL
1523 RtlCreateUserProcess(
1524 IN PUNICODE_STRING ImageFileName
,
1525 IN ULONG Attributes
,
1526 IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
,
1527 IN PSECURITY_DESCRIPTOR ProcessSecutityDescriptor OPTIONAL
,
1528 IN PSECURITY_DESCRIPTOR ThreadSecurityDescriptor OPTIONAL
,
1529 IN HANDLE ParentProcess OPTIONAL
,
1530 IN BOOLEAN CurrentDirectory
,
1531 IN HANDLE DebugPort OPTIONAL
,
1532 IN HANDLE ExceptionPort OPTIONAL
,
1533 OUT PRTL_USER_PROCESS_INFORMATION ProcessInfo
1539 RtlCreateUserThread(
1540 IN HANDLE ProcessHandle
,
1541 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
1542 IN BOOLEAN CreateSuspended
,
1543 IN LONG StackZeroBits
,
1544 IN ULONG StackReserve
,
1545 IN ULONG StackCommit
,
1546 IN PTHREAD_START_ROUTINE StartAddress
,
1548 IN OUT PHANDLE ThreadHandle
,
1549 IN OUT PCLIENT_ID ClientId
1553 PRTL_USER_PROCESS_PARAMETERS
1555 RtlDeNormalizeProcessParams(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
);
1560 RtlDestroyProcessParameters(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
);
1565 RtlExitUserThread(NTSTATUS Status
);
1570 RtlInitializeContext(
1571 IN HANDLE ProcessHandle
,
1572 OUT PCONTEXT ThreadContext
,
1573 IN PVOID ThreadStartParam OPTIONAL
,
1574 IN PTHREAD_START_ROUTINE ThreadStartAddress
,
1575 IN PINITIAL_TEB InitialTeb
1579 PRTL_USER_PROCESS_PARAMETERS
1581 RtlNormalizeProcessParams(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
);
1586 RtlReleasePebLock(VOID
);
1591 RtlSetProcessIsCritical(
1592 IN BOOLEAN NewValue
,
1593 OUT PBOOLEAN OldValue OPTIONAL
,
1594 IN BOOLEAN IsWinlogon
1603 #if defined(__GNUC__)
1605 __asm__ __volatile__
1607 "movl %%fs:0x30, %0\n" /* fs:30h == Teb->Peb */
1608 : "=r" (pPeb
) /* can't have two memory operands */
1612 #elif defined(_MSC_VER)
1614 __asm mov eax
, fs
:0x30;
1618 #error Unknown compiler for inline assembler
1625 // Environment/Path Functions
1630 RtlCreateEnvironment(
1638 RtlDestroyEnvironment(PWSTR Environment
);
1643 RtlDoesFileExists_U(PWSTR FileName
);
1648 RtlDetermineDosPathNameType_U(PCWSTR Path
);
1665 RtlDosPathNameToNtPathName_U(
1667 PUNICODE_STRING NtName
,
1669 PCURDIR CurrentDirectory
1675 RtlExpandEnvironmentStrings_U(
1677 PUNICODE_STRING Source
,
1678 PUNICODE_STRING Destination
,
1685 RtlGetCurrentDirectory_U(
1686 ULONG MaximumLength
,
1693 RtlGetFullPathName_U(
1694 const WCHAR
*dosname
,
1703 RtlIsNameLegalDOS8Dot3(
1704 IN PUNICODE_STRING UnicodeName
,
1705 IN PANSI_STRING AnsiName
,
1712 RtlQueryEnvironmentVariable_U(
1714 PUNICODE_STRING Name
,
1715 PUNICODE_STRING Value
1721 RtlSetCurrentDirectory_U(PUNICODE_STRING name
);
1726 RtlSetEnvironmentVariable(
1728 PUNICODE_STRING Name
,
1729 PUNICODE_STRING Value
1733 // Critical Section/Resource Functions
1738 RtlDeleteCriticalSection (
1739 IN PRTL_CRITICAL_SECTION CriticalSection
1745 RtlEnterCriticalSection(
1746 IN PRTL_CRITICAL_SECTION CriticalSection
1752 RtlInitializeCriticalSection(
1753 IN PRTL_CRITICAL_SECTION CriticalSection
1759 RtlInitializeCriticalSectionAndSpinCount(
1760 IN PRTL_CRITICAL_SECTION CriticalSection
,
1767 RtlLeaveCriticalSection(
1768 IN PRTL_CRITICAL_SECTION CriticalSection
1774 RtlpUnWaitCriticalSection(
1775 IN PRTL_CRITICAL_SECTION CriticalSection
1781 RtlpWaitForCriticalSection(
1782 IN PRTL_CRITICAL_SECTION CriticalSection
1788 RtlAcquireResourceExclusive(
1789 IN PRTL_RESOURCE Resource
,
1796 RtlAcquireResourceShared(
1797 IN PRTL_RESOURCE Resource
,
1804 RtlConvertExclusiveToShared(
1805 IN PRTL_RESOURCE Resource
1811 RtlConvertSharedToExclusive(
1812 IN PRTL_RESOURCE Resource
1819 IN PRTL_RESOURCE Resource
1826 IN PRTL_RESOURCE Resource
1832 RtlInitializeResource(
1833 IN PRTL_RESOURCE Resource
1840 IN PRTL_RESOURCE Resource
1844 // Compression Functions
1850 IN USHORT CompressionFormatAndEngine
,
1851 IN PUCHAR UncompressedBuffer
,
1852 IN ULONG UncompressedBufferSize
,
1853 OUT PUCHAR CompressedBuffer
,
1854 IN ULONG CompressedBufferSize
,
1855 IN ULONG UncompressedChunkSize
,
1856 OUT PULONG FinalCompressedSize
,
1863 RtlDecompressBuffer(
1864 IN USHORT CompressionFormat
,
1865 OUT PUCHAR UncompressedBuffer
,
1866 IN ULONG UncompressedBufferSize
,
1867 IN PUCHAR CompressedBuffer
,
1868 IN ULONG CompressedBufferSize
,
1869 OUT PULONG FinalUncompressedSize
1875 RtlGetCompressionWorkSpaceSize(
1876 IN USHORT CompressionFormatAndEngine
,
1877 OUT PULONG CompressBufferWorkSpaceSize
,
1878 OUT PULONG CompressFragmentWorkSpaceSize
1882 // Debug Info Functions
1887 RtlCreateQueryDebugBuffer(
1889 IN BOOLEAN EventPair
1895 RtlDestroyQueryDebugBuffer(IN PRTL_DEBUG_BUFFER DebugBuffer
);
1900 RtlQueryProcessDebugInformation(
1902 IN ULONG DebugInfoClassMask
,
1903 IN OUT PRTL_DEBUG_BUFFER DebugBuffer
1913 IN PRTL_BITMAP BitMapHeader
,
1914 IN ULONG StartingIndex
,
1922 IN PRTL_BITMAP BitMapHeader
,
1923 IN ULONG StartingIndex
,
1931 IN PRTL_BITMAP BitMapHeader
,
1932 IN ULONG StartingIndex
,
1933 IN ULONG NumberToClear
1940 IN PRTL_BITMAP BitMapHeader
,
1941 IN ULONG NumberToFind
,
1948 RtlFindClearBitsAndSet(
1949 IN PRTL_BITMAP BitMapHeader
,
1950 IN ULONG NumberToFind
,
1957 RtlInitializeBitMap(
1958 IN PRTL_BITMAP BitMapHeader
,
1959 IN PULONG BitMapBuffer
,
1960 IN ULONG SizeOfBitMap
1967 IN PRTL_BITMAP BitMapHeader
,
1968 IN ULONG StartingIndex
,
1969 IN ULONG NumberToSet
1981 WAITORTIMERCALLBACKFUNC Callback
,
1991 RtlCreateTimerQueue(PHANDLE TimerQueue
);
1999 HANDLE CompletionEvent
2015 RtlDeleteTimerQueueEx(
2017 HANDLE CompletionEvent
2023 RtlDeleteTimerQueue(HANDLE TimerQueue
);
2037 DbgBreakPoint(VOID
);
2040 // Handle Table Functions
2043 PRTL_HANDLE_TABLE_ENTRY
2046 IN PRTL_HANDLE_TABLE HandleTable
,
2053 RtlDestroyHandleTable(IN PRTL_HANDLE_TABLE HandleTable
);
2059 IN PRTL_HANDLE_TABLE HandleTable
,
2060 IN PRTL_HANDLE_TABLE_ENTRY Handle
2066 RtlInitializeHandleTable(
2068 IN ULONG HandleSize
,
2069 IN PRTL_HANDLE_TABLE HandleTable
2076 IN PRTL_HANDLE_TABLE HandleTable
,
2077 IN PRTL_HANDLE_TABLE_ENTRY Handle
2083 RtlIsValidIndexHandle(
2084 IN PRTL_HANDLE_TABLE HandleTable
,
2086 OUT PRTL_HANDLE_TABLE_ENTRY
*Handle
2096 IN PVOID BaseAddress
,
2100 OUT PRTL_MESSAGE_RESOURCE_ENTRY
*MessageResourceEntry
2106 RtlGetNtGlobalFlags(VOID
);
2111 RtlImageDirectoryEntryToData(
2122 PIMAGE_NT_HEADERS NtHeader
,
2125 PIMAGE_SECTION_HEADER
*SectionHeader
2131 RtlImageNtHeader(IN PVOID BaseAddress
);
2134 PIMAGE_SECTION_HEADER
2136 RtlImageRvaToSection(
2137 PIMAGE_NT_HEADERS NtHeader
,
2143 // Registry Functions
2148 RtlCheckRegistryKey(
2156 RtlFormatCurrentUserKeyPath(IN OUT PUNICODE_STRING KeyPath
);
2162 OUT HANDLE KeyHandle
,
2163 IN ACCESS_MASK DesiredAccess
,
2164 IN POBJECT_ATTRIBUTES ObjectAttributes
,
2172 IN ACCESS_MASK DesiredAccess
,
2173 OUT PHANDLE KeyHandle
2179 RtlQueryRegistryValues(
2180 IN ULONG RelativeTo
,
2182 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
2184 IN PVOID Environment
2190 RtlWriteRegistryValue(
2206 IN PUSHORT AnsiTableBase
,
2207 IN PUSHORT OemTableBase
,
2208 IN PUSHORT CaseTableBase
,
2209 OUT PNLSTABLEINFO NlsTable
2215 RtlInitCodePageTable(
2216 IN PUSHORT TableBase
,
2217 OUT PCPTABLEINFO CodePageTable
2223 RtlResetRtlTranslations(IN PNLSTABLEINFO NlsTable
);
2225 #if defined(NTOS_MODE_USER) && !defined(NO_RTL_INLINES)
2228 // Misc conversion functions
2233 RtlConvertLongToLargeIntegerf(
2237 LARGE_INTEGER Result
;
2239 Result
.QuadPart
= SignedInteger
;
2246 RtlEnlargedIntegerMultiply(
2251 LARGE_INTEGER Product
;
2253 Product
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2260 RtlEnlargedUnsignedDivide(
2261 IN ULARGE_INTEGER Dividend
,
2263 IN PULONG Remainder OPTIONAL
2268 Quotient
= (ULONG
)(Dividend
.QuadPart
/ Divisor
);
2270 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
2279 RtlEnlargedUnsignedMultiply(
2284 LARGE_INTEGER Product
;
2286 Product
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
2294 RtlUniform(PULONG Seed
);
2297 // Network Functions
2302 RtlIpv4StringToAddressW(
2305 OUT PULONG PtrToIpAddr
,
2315 RtlQueryTimeZoneInformation(LPTIME_ZONE_INFORMATION TimeZoneInformation
);
2320 RtlSecondsSince1970ToTime(
2321 IN ULONG SecondsSince1970
,
2322 OUT PLARGE_INTEGER Time
2328 RtlSetTimeZoneInformation(LPTIME_ZONE_INFORMATION TimeZoneInformation
);
2333 RtlTimeFieldsToTime(
2334 PTIME_FIELDS TimeFields
,
2341 RtlTimeToTimeFields(
2342 PLARGE_INTEGER Time
,
2343 PTIME_FIELDS TimeFields
2347 // Version Functions
2352 RtlVerifyVersionInfo(
2353 IN PRTL_OSVERSIONINFOEXW VersionInfo
,
2355 IN ULONGLONG ConditionMask
2361 RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation
);
2366 RtlGetNtProductType(OUT PNT_PRODUCT_TYPE ProductType
);