[PSDK]
[reactos.git] / include / psdk / ntdef.h
index b7b202b..4d6ed25 100644 (file)
-#ifndef _NTDEF_H
-#define _NTDEF_H
-#if __GNUC__ >=3
-#pragma GCC system_header
-#endif
+#ifndef _NTDEF_
+#define _NTDEF_
 
-#include <stdarg.h>
-#include <windef.h>
+/* Dependencies */
+#include <ctype.h>
+#include <basetsd.h>
 #include <excpt.h>
+#include <sdkddkver.h>
+
+// FIXME: Shouldn't be included!
+#include <stdarg.h>
+#include <string.h>
+
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
+/* Pseudo Modifiers for Input Parameters */
+
+#ifndef IN
+#define IN
+#endif
+
+#ifndef OUT
+#define OUT
+#endif
+
+#ifndef OPTIONAL
+#define OPTIONAL
+#endif
+
+#ifndef NOTHING
+#define NOTHING
+#endif
+
+#ifndef CRITICAL
+#define CRITICAL
+#endif
+
+#ifndef FAR
+#define FAR
+#endif
+
+
+/* Defines the "size" of an any-size array */
+#ifndef ANYSIZE_ARRAY
+#define ANYSIZE_ARRAY 1
+#endif
+
+/* Constant modifier */
+#ifndef CONST
+#define CONST const
+#endif
 
-/* TODO: some compilers support this */
+/* TRUE/FALSE */
+#define FALSE   0
+#define TRUE    1
+
+/* NULL/NULL64 */
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL    0
+#define NULL64  0
+#else
+#define NULL    ((void *)0)
+#define NULL64  ((void * POINTER_64)0)
+#endif
+#endif /* NULL */
+
+
+//
+// FIXME
+// We should use the -fms-extensions compiler flag for gcc,
+// and clean up the mess.
+//
+#ifndef __ANONYMOUS_DEFINED
+#define __ANONYMOUS_DEFINED
+
+#ifndef NONAMELESSUNION
+#ifdef __GNUC__
+#define _ANONYMOUS_UNION __GNU_EXTENSION
+#define _ANONYMOUS_STRUCT __GNU_EXTENSION
+#elif defined(__WATCOMC__) || defined(_MSC_VER)
+#define _ANONYMOUS_UNION
+#define _ANONYMOUS_STRUCT
+#endif /* __GNUC__/__WATCOMC__ */
+#endif /* NONAMELESSUNION */
+
+#ifndef _ANONYMOUS_UNION
+#define _ANONYMOUS_UNION
+#define _UNION_NAME(x) x
+#define DUMMYUNIONNAME  u
+#define DUMMYUNIONNAME2 u2
+#define DUMMYUNIONNAME3 u3
+#define DUMMYUNIONNAME4 u4
+#define DUMMYUNIONNAME5 u5
+#define DUMMYUNIONNAME6 u6
+#define DUMMYUNIONNAME7 u7
+#define DUMMYUNIONNAME8 u8
+#else
+#define _UNION_NAME(x)
+#define DUMMYUNIONNAME
+#define DUMMYUNIONNAME2
+#define DUMMYUNIONNAME3
+#define DUMMYUNIONNAME4
+#define DUMMYUNIONNAME5
+#define DUMMYUNIONNAME6
+#define DUMMYUNIONNAME7
+#define DUMMYUNIONNAME8
+#endif
+
+#ifndef _ANONYMOUS_STRUCT
+#define _ANONYMOUS_STRUCT
+#define _STRUCT_NAME(x) x
+#define DUMMYSTRUCTNAME s
+#define DUMMYSTRUCTNAME2 s2
+#define DUMMYSTRUCTNAME3 s3
+#define DUMMYSTRUCTNAME4 s4
+#define DUMMYSTRUCTNAME5 s5
+#else
+#define _STRUCT_NAME(x)
+#define DUMMYSTRUCTNAME
+#define DUMMYSTRUCTNAME2
+#define DUMMYSTRUCTNAME3
+#define DUMMYSTRUCTNAME4
+#define DUMMYSTRUCTNAME5
+#endif
+
+#endif /* __ANONYMOUS_DEFINED */
+
+// FIXME
+#undef UNALIGNED
+#define UNALIGNED
 #define RESTRICTED_POINTER
 
