ReactOS 0.4.16-dev-1308-gbf734eb
precomp.h File Reference
#include <stdio.h>
#include <stdlib.h>
#include <windef.h>
#include <winbase.h>
#include <wingdi.h>
#include <winuser.h>
#include <winnls.h>
#include <winreg.h>
#include <winnls32.h>
#include <winver.h>
#include <imm.h>
#include <immdev.h>
#include <imm32_undoc.h>
#include <ndk/umtypes.h>
#include <ndk/pstypes.h>
#include <ndk/rtlfuncs.h>
#include "ntuser.h"
#include "ntwin32.h"
#include <undocuser.h>
#include <strsafe.h>
#include <wine/debug.h>
Include dependency graph for precomp.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define WIN32_NO_STATUS
 
#define NTOS_MODE_USER
 
#define ERR_PRINTF(fmt, ...)
 
#define FAILED_UNEXPECTEDLY(hr)   FAILED(hr)
 
#define IS_NULL_UNEXPECTEDLY(p)   (!(p))
 
#define IS_ZERO_UNEXPECTEDLY(p)   (!(p))
 
#define IS_TRUE_UNEXPECTEDLY(x)   (x)
 
#define IS_ERROR_UNEXPECTEDLY(x)   ((x) != ERROR_SUCCESS)
 
#define IS_CROSS_THREAD_HIMC(hIMC)   IS_TRUE_UNEXPECTEDLY(Imm32IsCrossThreadAccess(hIMC))
 
#define IS_CROSS_PROCESS_HWND(hWnd)   IS_TRUE_UNEXPECTEDLY(Imm32IsCrossProcessAccess(hWnd))
 
#define IMM_INIT_MAGIC   0x19650412
 
#define IMM_INVALID_CANDFORM   ULONG_MAX
 
#define INVALID_HOTKEY_ID   0xFFFFFFFF
 
#define MAX_CANDIDATEFORM   4
 
#define MAX_IMM_FILENAME   80
 
#define LANGID_CHINESE_SIMPLIFIED   MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)
 
#define LANGID_CHINESE_TRADITIONAL   MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL)
 
#define LANGID_JAPANESE   MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT)
 
#define REGKEY_KEYBOARD_LAYOUTS   L"System\\CurrentControlSet\\Control\\Keyboard Layouts"
 
#define ValidateHwndNoErr(hwnd)   ValidateHandleNoErr((hwnd), TYPE_WINDOW)
 
#define ValidateHwnd(hwnd)   ValidateHandle((hwnd), TYPE_WINDOW)
 
#define ImmLocalFree(lpData)   HeapFree(ghImmHeap, 0, (lpData))
 
#define ImeDpi_IsUnicode(pImeDpi)   ((pImeDpi)->ImeInfo.fdwProperty & IME_PROP_UNICODE)
 

Functions

BOOL Imm32GetSystemLibraryPath (LPWSTR pszPath, DWORD cchPath, LPCWSTR pszFileName)
 
VOID LogFontAnsiToWide (const LOGFONTA *plfA, LPLOGFONTW plfW)
 
VOID LogFontWideToAnsi (const LOGFONTW *plfW, LPLOGFONTA plfA)
 
LPVOID FASTCALL ValidateHandleNoErr (HANDLE hObject, UINT uType)
 
LPVOID FASTCALL ValidateHandle (HANDLE hObject, UINT uType)
 
BOOL Imm32CheckImcProcess (PIMC pIMC)
 
LPVOID ImmLocalAlloc (_In_ DWORD dwFlags, _In_ DWORD dwBytes)
 
LPWSTR Imm32WideFromAnsi (UINT uCodePage, LPCSTR pszA)
 
LPSTR Imm32AnsiFromWide (UINT uCodePage, LPCWSTR pszW)
 
