Reactos
1/*
2 * PROJECT: ReactOS msctfime.ime
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Thread-local storage
5 * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "msctfime.h"
9
10WINE_DEFAULT_DEBUG_CHANNEL(msctfime);
11
12DWORD TLS::s_dwTlsIndex = (DWORD)-1;
13
14/// @implemented
15BOOL TLS::Initialize()
16{
17 s_dwTlsIndex = ::TlsAlloc();
18 return s_dwTlsIndex != (DWORD)-1;
19}
20
21/// @implemented
22VOID TLS::Uninitialize()
23{
24 if (s_dwTlsIndex != (DWORD)-1)
25 {
26 ::TlsFree(s_dwTlsIndex);
27 s_dwTlsIndex = (DWORD)-1;
28 }
29}
30
31/// @implemented
32TLS* TLS::GetTLS()
33{
34 if (s_dwTlsIndex == (DWORD)-1)
35 return NULL;
36
37 return InternalAllocateTLS();
38}
39
40/// @implemented
41TLS* TLS::PeekTLS()
42{
43 return (TLS*)::TlsGetValue(TLS::s_dwTlsIndex);
44}
45
46/// @implemented
47TLS* TLS::InternalAllocateTLS()
48{
49 TLS *pTLS = TLS::PeekTLS();
50 if (pTLS)
51 return pTLS;
52
53 if (DllShutdownInProgress())
54 return NULL;
55
56 pTLS = (TLS *)cicMemAllocClear(sizeof(TLS));
57 if (!pTLS)
58 return NULL;
59
60 if (!::TlsSetValue(s_dwTlsIndex, pTLS))
61 {
62 cicMemFree(pTLS);
63 return NULL;
64 }
65
66 pTLS->m_dwFlags1 |= 1;
67 pTLS->m_dwUnknown2 |= 1;
68 return pTLS;
69}
70
71/// @implemented
72BOOL TLS::InternalDestroyTLS()
73{
74 TLS *pTLS = TLS::PeekTLS();
75 if (!pTLS)
76 return FALSE;
77
78 if (pTLS->m_pBridge)
79 pTLS->m_pBridge->Release();
80 if (pTLS->m_pProfile)
81 pTLS->m_pProfile->Release();
82 if (pTLS->m_pThreadMgr)
83 pTLS->m_pThreadMgr->Release();
84
85 cicMemFree(pTLS);
86 ::TlsSetValue(s_dwTlsIndex, NULL);
87 return TRUE;
88}
89
90/// @implemented
91BOOL TLS::NonEACompositionEnabled()
92{
93 if (!m_NonEAComposition)
94 {
95 DWORD dwValue = 1;
96
97 CicRegKey regKey;
98 LSTATUS error = regKey.Open(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\CTF\\CUAS"));
99 if (error == ERROR_SUCCESS)
100 {
101 error = regKey.QueryDword(TEXT("NonEAComposition"), &dwValue);
102 if (error != ERROR_SUCCESS)
103 dwValue = 1;
104 }
105
106 m_NonEAComposition = dwValue;
107 }
108
109 return (m_NonEAComposition == 2);
110}