+
+#define ARGUMENT_PRESENT(ArgumentPointer) \
+  ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
+
+/* Returns the base address of a structure from a structure member */
+#ifndef CONTAINING_RECORD
+#define CONTAINING_RECORD(address, type, field) \
+  ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
+#endif
+
+/* Returns the byte offset of the specified structure's member */
+#ifndef __GNUC__
+#define FIELD_OFFSET(Type, Field) ((LONG)(LONG_PTR)&(((Type*) 0)->Field))
+#else
+#define FIELD_OFFSET(Type, Field) __builtin_offsetof(Type, Field)
+#endif
+
+/* Returns the type's alignment */
+#if defined(_MSC_VER) && (_MSC_VER >= 1300)
+#define TYPE_ALIGNMENT(t) __alignof(t)
+#else
+#define TYPE_ALIGNMENT(t) FIELD_OFFSET( struct { char x; t test; }, test )
+#endif
+
+/* Calling Conventions */
+#if defined(_M_IX86)
+#define FASTCALL __fastcall
+#else
+#define FASTCALL
+#endif
+
 #define NTAPI __stdcall
+
+
+/* Import and Export Specifiers */
+
+/* Done the same way as in windef.h for now */
+#define DECLSPEC_IMPORT __declspec(dllimport)
+#define DECLSPEC_NORETURN __declspec(noreturn)
+
+#ifndef DECLSPEC_ADDRSAFE
+#if (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64))
+#define DECLSPEC_ADDRSAFE  __declspec(address_safe)
+#else
+#define DECLSPEC_ADDRSAFE
+#endif
+#endif
+
+#if !defined(_NTSYSTEM_)
+#define NTSYSAPI     DECLSPEC_IMPORT
+#define NTSYSCALLAPI DECLSPEC_IMPORT
+#else
+#define NTSYSAPI
+#if defined(_NTDLLBUILD_)
+#define NTSYSCALLAPI
+#else
+#define NTSYSCALLAPI DECLSPEC_ADDRSAFE
+#endif
+#endif
+
+/* Inlines */
+#ifndef FORCEINLINE
+#if (_MSC_VER >= 1200)
+#define FORCEINLINE __forceinline
+#elif (_MSC_VER)
+#define FORCEINLINE __inline
+#else
+#define FORCEINLINE static __inline__ __attribute__((always_inline))
+#endif
+#endif
+
+#ifndef DECLSPEC_NOINLINE
+#if (_MSC_VER >= 1300)
+#define DECLSPEC_NOINLINE  __declspec(noinline)
+#elif defined(__GNUC__)
+#define DECLSPEC_NOINLINE __attribute__((noinline))
+#else
+#define DECLSPEC_NOINLINE
+#endif
+#endif
+
 #if !defined(_M_CEE_PURE)
 #define NTAPI_INLINE    NTAPI
 #else
 #define NTAPI_INLINE
 #endif
 
-#ifndef DECLSPEC_NOINLINE
-#define DECLSPEC_NOINLINE  __declspec(noinline)
+/* Use to specify structure alignment */
+#ifndef DECLSPEC_ALIGN
+#if defined(_MSC_VER) && (_MSC_VER >= 1300) && !defined(MIDL_PASS)
+#define DECLSPEC_ALIGN(x) __declspec(align(x))
+#elif defined(__GNUC__)
+#define DECLSPEC_ALIGN(x) __attribute__((aligned(x)))
+#else
+#define DECLSPEC_ALIGN(x)
+#endif
 #endif
 
