1 /*
2 * PROJECT: ReactOS Cicero
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Cicero base
5 * COPYRIGHT: Copyright 2023-2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8 #pragma once
9
cicMemAlloc(SIZE_T size)10 static inline LPVOID cicMemAlloc(SIZE_T size)
11 {
12 return LocalAlloc(0, size);
13 }
14
cicMemAllocClear(SIZE_T size)15 static inline LPVOID cicMemAllocClear(SIZE_T size)
16 {
17 return LocalAlloc(LMEM_ZEROINIT, size);
18 }
19
cicMemReAlloc(LPVOID ptr,SIZE_T newSize)20 static inline LPVOID cicMemReAlloc(LPVOID ptr, SIZE_T newSize)
21 {
22 if (!ptr)
23 return LocalAlloc(LMEM_ZEROINIT, newSize);
24 return LocalReAlloc(ptr, newSize, LMEM_ZEROINIT);
25 }
26
cicMemFree(LPVOID ptr)27 static inline void cicMemFree(LPVOID ptr)
28 {
29 if (ptr)
30 LocalFree(ptr);
31 }
32
33 struct CicNoThrow { };
34 #define cicNoThrow CicNoThrow{}
35
36 void* operator new(size_t size, const CicNoThrow&) noexcept;
37 void* operator new[](size_t size, const CicNoThrow&) noexcept;
38 void operator delete(void* ptr) noexcept;
39 void operator delete[](void* ptr) noexcept;
40 void operator delete(void* ptr, size_t size) noexcept;
41 void operator delete[](void* ptr, size_t size) noexcept;
42
43 /* The flags of cicGetOSInfo() */
44 #define CIC_OSINFO_NT 0x01
45 #define CIC_OSINFO_2KPLUS 0x02
46 #define CIC_OSINFO_95 0x04
47 #define CIC_OSINFO_98PLUS 0x08
48 #define CIC_OSINFO_CJK 0x10
49 #define CIC_OSINFO_IMM 0x20
50 #define CIC_OSINFO_DBCS 0x40
51 #define CIC_OSINFO_XPPLUS 0x80
52
53 EXTERN_C
54 void cicGetOSInfo(LPUINT puACP, LPDWORD pdwOSInfo);
55
56 #ifdef __cplusplus
57 struct CicSystemModulePath
58 {
59 TCHAR m_szPath[MAX_PATH + 2];
60 SIZE_T m_cchPath;
61
CicSystemModulePathCicSystemModulePath62 CicSystemModulePath()
63 {
64 m_szPath[0] = UNICODE_NULL;
65 m_cchPath = 0;
66 }
67
68 BOOL Init(_In_ LPCTSTR pszFileName, _In_ BOOL bSysWinDir);
69 };
70 #endif
71
72 // Get an instance handle that is already loaded
73 EXTERN_C
74 HINSTANCE
75 cicGetSystemModuleHandle(
76 _In_ LPCTSTR pszFileName,
77 _In_ BOOL bSysWinDir);
78
79 // Load a system library
80 EXTERN_C
81 HINSTANCE
82 cicLoadSystemLibrary(
83 _In_ LPCTSTR pszFileName,
84 _In_ BOOL bSysWinDir);
85
86 #ifdef __cplusplus
87 template <typename T_FN>
88 static inline BOOL
cicGetFN(HINSTANCE & hinstDLL,T_FN & fn,LPCTSTR pszDllName,LPCSTR pszFuncName)89 cicGetFN(HINSTANCE& hinstDLL, T_FN& fn, LPCTSTR pszDllName, LPCSTR pszFuncName)
90 {
91 if (fn)
92 return TRUE;
93 if (!hinstDLL)
94 hinstDLL = cicLoadSystemLibrary(pszDllName, FALSE);
95 if (!hinstDLL)
96 return FALSE;
97 fn = reinterpret_cast<T_FN>(GetProcAddress(hinstDLL, pszFuncName));
98 return !!fn;
99 }
100 #endif
101
102 /* Is the current process on WoW64? */
103 EXTERN_C
104 BOOL cicIsWow64(VOID);
105
106 EXTERN_C
107 HRESULT
108 cicRealCoCreateInstance(
109 _In_ REFCLSID rclsid,
110 _In_ LPUNKNOWN pUnkOuter,
111 _In_ DWORD dwClsContext,
112 _In_ REFIID iid,
113 _Out_ LPVOID *ppv);
114
115 EXTERN_C
116 HRESULT
117 cicCoCreateInstance(
118 _In_ REFCLSID rclsid,
119 _In_ LPUNKNOWN pUnkOuter,
120 _In_ DWORD dwClsContext,
121 _In_ REFIID iid,
122 _Out_ LPVOID *ppv);
123
124 // ole32!CoCreateInstance
125 typedef HRESULT (WINAPI *FN_CoCreateInstance)(
126 REFCLSID rclsid,
127 LPUNKNOWN pUnkOuter,
128 DWORD dwClsContext,
129 REFIID iid,
130 LPVOID *ppv);
131
132 EXTERN_C BOOL TFInitLib(FN_CoCreateInstance fnCoCreateInstance = NULL);
133 EXTERN_C VOID TFUninitLib(VOID);
134