1 /* $Id: rtl.h,v 1.55 2001/07/04 20:40:18 chorns Exp $
8 #if defined(__NTOSKRNL__) || defined(__NTDRIVER__) || defined(__NTHAL__) || defined(__NTDLL__) || defined (__NTAPP__)
13 #endif /* __NTOSKRNL__ || __NTDRIVER__ || __NTHAL__ || __NTDLL__ || __NTAPP__ */
17 typedef struct _INITIAL_TEB
24 } INITIAL_TEB
, *PINITIAL_TEB
;
26 typedef struct _CONTROLLER_OBJECT
30 PVOID ControllerExtension
;
31 KDEVICE_QUEUE DeviceWaitQueue
;
34 } CONTROLLER_OBJECT
, *PCONTROLLER_OBJECT
;
36 typedef struct _STRING
39 * Length in bytes of the string stored in buffer
44 * Maximum length of the string
54 typedef STRING ANSI_STRING
;
55 typedef PSTRING PANSI_STRING
;
57 typedef STRING OEM_STRING
;
58 typedef PSTRING POEM_STRING
;
61 typedef struct _TIME_FIELDS
71 } TIME_FIELDS
, *PTIME_FIELDS
;
73 typedef struct _RTL_BITMAP
77 } RTL_BITMAP
, *PRTL_BITMAP
;
82 } RTL_HEAP_DEFINITION
, *PRTL_HEAP_DEFINITION
;
84 typedef struct _RTL_ATOM_TABLE
88 PVOID Lock
; /* fast mutex (kernel mode)/ critical section (user mode) */
91 } RTL_ATOM_TABLE
, *PRTL_ATOM_TABLE
;
98 typedef struct _RTL_NLS_DATA
101 USHORT MaxCharacterSize
; // SBCS = 1, DBCS = 2
102 WCHAR DefaultCharacter
;
107 struct _LB_RANGE LeadByteRange
[6];
109 PWCHAR MultiByteToUnicode
;
110 PCHAR UnicodeToMultiByte
;
113 } RTL_NLS_DATA
, *PRTL_NLS_DATA
;
116 typedef struct _RTL_GENERIC_TABLE
124 PVOID CompareRoutine
;
125 PVOID AllocateRoutine
;
128 } RTL_GENERIC_TABLE
, *PRTL_GENERIC_TABLE
;
131 typedef struct _RTL_MESSAGE_RESOURCE_ENTRY
136 } RTL_MESSAGE_RESOURCE_ENTRY
, *PRTL_MESSAGE_RESOURCE_ENTRY
;
138 typedef struct _RTL_MESSAGE_RESOURCE_BLOCK
142 ULONG OffsetToEntries
;
143 } RTL_MESSAGE_RESOURCE_BLOCK
, *PRTL_MESSAGE_RESOURCE_BLOCK
;
145 typedef struct _RTL_MESSAGE_RESOURCE_DATA
147 ULONG NumberOfBlocks
;
148 RTL_MESSAGE_RESOURCE_BLOCK Blocks
[1];
149 } RTL_MESSAGE_RESOURCE_DATA
, *PRTL_MESSAGE_RESOURCE_DATA
;
153 * PURPOSE: Flags for RtlQueryRegistryValues
155 #define RTL_QUERY_REGISTRY_SUBKEY (0x00000001)
156 #define RTL_QUERY_REGISTRY_TOPKEY (0x00000002)
157 #define RTL_QUERY_REGISTRY_REQUIRED (0x00000004)
158 #define RTL_QUERY_REGISTRY_NOVALUE (0x00000008)
159 #define RTL_QUERY_REGISTRY_NOEXPAND (0x00000010)
160 #define RTL_QUERY_REGISTRY_DIRECT (0x00000020)
161 #define RTL_QUERY_REGISTRY_DELETE (0x00000040)
164 typedef NTSTATUS (*PRTL_QUERY_REGISTRY_ROUTINE
)(PWSTR ValueName
,
171 typedef struct _RTL_QUERY_REGISTRY_TABLE
173 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
180 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
183 * PURPOSE: Used with RtlCheckRegistryKey, RtlCreateRegistryKey,
184 * RtlDeleteRegistryKey
186 #define RTL_REGISTRY_ABSOLUTE 0
187 #define RTL_REGISTRY_SERVICES 1
188 #define RTL_REGISTRY_CONTROL 2
189 #define RTL_REGISTRY_WINDOWS_NT 3
190 #define RTL_REGISTRY_DEVICEMAP 4
191 #define RTL_REGISTRY_USER 5
192 #define RTL_REGISTRY_MAXIMUM 6
194 #define RTL_REGISTRY_HANDLE 0x40000000
195 #define RTL_REGISTRY_OPTIONAL 0x80000000
198 #define SHORT_SIZE (sizeof(USHORT))
199 #define SHORT_MASK (SHORT_SIZE-1)
200 #define LONG_SIZE (sizeof(ULONG))
201 #define LONG_MASK (LONG_SIZE-1)
202 #define LOWBYTE_MASK 0x00FF
204 #define FIRSTBYTE(Value) ((Value) & LOWBYTE_MASK)
205 #define SECONDBYTE(Value) (((Value) >> 8) & LOWBYTE_MASK)
206 #define THIRDBYTE(Value) (((Value) >> 16) & LOWBYTE_MASK)
207 #define FOURTHBYTE(Value) (((Value) >> 24) & LOWBYTE_MASK)
209 /* FIXME: reverse byte-order on big-endian machines (e.g. MIPS) */
210 #define SHORT_LEAST_SIGNIFICANT_BIT 0
211 #define SHORT_MOST_SIGNIFICANT_BIT 1
213 #define LONG_LEAST_SIGNIFICANT_BIT 0
214 #define LONG_3RD_MOST_SIGNIFICANT_BIT 1
215 #define LONG_2RD_MOST_SIGNIFICANT_BIT 2
216 #define LONG_MOST_SIGNIFICANT_BIT 3
220 #if defined(__NTOSKRNL__) || defined(__NTDLL__)
221 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
222 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
224 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
225 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
226 #endif /* __NTOSKRNL__ || __NTDLL__ */
228 extern BOOLEAN NLS_MB_CODE_PAGE_TAG
;
229 extern BOOLEAN NLS_MB_OEM_CODE_PAGE_TAG
;
234 * InitializeObjectAttributes (
235 * POBJECT_ATTRIBUTES InitializedAttributes,
236 * PUNICODE_STRING ObjectName,
238 * HANDLE RootDirectory,
239 * PSECURITY_DESCRIPTOR SecurityDescriptor
242 * FUNCTION: Sets up a parameter of type OBJECT_ATTRIBUTES for a
243 * subsequent call to ZwCreateXXX or ZwOpenXXX
245 * InitializedAttributes (OUT) = Caller supplied storage for the
247 * ObjectName = Full path name for object
248 * Attributes = Attributes for the object
249 * RootDirectory = Where the object should be placed or NULL
250 * SecurityDescriptor = Ignored
252 #define InitializeObjectAttributes(p,n,a,r,s) \
254 (p)->Length = sizeof(OBJECT_ATTRIBUTES); \
255 (p)->ObjectName = n; \
256 (p)->Attributes = a; \
257 (p)->RootDirectory = r; \
258 (p)->SecurityDescriptor = s; \
259 (p)->SecurityQualityOfService = NULL; \
265 * InitializeListHead (
266 * PLIST_ENTRY ListHead
269 * FUNCTION: Initializes a double linked list
271 * ListHead = Caller supplied storage for the head of the list
273 #define InitializeListHead(ListHead) \
275 (ListHead)->Flink = (ListHead); \
276 (ListHead)->Blink = (ListHead); \
283 * PLIST_ENTRY ListHead,
287 * FUNCTION: Inserts an entry in a double linked list
289 * ListHead = Head of the list
290 * Entry = Entry to insert
292 #define InsertHeadList(ListHead, ListEntry) \
294 PLIST_ENTRY OldFlink; \
295 OldFlink = (ListHead)->Flink; \
296 (ListEntry)->Flink = OldFlink; \
297 (ListEntry)->Blink = (ListHead); \
298 OldFlink->Blink = (ListEntry); \
299 (ListHead)->Flink = (ListEntry); \
300 assert((ListEntry) != NULL); \
301 assert((ListEntry)->Blink!=NULL); \
302 assert((ListEntry)->Blink->Flink == (ListEntry)); \
303 assert((ListEntry)->Flink != NULL); \
304 assert((ListEntry)->Flink->Blink == (ListEntry)); \
311 * PLIST_ENTRY ListHead,
316 * Inserts an entry in a double linked list
319 * ListHead = Head of the list
320 * Entry = Entry to insert
322 #define InsertTailList(ListHead, ListEntry) \
324 PLIST_ENTRY OldBlink; \
325 OldBlink = (ListHead)->Blink; \
326 (ListEntry)->Flink = (ListHead); \
327 (ListEntry)->Blink = OldBlink; \
328 OldBlink->Flink = (ListEntry); \
329 (ListHead)->Blink = (ListEntry); \
330 assert((ListEntry) != NULL); \
331 assert((ListEntry)->Blink != NULL); \
332 assert((ListEntry)->Blink->Flink == (ListEntry)); \
333 assert((ListEntry)->Flink != NULL); \
334 assert((ListEntry)->Flink->Blink == (ListEntry)); \
340 * PLIST_ENTRY ListHead
344 * Checks if a double linked list is empty
347 * ListHead = Head of the list
349 #define IsListEmpty(ListHead) \
350 ((ListHead)->Flink == (ListHead))
356 * PSINGLE_LIST_ENTRY ListHead
360 * Removes an entry from the head of a single linked list
363 * ListHead = Head of the list
369 #define PopEntryList(ListHead) \
372 PSINGLE_LIST_ENTRY FirstEntry; \
373 FirstEntry = (ListHead)->Next; \
374 if (FirstEntry != NULL) \
376 (ListHead)->Next = FirstEntry->Next; \
384 PSINGLE_LIST_ENTRY ListHead
387 PSINGLE_LIST_ENTRY ListEntry
;
389 ListEntry
= ListHead
->Next
;
392 ListHead
->Next
= ListEntry
->Next
;
400 PSINGLE_LIST_ENTRY ListHead,
401 PSINGLE_LIST_ENTRY Entry
405 #define PushEntryList(ListHead,Entry) \
406 (Entry)->Next = (ListHead)->Next; \
407 (ListHead)->Next = (Entry)
413 PSINGLE_LIST_ENTRY ListHead
,
414 PSINGLE_LIST_ENTRY Entry
417 Entry
->Next
= ListHead
->Next
;
418 ListHead
->Next
= Entry
;
423 * An ReactOS extension
429 PSLIST_HEADER ListHead
432 PSINGLE_LIST_ENTRY ListEntry
;
434 ListEntry
= ListHead
->s
.Next
.Next
;
437 ListHead
->s
.Next
.Next
= ListEntry
->Next
;
439 ListHead
->s
.Sequence
++;
446 * An ReactOS extension
452 PSLIST_HEADER ListHead
,
453 PSINGLE_LIST_ENTRY Entry
456 Entry
->Next
= ListHead
->s
.Next
.Next
;
457 ListHead
->s
.Next
.Next
= Entry
;
459 ListHead
->s
.Sequence
++;
470 * Removes an entry from a double linked list
473 * ListEntry = Entry to remove
475 #define RemoveEntryList(ListEntry) \
477 PLIST_ENTRY OldFlink; \
478 PLIST_ENTRY OldBlink; \
479 assert((ListEntry) != NULL); \
480 assert((ListEntry)->Blink!=NULL); \
481 assert((ListEntry)->Blink->Flink == (ListEntry)); \
482 assert((ListEntry)->Flink != NULL); \
483 assert((ListEntry)->Flink->Blink == (ListEntry)); \
484 OldFlink = (ListEntry)->Flink; \
485 OldBlink = (ListEntry)->Blink; \
486 OldFlink->Blink = OldBlink; \
487 OldBlink->Flink = OldFlink; \
488 (ListEntry)->Flink = NULL; \
489 (ListEntry)->Blink = NULL; \
496 * PLIST_ENTRY ListHead
500 * Removes the head entry from a double linked list
503 * ListHead = Head of the list
509 #define RemoveHeadList(ListHead) \
511 {RemoveEntryList((ListHead)->Flink)}
528 PLIST_ENTRY OldFlink
;
529 PLIST_ENTRY OldBlink
;
531 Old
= ListHead
->Flink
;
533 OldFlink
= ListHead
->Flink
->Flink
;
534 OldBlink
= ListHead
->Flink
->Blink
;
535 OldFlink
->Blink
= OldBlink
;
536 OldBlink
->Flink
= OldFlink
;
550 * PLIST_ENTRY ListHead
554 * Removes the tail entry from a double linked list
557 * ListHead = Head of the list
563 #define RemoveTailList(ListHead) \
565 {RemoveEntryList((ListHead)->Blink)}
582 PLIST_ENTRY OldFlink
;
583 PLIST_ENTRY OldBlink
;
585 Old
= ListHead
->Blink
;
587 OldFlink
= ListHead
->Blink
->Flink
;
588 OldBlink
= ListHead
->Blink
->Blink
;
589 OldFlink
->Blink
= OldBlink
;
590 OldBlink
->Flink
= OldFlink
;
603 RtlAddAtomToAtomTable (
604 IN PRTL_ATOM_TABLE AtomTable
,
618 RtlAnsiCharToUnicodeChar (
624 RtlAnsiStringToUnicodeSize (
625 PANSI_STRING AnsiString
630 RtlAnsiStringToUnicodeString (
631 PUNICODE_STRING DestinationString
,
632 PANSI_STRING SourceString
,
633 BOOLEAN AllocateDestinationString
638 RtlAppendAsciizToString(
645 RtlAppendStringToString (
652 RtlAppendUnicodeStringToString (
653 PUNICODE_STRING Destination
,
654 PUNICODE_STRING Source
659 RtlAppendUnicodeToString (
660 PUNICODE_STRING Destination
,
667 PRTL_BITMAP BitMapHeader
,
675 PRTL_BITMAP BitMapHeader
,
683 PVOID FailedAssertion
,
699 RtlCheckRegistryKey (
707 IN PRTL_BITMAP BitMapHeader
713 IN PRTL_BITMAP BitMapHeader
,
714 IN ULONG StartingIndex
,
715 IN ULONG NumberToClear
738 BOOLEAN CaseInsensitive
743 RtlCompareUnicodeString (
744 PUNICODE_STRING String1
,
745 PUNICODE_STRING String2
,
746 BOOLEAN BaseInsensitive
751 RtlConvertLongToLargeInteger (
752 IN LONG SignedInteger
757 RtlConvertSidToUnicodeString (
758 IN OUT PUNICODE_STRING String
,
760 IN BOOLEAN AllocateString
765 RtlConvertUlongToLargeInteger (
766 IN ULONG UnsignedInteger
785 #define RtlCopyMemory(Destination,Source,Length) \
786 memcpy((Destination),(Source),(Length))
788 #define RtlCopyBytes RtlCopyMemory
793 PSTRING DestinationString
,
799 RtlCopyUnicodeString (
800 PUNICODE_STRING DestinationString
,
801 PUNICODE_STRING SourceString
808 IN OUT PRTL_ATOM_TABLE
*AtomTable
819 PRTL_HEAP_DEFINITION Definition
824 RtlCreateRegistryKey (
831 RtlCreateSecurityDescriptor (
832 PSECURITY_DESCRIPTOR SecurityDescriptor
,
838 RtlCreateUnicodeString (
839 OUT PUNICODE_STRING Destination
,
845 RtlCreateUnicodeStringFromAsciiz (
846 OUT PUNICODE_STRING Destination
,
852 RtlCustomCPToUnicodeN (
853 PRTL_NLS_DATA NlsData
,
854 PWCHAR UnicodeString
,
863 RtlDeleteAtomFromAtomTable (
864 IN PRTL_ATOM_TABLE AtomTable
,
870 RtlDeleteRegistryValue (
878 RtlDestroyAtomTable (
879 IN PRTL_ATOM_TABLE AtomTable
890 RtlDowncaseUnicodeString (
891 IN OUT PUNICODE_STRING DestinationString
,
892 IN PUNICODE_STRING SourceString
,
893 IN BOOLEAN AllocateDestinationString
899 IN PRTL_ATOM_TABLE AtomTable
,
900 IN BOOLEAN DeletePinned
905 RtlEnlargedIntegerMultiply (
912 RtlEnlargedUnsignedDivide (
913 ULARGE_INTEGER Dividend
,
920 RtlEnlargedUnsignedMultiply (
930 BOOLEAN CaseInSensitive
935 RtlEqualUnicodeString (
936 PUNICODE_STRING String1
,
937 PUNICODE_STRING String2
,
938 BOOLEAN CaseInSensitive
943 RtlExtendedIntegerMultiply (
944 LARGE_INTEGER Multiplicand
,
950 RtlExtendedLargeIntegerDivide (
951 LARGE_INTEGER Dividend
,
958 RtlExtendedMagicDivide (
959 LARGE_INTEGER Dividend
,
960 LARGE_INTEGER MagicDivisor
,
983 PRTL_BITMAP BitMapHeader
,
990 RtlFindClearBitsAndSet (
991 PRTL_BITMAP BitMapHeader
,
998 RtlFindFirstRunClear (
999 PRTL_BITMAP BitMapHeader
,
1000 PULONG StartingIndex
1005 RtlFindFirstRunSet (
1006 PRTL_BITMAP BitMapHeader
,
1007 PULONG StartingIndex
1012 RtlFindLongestRunClear (
1013 PRTL_BITMAP BitMapHeader
,
1014 PULONG StartingIndex
1019 RtlFindLongestRunSet (
1020 PRTL_BITMAP BitMapHeader
,
1021 PULONG StartingIndex
1027 IN PVOID BaseAddress
,
1031 OUT PRTL_MESSAGE_RESOURCE_ENTRY
*MessageResourceEntry
1037 PRTL_BITMAP BitMapHeader
,
1044 RtlFindSetBitsAndClear (
1045 PRTL_BITMAP BitMapHeader
,
1052 RtlFormatCurrentUserKeyPath (
1053 IN OUT PUNICODE_STRING KeyPath
1059 PANSI_STRING AnsiString
1073 POEM_STRING OemString
1078 RtlFreeUnicodeString (
1079 PUNICODE_STRING UnicodeString
1083 RtlGetCallersAddress (
1084 PVOID
* CallersAddress
1089 RtlGetDefaultCodePage (
1090 PUSHORT AnsiCodePage
,
1102 RtlImageDirectoryEntryToData (
1115 PIMAGE_SECTION_HEADER
1117 RtlImageRvaToSection (
1118 PIMAGE_NT_HEADERS NtHeader
,
1126 PIMAGE_NT_HEADERS NtHeader
,
1129 PIMAGE_SECTION_HEADER
*SectionHeader
1135 PANSI_STRING DestinationString
,
1142 PSTRING DestinationString
,
1148 RtlInitUnicodeString (
1149 PUNICODE_STRING DestinationString
,
1155 RtlInitializeBitMap (
1156 IN OUT PRTL_BITMAP BitMapHeader
,
1157 IN PULONG BitMapBuffer
,
1158 IN ULONG SizeOfBitMap
1163 RtlInitializeContext (
1164 IN HANDLE ProcessHandle
,
1165 IN PCONTEXT Context
,
1167 IN PTHREAD_START_ROUTINE StartAddress
,
1168 IN OUT PINITIAL_TEB InitialTeb
1173 RtlInitializeGenericTable (
1174 IN OUT PRTL_GENERIC_TABLE Table
,
1175 IN PVOID CompareRoutine
,
1176 IN PVOID AllocateRoutine
,
1177 IN PVOID FreeRoutine
,
1178 IN ULONG UserParameter
1183 RtlInsertElementGenericTable (
1184 IN OUT PRTL_GENERIC_TABLE Table
,
1186 IN ULONG ElementSize
,
1201 RtlIntegerToUnicodeString (
1204 IN OUT PUNICODE_STRING String
1209 RtlIsGenericTableEmpty (
1210 IN PRTL_GENERIC_TABLE Table
1215 RtlIsNameLegalDOS8Dot3 (
1216 IN PUNICODE_STRING UnicodeName
,
1217 IN OUT PANSI_STRING AnsiName
,
1218 IN OUT PBOOLEAN SpacesFound
1223 RtlLargeIntegerAdd (
1224 LARGE_INTEGER Addend1
,
1225 LARGE_INTEGER Addend2
1230 * RtlLargeIntegerAnd (
1231 * PLARGE_INTEGER Result,
1232 * LARGE_INTEGER Source,
1233 * LARGE_INTEGER Mask
1236 #define RtlLargeIntegerAnd(Result, Source, Mask) \
1238 Result.HighPart = Source.HighPart & Mask.HighPart; \
1239 Result.LowPart = Source.LowPart & Mask.LowPart; \
1244 RtlLargeIntegerArithmeticShift (
1245 LARGE_INTEGER LargeInteger
,
1251 RtlLargeIntegerDivide (
1252 LARGE_INTEGER Dividend
,
1253 LARGE_INTEGER Divisor
,
1254 PLARGE_INTEGER Remainder
1259 * RtlLargeIntegerEqualTo (
1260 * LARGE_INTEGER Operand1,
1261 * LARGE_INTEGER Operand2
1264 #define RtlLargeIntegerEqualTo(X,Y) \
1265 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
1269 * RtlLargeIntegerEqualToZero (
1270 * LARGE_INTEGER Operand
1273 #define RtlLargeIntegerEqualToZero(X) \
1274 (!((X).LowPart | (X).HighPart))
1278 * RtlLargeIntegerGreaterThan (
1279 * LARGE_INTEGER Operand1,
1280 * LARGE_INTEGER Operand2
1283 #define RtlLargeIntegerGreaterThan(X,Y) \
1284 ((((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
1285 ((X).HighPart > (Y).HighPart))
1289 * RtlLargeIntegerGreaterThanOrEqualTo (
1290 * LARGE_INTEGER Operand1,
1291 * LARGE_INTEGER Operand2
1294 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) \
1295 ((((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
1296 ((X).HighPart > (Y).HighPart))
1300 * RtlLargeIntegerGreaterThanOrEqualToZero (
1301 * LARGE_INTEGER Operand1
1304 #define RtlLargeIntegerGreaterOrEqualToZero(X) \
1309 * RtlLargeIntegerGreaterThanZero (
1310 * LARGE_INTEGER Operand1
1313 #define RtlLargeIntegerGreaterThanZero(X) \
1314 ((((X).HighPart == 0) && ((X).LowPart > 0)) || \
1315 ((X).HighPart > 0 ))
1319 * RtlLargeIntegerLessThan (
1320 * LARGE_INTEGER Operand1,
1321 * LARGE_INTEGER Operand2
1324 #define RtlLargeIntegerLessThan(X,Y) \
1325 ((((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
1326 ((X).HighPart < (Y).HighPart))
1330 * RtlLargeIntegerLessThanOrEqualTo (
1331 * LARGE_INTEGER Operand1,
1332 * LARGE_INTEGER Operand2
1335 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) \
1336 ((((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
1337 ((X).HighPart < (Y).HighPart))
1341 * RtlLargeIntegerLessThanOrEqualToZero (
1342 * LARGE_INTEGER Operand
1345 #define RtlLargeIntegerLessOrEqualToZero(X) \
1346 (((X).HighPart < 0) || !((X).LowPart | (X).HighPart))
1350 * RtlLargeIntegerLessThanZero (
1351 * LARGE_INTEGER Operand
1354 #define RtlLargeIntegerLessThanZero(X) \
1355 (((X).HighPart < 0))
1359 RtlLargeIntegerNegate (
1360 LARGE_INTEGER Subtrahend
1365 * RtlLargeIntegerNotEqualTo (
1366 * LARGE_INTEGER Operand1,
1367 * LARGE_INTEGER Operand2
1370 #define RtlLargeIntegerNotEqualTo(X,Y) \
1371 ((((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
1375 * RtlLargeIntegerNotEqualToZero (
1376 * LARGE_INTEGER Operand
1379 #define RtlLargeIntegerNotEqualToZero(X) \
1380 (((X).LowPart | (X).HighPart))
1384 RtlLargeIntegerShiftLeft (
1385 LARGE_INTEGER LargeInteger
,
1391 RtlLargeIntegerShiftRight (
1392 LARGE_INTEGER LargeInteger
,
1398 RtlLargeIntegerSubtract (
1399 LARGE_INTEGER Minuend
,
1400 LARGE_INTEGER Subtrahend
1405 RtlLengthSecurityDescriptor (
1406 PSECURITY_DESCRIPTOR SecurityDescriptor
1417 RtlLookupAtomInAtomTable (
1418 IN PRTL_ATOM_TABLE AtomTable
,
1424 RtlMoveMemory (PVOID Destination
, CONST VOID
* Source
, ULONG Length
);
1428 RtlMultiByteToUnicodeN (
1429 PWCHAR UnicodeString
,
1438 RtlMultiByteToUnicodeSize (
1446 RtlNtStatusToDosError (
1452 RtlNtStatusToDosErrorNoTeb (
1458 RtlNtStatusToPsxErrno (
1464 RtlNumberGenericTableElements (
1465 IN PRTL_GENERIC_TABLE Table
1470 RtlNumberOfClearBits (
1471 PRTL_BITMAP BitMapHeader
1476 RtlNumberOfSetBits (
1477 PRTL_BITMAP BitMapHeader
1482 RtlOemStringToUnicodeSize (
1483 POEM_STRING AnsiString
1488 RtlOemStringToUnicodeString (
1489 PUNICODE_STRING DestinationString
,
1490 POEM_STRING SourceString
,
1491 BOOLEAN AllocateDestinationString
1497 PWCHAR UnicodeString
,
1506 RtlOpenCurrentUser (
1507 IN ACCESS_MASK DesiredAccess
,
1508 OUT PHANDLE KeyHandle
1512 RtlPinAtomInAtomTable (
1513 IN PRTL_ATOM_TABLE AtomTable
,
1520 PANSI_STRING String1
,
1521 PANSI_STRING String2
,
1522 BOOLEAN CaseInsensitive
1527 RtlPrefixUnicodeString (
1528 PUNICODE_STRING String1
,
1529 PUNICODE_STRING String2
,
1530 BOOLEAN CaseInsensitive
1535 RtlQueryAtomInAtomTable (
1536 IN PRTL_ATOM_TABLE AtomTable
,
1538 IN OUT PULONG RefCount OPTIONAL
,
1539 IN OUT PULONG PinCount OPTIONAL
,
1540 IN OUT PWSTR AtomName OPTIONAL
,
1541 IN OUT PULONG NameLength OPTIONAL
1546 RtlQueryRegistryValues (
1547 IN ULONG RelativeTo
,
1549 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
1551 IN PVOID Environment
1556 RtlQueryTimeZoneInformation (
1557 IN OUT PTIME_ZONE_INFORMATION TimeZoneInformation
1563 IN PEXCEPTION_RECORD ExceptionRecord
1577 * RtlRetrieveUlong (
1578 * PULONG DestinationAddress,
1579 * PULONG SourceAddress
1582 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1583 if ((ULONG)(SrcAddress) & LONG_MASK) \
1585 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1586 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1587 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1588 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1592 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1597 * RtlRetrieveUshort (
1598 * PUSHORT DestinationAddress,
1599 * PUSHORT SourceAddress
1602 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1603 if ((ULONG)(SrcAddress) & SHORT_MASK) \
1605 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1606 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1610 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1615 RtlSecondsSince1970ToTime (
1616 ULONG SecondsSince1970
,
1622 RtlSecondsSince1980ToTime (
1623 ULONG SecondsSince1980
,
1630 IN PRTL_BITMAP BitMapHeader
1636 PRTL_BITMAP BitMapHeader
,
1637 ULONG StartingIndex
,
1643 RtlSetDaclSecurityDescriptor (
1644 PSECURITY_DESCRIPTOR SecurityDescriptor
,
1645 BOOLEAN DaclPresent
,
1647 BOOLEAN DaclDefaulted
1652 RtlSetTimeZoneInformation (
1653 IN OUT PTIME_ZONE_INFORMATION TimeZoneInformation
1671 #define RtlStoreUlong(Address,Value) \
1672 if ((ULONG)(Address) & LONG_MASK) \
1674 ((PUCHAR)(Address))[LONG_LEAST_SIGNIFICANT_BIT]=(UCHAR)(FIRSTBYTE(Value)); \
1675 ((PUCHAR)(Address))[LONG_3RD_MOST_SIGNIFICANT_BIT]=(UCHAR)(FIRSTBYTE(Value)); \
1676 ((PUCHAR)(Address))[LONG_2ND_MOST_SIGNIFICANT_BIT]=(UCHAR)(THIRDBYTE(Value)); \
1677 ((PUCHAR)(Address))[LONG_MOST_SIGNIFICANT_BIT]=(UCHAR)(FOURTHBYTE(Value)); \
1681 *((PULONG)(Address))=(ULONG)(Value); \
1691 #define RtlStoreUshort(Address,Value) \
1692 if ((ULONG)(Address) & SHORT_MASK) \
1694 ((PUCHAR)(Address))[SHORT_LEAST_SIGNIFICANT_BIT]=(UCHAR)(FIRSTBYTE(Value)); \
1695 ((PUCHAR)(Address))[SHORT_MOST_SIGNIFICANT_BIT]=(UCHAR)(SECONDBYTE(Value)); \
1699 *((PUSHORT)(Address))=(USHORT)(Value); \
1704 RtlTimeFieldsToTime (
1705 PTIME_FIELDS TimeFields
,
1711 RtlTimeToSecondsSince1970 (
1712 PLARGE_INTEGER Time
,
1713 PULONG SecondsSince1970
1718 RtlTimeToSecondsSince1980 (
1719 PLARGE_INTEGER Time
,
1720 PULONG SecondsSince1980
1725 RtlTimeToTimeFields (
1726 PLARGE_INTEGER Time
,
1727 PTIME_FIELDS TimeFields
1732 RtlUnicodeStringToAnsiSize (
1733 IN PUNICODE_STRING UnicodeString
1738 RtlUnicodeStringToAnsiString (
1739 IN OUT PANSI_STRING DestinationString
,
1740 IN PUNICODE_STRING SourceString
,
1741 IN BOOLEAN AllocateDestinationString
1746 RtlUnicodeStringToInteger (
1747 IN PUNICODE_STRING String
,
1754 RtlUnicodeStringToOemSize (
1755 IN PUNICODE_STRING UnicodeString
1760 RtlUnicodeStringToCountedOemString (
1761 IN OUT POEM_STRING DestinationString
,
1762 IN PUNICODE_STRING SourceString
,
1763 IN BOOLEAN AllocateDestinationString
1768 RtlUnicodeStringToOemString (
1769 IN OUT POEM_STRING DestinationString
,
1770 IN PUNICODE_STRING SourceString
,
1771 IN BOOLEAN AllocateDestinationString
1776 RtlUnicodeToCustomCPN (
1777 PRTL_NLS_DATA NlsData
,
1781 PWCHAR UnicodeString
,
1787 RtlUnicodeToMultiByteN (
1791 PWCHAR UnicodeString
,
1797 RtlUnicodeToMultiByteSize (
1799 PWCHAR UnicodeString
,
1809 PWCHAR UnicodeString
,
1830 RtlUpcaseUnicodeChar (
1836 RtlUpcaseUnicodeString (
1837 IN OUT PUNICODE_STRING DestinationString
,
1838 IN PUNICODE_STRING SourceString
,
1839 IN BOOLEAN AllocateDestinationString
1844 RtlUpcaseUnicodeStringToAnsiString (
1845 IN OUT PANSI_STRING DestinationString
,
1846 IN PUNICODE_STRING SourceString
,
1847 IN BOOLEAN AllocateDestinationString
1852 RtlUpcaseUnicodeStringToCountedOemString (
1853 IN OUT POEM_STRING DestinationString
,
1854 IN PUNICODE_STRING SourceString
,
1855 IN BOOLEAN AllocateDestinationString
1860 RtlUpcaseUnicodeStringToOemString (
1861 IN OUT POEM_STRING DestinationString
,
1862 IN PUNICODE_STRING SourceString
,
1863 IN BOOLEAN AllocateDestinationString
1868 RtlUpcaseUnicodeToCustomCPN (
1869 PRTL_NLS_DATA NlsData
,
1873 PWCHAR UnicodeString
,
1879 RtlUpcaseUnicodeToMultiByteN (
1883 PWCHAR UnicodeString
,
1889 RtlUpcaseUnicodeToOemN (
1893 PWCHAR UnicodeString
,
1906 PSTRING DestinationString
,
1907 PSTRING SourceString
1920 RtlValidSecurityDescriptor (
1921 PSECURITY_DESCRIPTOR SecurityDescriptor
1926 RtlWriteRegistryValue (
1936 RtlZeroMemory (PVOID Destination
, ULONG Length
);
1940 RtlxAnsiStringToUnicodeSize (
1941 IN PANSI_STRING AnsiString
1946 RtlxOemStringToUnicodeSize (
1947 IN POEM_STRING OemString
1952 RtlxUnicodeStringToAnsiSize (
1953 IN PUNICODE_STRING UnicodeString
1958 RtlxUnicodeStringToOemSize (
1959 IN PUNICODE_STRING UnicodeString
1963 /* Register io functions */
1967 READ_REGISTER_UCHAR (
1973 READ_REGISTER_USHORT (
1979 READ_REGISTER_ULONG (
1985 READ_REGISTER_BUFFER_UCHAR (
1993 READ_REGISTER_BUFFER_USHORT (
2001 READ_REGISTER_BUFFER_ULONG (
2009 WRITE_REGISTER_UCHAR (
2016 WRITE_REGISTER_USHORT (
2023 WRITE_REGISTER_ULONG (
2030 WRITE_REGISTER_BUFFER_UCHAR (
2038 WRITE_REGISTER_BUFFER_USHORT (
2046 WRITE_REGISTER_BUFFER_ULONG (
2053 NTSTATUS STDCALL
RtlCreateAcl(PACL Acl
, ULONG AclSize
, ULONG AclRevision
);
2054 NTSTATUS STDCALL
RtlQueryInformationAcl (PACL Acl
, PVOID Information
, ULONG InformationLength
, ACL_INFORMATION_CLASS InformationClass
);
2055 NTSTATUS STDCALL
RtlSetInformationAcl (PACL Acl
, PVOID Information
, ULONG InformationLength
, ACL_INFORMATION_CLASS InformationClass
);
2056 BOOLEAN STDCALL
RtlValidAcl (PACL Acl
);
2058 NTSTATUS STDCALL
RtlAddAccessAllowedAce(PACL Acl
, ULONG Revision
, ACCESS_MASK AccessMask
, PSID Sid
);
2059 NTSTATUS STDCALL
RtlAddAccessDeniedAce(PACL Acl
, ULONG Revision
, ACCESS_MASK AccessMask
, PSID Sid
);
2060 NTSTATUS STDCALL
RtlAddAce(PACL Acl
, ULONG Revision
, ULONG StartingIndex
, PACE AceList
, ULONG AceListLength
);
2061 NTSTATUS STDCALL
RtlAddAuditAccessAce (PACL Acl
, ULONG Revision
, ACCESS_MASK AccessMask
, PSID Sid
, BOOLEAN Success
, BOOLEAN Failure
);
2062 NTSTATUS STDCALL
RtlDeleteAce(PACL Acl
, ULONG AceIndex
);
2063 BOOLEAN STDCALL
RtlFirstFreeAce(PACL Acl
, PACE
* Ace
);
2064 NTSTATUS STDCALL
RtlGetAce(PACL Acl
, ULONG AceIndex
, PACE
*Ace
);
2066 NTSTATUS STDCALL
RtlAbsoluteToSelfRelativeSD (PSECURITY_DESCRIPTOR AbsSD
, PSECURITY_DESCRIPTOR RelSD
, PULONG BufferLength
);
2067 NTSTATUS STDCALL
RtlMakeSelfRelativeSD (PSECURITY_DESCRIPTOR AbsSD
, PSECURITY_DESCRIPTOR RelSD
, PULONG BufferLength
);
2068 NTSTATUS STDCALL
RtlCreateSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor
, ULONG Revision
);
2069 BOOLEAN STDCALL
RtlValidSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor
);
2070 ULONG STDCALL
RtlLengthSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor
);
2071 NTSTATUS STDCALL
RtlSetDaclSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor
, BOOLEAN DaclPresent
, PACL Dacl
, BOOLEAN DaclDefaulted
);
2072 NTSTATUS STDCALL
RtlGetDaclSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor
, PBOOLEAN DaclPresent
, PACL
* Dacl
, PBOOLEAN DaclDefauted
);
2073 NTSTATUS STDCALL
RtlSetOwnerSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor
, PSID Owner
, BOOLEAN OwnerDefaulted
);
2074 NTSTATUS STDCALL
RtlGetOwnerSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor
, PSID
* Owner
, PBOOLEAN OwnerDefaulted
);
2075 NTSTATUS STDCALL
RtlSetGroupSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor
, PSID Group
, BOOLEAN GroupDefaulted
);
2076 NTSTATUS STDCALL
RtlGetGroupSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor
, PSID
* Group
, PBOOLEAN GroupDefaulted
);
2077 NTSTATUS STDCALL
RtlGetControlSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor
, PSECURITY_DESCRIPTOR_CONTROL Control
, PULONG Revision
);
2078 NTSTATUS STDCALL
RtlSetSaclSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor
, BOOLEAN SaclPresent
, PACL Sacl
, BOOLEAN SaclDefaulted
);
2079 NTSTATUS STDCALL
RtlGetSaclSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor
, PBOOLEAN SaclPresent
, PACL
* Sacl
, PBOOLEAN SaclDefauted
);
2080 NTSTATUS STDCALL
RtlSelfRelativeToAbsoluteSD (PSECURITY_DESCRIPTOR RelSD
,
2081 PSECURITY_DESCRIPTOR AbsSD
,
2092 NTSTATUS STDCALL
RtlAllocateAndInitializeSid (PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
2093 UCHAR SubAuthorityCount
,
2094 ULONG SubAuthority0
,
2095 ULONG SubAuthority1
,
2096 ULONG SubAuthority2
,
2097 ULONG SubAuthority3
,
2098 ULONG SubAuthority4
,
2099 ULONG SubAuthority5
,
2100 ULONG SubAuthority6
,
2101 ULONG SubAuthority7
,
2103 ULONG STDCALL
RtlLengthRequiredSid (UCHAR SubAuthorityCount
);
2104 PSID_IDENTIFIER_AUTHORITY STDCALL
RtlIdentifierAuthoritySid (PSID Sid
);
2105 NTSTATUS STDCALL
RtlInitializeSid (PSID Sid
, PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
, UCHAR SubAuthorityCount
);
2106 PULONG STDCALL
RtlSubAuthoritySid (PSID Sid
, ULONG SubAuthority
);
2107 NTSTATUS STDCALL
RtlCopySid (ULONG BufferLength
, PSID Dest
, PSID Src
);
2108 BOOLEAN STDCALL
RtlEqualPrefixSid (PSID Sid1
, PSID Sid2
);
2109 BOOLEAN STDCALL
RtlEqualSid(PSID Sid1
, PSID Sid2
);
2110 PSID STDCALL
RtlFreeSid (PSID Sid
);
2111 ULONG STDCALL
RtlLengthSid (PSID Sid
);
2112 PULONG STDCALL
RtlSubAuthoritySid (PSID Sid
, ULONG SubAuthority
);
2113 PUCHAR STDCALL
RtlSubAuthorityCountSid (PSID Sid
);
2114 BOOLEAN STDCALL
RtlValidSid (PSID Sid
);
2115 NTSTATUS STDCALL
RtlConvertSidToUnicodeString (PUNICODE_STRING String
, PSID Sid
, BOOLEAN AllocateBuffer
);
2117 BOOLEAN STDCALL
RtlAreAllAccessesGranted (ACCESS_MASK GrantedAccess
, ACCESS_MASK DesiredAccess
);
2118 BOOLEAN STDCALL
RtlAreAnyAccessesGranted (ACCESS_MASK GrantedAccess
, ACCESS_MASK DesiredAccess
);
2119 VOID STDCALL
RtlMapGenericMask (PACCESS_MASK AccessMask
, PGENERIC_MAPPING GenericMapping
);
2122 /* functions exported from NTOSKRNL.EXE which are considered RTL */
2124 #if defined(__NTOSKRNL__) || defined(__NTDRIVER__) || defined(__NTHAL__) || defined(__NTDLL__) || defined(__NTAPP__)
2126 char *_itoa (int value
, char *string
, int radix
);
2127 int _snprintf(char * buf
, size_t cnt
, const char *fmt
, ...);
2128 int _snwprintf(wchar_t *buf
, size_t cnt
, const wchar_t *fmt
, ...);
2129 int _stricmp(const char *s1
, const char *s2
);
2130 char * _strlwr(char *x
);
2131 int _strnicmp(const char *s1
, const char *s2
, size_t n
);
2132 char * _strnset(char* szToFill
, int szFill
, size_t sizeMaxFill
);
2133 char * _strrev(char *s
);
2134 char * _strset(char* szToFill
, int szFill
);
2135 char * _strupr(char *x
);
2136 int _vsnprintf(char *buf
, size_t cnt
, const char *fmt
, va_list args
);
2137 int _wcsicmp (const wchar_t* cs
, const wchar_t* ct
);
2138 wchar_t * _wcslwr (wchar_t *x
);
2139 int _wcsnicmp (const wchar_t * cs
,const wchar_t * ct
,size_t count
);
2140 wchar_t* _wcsnset (wchar_t* wsToFill
, wchar_t wcFill
, size_t sizeMaxFill
);
2141 wchar_t * _wcsrev(wchar_t *s
);
2142 wchar_t *_wcsupr(wchar_t *x
);
2144 int atoi(const char *str
);
2145 long atol(const char *str
);
2151 int isxdigit(int c
);
2152 size_t mbstowcs (wchar_t *wcstr
, const char *mbstr
, size_t count
);
2153 int mbtowc (wchar_t *wchar
, const char *mbchar
, size_t count
);
2154 void * memchr(const void *s
, int c
, size_t n
);
2155 void * memcpy(void *to
, const void *from
, size_t count
);
2156 void * memmove(void *dest
,const void *src
, size_t count
);
2157 void * memset(void *src
, int val
, size_t count
);
2164 int sprintf(char * buf
, const char *fmt
, ...);
2165 void srand(unsigned seed
);
2166 char * strcat(char *s
, const char *append
);
2167 char * strchr(const char *s
, int c
);
2168 int strcmp(const char *s1
, const char *s2
);
2169 char * strcpy(char *to
, const char *from
);
2170 size_t strlen(const char *str
);
2171 char * strncat(char *dst
, const char *src
, size_t n
);
2172 int strncmp(const char *s1
, const char *s2
, size_t n
);
2173 char *strncpy(char *dst
, const char *src
, size_t n
);
2174 char *strrchr(const char *s
, int c
);
2175 size_t strspn(const char *s1
, const char *s2
);
2176 char *strstr(const char *s
, const char *find
);
2177 int swprintf(wchar_t *buf
, const wchar_t *fmt
, ...);
2180 wchar_t towlower(wchar_t c
);
2181 wchar_t towupper(wchar_t c
);
2182 int vsprintf(char *buf
, const char *fmt
, va_list args
);
2183 wchar_t * wcscat(wchar_t *dest
, const wchar_t *src
);
2184 wchar_t * wcschr(const wchar_t *str
, wchar_t ch
);
2185 int wcscmp(const wchar_t *cs
, const wchar_t *ct
);
2186 wchar_t* wcscpy(wchar_t* str1
, const wchar_t* str2
);
2187 size_t wcscspn(const wchar_t *str
,const wchar_t *reject
);
2188 size_t wcslen(const wchar_t *s
);
2189 wchar_t * wcsncat(wchar_t *dest
, const wchar_t *src
, size_t count
);
2190 int wcsncmp(const wchar_t *cs
, const wchar_t *ct
, size_t count
);
2191 wchar_t * wcsncpy(wchar_t *dest
, const wchar_t *src
, size_t count
);
2192 wchar_t * wcsrchr(const wchar_t *str
, wchar_t ch
);
2193 size_t wcsspn(const wchar_t *str
,const wchar_t *accept
);
2194 wchar_t *wcsstr(const wchar_t *s
,const wchar_t *b
);
2195 size_t wcstombs (char *mbstr
, const wchar_t *wcstr
, size_t count
);
2196 int wctomb (char *mbchar
, wchar_t wchar
);
2198 #endif /* __NTOSKRNL__ || __NTDRIVER__ || __NTHAL__ || __NTDLL__ || __NTAPP__ */
2200 #endif /* __DDK_RTL_H */