-#define OBJ_INHERIT             0x00000002
-#define OBJ_PERMANENT           0x00000010
-#define OBJ_EXCLUSIVE           0x00000020
-#define OBJ_CASE_INSENSITIVE    0x00000040
-#define OBJ_OPENIF              0x00000080
-#define OBJ_OPENLINK            0x00000100
-#define OBJ_KERNEL_HANDLE       0x00000200
-#define OBJ_FORCE_ACCESS_CHECK  0x00000400
-#define OBJ_VALID_ATTRIBUTES    0x000007F2
-#define InitializeObjectAttributes(p,n,a,r,s) { \
-  (p)->Length = sizeof(OBJECT_ATTRIBUTES); \
-  (p)->RootDirectory = (r); \
-  (p)->Attributes = (a); \
-  (p)->ObjectName = (n); \
-  (p)->SecurityDescriptor = (s); \
-  (p)->SecurityQualityOfService = NULL; \
-}
-#ifndef NT_SUCCESS
-#define NT_SUCCESS(x) ((x)>=0)
+/* Use to silence unused variable warnings when it is intentional */
+#define UNREFERENCED_PARAMETER(P) {(P)=(P);}
+#define UNREFERENCED_LOCAL_VARIABLE(L) {(L)=(L);}
+#define DBG_UNREFERENCED_PARAMETER(P)
+#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
+
+/* min/max helper macros */
+#ifndef NOMINMAX
+
+#ifndef min
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+#ifndef max
+#define max(a,b) (((a) > (b)) ? (a) : (b))
 #endif
