- Finished implementing RtlInsertUnicodePrefix: handle greater and less than insertions.
[reactos.git] / reactos / include / ndk / rtlfuncs.h
index 18d0a6a..0a5ddd4 100644 (file)
 
 /* DEPENDENCIES **************************************************************/
 #include <ntnls.h>
+#include "extypes.h"
+#include "rtltypes.h"
+
+/* MACROS ********************************************************************/
+
+/* FIXME: Eventually move the ones in rtltypes.h here... */
+
+/*
+ * Splay Tree Macros
+ */
+#define RtlIsLeftChild(Links) \
+    (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
+
+#define RtlRightChild(Links) \
+    (PRTL_SPLAY_LINKS)(Links)->RightChild
+
+#define RtlIsRoot(Links) \
+    (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
+
+#define RtlLeftChild(Links) \
+    (PRTL_SPLAY_LINKS)(Links)->LeftChild
+
+#define RtlParent(Links) \
+    (PRTL_SPLAY_LINKS)(Links)->Parent
+
+#define RtlInitializeSplayLinks(Links)                  \
+    PRTL_SPLAY_LINKS _SplayLinks;                       \
+    _SplayLinks = (PRTL_SPLAY_LINKS)(Links);            \
+    _SplayLinks->Parent = _SplayLinks;                  \
+    _SplayLinks->LeftChild = NULL;                      \
+    _SplayLinks->RightChild = NULL;
+
+#define RtlInsertAsLeftChild(ParentLinks,ChildLinks)    \
+    PRTL_SPLAY_LINKS _SplayParent;                      \
+    PRTL_SPLAY_LINKS _SplayChild;                       \
+    _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks);     \
+    _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks);       \
+    _SplayParent->LeftChild = _SplayChild;              \
+    _SplayChild->Parent = _SplayParent;
+
+#define RtlInsertAsRightChild(ParentLinks,ChildLinks)   \
+    PRTL_SPLAY_LINKS _SplayParent;                      \
+    PRTL_SPLAY_LINKS _SplayChild;                       \
+    _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks);     \
+    _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks);       \
+    _SplayParent->RightChild = _SplayChild;             \
+    _SplayChild->Parent = _SplayParent;
 
 /* PROTOTYPES ****************************************************************/
 