LONG IchWideFromAnsi (LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
 
LONG IchAnsiFromWide (LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
 
PIMEDPI Imm32FindOrLoadImeDpi (HKL hKL)
 
LPINPUTCONTEXT Imm32InternalLockIMC (HIMC hIMC, BOOL fSelect)
 
BOOL Imm32ReleaseIME (_In_ HKL hKL)
 
BOOL Imm32IsSystemJapaneseOrKorean (VOID)
 
BOOL Imm32IsCrossThreadAccess (HIMC hIMC)
 
BOOL Imm32IsCrossProcessAccess (HWND hWnd)
 
BOOL Imm32IsImcAnsi (HIMC hIMC)
 
BOOL Imm32LoadImeVerInfo (_Out_ PIMEINFOEX pImeInfoEx)
 
DWORD CandidateListWideToAnsi (const CANDIDATELIST *pWideCL, LPCANDIDATELIST pAnsiCL, DWORD dwBufLen, UINT uCodePage)
 
DWORD CandidateListAnsiToWide (const CANDIDATELIST *pAnsiCL, LPCANDIDATELIST pWideCL, DWORD dwBufLen, UINT uCodePage)
 
BOOL Imm32MakeIMENotify (_In_ HIMC hIMC, _In_ HWND hwnd, _In_ DWORD dwAction, _In_ DWORD dwIndex, _Inout_opt_ DWORD_PTR dwValue, _In_ DWORD dwCommand, _Inout_opt_ DWORD_PTR dwData)
 
DWORD Imm32BuildHimcList (DWORD dwThreadId, HIMC **pphList)
 
PIME_STATE Imm32FetchImeState (LPINPUTCONTEXTDX pIC, HKL hKL)
 
PIME_SUBSTATE Imm32FetchImeSubState (PIME_STATE pState, HKL hKL)
 
BOOL Imm32LoadImeStateSentence (LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
 
BOOL Imm32SaveImeStateSentence (LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
 
DWORD Imm32ReconvertAnsiFromWide (LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
 
DWORD Imm32ReconvertWideFromAnsi (LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
 
HRESULT Imm32StrToUInt (_In_ PCWSTR pszText, _Out_ PDWORD pdwValue, _In_ ULONG nBase)
 
HRESULT Imm32UIntToStr (_In_ DWORD dwValue, _In_ ULONG nBase, _Out_ PWSTR pszBuff, _In_ USHORT cchBuff)
 
PTHREADINFO FASTCALL Imm32CurrentPti (VOID)
 
HRESULT CtfImmTIMCreateInputContext (_In_ HIMC hIMC)
 
HRESULT CtfImmTIMDestroyInputContext (_In_ HIMC hIMC)
 
HRESULT CtfImmCoInitialize (VOID)
 
HRESULT CtfImeCreateThreadMgr (VOID)
 
HRESULT CtfImeDestroyThreadMgr (VOID)
 
HRESULT Imm32ActivateOrDeactivateTIM (_In_ BOOL bCreate)
 
HRESULT CtfImeSetActiveContextAlways (_In_ HIMC hIMC, _In_ BOOL fActive, _In_ HWND hWnd, _In_ HKL hKL)
 
BOOL CtfImeProcessCicHotkey (_In_ HIMC hIMC, _In_ UINT vKey, _In_ LPARAM lParam)
 
LRESULT CtfImmSetLangBand (_In_ HWND hWnd, _In_ BOOL fSet)
 

Variables

HMODULE ghImm32Inst
 
RTL_CRITICAL_SECTION gcsImeDpi
 
PIMEDPI gpImeDpiList
 
PSERVERINFO gpsi
 
SHAREDINFO gSharedInfo
 
HANDLE ghImmHeap
 
DWORD g_aimm_compat_flags
 

Macro Definition Documentation

◆ ERR_PRINTF

#define ERR_PRINTF (   fmt,
  ... 
)
Value:
(__WINE_IS_DEBUG_ON(_ERR, __wine_dbch___default) ? \
(wine_dbg_printf("err:(%s:%d) " fmt, __RELFILE__, __LINE__, ##__VA_ARGS__), TRUE) : TRUE)
#define TRUE
Definition: types.h:120
#define __RELFILE__
Definition: debug.h:11
#define __WINE_IS_DEBUG_ON(dbcl, dbch)
Definition: debug.h:87
const char int wine_dbg_printf(const char *format,...) __WINE_PRINTF_ATTR(1
Definition: dsound.c:943

Definition at line 49 of file precomp.h.

◆ FAILED_UNEXPECTEDLY

#define FAILED_UNEXPECTEDLY (   hr)    FAILED(hr)

Definition at line 65 of file precomp.h.

◆ ImeDpi_IsUnicode

#define ImeDpi_IsUnicode (   pImeDpi)    ((pImeDpi)->ImeInfo.fdwProperty & IME_PROP_UNICODE)

Definition at line 120 of file precomp.h.

◆ IMM_INIT_MAGIC

#define IMM_INIT_MAGIC   0x19650412

Definition at line 75 of file precomp.h.

◆ IMM_INVALID_CANDFORM

#define IMM_INVALID_CANDFORM   ULONG_MAX

Definition at line 76 of file precomp.h.

◆ ImmLocalFree

#define ImmLocalFree (   lpData)    HeapFree(ghImmHeap, 0, (lpData))

Definition at line 105 of file precomp.h.

◆ INVALID_HOTKEY_ID

#define INVALID_HOTKEY_ID   0xFFFFFFFF

Definition at line 77 of file precomp.h.

◆ IS_CROSS_PROCESS_HWND

#define IS_CROSS_PROCESS_HWND (   hWnd)    IS_TRUE_UNEXPECTEDLY(Imm32IsCrossProcessAccess(hWnd))

Definition at line 73 of file precomp.h.

◆ IS_CROSS_THREAD_HIMC

#define IS_CROSS_THREAD_HIMC (   hIMC)    IS_TRUE_UNEXPECTEDLY(Imm32IsCrossThreadAccess(hIMC))

Definition at line 72 of file precomp.h.

◆ IS_ERROR_UNEXPECTEDLY

#define IS_ERROR_UNEXPECTEDLY (   x)    ((x) != ERROR_SUCCESS)

Definition at line 69 of file precomp.h.

◆ IS_NULL_UNEXPECTEDLY

#define IS_NULL_UNEXPECTEDLY (   p)    (!(p))

Definition at line 66 of file precomp.h.

◆ IS_TRUE_UNEXPECTEDLY

#define IS_TRUE_UNEXPECTEDLY (   x)    (x)

Definition at line 68 of file precomp.h.

◆ IS_ZERO_UNEXPECTEDLY

#define IS_ZERO_UNEXPECTEDLY (   p)    (!(p))

Definition at line 67 of file precomp.h.

◆ LANGID_CHINESE_SIMPLIFIED

#define LANGID_CHINESE_SIMPLIFIED   MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)

Definition at line 81 of file precomp.h.

◆ LANGID_CHINESE_TRADITIONAL

#define LANGID_CHINESE_TRADITIONAL   MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL)

Definition at line 82 of file precomp.h.

◆ LANGID_JAPANESE

Definition at line 83 of file precomp.h.

◆ MAX_CANDIDATEFORM

#define MAX_CANDIDATEFORM   4

Definition at line 78 of file precomp.h.

◆ MAX_IMM_FILENAME

#define MAX_IMM_FILENAME   80

Definition at line 79 of file precomp.h.

◆ NTOS_MODE_USER

#define NTOS_MODE_USER

Definition at line 33 of file precomp.h.

◆ REGKEY_KEYBOARD_LAYOUTS

#define REGKEY_KEYBOARD_LAYOUTS   L"System\\CurrentControlSet\\Control\\Keyboard Layouts"

Definition at line 85 of file precomp.h.

◆ ValidateHwnd

#define ValidateHwnd (   hwnd)    ValidateHandle((hwnd), TYPE_WINDOW)

Definition at line 101 of file precomp.h.

◆ ValidateHwndNoErr

#define ValidateHwndNoErr (   hwnd)    ValidateHandleNoErr((hwnd), TYPE_WINDOW)

Definition at line 100 of file precomp.h.

◆ WIN32_NO_STATUS

#define WIN32_NO_STATUS

Definition at line 19 of file precomp.h.

Function Documentation

◆ CandidateListAnsiToWide()

DWORD CandidateListAnsiToWide ( const CANDIDATELIST pAnsiCL,
LPCANDIDATELIST  pWideCL,
DWORD  dwBufLen,
UINT  uCodePage 
)

Definition at line 84 of file candidate.c.

86{
87 DWORD dwSize, dwIndex, cchGot, cbGot, cbLeft;
88 const BYTE *pbAnsi;
89 LPBYTE pbWide;
90 LPDWORD pibOffsets;
91
92 /* calculate total wide size */
93 if (pAnsiCL->dwCount > 0)
94 {
95 dwSize = sizeof(CANDIDATELIST) + ((pAnsiCL->dwCount - 1) * sizeof(DWORD));
96 for (dwIndex = 0; dwIndex < pAnsiCL->dwCount; ++dwIndex)
97 {
98 pbAnsi = (const BYTE *)pAnsiCL + pAnsiCL->dwOffset[dwIndex];
99 cchGot = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, (LPCSTR)pbAnsi, -1, NULL, 0);
100 dwSize += cchGot * sizeof(WCHAR);
101 }
102 }
103 else
104 {
105 dwSize = sizeof(CANDIDATELIST);
106 }
107
109 if (dwBufLen == 0)
110 return dwSize;
111 if (dwBufLen < dwSize)
112 return 0;
113
114 /* store to wide */
115 pWideCL->dwSize = dwBufLen;
116 pWideCL->dwStyle = pAnsiCL->dwStyle;
117 pWideCL->dwCount = pAnsiCL->dwCount;
118 pWideCL->dwSelection = pAnsiCL->dwSelection;
119 pWideCL->dwPageStart = pAnsiCL->dwPageStart;
120 pWideCL->dwPageSize = pAnsiCL->dwPageSize;
121
122 pibOffsets = pWideCL->dwOffset;
123 if (pAnsiCL->dwCount > 0)
124 {
125 pibOffsets[0] = sizeof(CANDIDATELIST) + ((pWideCL->dwCount - 1) * sizeof(DWORD));
126 cbLeft = dwBufLen - pibOffsets[0];
127
128 for (dwIndex = 0; dwIndex < pAnsiCL->dwCount; ++dwIndex)
129 {
130 pbAnsi = (const BYTE *)pAnsiCL + pAnsiCL->dwOffset[dwIndex];
131 pbWide = (LPBYTE)pWideCL + pibOffsets[dwIndex];
132
133 /* convert to wide */
134 cchGot = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, (LPCSTR)pbAnsi, -1,
135 (LPWSTR)pbWide, cbLeft / sizeof(WCHAR));
136 cbGot = cchGot * sizeof(WCHAR);
137 cbLeft -= cbGot;
138
139 if (dwIndex + 1 < pAnsiCL->dwCount)
140 pibOffsets[dwIndex + 1] = pibOffsets[dwIndex] + cbGot;
141 }
142 }
143 else
144 {
145 pibOffsets[0] = sizeof(CANDIDATELIST);
146 }
147
148 return dwBufLen;
149}
#define ROUNDUP4(n)
Definition: candidate.c:12
#define NULL
Definition: types.h:112
#define MultiByteToWideChar
Definition: compat.h:110
unsigned long DWORD
Definition: ntddk_ex.h:95
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
#define DWORD
Definition: nt_native.h:44
DWORD dwSelection
Definition: dimm.idl:95
DWORD dwPageSize
Definition: dimm.idl:97
DWORD dwCount
Definition: dimm.idl:94
DWORD dwStyle
Definition: dimm.idl:93
DWORD dwPageStart
Definition: dimm.idl:96
DWORD dwOffset[1]
Definition: dimm.idl:98
DWORD dwPageSize
Definition: imm.h:62
DWORD dwCount
Definition: imm.h:59
DWORD dwStyle
Definition: imm.h:58
DWORD dwPageStart
Definition: imm.h:61
DWORD dwOffset[ANYSIZE_ARRAY]
Definition: imm.h:63
DWORD dwSelection
Definition: imm.h:60
DWORD dwSize
Definition: imm.h:57
unsigned char * LPBYTE
Definition: typedefs.h:53
uint32_t * LPDWORD
Definition: typedefs.h:59
_In_ HCRYPTHASH _In_ BOOL _In_ DWORD _Inout_ DWORD _In_ DWORD dwBufLen
Definition: wincrypt.h:4246
#define MB_PRECOMPOSED
Definition: winnls.h:299
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
unsigned char BYTE
Definition: xxhash.c:193

Referenced by ImmGetCandidateListAW(), ImmGetCandidateListCountAW(), ImmGetConversionListW(), and ImmGetGuideLineAW().

◆ CandidateListWideToAnsi()

DWORD CandidateListWideToAnsi ( const CANDIDATELIST pWideCL,
LPCANDIDATELIST  pAnsiCL,
DWORD  dwBufLen,
UINT  uCodePage 
)

Definition at line 15 of file candidate.c.

17{
18 BOOL bUsedDefault;
19 DWORD dwSize, dwIndex, cbGot, cbLeft;
20 const BYTE *pbWide;
21 LPBYTE pbAnsi;
22 LPDWORD pibOffsets;
23
24 /* calculate total ansi size */
25 if (pWideCL->dwCount > 0)
26 {
27 dwSize = sizeof(CANDIDATELIST) + ((pWideCL->dwCount - 1) * sizeof(DWORD));
28 for (dwIndex = 0; dwIndex < pWideCL->dwCount; ++dwIndex)
29 {
30 pbWide = (const BYTE *)pWideCL + pWideCL->dwOffset[dwIndex];
31 cbGot = WideCharToMultiByte(uCodePage, 0, (LPCWSTR)pbWide, -1, NULL, 0,
32 NULL, &bUsedDefault);
33 dwSize += cbGot;
34 }
35 }
36 else
37 {
38 dwSize = sizeof(CANDIDATELIST);
39 }
40
42 if (dwBufLen == 0)
43 return dwSize;
44 if (dwBufLen < dwSize)
45 return 0;
46
47 /* store to ansi */
48 pAnsiCL->dwSize = dwBufLen;
49 pAnsiCL->dwStyle = pWideCL->dwStyle;
50 pAnsiCL->dwCount = pWideCL->dwCount;
51 pAnsiCL->dwSelection = pWideCL->dwSelection;
52 pAnsiCL->dwPageStart = pWideCL->dwPageStart;
53 pAnsiCL->dwPageSize = pWideCL->dwPageSize;
54
55 pibOffsets = pAnsiCL->dwOffset;
56 if (pWideCL->dwCount > 0)
57 {
58 pibOffsets[0] = sizeof(CANDIDATELIST) + ((pWideCL->dwCount - 1) * sizeof(DWORD));
59 cbLeft = dwBufLen - pibOffsets[0];
60
61 for (dwIndex = 0; dwIndex < pWideCL->dwCount; ++dwIndex)
62 {
63 pbWide = (const BYTE *)pWideCL + pWideCL->dwOffset[dwIndex];
64 pbAnsi = (LPBYTE)pAnsiCL + pibOffsets[dwIndex];
65
66 /* convert to ansi */
67 cbGot = WideCharToMultiByte(uCodePage, 0, (LPCWSTR)pbWide, -1,
68 (LPSTR)pbAnsi, cbLeft, NULL, &bUsedDefault);
69 cbLeft -= cbGot;
70
71 if (dwIndex < pWideCL->dwCount - 1)
72 pibOffsets[dwIndex + 1] = pibOffsets[dwIndex] + cbGot;
73 }
74 }
75 else
76 {
77 pibOffsets[0] = sizeof(CANDIDATELIST);
78 }
79
80 return dwBufLen;
81}
#define WideCharToMultiByte
Definition: compat.h:111
unsigned int BOOL
Definition: ntddk_ex.h:94
char * LPSTR
Definition: xmlstorage.h:182
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by ImmGetCandidateListAW(), ImmGetCandidateListCountAW(), ImmGetConversionListA(), and ImmGetGuideLineAW().

◆ CtfImeCreateThreadMgr()

HRESULT CtfImeCreateThreadMgr ( VOID  )

Definition at line 666 of file msctfime.cpp.

667{
668 TRACE("()\n");
669
670 TLS *pTLS = TLS::GetTLS();
671 if (!pTLS)
672 return E_OUTOFMEMORY;
673
674 if (!pTLS->m_pBridge)
675 {
676 pTLS->m_pBridge = new(cicNoThrow) CicBridge();
677 if (!pTLS->m_pBridge)
678 return E_OUTOFMEMORY;
679 }
680
681 HRESULT hr = S_OK;
683 {
684 hr = pTLS->m_pBridge->InitIMMX(pTLS);
685 if (SUCCEEDED(hr))
686 {
687 if (!pTLS->m_pThreadMgr)
688 return E_OUTOFMEMORY;
689
690 hr = pTLS->m_pBridge->ActivateIMMX(pTLS, pTLS->m_pThreadMgr);
691 if (FAILED(hr))
692 pTLS->m_pBridge->UnInitIMMX(pTLS);
693 }
694 }
695
696 return hr;
697}
#define cicNoThrow
Definition: cicbase.h:34
HRESULT ActivateIMMX(_Inout_ TLS *pTLS, _Inout_ ITfThreadMgr_P *pThreadMgr)
@implemented
Definition: bridge.cpp:277
BOOL UnInitIMMX(_Inout_ TLS *pTLS)
@implemented
Definition: bridge.cpp:453
HRESULT InitIMMX(_Inout_ TLS *pTLS)
@implemented
Definition: bridge.cpp:386
Definition: tls.h:14
DWORD m_dwSystemInfoFlags
Definition: tls.h:18
ITfThreadMgr_P * m_pThreadMgr
Definition: tls.h:21
static TLS * GetTLS()
@implemented
Definition: tls.cpp:32
CicBridge * m_pBridge
Definition: tls.h:19
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define IME_SYSINFO_WINLOGON
Definition: immdev.h:387
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
BOOL g_bWinLogon
Definition: msctfime.cpp:13
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by CtfAImmActivate(), CtfImeCreateThreadMgr(), CtfImmTIMActivate(), and Imm32ActivateOrDeactivateTIM().

◆ CtfImeDestroyThreadMgr()

HRESULT CtfImeDestroyThreadMgr ( VOID  )

Definition at line 705 of file msctfime.cpp.

706{
707 TRACE("()\n");
708
709 TLS *pTLS = TLS::PeekTLS();
710 if (!pTLS)
711 return E_OUTOFMEMORY;
712
713 if (pTLS->m_pBridge)
714 {
715 pTLS->m_pBridge = new(cicNoThrow) CicBridge();
716 if (!pTLS->m_pBridge)
717 return E_OUTOFMEMORY;
718 }
719
720 if (!pTLS->m_pThreadMgr)
721 return E_OUTOFMEMORY;
722
724 return S_OK;
725
726 HRESULT hr = pTLS->m_pBridge->DeactivateIMMX(pTLS, pTLS->m_pThreadMgr);
727 if (hr == S_OK)
728 pTLS->m_pBridge->UnInitIMMX(pTLS);
729
730 return hr;
731}
HRESULT DeactivateIMMX(_Inout_ TLS *pTLS, _Inout_ ITfThreadMgr_P *pThreadMgr)
@implemented
Definition: bridge.cpp:340
static TLS * PeekTLS()
@implemented
Definition: tls.cpp:41

Referenced by CtfAImmDeactivate(), CtfImeDestroyThreadMgr(), Imm32ActivateOrDeactivateTIM(), and ImmDisableTextFrameService().

◆ CtfImeProcessCicHotkey()

BOOL CtfImeProcessCicHotkey ( _In_ HIMC  hIMC,
_In_ UINT  vKey,
_In_ LPARAM  lParam 
)

Definition at line 795 of file msctfime.cpp.

799{
800 TRACE("(%p, %u, %p)\n", hIMC, vKey, lParam);
801
802 TLS *pTLS = TLS::GetTLS();
803 if (!pTLS)
804 return S_OK;
805
806 HRESULT hr = S_OK;
807 ITfThreadMgr *pThreadMgr = NULL;
808 ITfThreadMgr_P *pThreadMgr_P = NULL;
809 if ((TF_GetThreadMgr(&pThreadMgr) == S_OK) &&
810 (pThreadMgr->QueryInterface(IID_ITfThreadMgr_P, (void**)&pThreadMgr_P) == S_OK) &&
812 {
813 HRESULT hr2;
814 if (SUCCEEDED(pThreadMgr_P->CallImm32HotkeyHandler(vKey, lParam, &hr2)))
815 hr = hr2;
816 }
817
818 if (pThreadMgr)
819 pThreadMgr->Release();
820 if (pThreadMgr_P)
821 pThreadMgr_P->Release();
822
823 return hr;
824}
LPARAM lParam
Definition: combotst.c:139
BOOL WINAPI CtfImmIsCiceroStartedInThread(VOID)
Definition: ctf.c:781
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
nsrefcnt Release()
HRESULT WINAPI TF_GetThreadMgr(ITfThreadMgr **pptim)
Definition: msctf.c:630

Referenced by CtfImeProcessCicHotkey(), and ImmProcessKey().

◆ CtfImeSetActiveContextAlways()

HRESULT CtfImeSetActiveContextAlways ( _In_ HIMC  hIMC,
_In_ BOOL  fActive,
_In_ HWND  hWnd,
_In_ HKL  hKL 
)

Definition at line 775 of file msctfime.cpp.

780{
781 TRACE("(%p, %d, %p, %p)\n", hIMC, fActive, hWnd, hKL);
782
783 TLS *pTLS = TLS::GetTLS();
784 if (!pTLS || !pTLS->m_pBridge)
785 return E_OUTOFMEMORY;
786 return pTLS->m_pBridge->SetActiveContextAlways(pTLS, hIMC, fActive, hWnd, hKL);
787}
HWND hWnd
Definition: settings.c:17
HRESULT SetActiveContextAlways(TLS *pTLS, HIMC hIMC, BOOL fActive, HWND hWnd, HKL hKL)
Definition: bridge.cpp:622

Referenced by CtfImeSetActiveContextAlways(), and ImmSetActiveContext().

◆ CtfImmCoInitialize()

HRESULT CtfImmCoInitialize ( VOID  )

Definition at line 574 of file ctf.c.

575{
576 HRESULT hr;
578 ISPY *pSpy;
579
580 if (GetWin32ClientInfo()->CI_flags & CI_CTFCOINIT)
581 return S_OK; /* Already initialized */
582
585 return hr; /* CoInitializeEx failed */
586
587 GetWin32ClientInfo()->CI_flags |= CI_CTFCOINIT;
588 Imm32InitTLS();
589
591 if (!pData || pData->pSpy)
592 return S_OK; /* Cannot allocate or already it has a spy */
593
594 pSpy = Imm32AllocIMMISPY();
595 pData->pSpy = (IInitializeSpy*)pSpy;
596 if (IS_NULL_UNEXPECTEDLY(pSpy))
597 return S_OK; /* Cannot allocate a spy */
598
600 {
601 /* Failed to register the spy */
603 pData->pSpy = NULL;
604 pData->uliCookie.QuadPart = 0;
605 }
606
607 return S_OK;
608}
static IMMTLSDATA * Imm32AllocateTLS(VOID)
Definition: ctf.c:296
static ISPY * Imm32AllocIMMISPY(VOID)
Definition: ctf.c:557
#define Imm32DeleteIMMISPY(pSpy)
Definition: ctf.c:568
HRESULT Imm32CoInitializeEx(VOID)
Definition: ctf.c:130
HRESULT Imm32CoRegisterInitializeSpy(IInitializeSpy *spy, ULARGE_INTEGER *cookie)
Definition: ctf.c:146
static VOID Imm32InitTLS(VOID)
Definition: ctf.c:285
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
#define GetWin32ClientInfo()
Definition: ntuser.h:352
#define CI_CTFCOINIT
Definition: ntuser.h:307
Definition: ctf.c:416
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
#define IS_NULL_UNEXPECTEDLY(p)
Definition: precomp.h:66

Referenced by CtfImmTIMActivate().

◆ CtfImmSetLangBand()

LRESULT CtfImmSetLangBand ( _In_ HWND  hWnd,
_In_ BOOL  fSet 
)

Definition at line 1234 of file ctf.c.

1237{
1239 PWND pWnd = NULL;
1240 PIMM_DELAY_SET_LANG_BAND pSetBand;
1241 DWORD_PTR lResult = 0;
1242
1243 if (hWnd && gpsi)
1244 pWnd = ValidateHwndNoErr(hWnd);
1245
1246 if (IS_NULL_UNEXPECTEDLY(pWnd))
1247 return 0;
1248
1250 {
1252 5000, &lResult);
1253 return lResult;
1254 }
1255
1256 pSetBand = ImmLocalAlloc(0, sizeof(IMM_DELAY_SET_LANG_BAND));
1257 if (IS_NULL_UNEXPECTEDLY(pSetBand))
1258 return 0;
1259
1260 pSetBand->hWnd = hWnd;
1261 pSetBand->fSet = fSet;
1262
1264 if (hThread)
1266 return 0;
1267}
static DWORD WINAPI Imm32DelaySetLangBandProc(LPVOID arg)
Definition: ctf.c:1212
#define CloseHandle
Definition: compat.h:739
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
PSERVERINFO gpsi
Definition: imm.c:18
#define WNDS2_WMCREATEMSGPROCESSED
Definition: ntuser.h:670
HANDLE hThread
Definition: wizard.c:28
Definition: ntuser.h:694
DWORD state2
Definition: ntuser.h:702
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define ValidateHwndNoErr(hwnd)
Definition: precomp.h:100
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
Definition: utils.c:275
#define SMTO_BLOCK
Definition: winuser.h:1235
LRESULT WINAPI SendMessageTimeoutW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM, _In_ UINT, _In_ UINT, _Out_opt_ PDWORD_PTR)
#define SMTO_ABORTIFHUNG
Definition: winuser.h:1234
#define WM_USER
Definition: winuser.h:1914

Referenced by ImmSystemHandler().

◆ CtfImmTIMCreateInputContext()

HRESULT CtfImmTIMCreateInputContext ( _In_ HIMC  hIMC)

Definition at line 939 of file ctf.c.

941{
942 PCLIENTIMC pClientImc;
943 DWORD_PTR dwImeThreadId, dwCurrentThreadId;
945
946 TRACE("(%p)\n", hIMC);
947
948 pClientImc = ImmLockClientImc(hIMC);
949 if (!pClientImc)
950 return E_FAIL;
951
952 if (GetWin32ClientInfo()->CI_flags & CI_AIMMACTIVATED)
953 {
954 if (!pClientImc->bCtfIme)
955 {
956 dwImeThreadId = NtUserQueryInputContext(hIMC, QIC_INPUTTHREADID);
957 dwCurrentThreadId = GetCurrentThreadId();
958 if (dwImeThreadId == dwCurrentThreadId)
959 {
960 pClientImc->bCtfIme = TRUE;
963 pClientImc->bCtfIme = FALSE;
964 }
965 }
966 }
967 else
968 {
969 if (!(GetWin32ClientInfo()->CI_flags & CI_CTFTIM))
970 return S_OK;
971
972 if (!pClientImc->bCtfIme)
973 {
974 dwImeThreadId = NtUserQueryInputContext(hIMC, QIC_INPUTTHREADID);
975 dwCurrentThreadId = GetCurrentThreadId();
976 if ((dwImeThreadId == dwCurrentThreadId) && IS_CICERO_MODE() && !IS_16BIT_MODE())
977 {
978 pClientImc->bCtfIme = TRUE;
981 pClientImc->bCtfIme = FALSE;
982 }
983 }
984 }
985
986 ImmUnlockClientImc(pClientImc);
987 return hr;
988}
HRESULT CtfImeCreateInputContext(_In_ HIMC hIMC)
Definition: ctf.c:816
#define E_FAIL
Definition: ddrawi.h:102
#define FALSE
Definition: types.h:117
PCLIENTIMC WINAPI ImmLockClientImc(_In_ HIMC hImc)
Definition: imm.c:954
VOID WINAPI ImmUnlockClientImc(_Inout_ PCLIENTIMC pClientImc)
Definition: imm.c:1001
#define CI_AIMMACTIVATED
Definition: ntuser.h:311
#define CI_CTFTIM
Definition: ntuser.h:308
DWORD_PTR NTAPI NtUserQueryInputContext(HIMC hIMC, DWORD dwType)
Definition: ime.c:1878
#define IS_16BIT_MODE()
Definition: ntuser.h:1214
#define IS_CICERO_MODE()
Definition: ntuser.h:1213
@ QIC_INPUTTHREADID
Definition: undocuser.h:404
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
#define S_FALSE
Definition: winerror.h:2357

Referenced by Imm32CreateInputContext(), and Imm32InternalLockIMC().

◆ CtfImmTIMDestroyInputContext()

HRESULT CtfImmTIMDestroyInputContext ( _In_ HIMC  hIMC)

Definition at line 929 of file ctf.c.

931{
933 return E_NOINTERFACE;
934
935 return CtfImeDestroyInputContext(hIMC);
936}
HRESULT CtfImeDestroyInputContext(_In_ HIMC hIMC)
Definition: ctf.c:831
#define IS_CICERO_COMPAT_DISABLED()
Definition: ntuser.h:1215
#define E_NOINTERFACE
Definition: winerror.h:2364

Referenced by Imm32DestroyInputContext().

◆ IchAnsiFromWide()

LONG IchAnsiFromWide ( LONG  cchWide,
LPCWSTR  pchWide,
UINT  uCodePage 
)

Definition at line 140 of file utils.c.

141{
142 LONG cb, cchAnsi;
143 for (cchAnsi = 0; cchWide > 0; ++cchAnsi, ++pchWide, --cchWide)
144 {
145 cb = WideCharToMultiByte(uCodePage, 0, pchWide, 1, NULL, 0, NULL, NULL);
146 if (cb > 1)
147 ++cchAnsi;
148 }
149 return cchAnsi;
150}
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
long LONG
Definition: pedump.c:60

Referenced by Imm32GetCompStrA(), Imm32ProcessRequest(), and Imm32ReconvertAnsiFromWide().

◆ IchWideFromAnsi()

LONG IchWideFromAnsi ( LONG  cchAnsi,
LPCSTR  pchAnsi,
UINT  uCodePage 
)

Definition at line 120 of file utils.c.

121{
122 LONG cchWide;
123 for (cchWide = 0; cchAnsi > 0; ++cchWide)
124 {
125 if (IsDBCSLeadByteEx(uCodePage, *pchAnsi) && pchAnsi[1])
126 {
127 cchAnsi -= 2;
128 pchAnsi += 2;
129 }
130 else
131 {
132 --cchAnsi;
133 ++pchAnsi;
134 }
135 }
136 return cchWide;
137}
BOOL WINAPI IsDBCSLeadByteEx(UINT codepage, BYTE testchar)
Definition: locale.c:2104

Referenced by Imm32GetCompStrW(), Imm32ProcessRequest(), and Imm32ReconvertWideFromAnsi().

◆ Imm32ActivateOrDeactivateTIM()

HRESULT Imm32ActivateOrDeactivateTIM ( _In_ BOOL  bCreate)

Definition at line 895 of file ctf.c.

897{
898 HRESULT hr = S_OK;
899
900 if (!IS_CICERO_MODE() || IS_16BIT_MODE() ||
901 !(GetWin32ClientInfo()->CI_flags & CI_CTFCOINIT))
902 {
903 return S_OK; /* No need to activate/de-activate TIM */
904 }
905
906 if (bCreate)
907 {
908 if (!(GetWin32ClientInfo()->CI_flags & CI_CTFTIM))
909 {
911 if (SUCCEEDED(hr))
912 GetWin32ClientInfo()->CI_flags |= CI_CTFTIM;
913 }
914 }
915 else /* Destroy */
916 {
917 if (GetWin32ClientInfo()->CI_flags & CI_CTFTIM)
918 {
920 if (SUCCEEDED(hr))
921 GetWin32ClientInfo()->CI_flags &= ~CI_CTFTIM;
922 }
923 }
924
925 return hr;
926}
HRESULT CtfImeCreateThreadMgr(VOID)
Definition: ctf.c:723
HRESULT CtfImeDestroyThreadMgr(VOID)
Definition: ctf.c:751
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1528

Referenced by CtfImmLastEnabledWndDestroy(), and ISPY_PreInitialize().

◆ Imm32AnsiFromWide()

LPSTR Imm32AnsiFromWide ( UINT  uCodePage,
LPCWSTR  pszW 
)

Definition at line 107 of file utils.c.

108{
109 INT cchW = lstrlenW(pszW);
110 INT cchA = (cchW + 1) * sizeof(WCHAR);
111 LPSTR pszA = ImmLocalAlloc(0, cchA);
112 if (IS_NULL_UNEXPECTEDLY(pszA))
113 return NULL;
114 cchA = WideCharToMultiByte(uCodePage, 0, pszW, cchW, pszA, cchA, NULL, NULL);
115 pszA[cchA] = ANSI_NULL;
116 return pszA;
117}
#define lstrlenW
Definition: compat.h:750
#define ANSI_NULL
int32_t INT
Definition: typedefs.h:58
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
Definition: utils.c:275

Referenced by Imm32EnumWordProcW2A(), ImmConfigureIMEW(), ImmEnumRegisterWordW(), ImmGetConversionListW(), ImmRegisterWordW(), and ImmUnregisterWordW().

◆ Imm32BuildHimcList()

DWORD Imm32BuildHimcList ( DWORD  dwThreadId,
HIMC **  pphList 
)

Definition at line 338 of file utils.c.

339{
340#define INITIAL_COUNT 0x40
341#define MAX_RETRY 10
343 DWORD dwCount = INITIAL_COUNT, cRetry = 0;
344 HIMC *phNewList;
345
346 phNewList = ImmLocalAlloc(0, dwCount * sizeof(HIMC));
347 if (IS_NULL_UNEXPECTEDLY(phNewList))
348 return 0;
349
350 Status = NtUserBuildHimcList(dwThreadId, dwCount, phNewList, &dwCount);
352 {
353 ImmLocalFree(phNewList);
354 if (cRetry++ >= MAX_RETRY)
355 return 0;
356
357 phNewList = ImmLocalAlloc(0, dwCount * sizeof(HIMC));
358 if (IS_NULL_UNEXPECTEDLY(phNewList))
359 return 0;
360
361 Status = NtUserBuildHimcList(dwThreadId, dwCount, phNewList, &dwCount);
362 }
363
364 if (NT_ERROR(Status) || !dwCount)
365 {
366 ERR("Abnormal status\n");
367 ImmLocalFree(phNewList);
368 return 0;
369 }
370
371 *pphList = phNewList;
372 return dwCount;
373#undef INITIAL_COUNT
374#undef MAX_RETRY
375}
LONG NTSTATUS
Definition: precomp.h:26
#define ERR(fmt,...)
Definition: precomp.h:57
DWORD HIMC
Definition: dimm.idl:75
DWORD dwThreadId
Definition: fdebug.c:31
Status
Definition: gdiplustypes.h:25
NTSTATUS NTAPI NtUserBuildHimcList(_In_ DWORD dwThreadId, _In_ DWORD dwCount, _Out_ HIMC *phList, _Out_ PDWORD pdwCount)
Definition: ime.c:731
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define NT_ERROR(Status)
Definition: umtypes.h:106
#define ImmLocalFree(lpData)
Definition: precomp.h:105
#define MAX_RETRY
#define INITIAL_COUNT

Referenced by ImmEnumInputContext().

◆ Imm32CheckImcProcess()

BOOL Imm32CheckImcProcess ( PIMC  pIMC)

Definition at line 252 of file utils.c.

253{
254 HIMC hIMC;
255 DWORD_PTR dwPID1, dwPID2;
256
257 if (IS_NULL_UNEXPECTEDLY(pIMC))
258 return FALSE;
259
260 if (pIMC->head.pti == Imm32CurrentPti())
261 return TRUE;
262
263 hIMC = pIMC->head.h;
265 dwPID2 = (DWORD_PTR)NtCurrentTeb()->ClientId.UniqueProcess;
266 if (dwPID1 != dwPID2)
267 {
268 WARN("PID 0x%X != 0x%X\n", dwPID1, dwPID2);
269 return FALSE;
270 }
271
272 return TRUE;
273}
#define WARN(fmt,...)
Definition: precomp.h:61
#define NtCurrentTeb
THRDESKHEAD head
Definition: ntuser.h:200
#define DWORD_PTR
Definition: treelist.c:76
@ QIC_INPUTPROCESSID
Definition: undocuser.h:403
PTHREADINFO FASTCALL Imm32CurrentPti(VOID)
Definition: utils.c:18

Referenced by ImmLockClientImc().

◆ Imm32CurrentPti()

PTHREADINFO FASTCALL Imm32CurrentPti ( VOID  )

Definition at line 18 of file utils.c.

19{
20 if (NtCurrentTeb()->Win32ThreadInfo == NULL)
22 return NtCurrentTeb()->Win32ThreadInfo;
23}
@ THREADSTATE_GETTHREADINFO
Definition: ntuser.h:2503
DWORD_PTR NTAPI NtUserGetThreadState(DWORD Routine)
Definition: misc.c:240

Referenced by Imm32CheckImcProcess(), Imm32DestroyInputContext(), and ImmRequestMessageAW().

◆ Imm32FetchImeState()

PIME_STATE Imm32FetchImeState ( LPINPUTCONTEXTDX  pIC,
HKL  hKL 
)

Definition at line 378 of file utils.c.

379{
380 PIME_STATE pState;
381 WORD Lang = PRIMARYLANGID(LOWORD(hKL));
382 for (pState = pIC->pState; pState; pState = pState->pNext)
383 {
384 if (pState->wLang == Lang)
385 break;
386 }
387 if (!pState)
388 {
389 pState = ImmLocalAlloc(HEAP_ZERO_MEMORY, sizeof(IME_STATE));
390 if (pState)
391 {
392 pState->wLang = Lang;
393 pState->pNext = pIC->pState;
394 pIC->pState = pState;
395 }
396 }
397 return pState;
398}
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
unsigned short WORD
Definition: ntddk_ex.h:93
#define LOWORD(l)
Definition: pedump.c:82
#define PRIMARYLANGID(l)
Definition: nls.h:16
WORD wLang
Definition: imm32_undoc.h:214
struct IME_STATE * pNext
Definition: imm32_undoc.h:213
struct IME_STATE * pState
Definition: imm32_undoc.h:195

Referenced by Imm32SelectInputContext().

◆ Imm32FetchImeSubState()

PIME_SUBSTATE Imm32FetchImeSubState ( PIME_STATE  pState,
HKL  hKL 
)

Definition at line 401 of file utils.c.

402{
403 PIME_SUBSTATE pSubState;
404 for (pSubState = pState->pSubState; pSubState; pSubState = pSubState->pNext)
405 {
406 if (pSubState->hKL == hKL)
407 return pSubState;
408 }
409 pSubState = ImmLocalAlloc(0, sizeof(IME_SUBSTATE));
410 if (!pSubState)
411 return NULL;
412 pSubState->dwValue = 0;
413 pSubState->hKL = hKL;
414 pSubState->pNext = pState->pSubState;
415 pState->pSubState = pSubState;
416 return pSubState;
417}
PIME_SUBSTATE pSubState
Definition: imm32_undoc.h:219
struct IME_SUBSTATE * pNext
Definition: imm32_undoc.h:202

Referenced by Imm32LoadImeStateSentence(), and Imm32SaveImeStateSentence().

◆ Imm32FindOrLoadImeDpi()

PIMEDPI Imm32FindOrLoadImeDpi ( HKL  hKL)

Definition at line 350 of file ime.c.

351{
352 PIMEDPI pImeDpi;
353
354 if (!IS_IME_HKL(hKL) && (!IS_CICERO_MODE() || IS_16BIT_MODE()))
355 {
356 TRACE("\n");
357 return NULL;
358 }
359
360 pImeDpi = ImmLockImeDpi(hKL);
361 if (pImeDpi == NULL)
362 pImeDpi = Imm32LoadImeDpi(hKL, TRUE);
363 return pImeDpi;
364}
static PIMEDPI Imm32LoadImeDpi(HKL hKL, BOOL bLock)
Definition: ime.c:281
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
Definition: ime.c:531
#define IS_IME_HKL(hKL)
Definition: imm32_undoc.h:21

Referenced by CtfImmGetGuidAtom(), CtfImmIsGuidMapEnable(), Imm32InternalLockIMC(), ImmConfigureIMEA(), ImmConfigureIMEW(), ImmEnumRegisterWordA(), ImmEnumRegisterWordW(), ImmEscapeA(), ImmEscapeW(), ImmGetConversionListA(), ImmGetConversionListW(), ImmGetProperty(), ImmGetRegisterWordStyleA(), ImmGetRegisterWordStyleW(), ImmRegisterWordA(), ImmRegisterWordW(), ImmUnregisterWordA(), and ImmUnregisterWordW().

◆ Imm32GetSystemLibraryPath()

BOOL Imm32GetSystemLibraryPath ( LPWSTR  pszPath,
DWORD  cchPath,
LPCWSTR  pszFileName 
)

Definition at line 152 of file utils.c.

153{
154 if (!pszFileName[0] || !GetSystemDirectoryW(pszPath, cchPath))
155 {
156 ERR("Invalid filename\n");
157 return FALSE;
158 }
159 StringCchCatW(pszPath, cchPath, L"\\");
160 StringCchCatW(pszPath, cchPath, pszFileName);
161 return TRUE;
162}
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2313
#define L(x)
Definition: ntvdm.h:50
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44

Referenced by Imm32CopyImeFile(), Imm32GetFn(), Imm32LoadCtfIme(), Imm32LoadIME(), Imm32LoadImeVerInfo(), and ImmInstallIMEW().

◆ Imm32InternalLockIMC()

LPINPUTCONTEXT Imm32InternalLockIMC ( HIMC  hIMC,
BOOL  fSelect 
)

Definition at line 852 of file imm.c.

853{
854 HANDLE hIC;
855 LPINPUTCONTEXT pIC = NULL;
856 PCLIENTIMC pClientImc;
857 WORD LangID;
859 HKL hOldKL, hNewKL;
860 PIMEDPI pImeDpi = NULL;
861
862 pClientImc = ImmLockClientImc(hIMC);
863 if (!pClientImc)
864 return NULL;
865
866 RtlEnterCriticalSection(&pClientImc->cs);
867
868 if (pClientImc->hInputContext)
869 {
870 pIC = LocalLock(pClientImc->hInputContext);
871 if (IS_NULL_UNEXPECTEDLY(pIC))
872 goto Failure;
873
875 goto Success;
876 }
877
880 {
881 hOldKL = GetKeyboardLayout(0);
882 LangID = LOWORD(hOldKL);
884
885 pImeDpi = Imm32FindOrLoadImeDpi(hNewKL);
886 if (pImeDpi)
887 {
888 CtfImmTIMActivate(hNewKL);
889 }
890 }
891
893 {
894 ERR("No default IME window\n");
895 goto Failure;
896 }
897
898 hIC = LocalAlloc(LHND, sizeof(INPUTCONTEXTDX));
899 pIC = LocalLock(hIC);
900 if (IS_NULL_UNEXPECTEDLY(pIC))
901 {
902 LocalFree(hIC);
903 goto Failure;
904 }
905 pClientImc->hInputContext = hIC;
906
908 if (!Imm32CreateInputContext(hIMC, pIC, pClientImc, hNewKL, fSelect))
909 {
910 LocalUnlock(hIC);
911 pClientImc->hInputContext = LocalFree(hIC);
912 goto Failure;
913 }
914
915Success:
916 RtlLeaveCriticalSection(&pClientImc->cs);
917 InterlockedIncrement(&pClientImc->cLockObj);
918 ImmUnlockClientImc(pClientImc);
919 return pIC;
920
921Failure:
922 RtlLeaveCriticalSection(&pClientImc->cs);
923 ImmUnlockClientImc(pClientImc);
924 return NULL;
925}
#define InterlockedIncrement
Definition: armddk.h:53
#define UlongToHandle(ul)
Definition: basetsd.h:97
HRESULT CtfImmTIMCreateInputContext(_In_ HIMC hIMC)
Definition: ctf.c:939
@ Success
Definition: eventcreate.c:712
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
LPVOID NTAPI LocalLock(HLOCAL hMem)
Definition: heapmem.c:1616
BOOL NTAPI LocalUnlock(HLOCAL hMem)
Definition: heapmem.c:1805
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
PIMEDPI Imm32FindOrLoadImeDpi(HKL hKL)
Definition: ime.c:350
static BOOL Imm32CreateInputContext(HIMC hIMC, LPINPUTCONTEXT pIC, PCLIENTIMC pClientImc, HKL hKL, BOOL fSelect)
Definition: imm.c:752
PCLIENTIMC WINAPI ImmLockClientImc(_In_ HIMC hImc)
Definition: imm.c:954
VOID WINAPI ImmUnlockClientImc(_Inout_ PCLIENTIMC pClientImc)
Definition: imm.c:1001
HRESULT WINAPI CtfImmTIMActivate(_In_ HKL hKL)
Definition: ctf.c:1123
UINT_PTR HKL
Definition: msctf.idl:125
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
RTL_CRITICAL_SECTION cs
Definition: imm32_undoc.h:151
HANDLE hInputContext
Definition: imm32_undoc.h:147
#define MAKELONG(a, b)
Definition: typedefs.h:249
@ QIC_DEFAULTWINDOWIME
Definition: undocuser.h:405
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ WDFREQUEST _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_writes_opt_ NumCharacters PUSHORT _Inout_ PUSHORT _In_ UCHAR _In_opt_ USHORT LangID
Definition: wdfusb.h:1083
#define LHND
Definition: winbase.h:415
HKL WINAPI GetKeyboardLayout(_In_ DWORD)

Referenced by Imm32SelectInputContext(), and ImmLockIMC().

◆ Imm32IsCrossProcessAccess()

BOOL Imm32IsCrossProcessAccess ( HWND  hWnd)

Definition at line 32 of file utils.c.

33{
35 DWORD_PTR CurrentPID = (DWORD_PTR)NtCurrentTeb()->ClientId.UniqueProcess;
36 return WndPID != CurrentPID;
37}
DWORD_PTR NTAPI NtUserQueryWindow(HWND hWnd, DWORD Index)
Definition: window.c:4207
#define QUERY_WINDOW_UNIQUE_PROCESS_ID
Definition: ntuser.h:2843

◆ Imm32IsCrossThreadAccess()

BOOL Imm32IsCrossThreadAccess ( HIMC  hIMC)

Definition at line 25 of file utils.c.

26{
28 DWORD_PTR dwCurrentThreadId = GetCurrentThreadId();
29 return dwImeThreadId != dwCurrentThreadId;
30}

Referenced by ImmSetCompositionWindow().

◆ Imm32IsImcAnsi()

BOOL Imm32IsImcAnsi ( HIMC  hIMC)

Definition at line 85 of file utils.c.

86{
87 BOOL ret;
88 PCLIENTIMC pClientImc = ImmLockClientImc(hIMC);
89 if (IS_NULL_UNEXPECTEDLY(pClientImc))
90 return -1;
91 ret = !(pClientImc->dwFlags & CLIENTIMC_WIDE);
92 ImmUnlockClientImc(pClientImc);
93 return ret;
94}
#define CLIENTIMC_WIDE
Definition: imm32_undoc.h:169
int ret

Referenced by ImmGetImeMenuItemsAW().

◆ Imm32IsSystemJapaneseOrKorean()

BOOL Imm32IsSystemJapaneseOrKorean ( VOID  )

Definition at line 72 of file utils.c.

73{
76 WORD wPrimary = PRIMARYLANGID(LangID);
77 if (wPrimary != LANG_JAPANESE || wPrimary != LANG_KOREAN)
78 {
79 TRACE("The country has no special IME support\n");
80 return FALSE;
81 }
82 return TRUE;
83}
LCID WINAPI GetSystemDefaultLCID(void)
Definition: locale.c:1230
LCID lcid
Definition: locale.c:5656
USHORT LANGID
Definition: mui.h:9
#define LANGIDFROMLCID(l)
Definition: nls.h:18
DWORD LCID
Definition: nls.h:13
#define LANG_JAPANESE
Definition: nls.h:76
#define LANG_KOREAN
Definition: nls.h:84

Referenced by ImmIMPGetIMEA(), ImmIMPGetIMEW(), ImmIMPQueryIMEA(), ImmIMPQueryIMEW(), ImmIMPSetIMEA(), ImmIMPSetIMEW(), ImmWINNLSEnableIME(), and ImmWINNLSGetEnableStatus().

◆ Imm32LoadImeStateSentence()

BOOL Imm32LoadImeStateSentence ( LPINPUTCONTEXTDX  pIC,
PIME_STATE  pState,
HKL  hKL 
)

Definition at line 420 of file utils.c.

421{
422 PIME_SUBSTATE pSubState = Imm32FetchImeSubState(pState, hKL);
423 if (IS_NULL_UNEXPECTEDLY(pSubState))
424 return FALSE;
425
426 pIC->fdwSentence |= pSubState->dwValue;
427 return TRUE;
428}
PIME_SUBSTATE Imm32FetchImeSubState(PIME_STATE pState, HKL hKL)
Definition: utils.c:401

Referenced by Imm32SelectInputContext().

◆ Imm32LoadImeVerInfo()

BOOL Imm32LoadImeVerInfo ( _Out_ PIMEINFOEX  pImeInfoEx)

◆ Imm32MakeIMENotify()

BOOL Imm32MakeIMENotify ( _In_ HIMC  hIMC,
_In_ HWND  hwnd,
_In_ DWORD  dwAction,
_In_ DWORD  dwIndex,
_Inout_opt_ DWORD_PTR  dwValue,
_In_ DWORD  dwCommand,
_Inout_opt_ DWORD_PTR  dwData 
)

Definition at line 287 of file utils.c.

295{
297 HKL hKL;
298 PIMEDPI pImeDpi;
299
300 if (dwAction != 0)
301 {
303 if (dwThreadId)
304 {
305 /* find keyboard layout and lock it */
307 pImeDpi = ImmLockImeDpi(hKL);
308 if (pImeDpi)
309 {
310 /* do notify */
311 TRACE("NotifyIME(%p, %lu, %lu, %p)\n", hIMC, dwAction, dwIndex, dwValue);
312 if (!pImeDpi->NotifyIME(hIMC, dwAction, dwIndex, dwValue))
313 WARN("NotifyIME(%p, %lu, %lu, %p) failed\n", hIMC, dwAction, dwIndex, dwValue);
314
315 ImmUnlockImeDpi(pImeDpi); /* unlock */
316 }
317 else
318 {
319 WARN("pImeDpi was NULL\n");
320 }
321 }
322 else
323 {
324 WARN("dwThreadId was zero\n");
325 }
326 }
327 else
328 {
329 WARN("dwAction was zero\n");
330 }
331
332 if (hwnd && dwCommand)
334
335 return TRUE;
336}
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
Definition: ime.c:531
VOID WINAPI ImmUnlockImeDpi(_Inout_opt_ PIMEDPI pImeDpi)
Definition: ime.c:561
static HANDLE ULONG_PTR dwData
Definition: file.c:35
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WM_IME_NOTIFY
Definition: winuser.h:1849
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by ImmSetCandidateWindow(), ImmSetCompositionFontA(), ImmSetCompositionFontW(), ImmSetCompositionWindow(), ImmSetConversionStatus(), ImmSetOpenStatus(), and ImmSetStatusWindowPos().

◆ Imm32ReconvertAnsiFromWide()

DWORD Imm32ReconvertAnsiFromWide ( LPRECONVERTSTRING  pDest,
const RECONVERTSTRING *  pSrc,
UINT  uCodePage 
)

Definition at line 514 of file utils.c.

515{
516 DWORD cch0, cch1, cchDest, cbDest;
517 LPCWSTR pchSrc = (LPCWSTR)((LPCSTR)pSrc + pSrc->dwStrOffset);
518 LPSTR pchDest;
519
520 if (pSrc->dwVersion != 0)
521 {
522 ERR("\n");
523 return 0;
524 }
525
526 cchDest = WideCharToMultiByte(uCodePage, 0, pchSrc, pSrc->dwStrLen,
527 NULL, 0, NULL, NULL);
528 cbDest = sizeof(RECONVERTSTRING) + (cchDest + 1) * sizeof(CHAR);
529 if (!pDest)
530 return cbDest;
531
532 if (pDest->dwSize < cbDest)
533 {
534 ERR("Too small\n");
535 return 0;
536 }
537
538 /* dwSize */
539 pDest->dwSize = cbDest;
540
541 /* dwVersion */
542 pDest->dwVersion = 0;
543
544 /* dwStrOffset */
545 pDest->dwStrOffset = sizeof(RECONVERTSTRING);
546
547 /* dwCompStrOffset */
548 cch1 = pSrc->dwCompStrOffset / sizeof(WCHAR);
549 cch0 = IchAnsiFromWide(cch1, pchSrc, uCodePage);
550 pDest->dwCompStrOffset = cch0 * sizeof(CHAR);
551
552 /* dwCompStrLen */
553 cch0 = IchAnsiFromWide(cch1 + pSrc->dwCompStrLen, pchSrc, uCodePage);
554 pDest->dwCompStrLen = cch0 * sizeof(CHAR) - pDest->dwCompStrOffset;
555
556 /* dwTargetStrOffset */
557 cch1 = pSrc->dwTargetStrOffset / sizeof(WCHAR);
558 cch0 = IchAnsiFromWide(cch1, pchSrc, uCodePage);
559 pDest->dwTargetStrOffset = cch0 * sizeof(CHAR);
560
561 /* dwTargetStrLen */
562 cch0 = IchAnsiFromWide(cch1 + pSrc->dwTargetStrLen, pchSrc, uCodePage);
563 pDest->dwTargetStrLen = cch0 * sizeof(CHAR) - pDest->dwTargetStrOffset;
564
565 /* dwStrLen */
566 pDest->dwStrLen = cchDest;
567
568 /* the string */
569 pchDest = (LPSTR)pDest + pDest->dwStrOffset;
570 cchDest = WideCharToMultiByte(uCodePage, 0, pchSrc, pSrc->dwStrLen,
571 pchDest, cchDest, NULL, NULL);
572 pchDest[cchDest] = ANSI_NULL;
573
574 TRACE("cchDest: 0x%X\n", cchDest);
575 return cbDest;
576}
#define CHAR(Char)
LONG IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
Definition: utils.c:140
_In_ DWORD _In_ int _In_ int cchDest
Definition: winnls.h:1197

Referenced by Imm32ProcessRequest(), and ImmSetCompositionStringAW().

◆ Imm32ReconvertWideFromAnsi()

DWORD Imm32ReconvertWideFromAnsi ( LPRECONVERTSTRING  pDest,
const RECONVERTSTRING *  pSrc,
UINT  uCodePage 
)

Definition at line 451 of file utils.c.

452{
453 DWORD cch0, cchDest, cbDest;
454 LPCSTR pchSrc = (LPCSTR)pSrc + pSrc->dwStrOffset;
455 LPWSTR pchDest;
456
457 if (pSrc->dwVersion != 0)
458 {
459 ERR("\n");
460 return 0;
461 }
462
463 cchDest = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pchSrc, pSrc->dwStrLen,
464 NULL, 0);
465 cbDest = sizeof(RECONVERTSTRING) + (cchDest + 1) * sizeof(WCHAR);
466 if (!pDest)
467 return cbDest;
468
469 if (pDest->dwSize < cbDest)
470 {
471 ERR("Too small\n");
472 return 0;
473 }
474
475 /* dwSize */
476 pDest->dwSize = cbDest;
477
478 /* dwVersion */
479 pDest->dwVersion = 0;
480
481 /* dwStrOffset */
482 pDest->dwStrOffset = sizeof(RECONVERTSTRING);
483
484 /* dwCompStrOffset */
485 cch0 = IchWideFromAnsi(pSrc->dwCompStrOffset, pchSrc, uCodePage);
486 pDest->dwCompStrOffset = cch0 * sizeof(WCHAR);
487
488 /* dwCompStrLen */
489 cch0 = IchWideFromAnsi(pSrc->dwCompStrOffset + pSrc->dwCompStrLen, pchSrc, uCodePage);
490 pDest->dwCompStrLen = (cch0 * sizeof(WCHAR) - pDest->dwCompStrOffset) / sizeof(WCHAR);
491
492 /* dwTargetStrOffset */
493 cch0 = IchWideFromAnsi(pSrc->dwTargetStrOffset, pchSrc, uCodePage);
494 pDest->dwTargetStrOffset = cch0 * sizeof(WCHAR);
495
496 /* dwTargetStrLen */
497 cch0 = IchWideFromAnsi(pSrc->dwTargetStrOffset + pSrc->dwTargetStrLen, pchSrc, uCodePage);
498 pDest->dwTargetStrLen = (cch0 * sizeof(WCHAR) - pSrc->dwTargetStrOffset) / sizeof(WCHAR);
499
500 /* dwStrLen */
501 pDest->dwStrLen = cchDest;
502
503 /* the string */
504 pchDest = (LPWSTR)((LPBYTE)pDest + pDest->dwStrOffset);
505 cchDest = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pchSrc, pSrc->dwStrLen,
506 pchDest, cchDest);
507 pchDest[cchDest] = UNICODE_NULL;
508
509 TRACE("cbDest: 0x%X\n", cbDest);
510 return cbDest;
511}
if(dx< 0)
Definition: linetemp.h:194
#define UNICODE_NULL
LONG IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
Definition: utils.c:120

Referenced by Imm32ProcessRequest(), and ImmSetCompositionStringAW().

◆ Imm32ReleaseIME()

BOOL Imm32ReleaseIME ( _In_ HKL  hKL)

Definition at line 378 of file ime.c.

379{
380 BOOL ret = TRUE;
381 PIMEDPI pImeDpi0, pImeDpi1;
382
384
385 for (pImeDpi0 = gpImeDpiList; pImeDpi0; pImeDpi0 = pImeDpi0->pNext)
386 {
387 if (pImeDpi0->hKL == hKL)
388 break;
389 }
390
391 if (!pImeDpi0)
392 goto Quit;
393
394 if (pImeDpi0->cLockObj)
395 {
396 pImeDpi0->dwFlags |= IMEDPI_FLAG_UNLOADED;
397 ret = FALSE;
398 goto Quit;
399 }
400
401 if (gpImeDpiList == pImeDpi0)
402 {
403 gpImeDpiList = pImeDpi0->pNext;
404 }
405 else if (gpImeDpiList)
406 {
407 for (pImeDpi1 = gpImeDpiList; pImeDpi1; pImeDpi1 = pImeDpi1->pNext)
408 {
409 if (pImeDpi1->pNext == pImeDpi0)
410 {
411 pImeDpi1->pNext = pImeDpi0->pNext;
412 break;
413 }
414 }
415 }
416
417 Imm32FreeIME(pImeDpi0, TRUE);
418 ImmLocalFree(pImeDpi0);
419
420Quit:
422 return ret;
423}
RTL_CRITICAL_SECTION gcsImeDpi
Definition: ime.c:16
PIMEDPI gpImeDpiList
Definition: ime.c:17
VOID Imm32FreeIME(PIMEDPI pImeDpi, BOOL bDestroy)
Definition: ime.c:34
#define IMEDPI_FLAG_UNLOADED
Definition: imm32_undoc.h:138
DWORD dwFlags
Definition: imm32_undoc.h:98
HKL hKL
Definition: imm32_undoc.h:93
struct IMEDPI * pNext
Definition: imm32_undoc.h:91
DWORD cLockObj
Definition: imm32_undoc.h:97

Referenced by ImmFreeLayout().

◆ Imm32SaveImeStateSentence()

BOOL Imm32SaveImeStateSentence ( LPINPUTCONTEXTDX  pIC,
PIME_STATE  pState,
HKL  hKL 
)

Definition at line 431 of file utils.c.

432{
433 PIME_SUBSTATE pSubState = Imm32FetchImeSubState(pState, hKL);
434 if (IS_NULL_UNEXPECTEDLY(pSubState))
435 return FALSE;
436
437 pSubState->dwValue = (pIC->fdwSentence & 0xffff0000);
438 return TRUE;
439}

Referenced by Imm32SelectInputContext().

◆ Imm32StrToUInt()

HRESULT Imm32StrToUInt ( _In_ PCWSTR  pszText,
_Out_ PDWORD  pdwValue,
_In_ ULONG  nBase 
)

Definition at line 40 of file utils.c.

44{
47 *pdwValue = 0;
50 if (!NT_SUCCESS(Status))
51 return E_FAIL;
52 return S_OK;
53}
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger(PUNICODE_STRING String, ULONG Base, PULONG Value)

Referenced by Imm32GetImeLayoutList(), and Imm32UnitTest().

◆ Imm32UIntToStr()

HRESULT Imm32UIntToStr ( _In_ DWORD  dwValue,
_In_ ULONG  nBase,
_Out_ PWSTR  pszBuff,
_In_ USHORT  cchBuff 
)

Definition at line 56 of file utils.c.

61{
64 UnicodeString.Buffer = pszBuff;
65 UnicodeString.MaximumLength = cchBuff * sizeof(WCHAR);
67 if (!NT_SUCCESS(Status))
68 return E_FAIL;
69 return S_OK;
70}
NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString(ULONG Value, ULONG Base, PUNICODE_STRING String)

Referenced by Imm32UnitTest(), and Imm32WriteImeLayout().

◆ Imm32WideFromAnsi()

LPWSTR Imm32WideFromAnsi ( UINT  uCodePage,
LPCSTR  pszA 
)

Definition at line 96 of file utils.c.

97{
98 INT cch = lstrlenA(pszA);
99 LPWSTR pszW = ImmLocalAlloc(0, (cch + 1) * sizeof(WCHAR));
100 if (IS_NULL_UNEXPECTEDLY(pszW))
101 return NULL;
102 cch = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pszA, cch, pszW, cch + 1);
103 pszW[cch] = UNICODE_NULL;
104 return pszW;
105}
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202

Referenced by Imm32EnumWordProcA2W(), ImmConfigureIMEA(), ImmEnumRegisterWordA(), ImmGetConversionListA(), ImmInstallIMEA(), ImmRegisterWordA(), and ImmUnregisterWordA().

◆ ImmLocalAlloc()

◆ LogFontAnsiToWide()

VOID LogFontAnsiToWide ( const LOGFONTA plfA,
LPLOGFONTW  plfW 
)

Definition at line 164 of file utils.c.

165{
166 size_t cch;
167 RtlCopyMemory(plfW, plfA, offsetof(LOGFONTA, lfFaceName));
170 plfW->lfFaceName, _countof(plfW->lfFaceName));
171 if (cch > _countof(plfW->lfFaceName) - 1)
172 cch = _countof(plfW->lfFaceName) - 1;
173 plfW->lfFaceName[cch] = UNICODE_NULL;
174}
#define CP_ACP
Definition: compat.h:109
#define offsetof(TYPE, MEMBER)
#define _countof(array)
Definition: sndvol32.h:70
STRSAFEAPI StringCchLengthA(STRSAFE_LPCSTR psz, size_t cchMax, size_t *pcchLength)
Definition: strsafe.h:832
CHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:55
WCHAR lfFaceName[LF_FACESIZE]
Definition: wingdi.h:1910
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263

Referenced by Imm32ProcessRequest(), Imm32SelectInputContext(), ImmGetCompositionFontW(), and ImmSetCompositionFontA().

◆ LogFontWideToAnsi()

VOID LogFontWideToAnsi ( const LOGFONTW plfW,
LPLOGFONTA  plfA 
)

Definition at line 176 of file utils.c.

177{
178 size_t cch;
179 RtlCopyMemory(plfA, plfW, offsetof(LOGFONTW, lfFaceName));
182 plfA->lfFaceName, _countof(plfA->lfFaceName), NULL, NULL);
183 if (cch > _countof(plfA->lfFaceName) - 1)
184 cch = _countof(plfA->lfFaceName) - 1;
185 plfA->lfFaceName[cch] = ANSI_NULL;
186}
STRSAFEAPI StringCchLengthW(STRSAFE_LPCWSTR psz, size_t cchMax, size_t *pcchLength)
Definition: strsafe.h:842
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
CHAR lfFaceName[LF_FACESIZE]
Definition: wingdi.h:1894

Referenced by Imm32ProcessRequest(), Imm32SelectInputContext(), ImmGetCompositionFontA(), and ImmSetCompositionFontW().

◆ ValidateHandle()

LPVOID FASTCALL ValidateHandle ( HANDLE  hObject,
UINT  uType 
)

Definition at line 239 of file utils.c.

240{
241 LPVOID pvObj = ValidateHandleNoErr(hObject, uType);
242 if (pvObj)
243 return pvObj;
244
245 if (uType == TYPE_WINDOW)
247 else
249 return NULL;
250}
#define SetLastError(x)
Definition: compat.h:752
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
@ TYPE_WINDOW
Definition: ntuser.h:41
LPVOID FASTCALL ValidateHandleNoErr(HANDLE hObject, UINT uType)
Definition: utils.c:201
#define ERROR_INVALID_WINDOW_HANDLE
Definition: winerror.h:881

◆ ValidateHandleNoErr()

LPVOID FASTCALL ValidateHandleNoErr ( HANDLE  hObject,
UINT  uType 
)

Definition at line 201 of file utils.c.

202{
203 UINT index;
207 LPVOID ptr;
208
209 if (!NtUserValidateHandleSecure(hObject))
210 {
211 WARN("Not a handle\n");
212 return NULL;
213 }
214
215 ht = gSharedInfo.aheList; /* handle table */
216 ASSERT(ht);
217 /* ReactOS-Specific! */
220
221 index = (LOWORD(hObject) - FIRST_USER_HANDLE) >> 1;
222 if ((INT)index < 0 || ht->nb_handles <= index || he[index].type != uType)
223 return NULL;
224
226 return NULL;
227
228 generation = HIWORD(hObject);
229 if (generation != he[index].generation && generation && generation != 0xFFFF)
230 return NULL;
231
232 ptr = he[index].ptr;
233 if (ptr)
235
236 return ptr;
237}
#define index(s, c)
Definition: various.h:29
_In_ uint64_t _In_ uint64_t _In_ uint64_t generation
Definition: btrfs.c:2996
GLuint index
Definition: glext.h:6031
GLbitfield flags
Definition: glext.h:7161
static const struct newhuff ht[]
Definition: huffman.h:296
SHAREDINFO gSharedInfo
Definition: imm.c:19
#define HANDLEENTRY_DESTROY
Definition: ntuser.h:13
BOOL NTAPI NtUserValidateHandleSecure(HANDLE hHdl)
Definition: object.c:792
struct _USER_HANDLE_ENTRY * PUSER_HANDLE_ENTRY
#define FIRST_USER_HANDLE
Definition: ntuser.h:10
#define ASSERT(a)
Definition: mode.c:44
static PVOID ptr
Definition: dispmode.c:27
unsigned int UINT
Definition: ndis.h:50
PVOID aheList
Definition: ntuser.h:1131
ULONG_PTR ulSharedDelta
Definition: ntuser.h:1133
Definition: ntuser.h:17
void * ptr
Definition: ntuser.h:18
unsigned char type
Definition: ntuser.h:25
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define HIWORD(l)
Definition: typedefs.h:247
static PVOID FASTCALL DesktopPtrToUser(PVOID ptr)
Definition: utils.c:188

Referenced by ImmCallImeConsoleIME(), and MENU_GetMenu().

Variable Documentation

◆ g_aimm_compat_flags

DWORD g_aimm_compat_flags
extern

Definition at line 204 of file ctf.c.

Referenced by CtfImmSetAppCompatFlags(), and ImmGetAppCompatFlags().

◆ gcsImeDpi

◆ ghImm32Inst

◆ ghImmHeap

HANDLE ghImmHeap
extern

Definition at line 16 of file utils.c.

Referenced by ImmLocalAlloc().

◆ gpImeDpiList

PIMEDPI gpImeDpiList
extern

◆ gpsi

PSERVERINFO gpsi
extern

Definition at line 18 of file imm.c.

◆ gSharedInfo

SHAREDINFO gSharedInfo
extern

Definition at line 19 of file imm.c.