-#define NT_WARNING(x) ((ULONG)(x)>>30==2)
-#define NT_ERROR(x) ((ULONG)(x)>>30==3)
-#if !defined(_NTSECAPI_H) && !defined(_SUBAUTH_H)
-typedef LONG NTSTATUS, *PNTSTATUS;
+
+#endif /* NOMINMAX */
+
+/* Tell windef.h that we have defined some basic types */
+#define BASETYPES
+
+/* Void Pointers */
+typedef void *PVOID;
+//typedef void * POINTER_64 PVOID64;
+typedef PVOID PVOID64; // FIXME!
+
+/* Handle Type */
+#ifdef STRICT
+typedef void *HANDLE;
+#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n
+#else
+typedef PVOID HANDLE;
+#define DECLARE_HANDLE(n) typedef HANDLE n
+#endif
+typedef HANDLE *PHANDLE;
+
+/* Upper-Case Versions of Some Standard C Types */
+#ifndef VOID
+#define VOID void
+typedef char CHAR;
+typedef short SHORT;
+typedef long LONG;
+#if !defined(MIDL_PASS)
+typedef int INT;
+#endif
+#endif
+typedef double DOUBLE;
+
+/* Unsigned Types */
+typedef unsigned char UCHAR, *PUCHAR;
+typedef unsigned short USHORT, *PUSHORT;
+typedef unsigned long ULONG, *PULONG;
+typedef CONST UCHAR *PCUCHAR;
+typedef CONST USHORT *PCUSHORT;
+typedef CONST ULONG *PCULONG;
+typedef UCHAR FCHAR;
+typedef USHORT FSHORT;
+typedef ULONG FLONG;
+typedef UCHAR BOOLEAN, *PBOOLEAN;
+typedef ULONG LOGICAL;
+typedef ULONG *PLOGICAL;
+
+/* Signed Types */
+typedef SHORT *PSHORT;
+typedef LONG *PLONG;
+typedef LONG NTSTATUS;
+typedef NTSTATUS *PNTSTATUS;
+typedef signed char SCHAR;
+typedef SCHAR *PSCHAR;
+
+#ifndef _HRESULT_DEFINED
+#define _HRESULT_DEFINED
+typedef LONG HRESULT;
+#endif
+
+/* 64-bit types */
+__GNU_EXTENSION typedef __int64 LONGLONG, *PLONGLONG;
+__GNU_EXTENSION typedef unsigned __int64 ULONGLONG, *PULONGLONG;
+typedef ULONGLONG DWORDLONG, *PDWORDLONG;
+
+/* Update Sequence Number */
+typedef LONGLONG USN;
+
+/* ANSI (Multi-byte Character) types */
+typedef CHAR *PCHAR, *LPCH, *PCH;
+typedef CONST CHAR *LPCCH, *PCCH;
+typedef CHAR *NPSTR, *LPSTR, *PSTR;
+typedef PSTR *PZPSTR;
+typedef CONST PSTR *PCZPSTR;
+typedef CONST CHAR *LPCSTR, *PCSTR;
+typedef PCSTR *PZPCSTR;
+
+/* Pointer to an Asciiz string */
+typedef CHAR *PSZ;
+typedef CONST char *PCSZ;
+
+/* UNICODE (Wide Character) types */
+typedef wchar_t WCHAR;
+typedef WCHAR *PWCHAR, *LPWCH, *PWCH;
+typedef CONST WCHAR *LPCWCH, *PCWCH;
+typedef WCHAR *NWPSTR, *LPWSTR, *PWSTR;
+typedef PWSTR *PZPWSTR;
+typedef CONST PWSTR *PCZPWSTR;
+typedef WCHAR UNALIGNED *LPUWSTR, *PUWSTR;
+typedef CONST WCHAR *LPCWSTR, *PCWSTR;
+typedef PCWSTR *PZPCWSTR;
+typedef CONST WCHAR UNALIGNED *LPCUWSTR, *PCUWSTR;
+
+/* Cardinal Data Types */
+typedef char CCHAR, *PCCHAR;
+typedef short CSHORT, *PCSHORT;
+typedef ULONG CLONG, *PCLONG;
+
+/* NLS basics (Locale and Language Ids) */
+typedef ULONG LCID;
+typedef PULONG PLCID;
+typedef USHORT LANGID;
+
+/* Used to store a non-float 8 byte aligned structure */
+typedef struct _QUAD
+{
+    _ANONYMOUS_UNION union
+    {
+        __GNU_EXTENSION __int64 UseThisFieldToCopy;
+        double DoNotUseThisField;
+    } DUMMYUNIONNAME;
+} QUAD, *PQUAD, UQUAD, *PUQUAD;
+
+/* Large Integer Unions */
+#if defined(MIDL_PASS)
+typedef struct _LARGE_INTEGER {
+#else
+typedef union _LARGE_INTEGER {
+    _ANONYMOUS_STRUCT struct
+    {
+        ULONG LowPart;
+        LONG HighPart;
+    } DUMMYSTRUCTNAME;
+    struct
+    {
+        ULONG LowPart;
+        LONG HighPart;
+    } u;
+#endif /* MIDL_PASS */
+    LONGLONG QuadPart;
+} LARGE_INTEGER, *PLARGE_INTEGER;
+
+#if defined(MIDL_PASS)
+typedef struct _ULARGE_INTEGER {
+#else
+typedef union _ULARGE_INTEGER {
+    _ANONYMOUS_STRUCT struct
+    {
+        ULONG LowPart;
+        ULONG HighPart;
+    } DUMMYSTRUCTNAME;
+    struct
+    {
+        ULONG LowPart;
+        ULONG HighPart;
+    } u;
+#endif /* MIDL_PASS */
+    ULONGLONG QuadPart;
+} ULARGE_INTEGER, *PULARGE_INTEGER;
+
+/* Physical Addresses are always treated as 64-bit wide */
+typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;
+
+/* Locally Unique Identifier */
+typedef struct _LUID {
+    ULONG LowPart;
+    LONG HighPart;
+} LUID, *PLUID;
+
+/* Native API Return Value Macros */
+#define NT_SUCCESS(Status)              (((NTSTATUS)(Status)) >= 0)
+#define NT_INFORMATION(Status)          ((((ULONG)(Status)) >> 30) == 1)
+#define NT_WARNING(Status)              ((((ULONG)(Status)) >> 30) == 2)
+#define NT_ERROR(Status)                ((((ULONG)(Status)) >> 30) == 3)
+
+/* String Types */
 typedef struct _UNICODE_STRING {
   USHORT Length;
   USHORT MaximumLength;
   PWSTR  Buffer;
 } UNICODE_STRING, *PUNICODE_STRING;
 typedef const UNICODE_STRING* PCUNICODE_STRING;
-typedef struct _STRING {
-  USHORT Length;
-  USHORT MaximumLength;
-  PCHAR  Buffer;
-} STRING, *PSTRING;
+#define UNICODE_NULL ((WCHAR)0)
+
 typedef struct _CSTRING {
   USHORT Length;
   USHORT MaximumLength;
   CONST CHAR *Buffer;
 } CSTRING, *PCSTRING;
-#endif
+#define ANSI_NULL ((CHAR)0)
+
+typedef struct _STRING {
+  USHORT Length;
+  USHORT MaximumLength;
+  PCHAR  Buffer;
+} STRING, *PSTRING;
+
 typedef STRING ANSI_STRING;
 typedef PSTRING PANSI_STRING;
 typedef STRING OEM_STRING;
@@ -70,20 +446,41 @@ typedef PSTRING POEM_STRING;
 typedef CONST STRING* PCOEM_STRING;
 typedef STRING CANSI_STRING;
 typedef PSTRING PCANSI_STRING;
-typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;
-typedef CONST CHAR *LPCCH, *PCCH;
-typedef signed char SCHAR;
-typedef SCHAR *PSCHAR;
-typedef enum _SECTION_INHERIT {
-  ViewShare = 1,
-  ViewUnmap = 2
-} SECTION_INHERIT;
-typedef enum _NT_PRODUCT_TYPE {
-       NtProductWinNt = 1,
-       NtProductLanManNt,
-       NtProductServer
-} NT_PRODUCT_TYPE, *PNT_PRODUCT_TYPE;
-#if !defined(_NTSECAPI_H)
+
+typedef struct _STRING32 {
+    USHORT   Length;
+    USHORT   MaximumLength;
+    ULONG  Buffer;
+} STRING32, *PSTRING32, 
+  UNICODE_STRING32, *PUNICODE_STRING32, 
+  ANSI_STRING32, *PANSI_STRING32;
+
+typedef struct _STRING64 {
+    USHORT   Length;
+    USHORT   MaximumLength;
+    ULONGLONG  Buffer;
+} STRING64, *PSTRING64,
+  UNICODE_STRING64, *PUNICODE_STRING64, 
+  ANSI_STRING64, *PANSI_STRING64;
+
+/* LangID and NLS */
+#define MAKELANGID(p, s)       ((((USHORT)(s)) << 10) | (USHORT)(p))
+#define PRIMARYLANGID(lgid)    ((USHORT)(lgid) & 0x3ff)
+#define SUBLANGID(lgid)        ((USHORT)(lgid) >> 10)
+
+#define NLS_VALID_LOCALE_MASK  0x000fffff
+
+#define MAKELCID(lgid, srtid)  ((ULONG)((((ULONG)((USHORT)(srtid))) << 16) |  \
+                                         ((ULONG)((USHORT)(lgid)))))
+#define MAKESORTLCID(lgid, srtid, ver)                                            \
+                               ((ULONG)((MAKELCID(lgid, srtid)) |             \
+                                    (((ULONG)((USHORT)(ver))) << 20)))
+#define LANGIDFROMLCID(lcid)   ((USHORT)(lcid))
+#define SORTIDFROMLCID(lcid)   ((USHORT)((((ULONG)(lcid)) >> 16) & 0xf))
+#define SORTVERSIONFROMLCID(lcid)  ((USHORT)((((ULONG)(lcid)) >> 20) & 0xf))
+
+
+/* Object Attributes */
 typedef struct _OBJECT_ATTRIBUTES {
   ULONG Length;
   HANDLE RootDirectory;
@@ -92,34 +489,111 @@ typedef struct _OBJECT_ATTRIBUTES {
   PVOID SecurityDescriptor;
   PVOID SecurityQualityOfService;
 } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
-#endif
+typedef CONST OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES;
+
+/* Values for the Attributes member */
+#define OBJ_INHERIT             0x00000002
+#define OBJ_PERMANENT           0x00000010
+#define OBJ_EXCLUSIVE           0x00000020
+#define OBJ_CASE_INSENSITIVE    0x00000040
+#define OBJ_OPENIF              0x00000080
+#define OBJ_OPENLINK            0x00000100
+#define OBJ_KERNEL_HANDLE       0x00000200
+#define OBJ_FORCE_ACCESS_CHECK  0x00000400
+#define OBJ_VALID_ATTRIBUTES    0x000007F2
+
+/* Helper Macro */
+#define InitializeObjectAttributes(p,n,a,r,s) { \
+  (p)->Length = sizeof(OBJECT_ATTRIBUTES); \
+  (p)->RootDirectory = (r); \
+  (p)->Attributes = (a); \
+  (p)->ObjectName = (n); \
+  (p)->SecurityDescriptor = (s); \
+  (p)->SecurityQualityOfService = NULL; \
+}
+
+/* Product Types */
+typedef enum _NT_PRODUCT_TYPE {
+       NtProductWinNt = 1,
+       NtProductLanManNt,
+       NtProductServer
+} NT_PRODUCT_TYPE, *PNT_PRODUCT_TYPE;
+
+typedef enum _EVENT_TYPE {
+  NotificationEvent,
+  SynchronizationEvent
+} EVENT_TYPE;
+
+typedef enum _TIMER_TYPE {
+    NotificationTimer,
+    SynchronizationTimer
+} TIMER_TYPE;
+
+typedef enum _WAIT_TYPE {
+  WaitAll,
+  WaitAny
+} WAIT_TYPE;
+
+/* Doubly Linked Lists */
+typedef struct _LIST_ENTRY {
+   struct _LIST_ENTRY *Flink;
+   struct _LIST_ENTRY *Blink;
+} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;
 
 typedef struct LIST_ENTRY32
 {
     ULONG Flink;
     ULONG Blink;
-} LIST_ENTRY32;
-typedef LIST_ENTRY32 *PLIST_ENTRY32;
+} LIST_ENTRY32, *PLIST_ENTRY32;
 
 typedef struct LIST_ENTRY64
 {
     ULONGLONG Flink;
     ULONGLONG Blink;
-} LIST_ENTRY64;
-typedef LIST_ENTRY64 *PLIST_ENTRY64;
+} LIST_ENTRY64, *PLIST_ENTRY64;
 
