[RTL/NDK]
[reactos.git] / reactos / include / ndk / rtlfuncs.h
index f0a1839..2542845 100644 (file)
@@ -172,6 +172,17 @@ RtlInitEmptyUnicodeString(OUT PUNICODE_STRING UnicodeString,
     UnicodeString->Buffer = Buffer;
 }
 
+FORCEINLINE
+VOID
+RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
+                       IN PSTR Buffer,
+                       IN USHORT BufferSize)
+{
+    AnsiString->Length = 0;
+    AnsiString->MaximumLength = BufferSize;
+    AnsiString->Buffer = Buffer;
+}
+
 //
 // LUID Macros
 //
@@ -197,12 +208,12 @@ RtlConvertUlongToLuid(ULONG Ulong)
 
 #define ASSERT( exp ) \
     ((void)((!(exp)) ? \
-        (RtlAssert( #exp, __FILE__, __LINE__, NULL ),FALSE) : \
+        (RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ),FALSE) : \
         TRUE))
 
 #define ASSERTMSG( msg, exp ) \
     ((void)((!(exp)) ? \
-        (RtlAssert( #exp, __FILE__, __LINE__, msg ),FALSE) : \
+        (RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ),FALSE) : \
         TRUE))
 
 #else
@@ -233,6 +244,107 @@ RtlConvertUlongToLuid(ULONG Ulong)
 //
 // RTL Splay Tree Functions
 //
+#ifndef RTL_USE_AVL_TABLES
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitializeGenericTable(
+    OUT PRTL_GENERIC_TABLE Table,
+    IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine,
+    IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine,
+    IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine,
+    IN PVOID TableContext OPTIONAL
+);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlInsertElementGenericTable(
+    IN PRTL_GENERIC_TABLE Table,
+    IN PVOID Buffer,
+    IN CLONG BufferSize,
+    OUT PBOOLEAN NewElement OPTIONAL
+);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlInsertElementGenericTableFull(
+    IN PRTL_GENERIC_TABLE Table,
+    IN PVOID Buffer,
+    IN CLONG BufferSize,
+    OUT PBOOLEAN NewElement OPTIONAL,
+    IN PVOID NodeOrParent,
+    IN TABLE_SEARCH_RESULT SearchResult
+);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlDeleteElementGenericTable(
+    IN PRTL_GENERIC_TABLE Table,
+    IN PVOID Buffer
+);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlLookupElementGenericTable(
+    IN PRTL_GENERIC_TABLE Table,
+    IN PVOID Buffer
+);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlLookupElementGenericTableFull(
+    IN PRTL_GENERIC_TABLE Table,
+    IN PVOID Buffer,
+    OUT PVOID *NodeOrParent,
+    OUT TABLE_SEARCH_RESULT *SearchResult
+);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlEnumerateGenericTable(
+    IN PRTL_GENERIC_TABLE Table,
+    IN BOOLEAN Restart
+);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlEnumerateGenericTableWithoutSplaying(
+    IN PRTL_GENERIC_TABLE Table,
+    IN OUT PVOID *RestartKey
+);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlGetElementGenericTable(
+    IN PRTL_GENERIC_TABLE Table,
+    IN ULONG I
+);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlNumberGenericTableElements(
+    IN PRTL_GENERIC_TABLE Table
+);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlIsGenericTableEmpty(
+    IN PRTL_GENERIC_TABLE Table
+);
+
+#endif /* !RTL_USE_AVL_TABLES */
+
 NTSYSAPI
 PRTL_SPLAY_LINKS
 NTAPI
@@ -243,7 +355,8 @@ RtlSplay(
 NTSYSAPI
 PRTL_SPLAY_LINKS
 NTAPI
-RtlDelete(IN PRTL_SPLAY_LINKS Links
+RtlDelete(
+    IN PRTL_SPLAY_LINKS Links
 );
 
 NTSYSAPI
@@ -328,7 +441,7 @@ RtlRealPredecessor(
         _SplayParent->RightChild = _SplayChild;         \
         _SplayChild->Parent = _SplayParent;             \
     }
-    
+
 //
 // RTL AVL Tree Functions
 //
@@ -450,8 +563,24 @@ NTAPI
 RtlIsGenericTableEmptyAvl(
     IN PRTL_AVL_TABLE Table
 );
-  
-#endif
+
+#ifdef RTL_USE_AVL_TABLES
+
+#define RtlInitializeGenericTable               RtlInitializeGenericTableAvl
+#define RtlInsertElementGenericTable            RtlInsertElementGenericTableAvl
+#define RtlInsertElementGenericTableFull        RtlInsertElementGenericTableFullAvl
+#define RtlDeleteElementGenericTable            RtlDeleteElementGenericTableAvl
+#define RtlLookupElementGenericTable            RtlLookupElementGenericTableAvl
+#define RtlLookupElementGenericTableFull        RtlLookupElementGenericTableFullAvl
+#define RtlEnumerateGenericTable                RtlEnumerateGenericTableAvl
+#define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl
+#define RtlGetElementGenericTable               RtlGetElementGenericTableAvl
+#define RtlNumberGenericTableElements           RtlNumberGenericTableElementsAvl
+#define RtlIsGenericTableEmpty                  RtlIsGenericTableEmptyAvl
+
+#endif /* RTL_USE_AVL_TABLES */
+
+#endif /* NTOS_MODE_USER */
 
 //
 // Error and Exception Functions
@@ -475,10 +604,10 @@ RtlAssert(
 );
 
 NTSYSAPI
-PVOID
+VOID
 NTAPI
 RtlSetUnhandledExceptionFilter(
-    IN PVOID TopLevelExceptionFilter
+    IN PRTLP_UNHANDLED_EXCEPTION_FILTER TopLevelExceptionFilter
 );
 
 NTSYSAPI
@@ -707,6 +836,17 @@ RtlProtectHeap(
     IN BOOLEAN Protect
 );
 
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlQueryHeapInformation (
+    IN PVOID HeapHandle,
+    IN HEAP_INFORMATION_CLASS HeapInformationClass,
+    OUT PVOID HeapInformation OPTIONAL,
+    IN SIZE_T HeapInformationLength OPTIONAL,
+    OUT PSIZE_T ReturnLength OPTIONAL
+    );
+
 NTSYSAPI
 PWSTR
 NTAPI
@@ -728,6 +868,16 @@ RtlReAllocateHeap(
     SIZE_T Size
 );
 
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSetHeapInformation (
+    IN PVOID HeapHandle,
+    IN HEAP_INFORMATION_CLASS HeapInformationClass,
+    IN PVOID HeapInformation OPTIONAL,
+    IN SIZE_T HeapInformationLength OPTIONAL
+    );
+
 NTSYSAPI
 BOOLEAN
 NTAPI
@@ -735,6 +885,27 @@ RtlLockHeap(
     IN HANDLE Heap
 );
 
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlMultipleAllocateHeap (
+    IN PVOID HeapHandle,
+    IN ULONG Flags,
+    IN SIZE_T Size,
+    IN ULONG Count,
+    OUT PVOID * Array
+    );
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlMultipleFreeHeap (
+    IN PVOID HeapHandle,
+    IN ULONG Flags,
+    IN ULONG Count,
+    OUT PVOID * Array
+    );
+
 NTSYSAPI
 NTSTATUS
 NTAPI
@@ -766,7 +937,8 @@ RtlSetUserFlagsHeap(
     IN PVOID HeapHandle,
     IN ULONG Flags,
     IN PVOID BaseAddress,
-    IN ULONG UserFlags
+    IN ULONG UserFlagsReset,
+    IN ULONG UserFlagsSet
 );
 
 NTSYSAPI
@@ -946,7 +1118,7 @@ RtlAddMandatoryAce(
     IN ULONG Revision,
     IN ULONG Flags,
     IN ULONG MandatoryFlags,
-    IN ULONG AceType,
+    IN UCHAR AceType,
     IN PSID LabelSid);
 
 NTSYSAPI
@@ -1646,7 +1818,7 @@ RtlUnicodeToMultiByteN(
     PCHAR MbString,
     ULONG MbSize,
     PULONG ResultSize,
-    PWCHAR UnicodeString,
+    PCWCH UnicodeString,
     ULONG UnicodeSize
 );
 
@@ -1821,10 +1993,33 @@ VOID
 NTAPI
 RtlFillMemoryUlong(
     IN PVOID Destination,
-    IN ULONG Length,
+    IN SIZE_T Length,
     IN ULONG Fill
 );
 
+NTSYSAPI
+VOID
+NTAPI
+RtlFillMemoryUlonglong(
+    OUT PVOID Destination,
+    IN SIZE_T Length,
+    IN ULONGLONG Pattern
+);
+
+
+NTSYSAPI
+SIZE_T
+NTAPI
+RtlCompareMemoryUlong(
+    IN PVOID Source,
+    IN SIZE_T Length,
+    IN ULONG Pattern
+);
+
+#define RtlCopyBytes RtlCopyMemory
+#define RtlFillBytes RtlFillMemory
+#define RtlZeroBytes RtlZeroMemory
+
 #endif
 
 NTSYSAPI
@@ -1841,7 +2036,7 @@ NTSTATUS
 NTAPI
 RtlFindCharInUnicodeString(
     IN ULONG Flags,
-    IN PUNICODE_STRING SearchString,
+    IN PCUNICODE_STRING SearchString,
     IN PCUNICODE_STRING MatchString,
     OUT PUSHORT Position
 );
@@ -2136,6 +2331,27 @@ RtlInitializeContext(
     IN PINITIAL_TEB InitialTeb
 );
 
+#ifdef _M_AMD64
+typedef struct _WOW64_CONTEXT *PWOW64_CONTEXT;
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlWow64GetThreadContext(
+    IN HANDLE ThreadHandle,
+    IN OUT PWOW64_CONTEXT ThreadContext
+);
+
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlWow64SetThreadContext(
+    IN HANDLE ThreadHandle,
+    IN PWOW64_CONTEXT ThreadContext
+);
+#endif
+
 NTSYSAPI
 BOOLEAN
 NTAPI
@@ -2173,6 +2389,15 @@ RtlSetProcessIsCritical(
     IN BOOLEAN NeedBreaks
 );
 
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSetThreadIsCritical(
+    IN BOOLEAN NewValue,
+    OUT PBOOLEAN OldValue OPTIONAL,
+    IN BOOLEAN NeedBreaks
+);
+
 NTSYSAPI
 ULONG
 NTAPI
@@ -2185,6 +2410,14 @@ RtlGetCurrentProcessorNumber(
 //
 // Thread Pool Functions
 //
+//
+NTSTATUS
+NTAPI
+RtlSetThreadPoolStartFunc(
+    IN PRTL_START_POOL_THREAD StartPoolThread,
+    IN PRTL_EXIT_POOL_THREAD ExitPoolThread
+);
+
 NTSYSAPI
 NTSTATUS
 NTAPI
@@ -2280,7 +2513,7 @@ RtlDetermineDosPathNameType_U(
 );
 
 NTSYSAPI
-ULONG
+RTL_PATH_TYPE
 NTAPI
 RtlDetermineDosPathNameType_Ustr(
     IN PCUNICODE_STRING Path
@@ -2298,6 +2531,20 @@ RtlDosSearchPath_U(
     OUT PWSTR *PartName
 );
 
+ULONG
+NTAPI
+RtlDosSearchPath_Ustr(
+    IN ULONG Flags,
+    IN PUNICODE_STRING PathString,
+    IN PUNICODE_STRING FileNameString,
+    IN PUNICODE_STRING ExtensionString,
+    IN PUNICODE_STRING CallerBuffer,
+    IN OUT PUNICODE_STRING DynamicString OPTIONAL,
+    OUT PUNICODE_STRING* FullNameOut OPTIONAL,
+    OUT PSIZE_T FilePartSize OPTIONAL,
+    OUT PSIZE_T LengthNeeded OPTIONAL
+);
+
 NTSYSAPI
 BOOLEAN
 NTAPI
@@ -2305,7 +2552,17 @@ RtlDosPathNameToNtPathName_U(
     IN PCWSTR DosPathName,
     OUT PUNICODE_STRING NtPathName,
     OUT PCWSTR *NtFileNamePart,
-    OUT CURDIR *DirectoryInfo
+    OUT PRTL_RELATIVE_NAME_U DirectoryInfo
+);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlDosPathNameToRelativeNtPathName_U(
+    IN PCWSTR DosName,
+    OUT PUNICODE_STRING NtName,
+    OUT PCWSTR *PartName,
+    OUT PRTL_RELATIVE_NAME_U RelativeName
 );
 
 NTSYSAPI
@@ -2336,30 +2593,44 @@ RtlGetFullPathName_U(
     OUT PWSTR *ShortName
 );
 
+#if (NTDDI_VERSION >= NTDDI_WIN7)
 NTSYSAPI
-ULONG
+NTSTATUS
 NTAPI
-RtlGetFullPathName_Ustr(
+RtlGetFullPathName_UEx(
+    IN PWSTR FileName,
+    IN ULONG BufferLength,
+    OUT PWSTR Buffer,
+    OUT OPTIONAL PWSTR *FilePart,
+    OUT OPTIONAL RTL_PATH_TYPE *InputPathType
+    );
+#endif
+
+NTSTATUS
+NTAPI
+RtlGetFullPathName_UstrEx(
     IN PUNICODE_STRING FileName,
-    IN ULONG Size,
-    IN PWSTR Buffer,
-    OUT PWSTR *ShortName,
-    OUT PBOOLEAN InvalidName,
-    OUT RTL_PATH_TYPE *PathType
+    IN PUNICODE_STRING StaticString,
+    IN PUNICODE_STRING DynamicString,
+    IN PUNICODE_STRING *StringUsed,
+    IN PSIZE_T FilePartSize,
+    OUT PBOOLEAN NameInvalid,
+    OUT RTL_PATH_TYPE* PathType,
+    OUT PSIZE_T LengthNeeded
 );
 
 NTSYSAPI
 ULONG
 NTAPI
 RtlIsDosDeviceName_U(
-    IN PWSTR Name
+    IN PCWSTR Name
 );
 
 NTSYSAPI
 ULONG
 NTAPI
 RtlIsDosDeviceName_Ustr(
-    IN PUNICODE_STRING Name
+    IN PCUNICODE_STRING Name
 );
 
 
@@ -2376,9 +2647,15 @@ NTSYSAPI
 NTSTATUS
 NTAPI
 RtlQueryEnvironmentVariable_U(
-    PWSTR Environment,
-    PUNICODE_STRING Name,
-    PUNICODE_STRING Value
+    IN OPTIONAL PWSTR Environment,
+    IN PUNICODE_STRING Name,
+    OUT PUNICODE_STRING Value
+);
+
+VOID
+NTAPI
+RtlReleaseRelativeName(
+    IN PRTL_RELATIVE_NAME_U RelativeName
 );
 
 NTSYSAPI
@@ -2757,7 +3034,7 @@ NTAPI
 RtlInitializeRangeList(
     IN OUT PRTL_RANGE_LIST RangeList
 );
-    
+
 NTSYSAPI
 VOID
 NTAPI
@@ -3009,12 +3286,21 @@ LdrRelocateImageWithBias(
 // Activation Context Functions
 //
 #ifdef NTOS_MODE_USER
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlActivateActivationContextEx(
+    IN ULONG Flags,
+    IN PTEB Teb,
+    IN PVOID Context,
+    IN PULONG_PTR Cookie
+);
 
 NTSYSAPI
 NTSTATUS
 NTAPI
 RtlActivateActivationContext(
-    IN ULONG Unknown,
+    IN ULONG Flags,
     IN HANDLE Handle,
     OUT PULONG_PTR Cookie
 );
@@ -3026,10 +3312,9 @@ RtlAddRefActivationContext(
     PVOID Context
 );
 
-
 NTSYSAPI
-NTSTATUS
-NTAPI
+PRTL_ACTIVATION_CONTEXT_STACK_FRAME
+FASTCALL
 RtlActivateActivationContextUnsafeFast(
     IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame,
     IN PVOID Context
@@ -3078,8 +3363,8 @@ NTAPI
 RtlFreeThreadActivationContextStack(void);
 
 NTSYSAPI
-NTSTATUS
-NTAPI
+PRTL_ACTIVATION_CONTEXT_STACK_FRAME
+FASTCALL
 RtlDeactivateActivationContextUnsafeFast(
     IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame
 );
@@ -3088,15 +3373,15 @@ NTSYSAPI
 NTSTATUS
 NTAPI
 RtlDosApplyFileIsolationRedirection_Ustr(
-    IN BOOLEAN Unknown,
+    IN ULONG Flags,
     IN PUNICODE_STRING OriginalName,
     IN PUNICODE_STRING Extension,
-    IN OUT PUNICODE_STRING RedirectedName,
-    IN OUT PUNICODE_STRING RedirectedName2,
-    IN OUT PUNICODE_STRING *OriginalName2,
-    IN PVOID Unknown1,
-    IN PVOID Unknown2,
-    IN PVOID Unknown3
+    IN OUT PUNICODE_STRING StaticString,
+    IN OUT PUNICODE_STRING DynamicString,
+    IN OUT PUNICODE_STRING *NewName,
+    IN PULONG NewFlags,
+    IN PSIZE_T FileNameSize,
+    IN PSIZE_T RequiredLength
 );
 
 NTSYSAPI
@@ -3130,6 +3415,23 @@ RtlZombifyActivationContext(
     PVOID Context
 );
 
+//
+// WOW64 Functions
+//
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlWow64EnableFsRedirection(
+    IN BOOLEAN Wow64FsEnableRedirection
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlWow64EnableFsRedirectionEx(
+    IN PVOID Wow64FsEnableRedirection,
+    OUT PVOID *OldFsRedirectionLevel
+);
 
 #endif
 
@@ -3159,16 +3461,6 @@ RtlFormatCurrentUserKeyPath(
     IN OUT PUNICODE_STRING KeyPath
 );
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlpNtOpenKey(
-    OUT HANDLE KeyHandle,
-    IN ACCESS_MASK DesiredAccess,
-    IN POBJECT_ATTRIBUTES ObjectAttributes,
-    IN ULONG Unused
-);
-
 NTSYSAPI
 NTSTATUS
 NTAPI
@@ -3200,6 +3492,68 @@ RtlWriteRegistryValue(
     ULONG ValueLength
 );
 
+#ifdef NTOS_MODE_USER
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlpNtCreateKey(
+    OUT HANDLE KeyHandle,
+    IN ACCESS_MASK DesiredAccess,
+    IN POBJECT_ATTRIBUTES ObjectAttributes,
+    IN ULONG TitleIndex,
+    IN PUNICODE_STRING Class,
+    OUT PULONG Disposition
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlpNtEnumerateSubKey(
+    IN HANDLE KeyHandle,
+    OUT PUNICODE_STRING SubKeyName,
+    IN ULONG Index,
+    IN ULONG Unused
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlpNtMakeTemporaryKey(
+    IN HANDLE KeyHandle
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlpNtOpenKey(
+    OUT HANDLE KeyHandle,
+    IN ACCESS_MASK DesiredAccess,
+    IN POBJECT_ATTRIBUTES ObjectAttributes,
+    IN ULONG Unused
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlpNtQueryValueKey(
+    IN HANDLE KeyHandle,
+    OUT PULONG Type OPTIONAL,
+    OUT PVOID Data OPTIONAL,
+    IN OUT PULONG DataLength OPTIONAL,
+    IN ULONG Unused
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlpNtSetValueKey(
+    IN HANDLE KeyHandle,
+    IN ULONG Type,
+    IN PVOID Data,
+    IN ULONG DataLength
+);
+#endif
+
 //
 // NLS Functions
 //
@@ -3298,8 +3652,38 @@ RtlEnlargedUnsignedMultiply(
     Product.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
     return Product;
 }
+
+#if defined(_AMD64_) || defined(_IA64_)
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlExtendedLargeIntegerDivide(
+  IN LARGE_INTEGER Dividend,
+  IN ULONG Divisor,
+  OUT PULONG Remainder OPTIONAL)
+{
+  LARGE_INTEGER ret;
+  ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
+  if (Remainder)
+    *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
+  return ret;
+}
+
+#else
+NTSYSAPI
+LARGE_INTEGER
+NTAPI
+RtlExtendedLargeIntegerDivide(
+    IN LARGE_INTEGER Dividend,
+    IN ULONG Divisor,
+    OUT PULONG Remainder OPTIONAL
+);
+
+#endif /* defined(_AMD64_) || defined(_IA64_) */
+
 #endif
 
+
 NTSYSAPI
 ULONG
 NTAPI
@@ -3484,12 +3868,12 @@ NTSYSAPI
 NTSTATUS
 NTAPI
 RtlGetSetBootStatusData(
-    HANDLE FileHandle,
-    BOOLEAN WriteMode,
-    DWORD DataClass,
-    PVOID Buffer,
-    ULONG BufferSize,
-    DWORD DataClass2
+    IN HANDLE FileHandle,
+    IN BOOLEAN WriteMode,
+    IN RTL_BSD_ITEM_TYPE DataClass,
+    IN PVOID Buffer,
+    IN ULONG BufferSize,
+    OUT PULONG ReturnLength OPTIONAL
 );
 
 NTSYSAPI
@@ -3507,6 +3891,24 @@ RtlUnlockBootStatusData(
 );
 #endif
 
+#ifdef NTOS_MODE_USER
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGUIDFromString(
+  IN PUNICODE_STRING GuidString,
+  OUT GUID *Guid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlComputeImportTableHash(
+    IN HANDLE hFile,
+    OUT PCHAR Hash,
+    IN ULONG ImportTableHashRevision
+);
+#endif
+
 #ifdef __cplusplus
 }
 #endif