+/*
+ * Splay Tree Functions
+ */
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlSplay(PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlDelete(PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlDeleteNoSplay(
+    PRTL_SPLAY_LINKS Links,
+    PRTL_SPLAY_LINKS *Root
+);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlSubtreeSuccessor(PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlSubtreePredecessor(PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlRealSuccessor(PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlRealPredecessor(PRTL_SPLAY_LINKS Links);
+
 /*
  * Error and Exception Functions
  */
@@ -35,6 +123,11 @@ RtlAssert(
     PCHAR Message
 );
 
+NTSYSAPI
+VOID
+NTAPI
+RtlCaptureContext(OUT PCONTEXT ContextRecord);
+
 NTSYSAPI
 PVOID
 NTAPI
@@ -45,6 +138,14 @@ PVOID
 NTAPI
 RtlDecodePointer(IN PVOID Pointer);
 
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlDispatchException(
+    IN PEXCEPTION_RECORD ExceptionRecord,
+    IN PCONTEXT Context
+);
+
 NTSYSAPI
 ULONG
 NTAPI
@@ -69,10 +170,10 @@ NTSYSAPI
 VOID
 NTAPI
 RtlUnwind(
-    PEXCEPTION_REGISTRATION RegistrationFrame,
-    PVOID ReturnAddress,
-    PEXCEPTION_RECORD ExceptionRecord,
-    ULONG EaxValue
+    IN PVOID TargetFrame OPTIONAL,
+    IN PVOID TargetIp OPTIONAL,
+    IN PEXCEPTION_RECORD ExceptionRecord OPTIONAL,
+    IN PVOID ReturnValue
 );
 
 /*
@@ -524,6 +625,14 @@ RtlSelfRelativeToAbsoluteSD(
     IN PULONG PrimaryGroupSize
 );
 
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSelfRelativeToAbsoluteSD2(
+    IN OUT PSECURITY_DESCRIPTOR SelfRelativeSD,
+    OUT PULONG BufferSize
+);
+
 NTSYSAPI
 NTSTATUS
 NTAPI
@@ -764,12 +873,18 @@ RtlUlonglongByteSwap(IN ULONGLONG Source);
 /*
  * Unicode->Ansi String Functions
  */
-/* FIXME: Use macro */
-#undef RtlUnicodeStringToAnsiSize
 NTSYSAPI
 ULONG
 NTAPI
-RtlUnicodeStringToAnsiSize(IN PUNICODE_STRING UnicodeString);
+RtlxUnicodeStringToAnsiSize(IN PCUNICODE_STRING UnicodeString);
+
+#ifdef NTOS_MODE_USER
+#define RtlUnicodeStringToAnsiSize(STRING) (                  \
+    NLS_MB_CODE_PAGE_TAG ?                                    \
+    RtlxUnicodeStringToAnsiSize(STRING) :                     \
+    ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
+)
+#endif
 
 NTSYSAPI
 NTSTATUS
@@ -821,12 +936,21 @@ RtlUpcaseUnicodeToOemN(
     ULONG UnicodeSize
 );
 
-/* FIXME: Use macro */
-#undef RtlUnicodeStringToOemSize
 NTSYSAPI
 ULONG
 NTAPI
-RtlUnicodeStringToOemSize(IN PUNICODE_STRING UnicodeString);
+RtlxUnicodeStringToOemSize(IN PCUNICODE_STRING UnicodeString);
+
+#ifdef NTOS_MODE_USER
+#define RtlUnicodeStringToOemSize(STRING) (                   \
+    NLS_MB_OEM_CODE_PAGE_TAG ?                                \
+    RtlxUnicodeStringToOemSize(STRING) :                      \
+    ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
+)
+#define RtlUnicodeStringToCountedOemSize(STRING) (                    \
+    (ULONG)(RtlUnicodeStringToOemSize(STRING) - sizeof(ANSI_NULL)) \
+)
+#endif
 
 NTSYSAPI
 NTSTATUS
@@ -873,15 +997,24 @@ RtlUnicodeToMultiByteSize(
     ULONG UnicodeSize
 );
 
-/*
- * OEM to Unicode Functions
- */
-/* FIXME: Use macro */
-#undef RtlOemStringToUnicodeSize
 NTSYSAPI
 ULONG
 NTAPI
-RtlOemStringToUnicodeSize(POEM_STRING AnsiString);
+RtlxOemStringToUnicodeSize(IN PCOEM_STRING OemString);
+
+/*
+ * OEM to Unicode Functions
+ */
+#ifdef NTOS_MODE_USER
+#define RtlOemStringToUnicodeSize(STRING) (                  \
+    NLS_MB_OEM_CODE_PAGE_TAG ?                               \
+    RtlxOemStringToUnicodeSize(STRING) :                     \
+    ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)   \
+)
+#define RtlOemStringToCountedUnicodeSize(STRING) (                    \
+    (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
+)
+#endif
 
 NTSYSAPI
 NTSTATUS
@@ -906,6 +1039,14 @@ RtlOemToUnicodeN(
 /*
  * Ansi->Unicode String Functions
  */
+NTSYSAPI
+ULONG
+NTAPI
+RtlxAnsiStringToUnicodeSize(
+    PCANSI_STRING AnsiString
+);
+
+NTSYSAPI
 NTSTATUS
 NTAPI
 RtlAnsiStringToUnicodeString(
@@ -914,14 +1055,13 @@ RtlAnsiStringToUnicodeString(
     BOOLEAN AllocateDestinationString
 );
 
-/* FIXME: Use macro */
-#undef RtlAnsiStringToUnicodeSize
-NTSYSAPI
-ULONG
-NTAPI
-RtlAnsiStringToUnicodeSize(
-    PANSI_STRING AnsiString
-);
+#ifdef NTOS_MODE_USER
+#define RtlAnsiStringToUnicodeSize(STRING) (                 \
+    NLS_MB_CODE_PAGE_TAG ?                                   \
+    RtlxAnsiStringToUnicodeSize(STRING) :                    \
+    ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)   \
+)
+#endif
 
 NTSYSAPI
 BOOLEAN
@@ -975,6 +1115,7 @@ RtlCreateUnicodeString(
     PCWSTR SourceString
 );
 