-#define NOTHING
+/* Singly Linked Lists */
+typedef struct _SINGLE_LIST_ENTRY {
+    struct _SINGLE_LIST_ENTRY *Next;
+} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
+
+typedef struct _PROCESSOR_NUMBER {
+  USHORT Group;
+  UCHAR Number;
+  UCHAR Reserved;
+} PROCESSOR_NUMBER, *PPROCESSOR_NUMBER;
+
+struct _CONTEXT;
+struct _EXCEPTION_RECORD;
+
+typedef EXCEPTION_DISPOSITION
+(NTAPI *PEXCEPTION_ROUTINE)(
+  IN struct _EXCEPTION_RECORD *ExceptionRecord,
+  IN PVOID EstablisherFrame,
+  IN OUT struct _CONTEXT *ContextRecord,
+  IN OUT PVOID DispatcherContext);
+
+typedef struct _GROUP_AFFINITY {
+  KAFFINITY Mask;
+  USHORT Group;
+  USHORT Reserved[3];
+} GROUP_AFFINITY, *PGROUP_AFFINITY;
+
+/* Helper Macros */
 #define RTL_CONSTANT_STRING(s) { sizeof(s)-sizeof((s)[0]), sizeof(s), s }
-#define TYPE_ALIGNMENT( t ) FIELD_OFFSET( struct { char x; t test; }, test )
+
 #define RTL_FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
