/* 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 RtlIsRightChild(Links) \
+ (RtlRightChild(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
*/
PCHAR Message
);
+NTSYSAPI
+VOID
+NTAPI
+RtlCaptureContext(OUT PCONTEXT ContextRecord);
+
NTSYSAPI
PVOID
NTAPI
NTAPI
RtlDecodePointer(IN PVOID Pointer);
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlDispatchException(
+ IN PEXCEPTION_RECORD ExceptionRecord,
+ IN PCONTEXT Context
+);
+
NTSYSAPI
ULONG
NTAPI
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
);
/*
IN PULONG PrimaryGroupSize
);
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSelfRelativeToAbsoluteSD2(
+ IN OUT PSECURITY_DESCRIPTOR SelfRelativeSD,
+ OUT PULONG BufferSize
+);
+
NTSYSAPI
NTSTATUS
NTAPI
/*
* 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
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
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
/*
* Ansi->Unicode String Functions
*/
+NTSYSAPI
+ULONG
+NTAPI
+RtlxAnsiStringToUnicodeSize(
+ PCANSI_STRING AnsiString
+);
+
NTSYSAPI
NTSTATUS
NTAPI
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
ULONG *Flags
);
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlPrefixString(
+ PCANSI_STRING String1,
+ PCANSI_STRING String2,
+ BOOLEAN CaseInsensitive
+);
+
NTSYSAPI
BOOLEAN
NTAPI
IN OUT PULONG NameLength OPTIONAL
);
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlPinAtomInAtomTable(
+ IN PRTL_ATOM_TABLE AtomTable,
+ IN RTL_ATOM Atom
+);
+
NTSYSAPI
NTSTATUS
NTAPI
NTAPI
RtlReleasePebLock(VOID);
+NTSYSAPI
+VOID
+NTAPI
+RtlSetProcessIsCritical(
+ IN BOOLEAN NewValue,
+ OUT PBOOLEAN OldValue OPTIONAL,
+ IN BOOLEAN IsWinlogon
+);
+
/*
* Environment/Path Functions
*/
* Debug Info Functions
*/
NTSYSAPI
-PDEBUG_BUFFER
+PRTL_DEBUG_BUFFER
NTAPI
RtlCreateQueryDebugBuffer(
IN ULONG Size,
NTSYSAPI
NTSTATUS
NTAPI
-RtlDestroyQueryDebugBuffer(IN PDEBUG_BUFFER DebugBuffer);
+RtlDestroyQueryDebugBuffer(IN PRTL_DEBUG_BUFFER DebugBuffer);
NTSYSAPI
NTSTATUS
RtlQueryProcessDebugInformation(
IN ULONG ProcessId,
IN ULONG DebugInfoClassMask,
- IN OUT PDEBUG_BUFFER DebugBuffer
+ IN OUT PRTL_DEBUG_BUFFER DebugBuffer
);
/*
NTAPI
RtlUniform(PULONG Seed);
+/*
+ * Network Functions
+ */
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIpv4StringToAddressW(
+ IN LPWSTR IpString,
+ IN ULONG Base,
+ OUT PULONG PtrToIpAddr,
+ OUT PULONG IpAddr
+);
+
/*
* Time Functions
*/
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