+#ifdef NTOS_MODE_USER
 NTSYSAPI
 NTSTATUS
 NTAPI
@@ -983,6 +1124,7 @@ RtlDowncaseUnicodeString(
     IN PCUNICODE_STRING UniSource,
     IN BOOLEAN AllocateDestinationString
 );
+#endif
 
 NTSYSAPI
 NTSTATUS
@@ -1265,6 +1407,15 @@ VOID
 NTAPI
 RtlReleasePebLock(VOID);
 
+NTSYSAPI
+VOID
+NTAPI
+RtlSetProcessIsCritical(
+    IN BOOLEAN NewValue,
+    OUT PBOOLEAN OldValue OPTIONAL,
+    IN BOOLEAN IsWinlogon
+);
+
 /*
  * Environment/Path Functions
  */
@@ -1869,45 +2020,81 @@ RtlResetRtlTranslations(IN PNLSTABLEINFO NlsTable);
 /*
  * Misc conversion functions
  */
-/* FIXME: Use inline */
-NTSYSAPI
+#if defined(NTOS_MODE_USER) && !defined(NO_RTL_INLINES)
+static __inline
 LARGE_INTEGER
-NTAPI
-RtlConvertLongToLargeInteger(IN LONG SignedInteger);
+NTAPI_INLINE
+RtlConvertLongToLargeInteger(LONG SignedInteger)
+{
+    LARGE_INTEGER Result;
 
-/* FIXME: Use inline */
-NTSYSAPI
+    Result.QuadPart = SignedInteger;
+    return Result;
+}
+
+static __inline
 LARGE_INTEGER
-NTAPI
+NTAPI_INLINE
 RtlEnlargedIntegerMultiply(
     LONG Multiplicand,
-    LONG Multiplier
-);
+    LONG Multiplier)
+{
+    LARGE_INTEGER Product;
 
-/* FIXME: Use inline */
-NTSYSAPI
+    Product.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
+    return Product;
+}
+
+static __inline
 ULONG
-NTAPI
+NTAPI_INLINE
 RtlEnlargedUnsignedDivide(
-    ULARGE_INTEGER Dividend,
-    ULONG Divisor,
-    PULONG Remainder
-);
+    IN ULARGE_INTEGER Dividend,
+    IN ULONG Divisor,
+    IN PULONG Remainder OPTIONAL)
+{
+    ULONG Quotient;
 
-/* FIXME: Use inline */
-NTSYSAPI
+    Quotient = (ULONG)(Dividend.QuadPart / Divisor);
+    if (Remainder) {
+        *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
+    }
+
+    return Quotient;
+}
+
+static __inline
 LARGE_INTEGER
-NTAPI
+NTAPI_INLINE
 RtlEnlargedUnsignedMultiply(
     ULONG Multiplicand,
-    ULONG Multiplier
-);
+    ULONG Multiplier)
+{
+    LARGE_INTEGER Product;
+
+    Product.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
+    return Product;
+}
+#endif
 
 NTSYSAPI
 ULONG
 NTAPI
 RtlUniform(PULONG Seed);
 
+/*
+ * Network Functions
+ */
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIpv4StringToAddressW(
+    IN LPWSTR IpString,
+    IN ULONG Base,
+    OUT PULONG PtrToIpAddr,
+    OUT PULONG IpAddr
+);
+
 /*
  * Time Functions
  */
@@ -1962,4 +2149,33 @@ NTSTATUS
 NTAPI
 RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
 
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlGetNtProductType(OUT PNT_PRODUCT_TYPE ProductType);
+
+static __inline struct _PEB* NtCurrentPeb (void) 
+{
+    struct _PEB * pPeb;
+
+#if defined(__GNUC__)
+
+    __asm__ __volatile__
+    (
+      "movl %%fs:0x30, %0\n" /* fs:30h == Teb->Peb */
+      : "=r" (pPeb) /* can't have two memory operands */
+      : /* no inputs */
+    );
+
+#elif defined(_MSC_VER)
+
+    __asm mov eax, fs:0x30;
+    __asm mov pPeb, eax
+
+#else
+#error Unknown compiler for inline assembler
+#endif
+
+    return pPeb;
+}
 #endif