+
 #define RTL_NUMBER_OF_V1(A) (sizeof(A)/sizeof((A)[0]))
 #define RTL_NUMBER_OF_V2(A) RTL_NUMBER_OF_V1(A)
-#endif
 #ifdef ENABLE_RTL_NUMBER_OF_V2
 #define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V2(A)
 #else
 #define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V1(A)
+#endif
 #define ARRAYSIZE(A)    RTL_NUMBER_OF_V2(A)
+
+/* Type Limits */
 #define MINCHAR   0x80
 #define MAXCHAR   0x7f
 #define MINSHORT  0x8000
@@ -131,10 +605,145 @@ typedef LIST_ENTRY64 *PLIST_ENTRY64;
 #define MAXULONG  0xffffffff
 #define MAXLONGLONG (0x7fffffffffffffffLL)
 
-#define __C_ASSERT_JOIN(X, Y) __C_ASSERT_DO_JOIN(X, Y)
-#define __C_ASSERT_DO_JOIN(X, Y) __C_ASSERT_DO_JOIN2(X, Y)
-#define __C_ASSERT_DO_JOIN2(X, Y) X##Y
+/* Multiplication and Shift Operations */
+#define Int32x32To64(a,b) ((LONGLONG)(a)*(LONGLONG)(b))
+#define UInt32x32To64(a,b) ((DWORDLONG)(a)*(DWORDLONG)(b))
+#define Int64ShllMod32(a,b) ((DWORDLONG)(a)<<(b))
+#define Int64ShraMod32(a,b) ((LONGLONG)(a)>>(b))
+#define Int64ShrlMod32(a,b) ((DWORDLONG)(a)>>(b))
+
+/* C_ASSERT Definition */
+#define C_ASSERT(expr) extern char (*c_assert(void)) [(expr) ? 1 : -1]
+
+/*  Primary language IDs. */
+#define LANG_NEUTRAL                     0x00
+#define LANG_INVARIANT                   0x7f
 
-#define C_ASSERT(e) typedef char __C_ASSERT_JOIN(__C_ASSERT__, __LINE__)[(e) ? 1 : -1]
+#define LANG_AFRIKAANS                   0x36
+#define LANG_ALBANIAN                    0x1c
+#define LANG_ALSATIAN                    0x84
+#define LANG_AMHARIC                     0x5e
+#define LANG_ARABIC                      0x01
+#define LANG_ARMENIAN                    0x2b
+#define LANG_ASSAMESE                    0x4d
+#define LANG_AZERI                       0x2c
+#define LANG_BASHKIR                     0x6d
+#define LANG_BASQUE                      0x2d
+#define LANG_BELARUSIAN                  0x23
+#define LANG_BENGALI                     0x45
+#define LANG_BRETON                      0x7e
+#define LANG_BOSNIAN                     0x1a
+#define LANG_BOSNIAN_NEUTRAL           0x781a
+#define LANG_BULGARIAN                   0x02
+#define LANG_CATALAN                     0x03
+#define LANG_CHINESE                     0x04
+#define LANG_CHINESE_SIMPLIFIED          0x04
+#define LANG_CHINESE_TRADITIONAL       0x7c04
+#define LANG_CORSICAN                    0x83
+#define LANG_CROATIAN                    0x1a
+#define LANG_CZECH                       0x05
+#define LANG_DANISH                      0x06
+#define LANG_DARI                        0x8c
+#define LANG_DIVEHI                      0x65
+#define LANG_DUTCH                       0x13
+#define LANG_ENGLISH                     0x09
+#define LANG_ESTONIAN                    0x25
+#define LANG_FAEROESE                    0x38
+#define LANG_FARSI                       0x29
+#define LANG_FILIPINO                    0x64
+#define LANG_FINNISH                     0x0b
+#define LANG_FRENCH                      0x0c
+#define LANG_FRISIAN                     0x62
+#define LANG_GALICIAN                    0x56
+#define LANG_GEORGIAN                    0x37
+#define LANG_GERMAN                      0x07
+#define LANG_GREEK                       0x08
+#define LANG_GREENLANDIC                 0x6f
+#define LANG_GUJARATI                    0x47
+#define LANG_HAUSA                       0x68
+#define LANG_HEBREW                      0x0d
+#define LANG_HINDI                       0x39
+#define LANG_HUNGARIAN                   0x0e
+#define LANG_ICELANDIC                   0x0f
+#define LANG_IGBO                        0x70
+#define LANG_INDONESIAN                  0x21
+#define LANG_INUKTITUT                   0x5d
+#define LANG_IRISH                       0x3c
+#define LANG_ITALIAN                     0x10
+#define LANG_JAPANESE                    0x11
+#define LANG_KANNADA                     0x4b
+#define LANG_KASHMIRI                    0x60
+#define LANG_KAZAK                       0x3f
+#define LANG_KHMER                       0x53
+#define LANG_KICHE                       0x86
+#define LANG_KINYARWANDA                 0x87
+#define LANG_KONKANI                     0x57
+#define LANG_KOREAN                      0x12
+#define LANG_KYRGYZ                      0x40
+#define LANG_LAO                         0x54
+#define LANG_LATVIAN                     0x26
+#define LANG_LITHUANIAN                  0x27
+#define LANG_LOWER_SORBIAN               0x2e
+#define LANG_LUXEMBOURGISH               0x6e
+#define LANG_MACEDONIAN                  0x2f
+#define LANG_MALAY                       0x3e
+#define LANG_MALAYALAM                   0x4c
+#define LANG_MALTESE                     0x3a
+#define LANG_MANIPURI                    0x58
+#define LANG_MAORI                       0x81
+#define LANG_MAPUDUNGUN                  0x7a
+#define LANG_MARATHI                     0x4e
+#define LANG_MOHAWK                      0x7c
+#define LANG_MONGOLIAN                   0x50
+#define LANG_NEPALI                      0x61
+#define LANG_NORWEGIAN                   0x14
+#define LANG_OCCITAN                     0x82
+#define LANG_ORIYA                       0x48
+#define LANG_PASHTO                      0x63
+#define LANG_PERSIAN                     0x29
+#define LANG_POLISH                      0x15
+#define LANG_PORTUGUESE                  0x16
+#define LANG_PUNJABI                     0x46
+#define LANG_QUECHUA                     0x6b
+#define LANG_ROMANIAN                    0x18
+#define LANG_ROMANSH                     0x17
+#define LANG_RUSSIAN                     0x19
+#define LANG_SAMI                        0x3b
+#define LANG_SANSKRIT                    0x4f
+#define LANG_SERBIAN                     0x1a
+#define LANG_SERBIAN_NEUTRAL           0x7c1a
+#define LANG_SINDHI                      0x59
+#define LANG_SINHALESE                   0x5b
+#define LANG_SLOVAK                      0x1b
+#define LANG_SLOVENIAN                   0x24
+#define LANG_SOTHO                       0x6c
+#define LANG_SPANISH                     0x0a
+#define LANG_SWAHILI                     0x41
+#define LANG_SWEDISH                     0x1d
+#define LANG_SYRIAC                      0x5a
+#define LANG_TAJIK                       0x28
+#define LANG_TAMAZIGHT                   0x5f
+#define LANG_TAMIL                       0x49
+#define LANG_TATAR                       0x44
+#define LANG_TELUGU                      0x4a
+#define LANG_THAI                        0x1e
+#define LANG_TIBETAN                     0x51
+#define LANG_TIGRIGNA                    0x73
+#define LANG_TSWANA                      0x32
+#define LANG_TURKISH                     0x1f
+#define LANG_TURKMEN                     0x42
+#define LANG_UIGHUR                      0x80
+#define LANG_UKRAINIAN                   0x22
+#define LANG_UPPER_SORBIAN               0x2e
+#define LANG_URDU                        0x20
+#define LANG_UZBEK                       0x43
+#define LANG_VIETNAMESE                  0x2a
+#define LANG_WELSH                       0x52
+#define LANG_WOLOF                       0x88
+#define LANG_XHOSA                       0x34
+#define LANG_YAKUT                       0x85
+#define LANG_YI                          0x78
+#define LANG_YORUBA                      0x6a
+#define LANG_ZULU                        0x35
 
-#endif /* _NTDEF_H */
+#endif /* _NTDEF_ */