[IMM32] Improve debuggability at all (#4798)

- Strengthen tracing.
- Introduce IS_NULL_UNEXPECTEDLY, IS_ZERO_UNEXPECTEDLY etc. macros to manage tracing.
CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2022-10-23 09:51:24 +09:00 committed by GitHub
parent e6fb0e0c25
commit c2a943653e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 687 additions and 356 deletions

View file

@ -161,19 +161,19 @@ ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWOR
LPCANDIDATELIST pCL; LPCANDIDATELIST pCL;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (!pClientImc) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return 0; return 0;
uCodePage = pClientImc->uCodePage; uCodePage = pClientImc->uCodePage;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
{ {
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
return 0; return 0;
} }
pCI = ImmLockIMCC(pIC->hCandInfo); pCI = ImmLockIMCC(pIC->hCandInfo);
if (pCI == NULL) if (IS_NULL_UNEXPECTEDLY(pCI))
{ {
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
@ -181,7 +181,10 @@ ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWOR
} }
if (pCI->dwSize < sizeof(CANDIDATEINFO) || pCI->dwCount <= dwIndex) if (pCI->dwSize < sizeof(CANDIDATEINFO) || pCI->dwCount <= dwIndex)
{
ERR("\n");
goto Quit; goto Quit;
}
/* get required size */ /* get required size */
pCL = (LPCANDIDATELIST)((LPBYTE)pCI + pCI->dwOffset[dwIndex]); pCL = (LPCANDIDATELIST)((LPBYTE)pCI + pCI->dwOffset[dwIndex]);
@ -245,17 +248,17 @@ ImmGetCandidateListCountAW(HIMC hIMC, LPDWORD lpdwListCount, BOOL bAnsi)
const CANDIDATELIST *pCL; const CANDIDATELIST *pCL;
const DWORD *pdwOffsets; const DWORD *pdwOffsets;
if (lpdwListCount == NULL) if (IS_NULL_UNEXPECTEDLY(lpdwListCount))
return 0; return 0;
*lpdwListCount = 0; *lpdwListCount = 0;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (pClientImc == NULL) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return 0; return 0;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
{ {
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
return 0; return 0;
@ -264,7 +267,7 @@ ImmGetCandidateListCountAW(HIMC hIMC, LPDWORD lpdwListCount, BOOL bAnsi)
uCodePage = pClientImc->uCodePage; uCodePage = pClientImc->uCodePage;
pCI = ImmLockIMCC(pIC->hCandInfo); pCI = ImmLockIMCC(pIC->hCandInfo);
if (pCI == NULL) if (IS_NULL_UNEXPECTEDLY(pCI))
{ {
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
@ -272,7 +275,10 @@ ImmGetCandidateListCountAW(HIMC hIMC, LPDWORD lpdwListCount, BOOL bAnsi)
} }
if (pCI->dwSize < sizeof(CANDIDATEINFO)) if (pCI->dwSize < sizeof(CANDIDATEINFO))
{
ERR("\n");
goto Quit; goto Quit;
}
*lpdwListCount = pCI->dwCount; /* the number of candidate lists */ *lpdwListCount = pCI->dwCount; /* the number of candidate lists */
@ -371,10 +377,13 @@ ImmGetCandidateWindow(HIMC hIMC, DWORD dwIndex, LPCANDIDATEFORM lpCandidate)
TRACE("(%p, %lu, %p)\n", hIMC, dwIndex, lpCandidate); TRACE("(%p, %lu, %p)\n", hIMC, dwIndex, lpCandidate);
if (dwIndex >= MAX_CANDIDATEFORM) /* Windows didn't check but we do for security reason */ if (dwIndex >= MAX_CANDIDATEFORM) /* Windows didn't check but we do for security reason */
{
ERR("\n");
return FALSE; return FALSE;
}
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
pCF = &pIC->cfCandForm[dwIndex]; pCF = &pIC->cfCandForm[dwIndex];
@ -383,6 +392,10 @@ ImmGetCandidateWindow(HIMC hIMC, DWORD dwIndex, LPCANDIDATEFORM lpCandidate)
*lpCandidate = *pCF; *lpCandidate = *pCF;
ret = TRUE; ret = TRUE;
} }
else
{
ERR("\n");
}
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
TRACE("ret: %d\n", ret); TRACE("ret: %d\n", ret);
@ -400,13 +413,16 @@ BOOL WINAPI ImmSetCandidateWindow(HIMC hIMC, LPCANDIDATEFORM lpCandidate)
TRACE("(%p, %p)\n", hIMC, lpCandidate); TRACE("(%p, %p)\n", hIMC, lpCandidate);
if (lpCandidate->dwIndex >= MAX_CANDIDATEFORM) if (lpCandidate->dwIndex >= MAX_CANDIDATEFORM)
{
ERR("\n");
return FALSE; return FALSE;
}
if (Imm32IsCrossThreadAccess(hIMC)) if (IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
hWnd = pIC->hWnd; hWnd = pIC->hWnd;

View file

@ -23,11 +23,11 @@ Imm32OpenICAndCS(HIMC hIMC, LPINPUTCONTEXT *ppIC, LPCOMPOSITIONSTRING *ppCS)
*ppCS = NULL; *ppCS = NULL;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
pCS = ImmLockIMCC(pIC->hCompStr); pCS = ImmLockIMCC(pIC->hCompStr);
if (!pCS) if (IS_NULL_UNEXPECTEDLY(pCS))
{ {
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
return FALSE; return FALSE;
@ -272,7 +272,7 @@ Imm32GetCompStrA(HIMC hIMC, const COMPOSITIONSTRING *pCS, DWORD dwIndex,
break; break;
default: default:
FIXME("TODO:\n"); FIXME("\n");
return IMM_ERROR_GENERAL; return IMM_ERROR_GENERAL;
} }
} }
@ -357,7 +357,7 @@ Imm32GetCompStrA(HIMC hIMC, const COMPOSITIONSTRING *pCS, DWORD dwIndex,
break; break;
default: default:
FIXME("TODO:\n"); FIXME("\n");
return IMM_ERROR_GENERAL; return IMM_ERROR_GENERAL;
} }
} }
@ -449,7 +449,7 @@ Imm32GetCompStrW(HIMC hIMC, const COMPOSITIONSTRING *pCS, DWORD dwIndex,
break; break;
default: default:
FIXME("TODO:\n"); FIXME("\n");
return IMM_ERROR_GENERAL; return IMM_ERROR_GENERAL;
} }
} }
@ -506,7 +506,7 @@ Imm32GetCompStrW(HIMC hIMC, const COMPOSITIONSTRING *pCS, DWORD dwIndex,
break; break;
default: default:
FIXME("TODO:\n"); FIXME("\n");
return IMM_ERROR_GENERAL; return IMM_ERROR_GENERAL;
} }
} }
@ -531,11 +531,14 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
dwThreadId = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTTHREADID); dwThreadId = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTTHREADID);
if (dwThreadId != GetCurrentThreadId()) if (dwThreadId != GetCurrentThreadId())
{
ERR("\n");
return FALSE; return FALSE;
}
hKL = GetKeyboardLayout(dwThreadId); hKL = GetKeyboardLayout(dwThreadId);
pImeDpi = ImmLockImeDpi(hKL); pImeDpi = ImmLockImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return FALSE; return FALSE;
uCodePage = pImeDpi->uCodePage; uCodePage = pImeDpi->uCodePage;
@ -551,11 +554,12 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
break; break;
/* FALL THROUGH */ /* FALL THROUGH */
default: default:
ERR("\n");
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
return FALSE; return FALSE;
} }
if (bAnsiAPI == bAnsiClient || (!pComp && !pRead)) if (bAnsiAPI == bAnsiClient || (!pComp && !pRead)) /* No conversion needed */
{ {
ret = pImeDpi->ImeSetCompositionString(hIMC, dwIndex, pComp, dwCompLen, ret = pImeDpi->ImeSetCompositionString(hIMC, dwIndex, pComp, dwCompLen,
pRead, dwReadLen); pRead, dwReadLen);
@ -565,6 +569,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
if (!Imm32OpenICAndCS(hIMC, &pIC, &pCS)) if (!Imm32OpenICAndCS(hIMC, &pIC, &pCS))
{ {
ERR("\n");
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
return FALSE; return FALSE;
} }
@ -585,7 +590,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
{ {
cbCompNew = Imm32CompStrWideToAnsi(pComp, dwCompLen, NULL, 0, uCodePage); cbCompNew = Imm32CompStrWideToAnsi(pComp, dwCompLen, NULL, 0, uCodePage);
pCompNew = ImmLocalAlloc(0, cbCompNew); pCompNew = ImmLocalAlloc(0, cbCompNew);
if (!pCompNew) if (IS_NULL_UNEXPECTEDLY(pCompNew))
goto Quit; goto Quit;
Imm32CompStrWideToAnsi(pComp, dwCompLen, pCompNew, cbCompNew, uCodePage); Imm32CompStrWideToAnsi(pComp, dwCompLen, pCompNew, cbCompNew, uCodePage);
@ -594,7 +599,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
{ {
cbCompNew = Imm32CompStrAnsiToWide(pComp, dwCompLen, NULL, 0, uCodePage); cbCompNew = Imm32CompStrAnsiToWide(pComp, dwCompLen, NULL, 0, uCodePage);
pCompNew = ImmLocalAlloc(0, cbCompNew); pCompNew = ImmLocalAlloc(0, cbCompNew);
if (!pCompNew) if (IS_NULL_UNEXPECTEDLY(pCompNew))
goto Quit; goto Quit;
Imm32CompStrAnsiToWide(pComp, dwCompLen, pCompNew, cbCompNew, uCodePage); Imm32CompStrAnsiToWide(pComp, dwCompLen, pCompNew, cbCompNew, uCodePage);
@ -607,7 +612,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
{ {
cbReadNew = Imm32CompStrWideToAnsi(pRead, dwReadLen, NULL, 0, uCodePage); cbReadNew = Imm32CompStrWideToAnsi(pRead, dwReadLen, NULL, 0, uCodePage);
pReadNew = ImmLocalAlloc(0, cbReadNew); pReadNew = ImmLocalAlloc(0, cbReadNew);
if (!pReadNew) if (IS_NULL_UNEXPECTEDLY(pReadNew))
goto Quit; goto Quit;
Imm32CompStrWideToAnsi(pRead, dwReadLen, pReadNew, cbReadNew, uCodePage); Imm32CompStrWideToAnsi(pRead, dwReadLen, pReadNew, cbReadNew, uCodePage);
@ -616,7 +621,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
{ {
cbReadNew = Imm32CompStrAnsiToWide(pRead, dwReadLen, NULL, 0, uCodePage); cbReadNew = Imm32CompStrAnsiToWide(pRead, dwReadLen, NULL, 0, uCodePage);
pReadNew = ImmLocalAlloc(0, cbReadNew); pReadNew = ImmLocalAlloc(0, cbReadNew);
if (!pReadNew) if (IS_NULL_UNEXPECTEDLY(pReadNew))
goto Quit; goto Quit;
Imm32CompStrAnsiToWide(pRead, dwReadLen, pReadNew, cbReadNew, uCodePage); Imm32CompStrAnsiToWide(pRead, dwReadLen, pReadNew, cbReadNew, uCodePage);
@ -634,7 +639,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
CS_SizeW(pCS, CompStr), CS_SizeW(pCS, CompStr),
NULL, 0, uCodePage); NULL, 0, uCodePage);
pCompNew = ImmLocalAlloc(0, cbCompNew); pCompNew = ImmLocalAlloc(0, cbCompNew);
if (!pCompNew) if (IS_NULL_UNEXPECTEDLY(pCompNew))
goto Quit; goto Quit;
Imm32CompAttrWideToAnsi(pComp, dwCompLen, Imm32CompAttrWideToAnsi(pComp, dwCompLen,
@ -648,7 +653,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
CS_SizeA(pCS, CompStr), CS_SizeA(pCS, CompStr),
NULL, 0, uCodePage); NULL, 0, uCodePage);
pCompNew = ImmLocalAlloc(0, cbCompNew); pCompNew = ImmLocalAlloc(0, cbCompNew);
if (!pCompNew) if (IS_NULL_UNEXPECTEDLY(pCompNew))
goto Quit; goto Quit;
Imm32CompAttrAnsiToWide(pComp, dwCompLen, Imm32CompAttrAnsiToWide(pComp, dwCompLen,
@ -666,7 +671,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
CS_SizeW(pCS, CompReadStr), CS_SizeW(pCS, CompReadStr),
NULL, 0, uCodePage); NULL, 0, uCodePage);
pReadNew = ImmLocalAlloc(0, cbReadNew); pReadNew = ImmLocalAlloc(0, cbReadNew);
if (!pReadNew) if (IS_NULL_UNEXPECTEDLY(pReadNew))
goto Quit; goto Quit;
Imm32CompAttrWideToAnsi(pRead, dwReadLen, Imm32CompAttrWideToAnsi(pRead, dwReadLen,
@ -680,7 +685,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
CS_SizeA(pCS, CompReadStr), CS_SizeA(pCS, CompReadStr),
NULL, 0, uCodePage); NULL, 0, uCodePage);
pReadNew = ImmLocalAlloc(0, cbReadNew); pReadNew = ImmLocalAlloc(0, cbReadNew);
if (!pReadNew) if (IS_NULL_UNEXPECTEDLY(pReadNew))
goto Quit; goto Quit;
Imm32CompAttrAnsiToWide(pRead, dwReadLen, Imm32CompAttrAnsiToWide(pRead, dwReadLen,
@ -698,7 +703,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
cbCompNew = Imm32CompClauseWideToAnsi(pComp, dwCompLen, CS_StrW(pCS, CompStr), cbCompNew = Imm32CompClauseWideToAnsi(pComp, dwCompLen, CS_StrW(pCS, CompStr),
NULL, 0, uCodePage); NULL, 0, uCodePage);
pCompNew = ImmLocalAlloc(0, cbCompNew); pCompNew = ImmLocalAlloc(0, cbCompNew);
if (!pCompNew) if (IS_NULL_UNEXPECTEDLY(pCompNew))
goto Quit; goto Quit;
Imm32CompClauseWideToAnsi(pComp, dwCompLen, CS_StrW(pCS, CompStr), Imm32CompClauseWideToAnsi(pComp, dwCompLen, CS_StrW(pCS, CompStr),
@ -709,7 +714,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
cbCompNew = Imm32CompClauseAnsiToWide(pComp, dwCompLen, CS_StrA(pCS, CompStr), cbCompNew = Imm32CompClauseAnsiToWide(pComp, dwCompLen, CS_StrA(pCS, CompStr),
NULL, 0, uCodePage); NULL, 0, uCodePage);
pCompNew = ImmLocalAlloc(0, cbCompNew); pCompNew = ImmLocalAlloc(0, cbCompNew);
if (!pCompNew) if (IS_NULL_UNEXPECTEDLY(pCompNew))
goto Quit; goto Quit;
Imm32CompClauseAnsiToWide(pComp, dwCompLen, CS_StrA(pCS, CompStr), Imm32CompClauseAnsiToWide(pComp, dwCompLen, CS_StrA(pCS, CompStr),
@ -724,7 +729,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
cbReadNew = Imm32CompClauseWideToAnsi(pRead, dwReadLen, CS_StrW(pCS, CompReadStr), cbReadNew = Imm32CompClauseWideToAnsi(pRead, dwReadLen, CS_StrW(pCS, CompReadStr),
NULL, 0, uCodePage); NULL, 0, uCodePage);
pReadNew = ImmLocalAlloc(0, cbReadNew); pReadNew = ImmLocalAlloc(0, cbReadNew);
if (!pReadNew) if (IS_NULL_UNEXPECTEDLY(pReadNew))
goto Quit; goto Quit;
Imm32CompClauseWideToAnsi(pRead, dwReadLen, Imm32CompClauseWideToAnsi(pRead, dwReadLen,
@ -736,7 +741,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
cbReadNew = Imm32CompClauseAnsiToWide(pRead, dwReadLen, CS_StrA(pCS, CompReadStr), cbReadNew = Imm32CompClauseAnsiToWide(pRead, dwReadLen, CS_StrA(pCS, CompReadStr),
NULL, 0, uCodePage); NULL, 0, uCodePage);
pReadNew = ImmLocalAlloc(0, cbReadNew); pReadNew = ImmLocalAlloc(0, cbReadNew);
if (!pReadNew) if (IS_NULL_UNEXPECTEDLY(pReadNew))
goto Quit; goto Quit;
Imm32CompClauseAnsiToWide(pRead, dwReadLen, CS_StrA(pCS, CompReadStr), Imm32CompClauseAnsiToWide(pRead, dwReadLen, CS_StrA(pCS, CompReadStr),
@ -753,7 +758,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
{ {
cbCompNew = Imm32ReconvertAnsiFromWide(NULL, pComp, uCodePage); cbCompNew = Imm32ReconvertAnsiFromWide(NULL, pComp, uCodePage);
pCompNew = ImmLocalAlloc(0, cbCompNew); pCompNew = ImmLocalAlloc(0, cbCompNew);
if (!pCompNew) if (IS_NULL_UNEXPECTEDLY(pCompNew))
goto Quit; goto Quit;
pRS = pCompNew; pRS = pCompNew;
@ -765,7 +770,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
{ {
cbCompNew = Imm32ReconvertWideFromAnsi(NULL, pComp, uCodePage); cbCompNew = Imm32ReconvertWideFromAnsi(NULL, pComp, uCodePage);
pCompNew = ImmLocalAlloc(0, cbCompNew); pCompNew = ImmLocalAlloc(0, cbCompNew);
if (!pCompNew) if (IS_NULL_UNEXPECTEDLY(pCompNew))
goto Quit; goto Quit;
pRS = pCompNew; pRS = pCompNew;
@ -781,7 +786,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
{ {
cbReadNew = Imm32ReconvertAnsiFromWide(NULL, pRead, uCodePage); cbReadNew = Imm32ReconvertAnsiFromWide(NULL, pRead, uCodePage);
pReadNew = ImmLocalAlloc(0, cbReadNew); pReadNew = ImmLocalAlloc(0, cbReadNew);
if (!pReadNew) if (IS_NULL_UNEXPECTEDLY(pReadNew))
goto Quit; goto Quit;
pRS = pReadNew; pRS = pReadNew;
@ -793,7 +798,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
{ {
cbReadNew = Imm32ReconvertWideFromAnsi(NULL, pRead, uCodePage); cbReadNew = Imm32ReconvertWideFromAnsi(NULL, pRead, uCodePage);
pReadNew = ImmLocalAlloc(0, cbReadNew); pReadNew = ImmLocalAlloc(0, cbReadNew);
if (!pReadNew) if (IS_NULL_UNEXPECTEDLY(pReadNew))
goto Quit; goto Quit;
pRS = pReadNew; pRS = pReadNew;
@ -859,11 +864,11 @@ LONG WINAPI ImmGetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWO
TRACE("(%p, %lu, %p, %lu)\n", hIMC, dwIndex, lpBuf, dwBufLen); TRACE("(%p, %lu, %p, %lu)\n", hIMC, dwIndex, lpBuf, dwBufLen);
if (dwBufLen && !lpBuf) if (dwBufLen && IS_NULL_UNEXPECTEDLY(lpBuf))
return 0; return 0;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (!pClientImc) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return 0; return 0;
bAnsiClient = !(pClientImc->dwFlags & CLIENTIMC_WIDE); bAnsiClient = !(pClientImc->dwFlags & CLIENTIMC_WIDE);
@ -871,11 +876,11 @@ LONG WINAPI ImmGetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWO
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
return 0; return 0;
pCS = ImmLockIMCC(pIC->hCompStr); pCS = ImmLockIMCC(pIC->hCompStr);
if (!pCS) if (IS_NULL_UNEXPECTEDLY(pCS))
{ {
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
return 0; return 0;
@ -902,11 +907,11 @@ LONG WINAPI ImmGetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWO
TRACE("(%p, %lu, %p, %lu)\n", hIMC, dwIndex, lpBuf, dwBufLen); TRACE("(%p, %lu, %p, %lu)\n", hIMC, dwIndex, lpBuf, dwBufLen);
if (dwBufLen && !lpBuf) if (dwBufLen && IS_NULL_UNEXPECTEDLY(lpBuf))
return 0; return 0;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (!pClientImc) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return 0; return 0;
bAnsiClient = !(pClientImc->dwFlags & CLIENTIMC_WIDE); bAnsiClient = !(pClientImc->dwFlags & CLIENTIMC_WIDE);
@ -914,11 +919,11 @@ LONG WINAPI ImmGetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWO
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
return 0; return 0;
pCS = ImmLockIMCC(pIC->hCompStr); pCS = ImmLockIMCC(pIC->hCompStr);
if (!pCS) if (IS_NULL_UNEXPECTEDLY(pCS))
{ {
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
return 0; return 0;

View file

@ -20,7 +20,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(imm);
// Win: LoadCtfIme // Win: LoadCtfIme
HMODULE APIENTRY Imm32LoadCtfIme(VOID) HMODULE APIENTRY Imm32LoadCtfIme(VOID)
{ {
FIXME("()\n");
return NULL; return NULL;
} }
@ -29,6 +28,7 @@ HRESULT APIENTRY Imm32CtfImeDestroyInputContext(HIMC hIMC)
{ {
if (!Imm32LoadCtfIme()) if (!Imm32LoadCtfIme())
return E_FAIL; return E_FAIL;
#if 1 #if 1
FIXME("(%p)\n", hIMC); FIXME("(%p)\n", hIMC);
return E_NOTIMPL; return E_NOTIMPL;
@ -126,7 +126,7 @@ BOOL WINAPI CtfImmIsGuidMapEnable(HIMC hIMC)
return ret; return ret;
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return ret; return ret;
ret = pImeDpi->CtfImeIsGuidMapEnable(hIMC); ret = pImeDpi->CtfImeIsGuidMapEnable(hIMC);
@ -158,7 +158,7 @@ HRESULT WINAPI CtfImmGetGuidAtom(HIMC hIMC, DWORD dwUnknown, LPDWORD pdwGuidAtom
return S_OK; return S_OK;
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return hr; return hr;
hr = pImeDpi->CtfImeGetGuidAtom(hIMC, dwUnknown, pdwGuidAtom); hr = pImeDpi->CtfImeGetGuidAtom(hIMC, dwUnknown, pdwGuidAtom);

View file

@ -22,20 +22,20 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
UINT uCodePage; UINT uCodePage;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (!pClientImc) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return 0; return 0;
uCodePage = pClientImc->uCodePage; uCodePage = pClientImc->uCodePage;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
{ {
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
return 0; return 0;
} }
pGuideLine = ImmLockIMCC(pIC->hGuideLine); pGuideLine = ImmLockIMCC(pIC->hGuideLine);
if (!pGuideLine) if (IS_NULL_UNEXPECTEDLY(pGuideLine))
{ {
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);

View file

@ -60,21 +60,28 @@ BOOL APIENTRY Imm32InquireIme(PIMEDPI pImeDpi)
if (IS_IME_HKL(pImeDpi->hKL)) if (IS_IME_HKL(pImeDpi->hKL))
{ {
if (!pImeDpi->ImeInquire(pImeInfo, szUIClass, dwSysInfoFlags)) if (!pImeDpi->ImeInquire(pImeInfo, szUIClass, dwSysInfoFlags))
{
ERR("\n");
return FALSE; return FALSE;
}
} }
else if (IS_CICERO_MODE() && !IS_16BIT_MODE()) else if (IS_CICERO_MODE() && !IS_16BIT_MODE())
{ {
if (!pImeDpi->CtfImeInquireExW(pImeInfo, szUIClass, dwSysInfoFlags, pImeDpi->hKL)) if (!pImeDpi->CtfImeInquireExW(pImeInfo, szUIClass, dwSysInfoFlags, pImeDpi->hKL))
{
ERR("\n");
return FALSE; return FALSE;
}
} }
else else
{ {
ERR("\n");
return FALSE; return FALSE;
} }
szUIClass[_countof(szUIClass) - 1] = UNICODE_NULL; /* Avoid buffer overrun */ szUIClass[_countof(szUIClass) - 1] = UNICODE_NULL; /* Avoid buffer overrun */
if (pImeInfo->dwPrivateDataSize == 0) if (pImeInfo->dwPrivateDataSize < sizeof(DWORD))
pImeInfo->dwPrivateDataSize = sizeof(DWORD); pImeInfo->dwPrivateDataSize = sizeof(DWORD);
#define VALID_IME_PROP (IME_PROP_AT_CARET | \ #define VALID_IME_PROP (IME_PROP_AT_CARET | \
@ -117,17 +124,35 @@ BOOL APIENTRY Imm32InquireIme(PIMEDPI pImeDpi)
#define VALID_SELECT_CAPS (SELECT_CAP_CONVERSION | SELECT_CAP_SENTENCE) #define VALID_SELECT_CAPS (SELECT_CAP_CONVERSION | SELECT_CAP_SENTENCE)
if (pImeInfo->fdwProperty & ~VALID_IME_PROP) if (pImeInfo->fdwProperty & ~VALID_IME_PROP)
{
ERR("\n");
return FALSE; return FALSE;
}
if (pImeInfo->fdwConversionCaps & ~VALID_CMODE_CAPS) if (pImeInfo->fdwConversionCaps & ~VALID_CMODE_CAPS)
{
ERR("\n");
return FALSE; return FALSE;
}
if (pImeInfo->fdwSentenceCaps & ~VALID_SMODE_CAPS) if (pImeInfo->fdwSentenceCaps & ~VALID_SMODE_CAPS)
{
ERR("\n");
return FALSE; return FALSE;
}
if (pImeInfo->fdwUICaps & ~VALID_UI_CAPS) if (pImeInfo->fdwUICaps & ~VALID_UI_CAPS)
{
ERR("\n");
return FALSE; return FALSE;
}
if (pImeInfo->fdwSCSCaps & ~VALID_SCS_CAPS) if (pImeInfo->fdwSCSCaps & ~VALID_SCS_CAPS)
{
ERR("\n");
return FALSE; return FALSE;
}
if (pImeInfo->fdwSelectCaps & ~VALID_SELECT_CAPS) if (pImeInfo->fdwSelectCaps & ~VALID_SELECT_CAPS)
{
ERR("\n");
return FALSE; return FALSE;
}
#undef VALID_IME_PROP #undef VALID_IME_PROP
#undef VALID_CMODE_CAPS #undef VALID_CMODE_CAPS
@ -151,7 +176,13 @@ BOOL APIENTRY Imm32InquireIme(PIMEDPI pImeDpi)
pImeDpi->szUIClass[_countof(pImeDpi->szUIClass) - 1] = UNICODE_NULL; pImeDpi->szUIClass[_countof(pImeDpi->szUIClass) - 1] = UNICODE_NULL;
} }
return GetClassInfoW(pImeDpi->hInst, pImeDpi->szUIClass, &wcW); if (!GetClassInfoW(pImeDpi->hInst, pImeDpi->szUIClass, &wcW))
{
ERR("\n");
return FALSE;
}
return TRUE;
} }
/* Define stub IME functions */ /* Define stub IME functions */
@ -177,7 +208,7 @@ BOOL APIENTRY Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
pImeDpi->hInst = hIME = LoadLibraryW(szPath); pImeDpi->hInst = hIME = LoadLibraryW(szPath);
if (hIME == NULL) if (hIME == NULL)
{ {
ERR("Imm32LoadIME: LoadLibraryW(%s) failed\n", debugstr_w(szPath)); ERR("LoadLibraryW(%s) failed\n", debugstr_w(szPath));
return FALSE; return FALSE;
} }
@ -242,14 +273,23 @@ PIMEDPI APIENTRY Imm32LoadImeDpi(HKL hKL, BOOL bLock)
UINT uCodePage; UINT uCodePage;
LCID lcid; LCID lcid;
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL) || if (!IS_IME_HKL(hKL))
ImeInfoEx.fLoadFlag == 1) return NULL;
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
{ {
ERR("\n");
return NULL;
}
if (ImeInfoEx.fLoadFlag == 1)
{
ERR("\n");
return NULL; return NULL;
} }
pImeDpiNew = ImmLocalAlloc(HEAP_ZERO_MEMORY, sizeof(IMEDPI)); pImeDpiNew = ImmLocalAlloc(HEAP_ZERO_MEMORY, sizeof(IMEDPI));
if (pImeDpiNew == NULL) if (IS_NULL_UNEXPECTEDLY(pImeDpiNew))
return NULL; return NULL;
pImeDpiNew->hKL = hKL; pImeDpiNew->hKL = hKL;
@ -263,6 +303,7 @@ PIMEDPI APIENTRY Imm32LoadImeDpi(HKL hKL, BOOL bLock)
if (!Imm32LoadIME(&ImeInfoEx, pImeDpiNew)) if (!Imm32LoadIME(&ImeInfoEx, pImeDpiNew))
{ {
ERR("\n");
ImmLocalFree(pImeDpiNew); ImmLocalFree(pImeDpiNew);
return FALSE; return FALSE;
} }
@ -302,7 +343,10 @@ PIMEDPI APIENTRY Imm32FindOrLoadImeDpi(HKL hKL)
PIMEDPI pImeDpi; PIMEDPI pImeDpi;
if (!IS_IME_HKL(hKL) && (!IS_CICERO_MODE() || IS_16BIT_MODE())) if (!IS_IME_HKL(hKL) && (!IS_CICERO_MODE() || IS_16BIT_MODE()))
{
ERR("\n");
return NULL; return NULL;
}
pImeDpi = ImmLockImeDpi(hKL); pImeDpi = ImmLockImeDpi(hKL);
if (pImeDpi == NULL) if (pImeDpi == NULL)
@ -315,7 +359,6 @@ ImeDpi_Escape(PIMEDPI pImeDpi, HIMC hIMC, UINT uSubFunc, LPVOID lpData, HKL hKL)
{ {
if (IS_IME_HKL(hKL)) if (IS_IME_HKL(hKL))
return pImeDpi->ImeEscape(hIMC, uSubFunc, lpData); return pImeDpi->ImeEscape(hIMC, uSubFunc, lpData);
if (IS_CICERO_MODE() && !IS_16BIT_MODE()) if (IS_CICERO_MODE() && !IS_16BIT_MODE())
return pImeDpi->CtfImeEscapeEx(hIMC, uSubFunc, lpData, hKL); return pImeDpi->CtfImeEscapeEx(hIMC, uSubFunc, lpData, hKL);
@ -412,7 +455,7 @@ LRESULT WINAPI ImmPutImeMenuItemsIntoMappedFile(HIMC hIMC)
pView = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); pView = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (!pView || pView->dwVersion != 1) if (!pView || pView->dwVersion != 1)
{ {
ERR("hMapping %p, pView %p\n", hMapping, pView); ERR("\n");
goto Quit; goto Quit;
} }
@ -423,16 +466,13 @@ LRESULT WINAPI ImmPutImeMenuItemsIntoMappedFile(HIMC hIMC)
{ {
cbItems = pView->dwItemCount * sizeof(IMEMENUITEMINFOW); cbItems = pView->dwItemCount * sizeof(IMEMENUITEMINFOW);
pItems = ImmLocalAlloc(HEAP_ZERO_MEMORY, cbItems); pItems = ImmLocalAlloc(HEAP_ZERO_MEMORY, cbItems);
if (!pItems) if (IS_NULL_UNEXPECTEDLY(pItems))
{
ERR("!pItems\n");
goto Quit; goto Quit;
}
} }
cItems = ImmGetImeMenuItemsW(hIMC, pView->dwFlags, pView->dwType, pParent, pItems, cbItems); cItems = ImmGetImeMenuItemsW(hIMC, pView->dwFlags, pView->dwType, pParent, pItems, cbItems);
pView->dwItemCount = cItems; pView->dwItemCount = cItems;
if (cItems == 0) if (IS_ZERO_UNEXPECTEDLY(cItems))
goto Quit; goto Quit;
if (pItems) if (pItems)
@ -490,7 +530,7 @@ Imm32GetImeMenuItemWInterProcess(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID
hImeWnd = (HWND)NtUserQueryInputContext(hIMC, QIC_DEFAULTWINDOWIME); hImeWnd = (HWND)NtUserQueryInputContext(hIMC, QIC_DEFAULTWINDOWIME);
if (!hImeWnd || !IsWindow(hImeWnd)) if (!hImeWnd || !IsWindow(hImeWnd))
{ {
ERR("hImeWnd %p\n", hImeWnd); ERR("\n");
return 0; return 0;
} }
@ -503,11 +543,8 @@ Imm32GetImeMenuItemWInterProcess(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID
hMapping = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, hMapping = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
0, cbView, L"ImmMenuInfo"); 0, cbView, L"ImmMenuInfo");
pView = MapViewOfFile(hMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); pView = MapViewOfFile(hMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
if (!pView) if (IS_NULL_UNEXPECTEDLY(pView))
{
ERR("hMapping %p, pView %p\n", hMapping, pView);
goto Quit; goto Quit;
}
ZeroMemory(pView, cbView); ZeroMemory(pView, cbView);
pView->dwVersion = 1; pView->dwVersion = 1;
@ -521,7 +558,10 @@ Imm32GetImeMenuItemWInterProcess(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID
} }
if (!SendMessageW(hImeWnd, WM_IME_SYSTEM, IMS_GETIMEMENU, (LPARAM)hIMC)) if (!SendMessageW(hImeWnd, WM_IME_SYSTEM, IMS_GETIMEMENU, (LPARAM)hIMC))
{
ERR("\n");
goto Quit; goto Quit;
}
ret = pView->dwItemCount; ret = pView->dwItemCount;
@ -575,11 +615,11 @@ ImmGetImeMenuItemsAW(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID lpImeParentM
BOOL bImcIsAnsi; BOOL bImcIsAnsi;
HKL hKL; HKL hKL;
if (!hIMC) if (IS_NULL_UNEXPECTEDLY(hIMC))
return 0; return 0;
dwProcessId = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTPROCESSID); dwProcessId = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTPROCESSID);
if (dwProcessId == 0) if (IS_ZERO_UNEXPECTEDLY(dwProcessId))
return 0; return 0;
if (dwProcessId != GetCurrentProcessId()) if (dwProcessId != GetCurrentProcessId())
@ -591,11 +631,11 @@ ImmGetImeMenuItemsAW(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID lpImeParentM
} }
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return 0; return 0;
dwThreadId = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTTHREADID); dwThreadId = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTTHREADID);
if (dwThreadId == 0) if (IS_ZERO_UNEXPECTEDLY(dwThreadId))
{ {
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
return 0; return 0;
@ -603,7 +643,7 @@ ImmGetImeMenuItemsAW(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID lpImeParentM
hKL = GetKeyboardLayout(dwThreadId); hKL = GetKeyboardLayout(dwThreadId);
pImeDpi = ImmLockImeDpi(hKL); pImeDpi = ImmLockImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
{ {
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
return 0; return 0;
@ -622,7 +662,7 @@ ImmGetImeMenuItemsAW(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID lpImeParentM
{ {
cbTotal = ((dwSize / sizeof(IMEMENUITEMINFOA)) * sizeof(IMEMENUITEMINFOW)); cbTotal = ((dwSize / sizeof(IMEMENUITEMINFOA)) * sizeof(IMEMENUITEMINFOW));
pNewItems = ImmLocalAlloc(0, cbTotal); pNewItems = ImmLocalAlloc(0, cbTotal);
if (!pNewItems) if (IS_NULL_UNEXPECTEDLY(pNewItems))
goto Quit; goto Quit;
} }
} }
@ -635,7 +675,7 @@ ImmGetImeMenuItemsAW(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID lpImeParentM
{ {
cbTotal = ((dwSize / sizeof(IMEMENUITEMINFOW)) * sizeof(IMEMENUITEMINFOA)); cbTotal = ((dwSize / sizeof(IMEMENUITEMINFOW)) * sizeof(IMEMENUITEMINFOA));
pNewItems = ImmLocalAlloc(0, cbTotal); pNewItems = ImmLocalAlloc(0, cbTotal);
if (!pNewItems) if (IS_NULL_UNEXPECTEDLY(pNewItems))
goto Quit; goto Quit;
} }
} }
@ -647,7 +687,7 @@ ImmGetImeMenuItemsAW(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID lpImeParentM
} }
ret = pImeDpi->ImeGetImeMenuItems(hIMC, dwFlags, dwType, pNewParent, pNewItems, dwSize); ret = pImeDpi->ImeGetImeMenuItems(hIMC, dwFlags, dwType, pNewParent, pNewItems, dwSize);
if (!ret || !lpImeMenu) if (IS_ZERO_UNEXPECTEDLY(ret) || !lpImeMenu)
goto Quit; goto Quit;
if (bImcIsAnsi != bTargetIsAnsi) if (bImcIsAnsi != bTargetIsAnsi)
@ -663,6 +703,7 @@ ImmGetImeMenuItemsAW(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID lpImeParentM
{ {
if (!Imm32ImeMenuWideToAnsi(pItemW, pItemA, pImeDpi->uCodePage)) if (!Imm32ImeMenuWideToAnsi(pItemW, pItemA, pImeDpi->uCodePage))
{ {
ERR("\n");
ret = 0; ret = 0;
break; break;
} }
@ -679,6 +720,7 @@ ImmGetImeMenuItemsAW(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID lpImeParentM
{ {
if (!Imm32ImeMenuAnsiToWide(pItemA, pItemW, pImeDpi->uCodePage, TRUE)) if (!Imm32ImeMenuAnsiToWide(pItemA, pItemW, pImeDpi->uCodePage, TRUE))
{ {
ERR("\n");
ret = 0; ret = 0;
break; break;
} }
@ -691,6 +733,7 @@ Quit:
ImmLocalFree(pNewItems); ImmLocalFree(pNewItems);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
TRACE("ret: 0x%X\n", ret);
return ret; return ret;
} }
@ -705,11 +748,11 @@ HKL WINAPI ImmInstallIMEA(LPCSTR lpszIMEFileName, LPCSTR lpszLayoutText)
TRACE("(%s, %s)\n", debugstr_a(lpszIMEFileName), debugstr_a(lpszLayoutText)); TRACE("(%s, %s)\n", debugstr_a(lpszIMEFileName), debugstr_a(lpszLayoutText));
pszFileNameW = Imm32WideFromAnsi(CP_ACP, lpszIMEFileName); pszFileNameW = Imm32WideFromAnsi(CP_ACP, lpszIMEFileName);
if (!pszFileNameW) if (IS_NULL_UNEXPECTEDLY(pszFileNameW))
goto Quit; goto Quit;
pszLayoutTextW = Imm32WideFromAnsi(CP_ACP, lpszLayoutText); pszLayoutTextW = Imm32WideFromAnsi(CP_ACP, lpszLayoutText);
if (!pszLayoutTextW) if (IS_NULL_UNEXPECTEDLY(pszLayoutTextW))
goto Quit; goto Quit;
hKL = ImmInstallIMEW(pszFileNameW, pszLayoutTextW); hKL = ImmInstallIMEW(pszFileNameW, pszLayoutTextW);
@ -737,16 +780,18 @@ HKL WINAPI ImmInstallIMEW(LPCWSTR lpszIMEFileName, LPCWSTR lpszLayoutText)
GetFullPathNameW(lpszIMEFileName, _countof(szImeFileName), szImeFileName, &pchFilePart); GetFullPathNameW(lpszIMEFileName, _countof(szImeFileName), szImeFileName, &pchFilePart);
CharUpperW(szImeFileName); CharUpperW(szImeFileName);
if (!pchFilePart) if (IS_NULL_UNEXPECTEDLY(pchFilePart))
return NULL; return NULL;
/* Load the IME version info */ /* Load the IME version info */
InfoEx.hkl = hNewKL = NULL; InfoEx.hkl = hNewKL = NULL;
StringCchCopyW(InfoEx.wszImeFile, _countof(InfoEx.wszImeFile), pchFilePart); StringCchCopyW(InfoEx.wszImeFile, _countof(InfoEx.wszImeFile), pchFilePart);
if (Imm32LoadImeVerInfo(&InfoEx) && InfoEx.hkl) if (!Imm32LoadImeVerInfo(&InfoEx) || !InfoEx.hkl)
wLangID = LOWORD(InfoEx.hkl); {
else ERR("\n");
return NULL; return NULL;
}
wLangID = LOWORD(InfoEx.hkl);
/* Get the IME layouts from registry */ /* Get the IME layouts from registry */
cLayouts = Imm32GetImeLayout(NULL, 0); cLayouts = Imm32GetImeLayout(NULL, 0);
@ -755,6 +800,7 @@ HKL WINAPI ImmInstallIMEW(LPCWSTR lpszIMEFileName, LPCWSTR lpszLayoutText)
pLayouts = ImmLocalAlloc(0, cLayouts * sizeof(REG_IME)); pLayouts = ImmLocalAlloc(0, cLayouts * sizeof(REG_IME));
if (!pLayouts || !Imm32GetImeLayout(pLayouts, cLayouts)) if (!pLayouts || !Imm32GetImeLayout(pLayouts, cLayouts))
{ {
ERR("\n");
ImmLocalFree(pLayouts); ImmLocalFree(pLayouts);
return NULL; return NULL;
} }
@ -764,7 +810,10 @@ HKL WINAPI ImmInstallIMEW(LPCWSTR lpszIMEFileName, LPCWSTR lpszLayoutText)
if (lstrcmpiW(pLayouts[iLayout].szFileName, pchFilePart) == 0) if (lstrcmpiW(pLayouts[iLayout].szFileName, pchFilePart) == 0)
{ {
if (wLangID != LOWORD(pLayouts[iLayout].hKL)) if (wLangID != LOWORD(pLayouts[iLayout].hKL))
{
ERR("\n");
goto Quit; /* The language is different */ goto Quit; /* The language is different */
}
hNewKL = pLayouts[iLayout].hKL; /* Found */ hNewKL = pLayouts[iLayout].hKL; /* Found */
break; break;
@ -776,6 +825,7 @@ HKL WINAPI ImmInstallIMEW(LPCWSTR lpszIMEFileName, LPCWSTR lpszLayoutText)
if (ImmGetImeInfoEx(&InfoEx, ImeInfoExImeFileName, pchFilePart) && if (ImmGetImeInfoEx(&InfoEx, ImeInfoExImeFileName, pchFilePart) &&
!UnloadKeyboardLayout(InfoEx.hkl)) !UnloadKeyboardLayout(InfoEx.hkl))
{ {
ERR("\n");
hNewKL = NULL; hNewKL = NULL;
goto Quit; goto Quit;
} }
@ -787,6 +837,7 @@ HKL WINAPI ImmInstallIMEW(LPCWSTR lpszIMEFileName, LPCWSTR lpszLayoutText)
if (lstrcmpiW(szImeFileName, szImeDestPath) != 0 && if (lstrcmpiW(szImeFileName, szImeDestPath) != 0 &&
!Imm32CopyImeFile(szImeFileName, szImeDestPath)) !Imm32CopyImeFile(szImeFileName, szImeDestPath))
{ {
ERR("\n");
hNewKL = NULL; hNewKL = NULL;
goto Quit; goto Quit;
} }
@ -800,11 +851,12 @@ HKL WINAPI ImmInstallIMEW(LPCWSTR lpszIMEFileName, LPCWSTR lpszLayoutText)
if (Imm32WriteImeLayout(hNewKL, pchFilePart, lpszLayoutText)) if (Imm32WriteImeLayout(hNewKL, pchFilePart, lpszLayoutText))
{ {
/* Load the keyboard layout */ /* Load the keyboard layout */
Imm32UIntToStr((DWORD)(DWORD_PTR)hNewKL, 16, szImeKey, _countof(szImeKey)); StringCchPrintfW(szImeKey, _countof(szImeKey), L"%08X", (DWORD)(DWORD_PTR)hNewKL);
hNewKL = LoadKeyboardLayoutW(szImeKey, KLF_REPLACELANG); hNewKL = LoadKeyboardLayoutW(szImeKey, KLF_REPLACELANG);
} }
else else
{ {
ERR("\n");
hNewKL = NULL; hNewKL = NULL;
} }
} }
@ -830,7 +882,10 @@ BOOL WINAPI ImmIsIME(HKL hKL)
HWND WINAPI ImmGetDefaultIMEWnd(HWND hWnd) HWND WINAPI ImmGetDefaultIMEWnd(HWND hWnd)
{ {
if (!IS_IMM_MODE()) if (!IS_IMM_MODE())
{
WARN("\n");
return NULL; return NULL;
}
if (hWnd == NULL) if (hWnd == NULL)
return (HWND)NtUserGetThreadState(THREADSTATE_DEFAULTIMEWINDOW); return (HWND)NtUserGetThreadState(THREADSTATE_DEFAULTIMEWINDOW);
@ -849,12 +904,12 @@ BOOL WINAPI ImmNotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue
TRACE("(%p, %lu, %lu, %lu)\n", hIMC, dwAction, dwIndex, dwValue); TRACE("(%p, %lu, %lu, %lu)\n", hIMC, dwAction, dwIndex, dwValue);
if (hIMC && Imm32IsCrossThreadAccess(hIMC)) if (hIMC && IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
hKL = GetKeyboardLayout(0); hKL = GetKeyboardLayout(0);
pImeDpi = ImmLockImeDpi(hKL); pImeDpi = ImmLockImeDpi(hKL);
if (pImeDpi == NULL) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return FALSE; return FALSE;
ret = pImeDpi->NotifyIME(hIMC, dwAction, dwIndex, dwValue); ret = pImeDpi->NotifyIME(hIMC, dwAction, dwIndex, dwValue);
@ -888,7 +943,10 @@ ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearch
if (!IS_IME_HKL(hKL)) if (!IS_IME_HKL(hKL))
{ {
if (CtfImmIsTextFrameServiceDisabled() || !IS_CICERO_MODE() || IS_16BIT_MODE()) if (CtfImmIsTextFrameServiceDisabled() || !IS_CICERO_MODE() || IS_16BIT_MODE())
{
TRACE("\n");
return FALSE; return FALSE;
}
} }
SearchType = ImeInfoExKeyboardLayout; SearchType = ImeInfoExKeyboardLayout;
@ -896,7 +954,10 @@ ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearch
else else
{ {
if (!IS_IME_HKL(hKL)) if (!IS_IME_HKL(hKL))
{
TRACE("\n");
return FALSE; return FALSE;
}
} }
} }
else if (SearchType == ImeInfoExImeFileName) else if (SearchType == ImeInfoExImeFileName)
@ -997,7 +1058,10 @@ BOOL WINAPI ImmLoadIME(HKL hKL)
PIMEDPI pImeDpi; PIMEDPI pImeDpi;
if (!IS_IME_HKL(hKL) && (!IS_CICERO_MODE() || IS_16BIT_MODE())) if (!IS_IME_HKL(hKL) && (!IS_CICERO_MODE() || IS_16BIT_MODE()))
{
TRACE("\n");
return FALSE; return FALSE;
}
pImeDpi = Imm32FindImeDpi(hKL); pImeDpi = Imm32FindImeDpi(hKL);
if (pImeDpi == NULL) if (pImeDpi == NULL)
@ -1023,9 +1087,15 @@ UINT WINAPI ImmGetDescriptionA(HKL hKL, LPSTR lpszDescription, UINT uBufLen)
TRACE("(%p,%p,%d)\n", hKL, lpszDescription, uBufLen); TRACE("(%p,%p,%d)\n", hKL, lpszDescription, uBufLen);
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL) || !IS_IME_HKL(hKL)) if (!IS_IME_HKL(hKL))
return 0; return 0;
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
{
ERR("\n");
return 0;
}
StringCchLengthW(info.wszImeDescription, _countof(info.wszImeDescription), &cch); StringCchLengthW(info.wszImeDescription, _countof(info.wszImeDescription), &cch);
cch = WideCharToMultiByte(CP_ACP, 0, info.wszImeDescription, (INT)cch, cch = WideCharToMultiByte(CP_ACP, 0, info.wszImeDescription, (INT)cch,
lpszDescription, uBufLen, NULL, NULL); lpszDescription, uBufLen, NULL, NULL);
@ -1044,9 +1114,15 @@ UINT WINAPI ImmGetDescriptionW(HKL hKL, LPWSTR lpszDescription, UINT uBufLen)
TRACE("(%p, %p, %d)\n", hKL, lpszDescription, uBufLen); TRACE("(%p, %p, %d)\n", hKL, lpszDescription, uBufLen);
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL) || !IS_IME_HKL(hKL)) if (!IS_IME_HKL(hKL))
return 0; return 0;
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
{
ERR("\n");
return 0;
}
if (uBufLen != 0) if (uBufLen != 0)
StringCchCopyW(lpszDescription, uBufLen, info.wszImeDescription); StringCchCopyW(lpszDescription, uBufLen, info.wszImeDescription);
@ -1065,13 +1141,21 @@ UINT WINAPI ImmGetIMEFileNameA( HKL hKL, LPSTR lpszFileName, UINT uBufLen)
TRACE("(%p, %p, %u)\n", hKL, lpszFileName, uBufLen); TRACE("(%p, %p, %u)\n", hKL, lpszFileName, uBufLen);
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL) || !IS_IME_HKL(hKL)) if (!IS_IME_HKL(hKL))
{ {
if (uBufLen > 0) if (uBufLen > 0)
lpszFileName[0] = 0; lpszFileName[0] = 0;
return 0; return 0;
} }
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
{
ERR("\n");
if (uBufLen > 0)
lpszFileName[0] = 0;
return 0;
}
StringCchLengthW(info.wszImeFile, _countof(info.wszImeFile), &cch); StringCchLengthW(info.wszImeFile, _countof(info.wszImeFile), &cch);
cch = WideCharToMultiByte(CP_ACP, 0, info.wszImeFile, (INT)cch, cch = WideCharToMultiByte(CP_ACP, 0, info.wszImeFile, (INT)cch,
@ -1096,13 +1180,21 @@ UINT WINAPI ImmGetIMEFileNameW(HKL hKL, LPWSTR lpszFileName, UINT uBufLen)
TRACE("(%p, %p, %u)\n", hKL, lpszFileName, uBufLen); TRACE("(%p, %p, %u)\n", hKL, lpszFileName, uBufLen);
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL) || !IS_IME_HKL(hKL)) if (!IS_IME_HKL(hKL))
{ {
if (uBufLen > 0) if (uBufLen > 0)
lpszFileName[0] = 0; lpszFileName[0] = 0;
return 0; return 0;
} }
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
{
ERR("\n");
if (uBufLen > 0)
lpszFileName[0] = 0;
return 0;
}
StringCchLengthW(info.wszImeFile, _countof(info.wszImeFile), &cch); StringCchLengthW(info.wszImeFile, _countof(info.wszImeFile), &cch);
if (uBufLen == 0) if (uBufLen == 0)
return (UINT)cch; return (UINT)cch;
@ -1128,16 +1220,22 @@ DWORD WINAPI ImmGetProperty(HKL hKL, DWORD fdwIndex)
TRACE("(%p, %lu)\n", hKL, fdwIndex); TRACE("(%p, %lu)\n", hKL, fdwIndex);
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL)) if (!IS_IME_HKL(hKL))
return FALSE; return FALSE;
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
{
ERR("\n");
return FALSE;
}
if (fdwIndex == IGP_GETIMEVERSION) if (fdwIndex == IGP_GETIMEVERSION)
return ImeInfoEx.dwImeWinVersion; return ImeInfoEx.dwImeWinVersion;
if (ImeInfoEx.fLoadFlag != 2) if (ImeInfoEx.fLoadFlag != 2)
{ {
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (pImeDpi == NULL) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return FALSE; return FALSE;
pImeInfo = &pImeDpi->ImeInfo; pImeInfo = &pImeDpi->ImeInfo;
@ -1177,10 +1275,10 @@ LRESULT WINAPI ImmEscapeA(HKL hKL, HIMC hIMC, UINT uSubFunc, LPVOID lpData)
TRACE("(%p, %p, %u, %p)\n", hKL, hIMC, uSubFunc, lpData); TRACE("(%p, %p, %u, %p)\n", hKL, hIMC, uSubFunc, lpData);
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return 0; return 0;
if (!ImeDpi_IsUnicode(pImeDpi) || !lpData) if (!ImeDpi_IsUnicode(pImeDpi) || !lpData) /* No conversion needed */
{ {
ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL); ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
@ -1247,6 +1345,7 @@ LRESULT WINAPI ImmEscapeA(HKL hKL, HIMC hIMC, UINT uSubFunc, LPVOID lpData)
} }
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: %p\n", ret);
return ret; return ret;
} }
@ -1265,10 +1364,10 @@ LRESULT WINAPI ImmEscapeW(HKL hKL, HIMC hIMC, UINT uSubFunc, LPVOID lpData)
TRACE("(%p, %p, %u, %p)\n", hKL, hIMC, uSubFunc, lpData); TRACE("(%p, %p, %u, %p)\n", hKL, hIMC, uSubFunc, lpData);
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return 0; return 0;
if (ImeDpi_IsUnicode(pImeDpi) || !lpData) if (ImeDpi_IsUnicode(pImeDpi) || !lpData) /* No conversion needed */
{ {
ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL); ret = ImeDpi_Escape(pImeDpi, hIMC, uSubFunc, lpData, hKL);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
@ -1324,6 +1423,7 @@ LRESULT WINAPI ImmEscapeW(HKL hKL, HIMC hIMC, UINT uSubFunc, LPVOID lpData)
} }
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: %p\n", ret);
return ret; return ret;
} }
@ -1337,16 +1437,16 @@ BOOL WINAPI ImmGetOpenStatus(HIMC hIMC)
TRACE("(%p)\n", hIMC); TRACE("(%p)\n", hIMC);
if (!hIMC) if (IS_NULL_UNEXPECTEDLY(hIMC))
return FALSE; return FALSE;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
ret = pIC->fOpen; ret = pIC->fOpen;
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
TRACE("ret: %d\n", ret);
return ret; return ret;
} }
@ -1362,11 +1462,11 @@ BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
TRACE("(%p, %d)\n", hIMC, fOpen); TRACE("(%p, %d)\n", hIMC, fOpen);
if (Imm32IsCrossThreadAccess(hIMC)) if (IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
if (pIC->fOpen != fOpen) if (pIC->fOpen != fOpen)
@ -1385,6 +1485,10 @@ BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
IMC_SETOPENSTATUS, IMN_SETOPENSTATUS, 0); IMC_SETOPENSTATUS, IMN_SETOPENSTATUS, 0);
NtUserNotifyIMEStatus(hWnd, fOpen, dwConversion); NtUserNotifyIMEStatus(hWnd, fOpen, dwConversion);
} }
else
{
TRACE("No change.\n");
}
return TRUE; return TRUE;
} }
@ -1400,7 +1504,7 @@ BOOL WINAPI ImmGetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
TRACE("(%p, %p)\n", hIMC, lpptPos); TRACE("(%p, %p)\n", hIMC, lpptPos);
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
ret = !!(pIC->fdwInit & INIT_STATUSWNDPOS); ret = !!(pIC->fdwInit & INIT_STATUSWNDPOS);
@ -1421,11 +1525,11 @@ BOOL WINAPI ImmSetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
TRACE("(%p, {%ld, %ld})\n", hIMC, lpptPos->x, lpptPos->y); TRACE("(%p, {%ld, %ld})\n", hIMC, lpptPos->x, lpptPos->y);
if (Imm32IsCrossThreadAccess(hIMC)) if (IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
hWnd = pIC->hWnd; hWnd = pIC->hWnd;
@ -1450,7 +1554,7 @@ BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
TRACE("(%p, %p)\n", hIMC, lpCompForm); TRACE("(%p, %p)\n", hIMC, lpCompForm);
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
if (pIC->fdwInit & INIT_COMPFORM) if (pIC->fdwInit & INIT_COMPFORM)
@ -1471,11 +1575,11 @@ BOOL WINAPI ImmSetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
LPINPUTCONTEXTDX pIC; LPINPUTCONTEXTDX pIC;
HWND hWnd; HWND hWnd;
if (Imm32IsCrossThreadAccess(hIMC)) if (IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC); pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
pIC->cfCompForm = *lpCompForm; pIC->cfCompForm = *lpCompForm;
@ -1507,14 +1611,14 @@ BOOL WINAPI ImmGetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
TRACE("(%p, %p)\n", hIMC, lplf); TRACE("(%p, %p)\n", hIMC, lplf);
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (pClientImc == NULL) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return FALSE; return FALSE;
bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE); bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE);
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
if (pIC->fdwInit & INIT_LOGFONT) if (pIC->fdwInit & INIT_LOGFONT)
@ -1544,14 +1648,14 @@ BOOL WINAPI ImmGetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
TRACE("(%p, %p)\n", hIMC, lplf); TRACE("(%p, %p)\n", hIMC, lplf);
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (pClientImc == NULL) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return FALSE; return FALSE;
bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE); bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE);
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
if (pIC->fdwInit & INIT_LOGFONT) if (pIC->fdwInit & INIT_LOGFONT)
@ -1582,11 +1686,11 @@ BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
TRACE("(%p, %p)\n", hIMC, lplf); TRACE("(%p, %p)\n", hIMC, lplf);
if (Imm32IsCrossThreadAccess(hIMC)) if (IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (pClientImc == NULL) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return FALSE; return FALSE;
bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE); bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE);
@ -1599,7 +1703,7 @@ BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
} }
pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC); pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
if (GetWin32ClientInfo()->dwExpWinVer < _WIN32_WINNT_NT4) /* old version (3.x)? */ if (GetWin32ClientInfo()->dwExpWinVer < _WIN32_WINNT_NT4) /* old version (3.x)? */
@ -1638,11 +1742,11 @@ BOOL WINAPI ImmSetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
TRACE("(%p, %p)\n", hIMC, lplf); TRACE("(%p, %p)\n", hIMC, lplf);
if (Imm32IsCrossThreadAccess(hIMC)) if (IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (pClientImc == NULL) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return FALSE; return FALSE;
bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE); bWide = (pClientImc->dwFlags & CLIENTIMC_WIDE);
@ -1655,7 +1759,7 @@ BOOL WINAPI ImmSetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
} }
pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC); pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
if (GetWin32ClientInfo()->dwExpWinVer < _WIN32_WINNT_NT4) /* old version (3.x)? */ if (GetWin32ClientInfo()->dwExpWinVer < _WIN32_WINNT_NT4) /* old version (3.x)? */
@ -1697,10 +1801,10 @@ ImmGetConversionListA(HKL hKL, HIMC hIMC, LPCSTR pSrc, LPCANDIDATELIST lpDst,
lpDst, dwBufLen, uFlag); lpDst, dwBufLen, uFlag);
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (pImeDpi == NULL) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return 0; return 0;
if (!ImeDpi_IsUnicode(pImeDpi)) if (!ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
{ {
ret = pImeDpi->ImeConversionList(hIMC, pSrc, lpDst, dwBufLen, uFlag); ret = pImeDpi->ImeConversionList(hIMC, pSrc, lpDst, dwBufLen, uFlag);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
@ -1710,20 +1814,20 @@ ImmGetConversionListA(HKL hKL, HIMC hIMC, LPCSTR pSrc, LPCANDIDATELIST lpDst,
if (pSrc) if (pSrc)
{ {
pszSrcW = Imm32WideFromAnsi(pImeDpi->uCodePage, pSrc); pszSrcW = Imm32WideFromAnsi(pImeDpi->uCodePage, pSrc);
if (pszSrcW == NULL) if (IS_NULL_UNEXPECTEDLY(pszSrcW))
goto Quit; goto Quit;
} }
cb = pImeDpi->ImeConversionList(hIMC, pszSrcW, NULL, 0, uFlag); cb = pImeDpi->ImeConversionList(hIMC, pszSrcW, NULL, 0, uFlag);
if (cb == 0) if (IS_ZERO_UNEXPECTEDLY(cb))
goto Quit; goto Quit;
pCL = ImmLocalAlloc(0, cb); pCL = ImmLocalAlloc(0, cb);
if (pCL == NULL) if (IS_NULL_UNEXPECTEDLY(pCL))
goto Quit; goto Quit;
cb = pImeDpi->ImeConversionList(hIMC, pszSrcW, pCL, cb, uFlag); cb = pImeDpi->ImeConversionList(hIMC, pszSrcW, pCL, cb, uFlag);
if (cb == 0) if (IS_ZERO_UNEXPECTEDLY(cb))
goto Quit; goto Quit;
ret = CandidateListWideToAnsi(pCL, lpDst, dwBufLen, pImeDpi->uCodePage); ret = CandidateListWideToAnsi(pCL, lpDst, dwBufLen, pImeDpi->uCodePage);
@ -1732,6 +1836,7 @@ Quit:
ImmLocalFree(pszSrcW); ImmLocalFree(pszSrcW);
ImmLocalFree(pCL); ImmLocalFree(pCL);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: 0x%X\n", ret);
return ret; return ret;
} }
@ -1752,10 +1857,10 @@ ImmGetConversionListW(HKL hKL, HIMC hIMC, LPCWSTR pSrc, LPCANDIDATELIST lpDst,
lpDst, dwBufLen, uFlag); lpDst, dwBufLen, uFlag);
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return 0; return 0;
if (ImeDpi_IsUnicode(pImeDpi)) if (ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
{ {
ret = pImeDpi->ImeConversionList(hIMC, pSrc, lpDst, dwBufLen, uFlag); ret = pImeDpi->ImeConversionList(hIMC, pSrc, lpDst, dwBufLen, uFlag);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
@ -1765,20 +1870,20 @@ ImmGetConversionListW(HKL hKL, HIMC hIMC, LPCWSTR pSrc, LPCANDIDATELIST lpDst,
if (pSrc) if (pSrc)
{ {
pszSrcA = Imm32AnsiFromWide(pImeDpi->uCodePage, pSrc); pszSrcA = Imm32AnsiFromWide(pImeDpi->uCodePage, pSrc);
if (pszSrcA == NULL) if (IS_NULL_UNEXPECTEDLY(pszSrcA))
goto Quit; goto Quit;
} }
cb = pImeDpi->ImeConversionList(hIMC, pszSrcA, NULL, 0, uFlag); cb = pImeDpi->ImeConversionList(hIMC, pszSrcA, NULL, 0, uFlag);
if (cb == 0) if (IS_ZERO_UNEXPECTEDLY(cb))
goto Quit; goto Quit;
pCL = ImmLocalAlloc(0, cb); pCL = ImmLocalAlloc(0, cb);
if (!pCL) if (IS_NULL_UNEXPECTEDLY(pCL))
goto Quit; goto Quit;
cb = pImeDpi->ImeConversionList(hIMC, pszSrcA, pCL, cb, uFlag); cb = pImeDpi->ImeConversionList(hIMC, pszSrcA, pCL, cb, uFlag);
if (!cb) if (IS_ZERO_UNEXPECTEDLY(cb))
goto Quit; goto Quit;
ret = CandidateListAnsiToWide(pCL, lpDst, dwBufLen, pImeDpi->uCodePage); ret = CandidateListAnsiToWide(pCL, lpDst, dwBufLen, pImeDpi->uCodePage);
@ -1787,6 +1892,7 @@ Quit:
ImmLocalFree(pszSrcA); ImmLocalFree(pszSrcA);
ImmLocalFree(pCL); ImmLocalFree(pCL);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: 0x%X\n", ret);
return ret; return ret;
} }
@ -1800,13 +1906,20 @@ BOOL WINAPI ImmGetConversionStatus(HIMC hIMC, LPDWORD lpfdwConversion, LPDWORD l
TRACE("(%p %p %p)\n", hIMC, lpfdwConversion, lpfdwSentence); TRACE("(%p %p %p)\n", hIMC, lpfdwConversion, lpfdwSentence);
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
if (lpfdwConversion) if (lpfdwConversion)
{
*lpfdwConversion = pIC->fdwConversion; *lpfdwConversion = pIC->fdwConversion;
TRACE("0x%X\n", *lpfdwConversion);
}
if (lpfdwSentence) if (lpfdwSentence)
{
*lpfdwSentence = pIC->fdwSentence; *lpfdwSentence = pIC->fdwSentence;
TRACE("0x%X\n", *lpfdwSentence);
}
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
return TRUE; return TRUE;
@ -1829,11 +1942,11 @@ BOOL WINAPI ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSent
if (!IS_IME_HKL(hKL) && IS_CICERO_MODE() && !IS_16BIT_MODE()) if (!IS_IME_HKL(hKL) && IS_CICERO_MODE() && !IS_16BIT_MODE())
fUseCicero = TRUE; fUseCicero = TRUE;
if (Imm32IsCrossThreadAccess(hIMC)) if (IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
if (pIC->fdwConversion != fdwConversion) if (pIC->fdwConversion != fdwConversion)
@ -1883,31 +1996,31 @@ BOOL WINAPI ImmConfigureIMEA(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
TRACE("(%p, %p, 0x%lX, %p)\n", hKL, hWnd, dwMode, lpData); TRACE("(%p, %p, 0x%lX, %p)\n", hKL, hWnd, dwMode, lpData);
if (!ValidateHwnd(hWnd) || Imm32IsCrossProcessAccess(hWnd)) if (IS_NULL_UNEXPECTEDLY(ValidateHwnd(hWnd)) || IS_CROSS_PROCESS_HWND(hWnd))
return FALSE; return FALSE;
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return FALSE; return FALSE;
RtlZeroMemory(&RegWordW, sizeof(RegWordW)); RtlZeroMemory(&RegWordW, sizeof(RegWordW));
if (!ImeDpi_IsUnicode(pImeDpi) || !lpData || dwMode != IME_CONFIG_REGISTERWORD) if (!ImeDpi_IsUnicode(pImeDpi) || !lpData || dwMode != IME_CONFIG_REGISTERWORD)
goto DoIt; goto DoIt; /* No conversion needed */
pRegWordA = lpData; pRegWordA = lpData;
if (pRegWordA->lpReading) if (pRegWordA->lpReading)
{ {
RegWordW.lpReading = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpReading); RegWordW.lpReading = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpReading);
if (!RegWordW.lpReading) if (IS_NULL_UNEXPECTEDLY(RegWordW.lpReading))
goto Quit; goto Quit;
} }
if (pRegWordA->lpWord) if (pRegWordA->lpWord)
{ {
RegWordW.lpWord = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpWord); RegWordW.lpWord = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpWord);
if (!RegWordW.lpWord) if (IS_NULL_UNEXPECTEDLY(RegWordW.lpWord))
goto Quit; goto Quit;
} }
@ -1922,6 +2035,7 @@ Quit:
ImmLocalFree(RegWordW.lpReading); ImmLocalFree(RegWordW.lpReading);
ImmLocalFree(RegWordW.lpWord); ImmLocalFree(RegWordW.lpWord);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: %d\n", ret);
return ret; return ret;
} }
@ -1937,31 +2051,31 @@ BOOL WINAPI ImmConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
TRACE("(%p, %p, 0x%lX, %p)\n", hKL, hWnd, dwMode, lpData); TRACE("(%p, %p, 0x%lX, %p)\n", hKL, hWnd, dwMode, lpData);
if (!ValidateHwnd(hWnd) || Imm32IsCrossProcessAccess(hWnd)) if (IS_NULL_UNEXPECTEDLY(ValidateHwnd(hWnd)) || IS_CROSS_PROCESS_HWND(hWnd))
return FALSE; return FALSE;
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return FALSE; return FALSE;
RtlZeroMemory(&RegWordA, sizeof(RegWordA)); RtlZeroMemory(&RegWordA, sizeof(RegWordA));
if (ImeDpi_IsUnicode(pImeDpi) || !lpData || dwMode != IME_CONFIG_REGISTERWORD) if (ImeDpi_IsUnicode(pImeDpi) || !lpData || dwMode != IME_CONFIG_REGISTERWORD)
goto DoIt; goto DoIt; /* No conversion needed */
pRegWordW = lpData; pRegWordW = lpData;
if (pRegWordW->lpReading) if (pRegWordW->lpReading)
{ {
RegWordA.lpReading = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpReading); RegWordA.lpReading = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpReading);
if (!RegWordA.lpReading) if (IS_NULL_UNEXPECTEDLY(RegWordA.lpReading))
goto Quit; goto Quit;
} }
if (pRegWordW->lpWord) if (pRegWordW->lpWord)
{ {
RegWordA.lpWord = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpWord); RegWordA.lpWord = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpWord);
if (!RegWordA.lpWord) if (IS_NULL_UNEXPECTEDLY(RegWordA.lpWord))
goto Quit; goto Quit;
} }
@ -1976,6 +2090,7 @@ Quit:
ImmLocalFree(RegWordA.lpReading); ImmLocalFree(RegWordA.lpReading);
ImmLocalFree(RegWordA.lpWord); ImmLocalFree(RegWordA.lpWord);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: %d\n", ret);
return ret; return ret;
} }
@ -2024,16 +2139,17 @@ BOOL WINAPI ImmWINNLSEnableIME(HWND hWnd, BOOL enable)
} }
hIMC = (HIMC)NtUserGetThreadState(THREADSTATE_DEFAULTINPUTCONTEXT); hIMC = (HIMC)NtUserGetThreadState(THREADSTATE_DEFAULTINPUTCONTEXT);
if (!hIMC) if (IS_NULL_UNEXPECTEDLY(hIMC))
return FALSE; return FALSE;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (!pClientImc) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return FALSE; return FALSE;
ret = !(pClientImc->dwFlags & CLIENTIMC_DISABLEIME); ret = !(pClientImc->dwFlags & CLIENTIMC_DISABLEIME);
if (!!enable == ret) if (!!enable == ret)
{ {
TRACE("Same\n");
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
return ret; return ret;
} }

View file

@ -31,7 +31,10 @@ static BOOL APIENTRY ImmInitializeGlobals(HMODULE hMod)
status = RtlInitializeCriticalSection(&gcsImeDpi); status = RtlInitializeCriticalSection(&gcsImeDpi);
if (NT_ERROR(status)) if (NT_ERROR(status))
{
ERR("\n");
return FALSE; return FALSE;
}
gfImmInitialized = TRUE; gfImmInitialized = TRUE;
return TRUE; return TRUE;
@ -68,20 +71,14 @@ BOOL WINAPI ImmLoadLayout(HKL hKL, PIMEINFOEX pImeInfoEx)
REGKEY_KEYBOARD_LAYOUTS, HandleToUlong(hKL)); REGKEY_KEYBOARD_LAYOUTS, HandleToUlong(hKL));
error = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szLayout, 0, KEY_READ, &hLayoutKey); error = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szLayout, 0, KEY_READ, &hLayoutKey);
if (error) if (IS_ERROR_UNEXPECTEDLY(error))
{
ERR("RegOpenKeyExW: 0x%08lX\n", error);
return FALSE; return FALSE;
}
} }
else else
{ {
error = RegOpenKeyExW(HKEY_LOCAL_MACHINE, REGKEY_IMM, 0, KEY_READ, &hLayoutKey); error = RegOpenKeyExW(HKEY_LOCAL_MACHINE, REGKEY_IMM, 0, KEY_READ, &hLayoutKey);
if (error) if (IS_ERROR_UNEXPECTEDLY(error))
{
ERR("RegOpenKeyExW: 0x%08lX\n", error);
return FALSE; return FALSE;
}
} }
cbData = sizeof(pImeInfoEx->wszImeFile); cbData = sizeof(pImeInfoEx->wszImeFile);
@ -93,9 +90,9 @@ BOOL WINAPI ImmLoadLayout(HKL hKL, PIMEINFOEX pImeInfoEx)
pImeInfoEx->fLoadFlag = 0; pImeInfoEx->fLoadFlag = 0;
if (error != ERROR_SUCCESS || dwType != REG_SZ) if (IS_ERROR_UNEXPECTEDLY(error) || dwType != REG_SZ)
{ {
ERR("RegQueryValueExW: 0x%lX, 0x%lX\n", error, dwType); ERR("\n");
return FALSE; return FALSE;
} }
@ -129,7 +126,7 @@ BOOL WINAPI ImmFreeLayout(DWORD dwUnknown)
if (cKLs) if (cKLs)
{ {
pList = ImmLocalAlloc(0, cKLs * sizeof(HKL)); pList = ImmLocalAlloc(0, cKLs * sizeof(HKL));
if (pList == NULL) if (IS_NULL_UNEXPECTEDLY(pList))
return FALSE; return FALSE;
cKLs = GetKeyboardLayoutList(cKLs, pList); cKLs = GetKeyboardLayoutList(cKLs, pList);
@ -147,7 +144,10 @@ BOOL WINAPI ImmFreeLayout(DWORD dwUnknown)
StringCchPrintfW(szKBD, _countof(szKBD), L"%08X", LangID); StringCchPrintfW(szKBD, _countof(szKBD), L"%08X", LangID);
if (!LoadKeyboardLayoutW(szKBD, KLF_ACTIVATE)) if (!LoadKeyboardLayoutW(szKBD, KLF_ACTIVATE))
{
WARN("\n");
LoadKeyboardLayoutW(L"00000409", KLF_ACTIVATE | 0x200); LoadKeyboardLayoutW(L"00000409", KLF_ACTIVATE | 0x200);
}
} }
else if (dwUnknown == 2) else if (dwUnknown == 2)
{ {
@ -187,7 +187,7 @@ VOID APIENTRY Imm32SelectInputContext(HKL hNewKL, HKL hOldKL, HIMC hIMC)
PIME_STATE pNewState = NULL, pOldState = NULL; PIME_STATE pNewState = NULL, pOldState = NULL;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (!pClientImc) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return; return;
pNewImeDpi = ImmLockImeDpi(hNewKL); pNewImeDpi = ImmLockImeDpi(hNewKL);
@ -496,13 +496,16 @@ HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC)
TRACE("(%p, %p)\n", hWnd, hIMC); TRACE("(%p, %p)\n", hWnd, hIMC);
if (!IS_IMM_MODE()) if (!IS_IMM_MODE())
{
WARN("\n");
return NULL; return NULL;
}
pWnd = ValidateHwnd(hWnd); pWnd = ValidateHwnd(hWnd);
if (!pWnd) if (IS_NULL_UNEXPECTEDLY(pWnd))
return NULL; return NULL;
if (hIMC && Imm32IsCrossThreadAccess(hIMC)) if (hIMC && IS_CROSS_THREAD_HIMC(hIMC))
return NULL; return NULL;
hOldIMC = pWnd->hImc; hOldIMC = pWnd->hImc;
@ -542,9 +545,12 @@ BOOL WINAPI ImmAssociateContextEx(HWND hWnd, HIMC hIMC, DWORD dwFlags)
TRACE("(%p, %p, 0x%lX)\n", hWnd, hIMC, dwFlags); TRACE("(%p, %p, 0x%lX)\n", hWnd, hIMC, dwFlags);
if (!IS_IMM_MODE()) if (!IS_IMM_MODE())
{
WARN("\n");
return FALSE; return FALSE;
}
if (hIMC && !(dwFlags & IACE_DEFAULT) && Imm32IsCrossThreadAccess(hIMC)) if (hIMC && !(dwFlags & IACE_DEFAULT) && IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
hwndFocus = (HWND)NtUserQueryWindow(hWnd, QUERY_WINDOW_FOCUS); hwndFocus = (HWND)NtUserQueryWindow(hWnd, QUERY_WINDOW_FOCUS);
@ -587,14 +593,17 @@ HIMC WINAPI ImmCreateContext(void)
TRACE("()\n"); TRACE("()\n");
if (!IS_IMM_MODE()) if (!IS_IMM_MODE())
{
WARN("\n");
return NULL; return NULL;
}
pClientImc = ImmLocalAlloc(HEAP_ZERO_MEMORY, sizeof(CLIENTIMC)); pClientImc = ImmLocalAlloc(HEAP_ZERO_MEMORY, sizeof(CLIENTIMC));
if (pClientImc == NULL) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return NULL; return NULL;
hIMC = NtUserCreateInputContext((ULONG_PTR)pClientImc); hIMC = NtUserCreateInputContext((ULONG_PTR)pClientImc);
if (hIMC == NULL) if (IS_NULL_UNEXPECTEDLY(hIMC))
{ {
ImmLocalFree(pClientImc); ImmLocalFree(pClientImc);
return NULL; return NULL;
@ -637,23 +646,35 @@ BOOL APIENTRY Imm32DestroyInputContext(HIMC hIMC, HKL hKL, BOOL bKeep)
PCLIENTIMC pClientImc; PCLIENTIMC pClientImc;
PIMC pIMC; PIMC pIMC;
if (!hIMC || !IS_IMM_MODE()) if (hIMC == NULL)
return FALSE; return FALSE;
pIMC = ValidateHandle(hIMC, TYPE_INPUTCONTEXT); if (!IS_IMM_MODE())
if (!pIMC || pIMC->head.pti != Imm32CurrentPti())
{ {
ERR("invalid pIMC: %p\n", pIMC); WARN("\n");
return FALSE;
}
pIMC = ValidateHandle(hIMC, TYPE_INPUTCONTEXT);
if (IS_NULL_UNEXPECTEDLY(pIMC))
return FALSE;
if (pIMC->head.pti != Imm32CurrentPti())
{
ERR("\n");
return FALSE; return FALSE;
} }
pClientImc = (PCLIENTIMC)pIMC->dwClientImcData; pClientImc = (PCLIENTIMC)pIMC->dwClientImcData;
if (!pClientImc) if (pClientImc == NULL)
{
TRACE("pClientImc == NULL\n");
goto Finish; goto Finish;
}
if ((pClientImc->dwFlags & CLIENTIMC_UNKNOWN2) && !bKeep) if ((pClientImc->dwFlags & CLIENTIMC_UNKNOWN2) && !bKeep)
{ {
ERR("CLIENTIMC_UNKNOWN2\n"); ERR("\n");
return FALSE; return FALSE;
} }
@ -662,14 +683,13 @@ BOOL APIENTRY Imm32DestroyInputContext(HIMC hIMC, HKL hKL, BOOL bKeep)
InterlockedIncrement(&pClientImc->cLockObj); InterlockedIncrement(&pClientImc->cLockObj);
if (!pClientImc->hInputContext) if (IS_NULL_UNEXPECTEDLY(pClientImc->hInputContext))
goto Quit; goto Quit;
pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC); pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
{ {
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
ERR("!pIC\n");
return FALSE; return FALSE;
} }
@ -725,24 +745,29 @@ Imm32CreateInputContext(HIMC hIMC, LPINPUTCONTEXT pIC, PCLIENTIMC pClientImc, HK
pIC->hCandInfo = ImmCreateIMCC(sizeof(CANDIDATEINFO)); pIC->hCandInfo = ImmCreateIMCC(sizeof(CANDIDATEINFO));
pIC->hGuideLine = ImmCreateIMCC(sizeof(GUIDELINE)); pIC->hGuideLine = ImmCreateIMCC(sizeof(GUIDELINE));
pIC->hMsgBuf = ImmCreateIMCC(sizeof(UINT)); pIC->hMsgBuf = ImmCreateIMCC(sizeof(UINT));
if (!pIC->hCompStr || !pIC->hCandInfo || !pIC->hGuideLine || !pIC->hMsgBuf) if (IS_NULL_UNEXPECTEDLY(pIC->hCompStr) ||
IS_NULL_UNEXPECTEDLY(pIC->hCandInfo) ||
IS_NULL_UNEXPECTEDLY(pIC->hGuideLine) ||
IS_NULL_UNEXPECTEDLY(pIC->hMsgBuf))
{
goto Fail; goto Fail;
}
/* Initialize IC components */ /* Initialize IC components */
pCS = ImmLockIMCC(pIC->hCompStr); pCS = ImmLockIMCC(pIC->hCompStr);
if (!pCS) if (IS_NULL_UNEXPECTEDLY(pCS))
goto Fail; goto Fail;
pCS->dwSize = sizeof(COMPOSITIONSTRING); pCS->dwSize = sizeof(COMPOSITIONSTRING);
ImmUnlockIMCC(pIC->hCompStr); ImmUnlockIMCC(pIC->hCompStr);
pCI = ImmLockIMCC(pIC->hCandInfo); pCI = ImmLockIMCC(pIC->hCandInfo);
if (!pCI) if (IS_NULL_UNEXPECTEDLY(pCI))
goto Fail; goto Fail;
pCI->dwSize = sizeof(CANDIDATEINFO); pCI->dwSize = sizeof(CANDIDATEINFO);
ImmUnlockIMCC(pIC->hCandInfo); ImmUnlockIMCC(pIC->hCandInfo);
pGL = ImmLockIMCC(pIC->hGuideLine); pGL = ImmLockIMCC(pIC->hGuideLine);
if (!pGL) if (IS_NULL_UNEXPECTEDLY(pGL))
goto Fail; goto Fail;
pGL->dwSize = sizeof(GUIDELINE); pGL->dwSize = sizeof(GUIDELINE);
ImmUnlockIMCC(pIC->hGuideLine); ImmUnlockIMCC(pIC->hGuideLine);
@ -772,7 +797,7 @@ Imm32CreateInputContext(HIMC hIMC, LPINPUTCONTEXT pIC, PCLIENTIMC pClientImc, HK
/* Create private data */ /* Create private data */
pIC->hPrivate = ImmCreateIMCC(cbPrivate); pIC->hPrivate = ImmCreateIMCC(cbPrivate);
if (!pIC->hPrivate) if (IS_NULL_UNEXPECTEDLY(pIC->hPrivate))
goto Fail; goto Fail;
CtfImmTIMCreateInputContext(hIMC); CtfImmTIMCreateInputContext(hIMC);
@ -819,7 +844,7 @@ LPINPUTCONTEXT APIENTRY Imm32InternalLockIMC(HIMC hIMC, BOOL fSelect)
PIMEDPI pImeDpi = NULL; PIMEDPI pImeDpi = NULL;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (!pClientImc) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return NULL; return NULL;
RtlEnterCriticalSection(&pClientImc->cs); RtlEnterCriticalSection(&pClientImc->cs);
@ -827,15 +852,11 @@ LPINPUTCONTEXT APIENTRY Imm32InternalLockIMC(HIMC hIMC, BOOL fSelect)
if (pClientImc->hInputContext) if (pClientImc->hInputContext)
{ {
pIC = LocalLock(pClientImc->hInputContext); pIC = LocalLock(pClientImc->hInputContext);
if (pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
{
CtfImmTIMCreateInputContext(hIMC);
goto Success;
}
else
{
goto Failure; goto Failure;
}
CtfImmTIMCreateInputContext(hIMC);
goto Success;
} }
dwThreadId = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTTHREADID); dwThreadId = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTTHREADID);
@ -853,11 +874,14 @@ LPINPUTCONTEXT APIENTRY Imm32InternalLockIMC(HIMC hIMC, BOOL fSelect)
} }
if (!NtUserQueryInputContext(hIMC, QIC_DEFAULTWINDOWIME)) if (!NtUserQueryInputContext(hIMC, QIC_DEFAULTWINDOWIME))
{
ERR("\n");
goto Failure; goto Failure;
}
hIC = LocalAlloc(LHND, sizeof(INPUTCONTEXTDX)); hIC = LocalAlloc(LHND, sizeof(INPUTCONTEXTDX));
pIC = LocalLock(hIC); pIC = LocalLock(hIC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
{ {
LocalFree(hIC); LocalFree(hIC);
goto Failure; goto Failure;
@ -867,6 +891,7 @@ LPINPUTCONTEXT APIENTRY Imm32InternalLockIMC(HIMC hIMC, BOOL fSelect)
hNewKL = GetKeyboardLayout(dwThreadId); hNewKL = GetKeyboardLayout(dwThreadId);
if (!Imm32CreateInputContext(hIMC, pIC, pClientImc, hNewKL, fSelect)) if (!Imm32CreateInputContext(hIMC, pIC, pClientImc, hNewKL, fSelect))
{ {
ERR("\n");
LocalUnlock(hIC); LocalUnlock(hIC);
pClientImc->hInputContext = LocalFree(hIC); pClientImc->hInputContext = LocalFree(hIC);
goto Failure; goto Failure;
@ -894,9 +919,12 @@ BOOL WINAPI ImmDestroyContext(HIMC hIMC)
TRACE("(%p)\n", hIMC); TRACE("(%p)\n", hIMC);
if (!IS_IMM_MODE()) if (!IS_IMM_MODE())
{
WARN("\n");
return FALSE; return FALSE;
}
if (Imm32IsCrossThreadAccess(hIMC)) if (IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
hKL = GetKeyboardLayout(0); hKL = GetKeyboardLayout(0);
@ -913,11 +941,11 @@ PCLIENTIMC WINAPI ImmLockClientImc(HIMC hImc)
TRACE("(%p)\n", hImc); TRACE("(%p)\n", hImc);
if (!hImc) if (IS_NULL_UNEXPECTEDLY(hImc))
return NULL; return NULL;
pIMC = ValidateHandle(hImc, TYPE_INPUTCONTEXT); pIMC = ValidateHandle(hImc, TYPE_INPUTCONTEXT);
if (!pIMC || !Imm32CheckImcProcess(pIMC)) if (IS_NULL_UNEXPECTEDLY(pIMC) || !Imm32CheckImcProcess(pIMC))
return NULL; return NULL;
pClientImc = (PCLIENTIMC)pIMC->dwClientImcData; pClientImc = (PCLIENTIMC)pIMC->dwClientImcData;
@ -929,7 +957,7 @@ PCLIENTIMC WINAPI ImmLockClientImc(HIMC hImc)
} }
pClientImc = ImmLocalAlloc(HEAP_ZERO_MEMORY, sizeof(CLIENTIMC)); pClientImc = ImmLocalAlloc(HEAP_ZERO_MEMORY, sizeof(CLIENTIMC));
if (!pClientImc) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return NULL; return NULL;
RtlInitializeCriticalSection(&pClientImc->cs); RtlInitializeCriticalSection(&pClientImc->cs);
@ -937,6 +965,7 @@ PCLIENTIMC WINAPI ImmLockClientImc(HIMC hImc)
if (!NtUserUpdateInputContext(hImc, UIC_CLIENTIMCDATA, (DWORD_PTR)pClientImc)) if (!NtUserUpdateInputContext(hImc, UIC_CLIENTIMCDATA, (DWORD_PTR)pClientImc))
{ {
ERR("\n");
ImmLocalFree(pClientImc); ImmLocalFree(pClientImc);
return NULL; return NULL;
} }
@ -978,7 +1007,10 @@ static HIMC APIENTRY ImmGetSaveContext(HWND hWnd, DWORD dwContextFlags)
PWND pWnd; PWND pWnd;
if (!IS_IMM_MODE()) if (!IS_IMM_MODE())
{
TRACE("Not IMM mode.\n");
return NULL; return NULL;
}
if (!hWnd) if (!hWnd)
{ {
@ -987,7 +1019,7 @@ static HIMC APIENTRY ImmGetSaveContext(HWND hWnd, DWORD dwContextFlags)
} }
pWnd = ValidateHwnd(hWnd); pWnd = ValidateHwnd(hWnd);
if (!pWnd || Imm32IsCrossProcessAccess(hWnd)) if (IS_NULL_UNEXPECTEDLY(pWnd) || IS_CROSS_PROCESS_HWND(hWnd))
return NULL; return NULL;
hIMC = pWnd->hImc; hIMC = pWnd->hImc;
@ -996,10 +1028,12 @@ static HIMC APIENTRY ImmGetSaveContext(HWND hWnd, DWORD dwContextFlags)
Quit: Quit:
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (pClientImc == NULL) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return NULL; return NULL;
if ((dwContextFlags & 2) && (pClientImc->dwFlags & CLIENTIMC_DISABLEIME)) if ((dwContextFlags & 2) && (pClientImc->dwFlags & CLIENTIMC_DISABLEIME))
hIMC = NULL; hIMC = NULL;
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
return hIMC; return hIMC;
} }
@ -1010,7 +1044,7 @@ Quit:
HIMC WINAPI ImmGetContext(HWND hWnd) HIMC WINAPI ImmGetContext(HWND hWnd)
{ {
TRACE("(%p)\n", hWnd); TRACE("(%p)\n", hWnd);
if (hWnd == NULL) if (IS_NULL_UNEXPECTEDLY(hWnd))
return NULL; return NULL;
return ImmGetSaveContext(hWnd, 2); return ImmGetSaveContext(hWnd, 2);
} }
@ -1034,7 +1068,7 @@ BOOL WINAPI ImmUnlockIMC(HIMC hIMC)
PCLIENTIMC pClientImc; PCLIENTIMC pClientImc;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (pClientImc == NULL) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return FALSE; return FALSE;
if (pClientImc->hInputContext) if (pClientImc->hInputContext)
@ -1108,7 +1142,7 @@ BOOL WINAPI ImmEnumInputContext(DWORD dwThreadId, IMCENUMPROC lpfn, LPARAM lPara
TRACE("(%lu, %p, %p)\n", dwThreadId, lpfn, lParam); TRACE("(%lu, %p, %p)\n", dwThreadId, lpfn, lParam);
dwCount = Imm32BuildHimcList(dwThreadId, &phList); dwCount = Imm32BuildHimcList(dwThreadId, &phList);
if (!dwCount) if (IS_ZERO_UNEXPECTEDLY(dwCount))
return FALSE; return FALSE;
for (dwIndex = 0; dwIndex < dwCount; ++dwIndex) for (dwIndex = 0; dwIndex < dwCount; ++dwIndex)
@ -1140,7 +1174,10 @@ BOOL WINAPI ImmSetActiveContext(HWND hWnd, HIMC hIMC, BOOL fActive)
TRACE("(%p, %p, %d)\n", hWnd, hIMC, fActive); TRACE("(%p, %p, %d)\n", hWnd, hIMC, fActive);
if (!IS_IMM_MODE()) if (!IS_IMM_MODE())
{
WARN("\n");
return FALSE; return FALSE;
}
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
@ -1151,11 +1188,11 @@ BOOL WINAPI ImmSetActiveContext(HWND hWnd, HIMC hIMC, BOOL fActive)
} }
else if (hIMC) else if (hIMC)
{ {
if (!pClientImc) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return FALSE; return FALSE;
pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC); pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
{ {
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
return FALSE; return FALSE;
@ -1241,11 +1278,32 @@ BOOL WINAPI ImmSetActiveContextConsoleIME(HWND hwnd, BOOL fFlag)
TRACE("(%p, %d)\n", hwnd, fFlag); TRACE("(%p, %d)\n", hwnd, fFlag);
hIMC = ImmGetContext(hwnd); hIMC = ImmGetContext(hwnd);
if (hIMC) if (IS_NULL_UNEXPECTEDLY(hIMC))
return ImmSetActiveContext(hwnd, hIMC, fFlag); return FALSE;
return FALSE; return ImmSetActiveContext(hwnd, hIMC, fFlag);
} }
#ifndef NDEBUG
VOID APIENTRY Imm32UnitTest(VOID)
{
if (0)
{
DWORD dwValue;
WCHAR szText[64];
Imm32StrToUInt(L"123", &dwValue, 10);
ASSERT(dwValue == 123);
Imm32StrToUInt(L"100", &dwValue, 16);
ASSERT(dwValue == 0x100);
Imm32UIntToStr(123, 10, szText, _countof(szText));
ASSERT(lstrcmpW(szText, L"123") == 0);
Imm32UIntToStr(0x100, 16, szText, _countof(szText));
ASSERT(lstrcmpW(szText, L"100") == 0);
}
}
#endif
BOOL WINAPI User32InitializeImmEntryTable(DWORD); BOOL WINAPI User32InitializeImmEntryTable(DWORD);
BOOL BOOL
@ -1273,6 +1331,9 @@ ImmDllInitialize(
ERR("User32InitializeImmEntryTable failed\n"); ERR("User32InitializeImmEntryTable failed\n");
return FALSE; return FALSE;
} }
#ifndef NDEBUG
Imm32UnitTest();
#endif
break; break;
case DLL_THREAD_ATTACH: case DLL_THREAD_ATTACH:

View file

@ -69,7 +69,7 @@ BOOL APIENTRY Imm32CImeNonImeToggle(HIMC hIMC, HKL hKL, HWND hWnd, LANGID LangID
LPINPUTCONTEXT pIC; LPINPUTCONTEXT pIC;
BOOL fOpen; BOOL fOpen;
if (hWnd == NULL) if (IS_NULL_UNEXPECTEDLY(hWnd))
return FALSE; return FALSE;
if (LOWORD(hKL) != LangID || !ImmIsIME(hKL)) if (LOWORD(hKL) != LangID || !ImmIsIME(hKL))
@ -79,7 +79,7 @@ BOOL APIENTRY Imm32CImeNonImeToggle(HIMC hIMC, HKL hKL, HWND hWnd, LANGID LangID
} }
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return TRUE; return TRUE;
fOpen = pIC->fOpen; fOpen = pIC->fOpen;
@ -105,7 +105,7 @@ BOOL APIENTRY Imm32CShapeToggle(HIMC hIMC, HKL hKL, HWND hWnd)
return FALSE; return FALSE;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return TRUE; return TRUE;
fOpen = pIC->fOpen; fOpen = pIC->fOpen;
@ -136,7 +136,7 @@ BOOL APIENTRY Imm32CSymbolToggle(HIMC hIMC, HKL hKL, HWND hWnd)
return FALSE; return FALSE;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return TRUE; return TRUE;
fOpen = pIC->fOpen; fOpen = pIC->fOpen;
@ -191,7 +191,7 @@ BOOL APIENTRY Imm32KShapeToggle(HIMC hIMC)
DWORD dwConversion, dwSentence; DWORD dwConversion, dwSentence;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
dwConversion = (pIC->fdwConversion ^ IME_CMODE_FULLSHAPE); dwConversion = (pIC->fdwConversion ^ IME_CMODE_FULLSHAPE);
@ -214,7 +214,7 @@ BOOL APIENTRY Imm32KHanjaConvert(HIMC hIMC)
DWORD dwConversion, dwSentence; DWORD dwConversion, dwSentence;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
dwConversion = (pIC->fdwConversion ^ IME_CMODE_HANJACONVERT); dwConversion = (pIC->fdwConversion ^ IME_CMODE_HANJACONVERT);
@ -233,7 +233,7 @@ BOOL APIENTRY Imm32KEnglish(HIMC hIMC)
BOOL fOpen; BOOL fOpen;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
dwConversion = (pIC->fdwConversion ^ IME_CMODE_NATIVE); dwConversion = (pIC->fdwConversion ^ IME_CMODE_NATIVE);
@ -253,7 +253,7 @@ BOOL APIENTRY Imm32ProcessHotKey(HWND hWnd, HIMC hIMC, HKL hKL, DWORD dwHotKeyID
PIMEDPI pImeDpi; PIMEDPI pImeDpi;
BOOL ret; BOOL ret;
if (hIMC && Imm32IsCrossThreadAccess(hIMC)) if (hIMC && IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
switch (dwHotKeyID) switch (dwHotKeyID)
@ -289,6 +289,7 @@ BOOL APIENTRY Imm32ProcessHotKey(HWND hWnd, HIMC hIMC, HKL hKL, DWORD dwHotKeyID
return Imm32CSymbolToggle(hIMC, hKL, hWnd); return Imm32CSymbolToggle(hIMC, hKL, hWnd);
default: default:
WARN("0x%X\n", dwHotKeyID);
break; break;
} }
@ -296,7 +297,7 @@ BOOL APIENTRY Imm32ProcessHotKey(HWND hWnd, HIMC hIMC, HKL hKL, DWORD dwHotKeyID
return FALSE; return FALSE;
pImeDpi = ImmLockImeDpi(hKL); pImeDpi = ImmLockImeDpi(hKL);
if (pImeDpi == NULL) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return FALSE; return FALSE;
ret = (BOOL)pImeDpi->ImeEscape(hIMC, IME_ESC_PRIVATE_HOTKEY, &dwHotKeyID); ret = (BOOL)pImeDpi->ImeEscape(hIMC, IME_ESC_PRIVATE_HOTKEY, &dwHotKeyID);
@ -318,7 +319,7 @@ ImmIsUIMessageAW(HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam, BOOL bAns
return FALSE; return FALSE;
} }
if (!hWndIME) if (IS_NULL_UNEXPECTEDLY(hWndIME))
return TRUE; return TRUE;
if (bAnsi) if (bAnsi)
@ -369,7 +370,7 @@ LRESULT APIENTRY CtfImmSetLangBand(HWND hWnd, BOOL fSet)
if (hWnd && gpsi) if (hWnd && gpsi)
pWnd = ValidateHwndNoErr(hWnd); pWnd = ValidateHwndNoErr(hWnd);
if (!pWnd) if (IS_NULL_UNEXPECTEDLY(pWnd))
return 0; return 0;
if (pWnd->state2 & WNDS2_WMCREATEMSGPROCESSED) if (pWnd->state2 & WNDS2_WMCREATEMSGPROCESSED)
@ -380,7 +381,7 @@ LRESULT APIENTRY CtfImmSetLangBand(HWND hWnd, BOOL fSet)
} }
pSetBand = ImmLocalAlloc(0, sizeof(IMM_DELAY_SET_LANG_BAND)); pSetBand = ImmLocalAlloc(0, sizeof(IMM_DELAY_SET_LANG_BAND));
if (!pSetBand) if (IS_NULL_UNEXPECTEDLY(pSetBand))
return 0; return 0;
pSetBand->hWnd = hWnd; pSetBand->hWnd = hWnd;
@ -399,12 +400,17 @@ static BOOL CALLBACK Imm32SendNotificationProc(HIMC hIMC, LPARAM lParam)
LPINPUTCONTEXTDX pIC; LPINPUTCONTEXTDX pIC;
pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC); pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
return TRUE; return TRUE;
hWnd = pIC->hWnd; hWnd = pIC->hWnd;
if (!IsWindow(hWnd)) if (hWnd == NULL || !IsWindow(hWnd))
{
ERR("\n");
goto Quit; goto Quit;
}
TRACE("dwChange: 0x%08X\n", pIC->dwChange);
if (pIC->dwChange & INPUTCONTEXTDX_CHANGE_OPEN) if (pIC->dwChange & INPUTCONTEXTDX_CHANGE_OPEN)
SendMessageW(hWnd, WM_IME_NOTIFY, IMN_SETOPENSTATUS, 0); SendMessageW(hWnd, WM_IME_NOTIFY, IMN_SETOPENSTATUS, 0);
@ -426,17 +432,11 @@ BOOL APIENTRY Imm32SendNotification(BOOL bProcess)
return ImmEnumInputContext((bProcess ? -1 : 0), Imm32SendNotificationProc, 0); return ImmEnumInputContext((bProcess ? -1 : 0), Imm32SendNotificationProc, 0);
} }
VOID APIENTRY Imm32RequestError(DWORD dwError)
{
FIXME("()\n");
SetLastError(dwError);
}
LRESULT APIENTRY LRESULT APIENTRY
Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bAnsiAPI) Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bAnsiAPI)
{ {
HWND hWnd; HWND hWnd;
DWORD ret = 0, dwCharPos, cchCompStr; DWORD ret = 0, dwCharPos, cchCompStr, dwSize;
LPVOID pCS, pTempData = pData; LPVOID pCS, pTempData = pData;
LPRECONVERTSTRING pRS; LPRECONVERTSTRING pRS;
LPIMECHARPOSITION pICP; LPIMECHARPOSITION pICP;
@ -456,10 +456,17 @@ Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bA
}; };
if (dwCommand == 0 || dwCommand > IMR_DOCUMENTFEED) if (dwCommand == 0 || dwCommand > IMR_DOCUMENTFEED)
{
ERR("\n");
return 0; /* Out of range */ return 0; /* Out of range */
}
if (pData && IsBadWritePtr(pData, acbData[bAnsiAPI * 7 + dwCommand - 1])) dwSize = acbData[bAnsiAPI * 7 + dwCommand - 1];
if (pData && IsBadWritePtr(pData, dwSize))
{
ERR("\n");
return 0; /* Invalid pointer */ return 0; /* Invalid pointer */
}
/* Sanity check */ /* Sanity check */
switch (dwCommand) switch (dwCommand)
@ -468,7 +475,7 @@ Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bA
pRS = pData; pRS = pData;
if (pRS && (pRS->dwVersion != 0 || pRS->dwSize < sizeof(RECONVERTSTRING))) if (pRS && (pRS->dwVersion != 0 || pRS->dwSize < sizeof(RECONVERTSTRING)))
{ {
Imm32RequestError(ERROR_INVALID_PARAMETER); ERR("\n");
return 0; return 0;
} }
break; break;
@ -477,7 +484,7 @@ Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bA
pRS = pData; pRS = pData;
if (!pRS || pRS->dwVersion != 0) if (!pRS || pRS->dwVersion != 0)
{ {
Imm32RequestError(ERROR_INVALID_PARAMETER); ERR("\n");
return 0; return 0;
} }
break; break;
@ -485,7 +492,7 @@ Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bA
default: default:
if (!pData) if (!pData)
{ {
Imm32RequestError(ERROR_INVALID_PARAMETER); ERR("\n");
return 0; return 0;
} }
break; break;
@ -503,18 +510,20 @@ Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bA
{ {
case IMR_COMPOSITIONFONT: case IMR_COMPOSITIONFONT:
if (bAnsiAPI == bAnsiWnd) if (bAnsiAPI == bAnsiWnd)
goto DoIt; goto DoIt; /* No conversion needed */
if (bAnsiWnd) if (bAnsiWnd)
pTempData = ImmLocalAlloc(0, sizeof(LOGFONTA)); pTempData = ImmLocalAlloc(0, sizeof(LOGFONTA));
else else
pTempData = ImmLocalAlloc(0, sizeof(LOGFONTW)); pTempData = ImmLocalAlloc(0, sizeof(LOGFONTW));
if (!pTempData)
if (IS_NULL_UNEXPECTEDLY(pTempData))
return 0; return 0;
break; break;
case IMR_RECONVERTSTRING: case IMR_CONFIRMRECONVERTSTRING: case IMR_DOCUMENTFEED: case IMR_RECONVERTSTRING: case IMR_CONFIRMRECONVERTSTRING: case IMR_DOCUMENTFEED:
if (bAnsiAPI == bAnsiWnd || !pData) if (bAnsiAPI == bAnsiWnd || !pData)
goto DoIt; goto DoIt; /* No conversion needed */
if (bAnsiWnd) if (bAnsiWnd)
ret = Imm32ReconvertAnsiFromWide(NULL, pData, uCodePage); ret = Imm32ReconvertAnsiFromWide(NULL, pData, uCodePage);
@ -522,7 +531,7 @@ Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bA
ret = Imm32ReconvertWideFromAnsi(NULL, pData, uCodePage); ret = Imm32ReconvertWideFromAnsi(NULL, pData, uCodePage);
pTempData = ImmLocalAlloc(0, ret + sizeof(WCHAR)); pTempData = ImmLocalAlloc(0, ret + sizeof(WCHAR));
if (!pTempData) if (IS_NULL_UNEXPECTEDLY(pTempData))
return 0; return 0;
pRS = pTempData; pRS = pTempData;
@ -540,7 +549,7 @@ Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bA
case IMR_QUERYCHARPOSITION: case IMR_QUERYCHARPOSITION:
if (bAnsiAPI == bAnsiWnd) if (bAnsiAPI == bAnsiWnd)
goto DoIt; goto DoIt; /* No conversion needed */
pICP = pData; pICP = pData;
dwCharPos = pICP->dwCharPos; dwCharPos = pICP->dwCharPos;
@ -548,11 +557,11 @@ Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bA
if (bAnsiAPI) if (bAnsiAPI)
{ {
cchCompStr = ImmGetCompositionStringA(hIMC, GCS_COMPSTR, NULL, 0); cchCompStr = ImmGetCompositionStringA(hIMC, GCS_COMPSTR, NULL, 0);
if (!cchCompStr) if (IS_ZERO_UNEXPECTEDLY(cchCompStr))
return 0; return 0;
pCS = ImmLocalAlloc(0, (cchCompStr + 1) * sizeof(CHAR)); pCS = ImmLocalAlloc(0, (cchCompStr + 1) * sizeof(CHAR));
if (!pCS) if (IS_NULL_UNEXPECTEDLY(pCS))
return 0; return 0;
ImmGetCompositionStringA(hIMC, GCS_COMPSTR, pCS, cchCompStr); ImmGetCompositionStringA(hIMC, GCS_COMPSTR, pCS, cchCompStr);
@ -561,11 +570,11 @@ Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bA
else else
{ {
cchCompStr = ImmGetCompositionStringW(hIMC, GCS_COMPSTR, NULL, 0); cchCompStr = ImmGetCompositionStringW(hIMC, GCS_COMPSTR, NULL, 0);
if (!cchCompStr) if (IS_ZERO_UNEXPECTEDLY(cchCompStr))
return 0; return 0;
pCS = ImmLocalAlloc(0, (cchCompStr + 1) * sizeof(WCHAR)); pCS = ImmLocalAlloc(0, (cchCompStr + 1) * sizeof(WCHAR));
if (!pCS) if (IS_NULL_UNEXPECTEDLY(pCS))
return 0; return 0;
ImmGetCompositionStringW(hIMC, GCS_COMPSTR, pCS, cchCompStr); ImmGetCompositionStringW(hIMC, GCS_COMPSTR, pCS, cchCompStr);
@ -576,6 +585,7 @@ Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bA
break; break;
default: default:
WARN("\n");
break; break;
} }
@ -588,7 +598,7 @@ DoIt:
ret = SendMessageW(hWnd, WM_IME_REQUEST, dwCommand, (LPARAM)pTempData); ret = SendMessageW(hWnd, WM_IME_REQUEST, dwCommand, (LPARAM)pTempData);
if (bAnsiAPI == bAnsiWnd) if (bAnsiAPI == bAnsiWnd)
goto Quit; goto Quit; /* No conversion needed */
/* Get back to caller */ /* Get back to caller */
switch (dwCommand) switch (dwCommand)
@ -624,6 +634,7 @@ DoIt:
break; break;
default: default:
WARN("\n");
break; break;
} }
@ -641,11 +652,11 @@ LRESULT APIENTRY ImmRequestMessageAW(HIMC hIMC, WPARAM wParam, LPARAM lParam, BO
HWND hWnd; HWND hWnd;
PWND pWnd = NULL; PWND pWnd = NULL;
if (!hIMC || Imm32IsCrossThreadAccess(hIMC)) if (IS_NULL_UNEXPECTEDLY(hIMC) || IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
hWnd = pIC->hWnd; hWnd = pIC->hWnd;
@ -733,7 +744,7 @@ UINT WINAPI ImmGetVirtualKey(HWND hWnd)
hIMC = ImmGetContext(hWnd); hIMC = ImmGetContext(hWnd);
pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC); pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
if (!pIC) if (IS_NULL_UNEXPECTEDLY(pIC))
return ret; return ret;
if (pIC->bNeedsTrans) if (pIC->bNeedsTrans)
@ -749,7 +760,7 @@ DWORD WINAPI ImmGetAppCompatFlags(HIMC hIMC)
DWORD dwFlags; DWORD dwFlags;
pClientIMC = ImmLockClientImc(hIMC); pClientIMC = ImmLockClientImc(hIMC);
if (pClientIMC == NULL) if (IS_NULL_UNEXPECTEDLY(pClientIMC))
return 0; return 0;
dwFlags = pClientIMC->dwCompatFlags; dwFlags = pClientIMC->dwCompatFlags;
@ -833,8 +844,12 @@ ImmProcessKey(HWND hWnd, HKL hKL, UINT vKey, LPARAM lParam, DWORD dwHotKeyID)
{ {
/* The key has been processed by IME's ImeProcessKey */ /* The key has been processed by IME's ImeProcessKey */
LANGID wLangID = LANGIDFROMLCID(GetSystemDefaultLCID()); LANGID wLangID = LANGIDFROMLCID(GetSystemDefaultLCID());
if (PRIMARYLANGID(wLangID) != LANG_KOREAN || /* Korean doesn't wanna this code */ if (PRIMARYLANGID(wLangID) == LANG_KOREAN &&
(vKey != VK_PROCESSKEY && !(ret & IPHK_HOTKEY))) /* Is the key to be processed? */ (vKey == VK_PROCESSKEY || (ret & IPHK_HOTKEY)))
{
/* Korean don't want VK_PROCESSKEY and IME hot-keys */
}
else
{ {
/* Add WM_KEYDOWN:VK_PROCESSKEY message */ /* Add WM_KEYDOWN:VK_PROCESSKEY message */
ImmTranslateMessage(hWnd, WM_KEYDOWN, VK_PROCESSKEY, lParam); ImmTranslateMessage(hWnd, WM_KEYDOWN, VK_PROCESSKEY, lParam);
@ -844,7 +859,7 @@ ImmProcessKey(HWND hWnd, HKL hKL, UINT vKey, LPARAM lParam, DWORD dwHotKeyID)
} }
ImmReleaseContext(hWnd, hIMC); ImmReleaseContext(hWnd, hIMC);
return ret; return ret; /* Returns IPHK_... flags */
} }
/*********************************************************************** /***********************************************************************
@ -869,6 +884,7 @@ LRESULT WINAPI ImmSystemHandler(HIMC hIMC, WPARAM wParam, LPARAM lParam)
return CtfImmSetLangBand((HWND)lParam, (wParam == IMS_SETLANGBAND)); return CtfImmSetLangBand((HWND)lParam, (wParam == IMS_SETLANGBAND));
default: default:
WARN("\n");
return 0; return 0;
} }
} }
@ -888,18 +904,18 @@ BOOL WINAPI ImmGenerateMessage(HIMC hIMC)
TRACE("(%p)\n", hIMC); TRACE("(%p)\n", hIMC);
if (Imm32IsCrossThreadAccess(hIMC)) if (IS_CROSS_THREAD_HIMC(hIMC))
return FALSE; return FALSE;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (pClientImc == NULL) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return FALSE; return FALSE;
bAnsi = !(pClientImc->dwFlags & CLIENTIMC_WIDE); bAnsi = !(pClientImc->dwFlags & CLIENTIMC_WIDE);
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return FALSE; return FALSE;
dwCount = pIC->dwNumMsgBuf; dwCount = pIC->dwNumMsgBuf;
@ -908,12 +924,12 @@ BOOL WINAPI ImmGenerateMessage(HIMC hIMC)
hMsgBuf = pIC->hMsgBuf; hMsgBuf = pIC->hMsgBuf;
pMsgs = ImmLockIMCC(hMsgBuf); pMsgs = ImmLockIMCC(hMsgBuf);
if (pMsgs == NULL) if (IS_NULL_UNEXPECTEDLY(pMsgs))
goto Quit; goto Quit;
cbTrans = dwCount * sizeof(TRANSMSG); cbTrans = dwCount * sizeof(TRANSMSG);
pTrans = ImmLocalAlloc(0, cbTrans); pTrans = ImmLocalAlloc(0, cbTrans);
if (pTrans == NULL) if (IS_NULL_UNEXPECTEDLY(pTrans))
goto Quit; goto Quit;
RtlCopyMemory(pTrans, pMsgs, cbTrans); RtlCopyMemory(pTrans, pMsgs, cbTrans);
@ -962,7 +978,7 @@ ImmPostMessages(HWND hwnd, HIMC hIMC, DWORD dwCount, LPTRANSMSG lpTransMsg)
BOOL bAnsi; BOOL bAnsi;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (pClientImc == NULL) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return; return;
bAnsi = !(pClientImc->dwFlags & CLIENTIMC_WIDE); bAnsi = !(pClientImc->dwFlags & CLIENTIMC_WIDE);
@ -1043,7 +1059,7 @@ BOOL WINAPI ImmTranslateMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lKeyD
hIMC = ImmGetContext(hwnd); hIMC = ImmGetContext(hwnd);
pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC); pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
{ {
ImmReleaseContext(hwnd, hIMC); ImmReleaseContext(hwnd, hIMC);
return FALSE; return FALSE;
@ -1071,11 +1087,14 @@ BOOL WINAPI ImmTranslateMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lKeyD
dwThreadId = GetWindowThreadProcessId(hwnd, NULL); dwThreadId = GetWindowThreadProcessId(hwnd, NULL);
hKL = GetKeyboardLayout(dwThreadId); hKL = GetKeyboardLayout(dwThreadId);
pImeDpi = ImmLockImeDpi(hKL); pImeDpi = ImmLockImeDpi(hKL);
if (pImeDpi == NULL) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
goto Quit; goto Quit;
if (!GetKeyboardState(abKeyState)) /* get keyboard ON/OFF status */ if (!GetKeyboardState(abKeyState)) /* get keyboard ON/OFF status */
{
WARN("\n");
goto Quit; goto Quit;
}
/* convert a virtual key if IME_PROP_KBD_CHAR_FIRST */ /* convert a virtual key if IME_PROP_KBD_CHAR_FIRST */
vk = pIC->nVKey; vk = pIC->nVKey;
@ -1110,7 +1129,7 @@ BOOL WINAPI ImmTranslateMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lKeyD
/* allocate a list */ /* allocate a list */
cbList = offsetof(TRANSMSGLIST, TransMsg) + MSG_COUNT * sizeof(TRANSMSG); cbList = offsetof(TRANSMSGLIST, TransMsg) + MSG_COUNT * sizeof(TRANSMSG);
pList = ImmLocalAlloc(0, cbList); pList = ImmLocalAlloc(0, cbList);
if (!pList) if (IS_NULL_UNEXPECTEDLY(pList))
goto Quit; goto Quit;
/* use IME conversion engine and convert the list */ /* use IME conversion engine and convert the list */
@ -1128,7 +1147,7 @@ BOOL WINAPI ImmTranslateMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lKeyD
else else
{ {
pTransMsg = ImmLockIMCC(pIC->hMsgBuf); pTransMsg = ImmLockIMCC(pIC->hMsgBuf);
if (pTransMsg == NULL) if (IS_NULL_UNEXPECTEDLY(pTransMsg))
goto Quit; goto Quit;
ImmPostMessages(hwnd, hIMC, kret, pTransMsg); ImmPostMessages(hwnd, hIMC, kret, pTransMsg);
ImmUnlockIMCC(pIC->hMsgBuf); ImmUnlockIMCC(pIC->hMsgBuf);
@ -1139,6 +1158,7 @@ Quit:
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
ImmReleaseContext(hwnd, hIMC); ImmReleaseContext(hwnd, hIMC);
TRACE("ret: %d\n", ret);
return ret; return ret;
#undef MSG_COUNT #undef MSG_COUNT
} }
@ -1173,7 +1193,7 @@ ImmSendMessageToActiveDefImeWndW(UINT uMsg, WPARAM wParam, LPARAM lParam)
return 0; return 0;
hwndIME = (HWND)NtUserQueryWindow((HWND)wParam, QUERY_WINDOW_DEFAULT_IME); hwndIME = (HWND)NtUserQueryWindow((HWND)wParam, QUERY_WINDOW_DEFAULT_IME);
if (!hwndIME) if (IS_NULL_UNEXPECTEDLY(hwndIME))
return 0; return 0;
return SendMessageW(hwndIME, uMsg, wParam, lParam); return SendMessageW(hwndIME, uMsg, wParam, lParam);

View file

@ -7,7 +7,7 @@
* Copyright 2017 James Tabor <james.tabor@reactos.org> * Copyright 2017 James Tabor <james.tabor@reactos.org>
* Copyright 2018 Amine Khaldi <amine.khaldi@reactos.org> * Copyright 2018 Amine Khaldi <amine.khaldi@reactos.org>
* Copyright 2020 Oleg Dubinskiy <oleg.dubinskij2013@yandex.ua> * Copyright 2020 Oleg Dubinskiy <oleg.dubinskij2013@yandex.ua>
* Copyright 2020-2021 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com> * Copyright 2020-2022 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
*/ */
#pragma once #pragma once
@ -96,25 +96,48 @@ PIMEDPI APIENTRY Imm32FindOrLoadImeDpi(HKL hKL);
LPINPUTCONTEXT APIENTRY Imm32InternalLockIMC(HIMC hIMC, BOOL fSelect); LPINPUTCONTEXT APIENTRY Imm32InternalLockIMC(HIMC hIMC, BOOL fSelect);
BOOL APIENTRY Imm32ReleaseIME(HKL hKL); BOOL APIENTRY Imm32ReleaseIME(HKL hKL);
BOOL APIENTRY Imm32IsSystemJapaneseOrKorean(VOID); BOOL APIENTRY Imm32IsSystemJapaneseOrKorean(VOID);
BOOL APIENTRY Imm32IsCrossThreadAccess(HIMC hIMC);
static inline BOOL Imm32IsCrossThreadAccess(HIMC hIMC) BOOL APIENTRY Imm32IsCrossProcessAccess(HWND hWnd);
{
DWORD dwImeThreadId = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTTHREADID);
DWORD dwThreadId = GetCurrentThreadId();
return (dwImeThreadId != dwThreadId);
}
// Win: TestWindowProcess
static inline BOOL Imm32IsCrossProcessAccess(HWND hWnd)
{
return (NtUserQueryWindow(hWnd, QUERY_WINDOW_UNIQUE_PROCESS_ID) !=
(DWORD_PTR)NtCurrentTeb()->ClientId.UniqueProcess);
}
BOOL WINAPI Imm32IsImcAnsi(HIMC hIMC); BOOL WINAPI Imm32IsImcAnsi(HIMC hIMC);
#define ImeDpi_IsUnicode(pImeDpi) ((pImeDpi)->ImeInfo.fdwProperty & IME_PROP_UNICODE) /*
#define IS_16BIT_MODE() (GetWin32ClientInfo()->dwTIFlags & TIF_16BIT) * Unexpected Condition Checkers
* --- Examine the condition, and then generate trace log if necessary.
*/
#ifdef NDEBUG /* on Release */
#define IS_NULL_UNEXPECTEDLY(p) (!(p))
#define IS_ZERO_UNEXPECTEDLY(p) (!(p))
#define IS_TRUE_UNEXPECTEDLY(x) (x)
#define IS_FALSE_UNEXPECTEDLY(x) (!(x))
#define IS_ERROR_UNEXPECTEDLY(x) (!(x))
#else /* on Debug */
#define IS_NULL_UNEXPECTEDLY(p) \
(!(p) ? (ros_dbg_log(__WINE_DBCL_ERR, __wine_dbch___default, \
__FILE__, __FUNCTION__, __LINE__, "%s was NULL\n", #p), TRUE) \
: FALSE)
#define IS_ZERO_UNEXPECTEDLY(p) \
(!(p) ? (ros_dbg_log(__WINE_DBCL_ERR, __wine_dbch___default, \
__FILE__, __FUNCTION__, __LINE__, "%s was zero\n", #p), TRUE) \
: FALSE)
#define IS_TRUE_UNEXPECTEDLY(x) \
((x) ? (ros_dbg_log(__WINE_DBCL_ERR, __wine_dbch___default, \
__FILE__, __FUNCTION__, __LINE__, "%s was non-zero\n", #x), TRUE) \
: FALSE)
#define IS_FALSE_UNEXPECTEDLY(x) \
((!(x)) ? (ros_dbg_log(__WINE_DBCL_ERR, __wine_dbch___default, \
__FILE__, __FUNCTION__, __LINE__, "%s was FALSE\n", #x), TRUE) \
: FALSE)
#define IS_ERROR_UNEXPECTEDLY(x) \
((x) != ERROR_SUCCESS ? (ros_dbg_log(__WINE_DBCL_ERR, __wine_dbch___default, \
__FILE__, __FUNCTION__, __LINE__, \
"%s was 0x%X\n", #x, (x)), TRUE) \
: FALSE)
#endif
#define IS_CROSS_THREAD_HIMC(hIMC) IS_TRUE_UNEXPECTEDLY(Imm32IsCrossThreadAccess(hIMC))
#define IS_CROSS_PROCESS_HWND(hWnd) IS_TRUE_UNEXPECTEDLY(Imm32IsCrossProcessAccess(hWnd))
#define ImeDpi_IsUnicode(pImeDpi) ((pImeDpi)->ImeInfo.fdwProperty & IME_PROP_UNICODE)
#define IS_16BIT_MODE() (GetWin32ClientInfo()->dwTIFlags & TIF_16BIT)
DWORD APIENTRY DWORD APIENTRY
CandidateListWideToAnsi(const CANDIDATELIST *pWideCL, LPCANDIDATELIST pAnsiCL, DWORD dwBufLen, CandidateListWideToAnsi(const CANDIDATELIST *pWideCL, LPCANDIDATELIST pAnsiCL, DWORD dwBufLen,
@ -156,14 +179,7 @@ UINT APIENTRY Imm32GetImeLayout(PREG_IME pLayouts, UINT cLayouts);
BOOL APIENTRY Imm32WriteImeLayout(HKL hKL, LPCWSTR pchFilePart, LPCWSTR pszLayoutText); BOOL APIENTRY Imm32WriteImeLayout(HKL hKL, LPCWSTR pchFilePart, LPCWSTR pszLayoutText);
HKL APIENTRY Imm32AssignNewLayout(UINT cKLs, const REG_IME *pLayouts, WORD wLangID); HKL APIENTRY Imm32AssignNewLayout(UINT cKLs, const REG_IME *pLayouts, WORD wLangID);
BOOL APIENTRY Imm32CopyImeFile(LPWSTR pszOldFile, LPCWSTR pszNewFile); BOOL APIENTRY Imm32CopyImeFile(LPWSTR pszOldFile, LPCWSTR pszNewFile);
PTHREADINFO FASTCALL Imm32CurrentPti(VOID);
/* Win: PtiCurrent */
static inline PTHREADINFO FASTCALL Imm32CurrentPti(VOID)
{
if (NtCurrentTeb()->Win32ThreadInfo == NULL)
NtUserGetThreadState(THREADSTATE_GETTHREADINFO);
return NtCurrentTeb()->Win32ThreadInfo;
}
HBITMAP Imm32LoadBitmapFromBytes(const BYTE *pb); HBITMAP Imm32LoadBitmapFromBytes(const BYTE *pb);
BOOL Imm32StoreBitmapToBytes(HBITMAP hbm, LPBYTE pbData, DWORD cbDataMax); BOOL Imm32StoreBitmapToBytes(HBITMAP hbm, LPBYTE pbData, DWORD cbDataMax);

View file

@ -38,14 +38,14 @@ Imm32EnumWordProcA2W(LPCSTR pszReadingA, DWORD dwStyle, LPCSTR pszRegisterA, LPV
if (pszReadingA) if (pszReadingA)
{ {
pszReadingW = Imm32WideFromAnsi(lpEnumData->uCodePage, pszReadingA); pszReadingW = Imm32WideFromAnsi(lpEnumData->uCodePage, pszReadingA);
if (pszReadingW == NULL) if (IS_NULL_UNEXPECTEDLY(pszReadingW))
goto Quit; goto Quit;
} }
if (pszRegisterA) if (pszRegisterA)
{ {
pszRegisterW = Imm32WideFromAnsi(lpEnumData->uCodePage, pszRegisterA); pszRegisterW = Imm32WideFromAnsi(lpEnumData->uCodePage, pszRegisterA);
if (pszRegisterW == NULL) if (IS_NULL_UNEXPECTEDLY(pszRegisterW))
goto Quit; goto Quit;
} }
@ -68,14 +68,14 @@ Imm32EnumWordProcW2A(LPCWSTR pszReadingW, DWORD dwStyle, LPCWSTR pszRegisterW, L
if (pszReadingW) if (pszReadingW)
{ {
pszReadingA = Imm32AnsiFromWide(lpEnumData->uCodePage, pszReadingW); pszReadingA = Imm32AnsiFromWide(lpEnumData->uCodePage, pszReadingW);
if (pszReadingW == NULL) if (IS_NULL_UNEXPECTEDLY(pszReadingW))
goto Quit; goto Quit;
} }
if (pszRegisterW) if (pszRegisterW)
{ {
pszRegisterA = Imm32AnsiFromWide(lpEnumData->uCodePage, pszRegisterW); pszRegisterA = Imm32AnsiFromWide(lpEnumData->uCodePage, pszRegisterW);
if (pszRegisterA == NULL) if (IS_NULL_UNEXPECTEDLY(pszRegisterA))
goto Quit; goto Quit;
} }
@ -105,10 +105,10 @@ ImmEnumRegisterWordA(HKL hKL, REGISTERWORDENUMPROCA lpfnEnumProc,
dwStyle, debugstr_a(lpszRegister), lpData); dwStyle, debugstr_a(lpszRegister), lpData);
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return 0; return 0;
if (!ImeDpi_IsUnicode(pImeDpi)) if (!ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
{ {
ret = pImeDpi->ImeEnumRegisterWord(lpfnEnumProc, lpszReading, dwStyle, ret = pImeDpi->ImeEnumRegisterWord(lpfnEnumProc, lpszReading, dwStyle,
lpszRegister, lpData); lpszRegister, lpData);
@ -119,14 +119,14 @@ ImmEnumRegisterWordA(HKL hKL, REGISTERWORDENUMPROCA lpfnEnumProc,
if (lpszReading) if (lpszReading)
{ {
pszReadingW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszReading); pszReadingW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszReading);
if (pszReadingW == NULL) if (IS_NULL_UNEXPECTEDLY(pszReadingW))
goto Quit; goto Quit;
} }
if (lpszRegister) if (lpszRegister)
{ {
pszRegisterW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszRegister); pszRegisterW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszRegister);
if (pszRegisterW == NULL) if (IS_NULL_UNEXPECTEDLY(pszRegisterW))
goto Quit; goto Quit;
} }
@ -162,10 +162,10 @@ ImmEnumRegisterWordW(HKL hKL, REGISTERWORDENUMPROCW lpfnEnumProc,
dwStyle, debugstr_w(lpszRegister), lpData); dwStyle, debugstr_w(lpszRegister), lpData);
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return 0; return 0;
if (ImeDpi_IsUnicode(pImeDpi)) if (ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
{ {
ret = pImeDpi->ImeEnumRegisterWord(lpfnEnumProc, lpszReading, dwStyle, ret = pImeDpi->ImeEnumRegisterWord(lpfnEnumProc, lpszReading, dwStyle,
lpszRegister, lpData); lpszRegister, lpData);
@ -176,14 +176,14 @@ ImmEnumRegisterWordW(HKL hKL, REGISTERWORDENUMPROCW lpfnEnumProc,
if (lpszReading) if (lpszReading)
{ {
pszReadingA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszReading); pszReadingA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszReading);
if (pszReadingA == NULL) if (IS_NULL_UNEXPECTEDLY(pszReadingA))
goto Quit; goto Quit;
} }
if (lpszRegister) if (lpszRegister)
{ {
pszRegisterA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszRegister); pszRegisterA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszRegister);
if (pszRegisterA == NULL) if (IS_NULL_UNEXPECTEDLY(pszRegisterA))
goto Quit; goto Quit;
} }
@ -199,6 +199,7 @@ Quit:
ImmLocalFree(pszReadingA); ImmLocalFree(pszReadingA);
ImmLocalFree(pszRegisterA); ImmLocalFree(pszRegisterA);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: %u\n", ret);
return ret; return ret;
} }
@ -217,10 +218,10 @@ UINT WINAPI ImmGetRegisterWordStyleA(HKL hKL, UINT nItem, LPSTYLEBUFA lpStyleBuf
TRACE("(%p, %u, %p)\n", hKL, nItem, lpStyleBuf); TRACE("(%p, %u, %p)\n", hKL, nItem, lpStyleBuf);
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return 0; return 0;
if (!ImeDpi_IsUnicode(pImeDpi)) if (!ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
{ {
ret = pImeDpi->ImeGetRegisterWordStyle(nItem, lpStyleBuf); ret = pImeDpi->ImeGetRegisterWordStyle(nItem, lpStyleBuf);
goto Quit; goto Quit;
@ -229,7 +230,7 @@ UINT WINAPI ImmGetRegisterWordStyleA(HKL hKL, UINT nItem, LPSTYLEBUFA lpStyleBuf
if (nItem > 0) if (nItem > 0)
{ {
pNewStylesW = ImmLocalAlloc(0, nItem * sizeof(STYLEBUFW)); pNewStylesW = ImmLocalAlloc(0, nItem * sizeof(STYLEBUFW));
if (!pNewStylesW) if (IS_NULL_UNEXPECTEDLY(pNewStylesW))
goto Quit; goto Quit;
} }
@ -257,6 +258,7 @@ UINT WINAPI ImmGetRegisterWordStyleA(HKL hKL, UINT nItem, LPSTYLEBUFA lpStyleBuf
Quit: Quit:
ImmLocalFree(pNewStylesW); ImmLocalFree(pNewStylesW);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: %u\n", ret);
return ret; return ret;
} }
@ -275,10 +277,10 @@ UINT WINAPI ImmGetRegisterWordStyleW(HKL hKL, UINT nItem, LPSTYLEBUFW lpStyleBuf
TRACE("(%p, %u, %p)\n", hKL, nItem, lpStyleBuf); TRACE("(%p, %u, %p)\n", hKL, nItem, lpStyleBuf);
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return 0; return 0;
if (ImeDpi_IsUnicode(pImeDpi)) if (ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
{ {
ret = pImeDpi->ImeGetRegisterWordStyle(nItem, lpStyleBuf); ret = pImeDpi->ImeGetRegisterWordStyle(nItem, lpStyleBuf);
goto Quit; goto Quit;
@ -287,7 +289,7 @@ UINT WINAPI ImmGetRegisterWordStyleW(HKL hKL, UINT nItem, LPSTYLEBUFW lpStyleBuf
if (nItem > 0) if (nItem > 0)
{ {
pNewStylesA = ImmLocalAlloc(0, nItem * sizeof(STYLEBUFA)); pNewStylesA = ImmLocalAlloc(0, nItem * sizeof(STYLEBUFA));
if (!pNewStylesA) if (IS_NULL_UNEXPECTEDLY(pNewStylesA))
goto Quit; goto Quit;
} }
@ -314,6 +316,7 @@ UINT WINAPI ImmGetRegisterWordStyleW(HKL hKL, UINT nItem, LPSTYLEBUFW lpStyleBuf
Quit: Quit:
ImmLocalFree(pNewStylesA); ImmLocalFree(pNewStylesA);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: %u\n", ret);
return ret; return ret;
} }
@ -331,10 +334,10 @@ ImmRegisterWordA(HKL hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszRegister
debugstr_a(lpszRegister)); debugstr_a(lpszRegister));
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return FALSE; return FALSE;
if (!ImeDpi_IsUnicode(pImeDpi)) if (!ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
{ {
ret = pImeDpi->ImeRegisterWord(lpszReading, dwStyle, lpszRegister); ret = pImeDpi->ImeRegisterWord(lpszReading, dwStyle, lpszRegister);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
@ -344,14 +347,14 @@ ImmRegisterWordA(HKL hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszRegister
if (lpszReading) if (lpszReading)
{ {
pszReadingW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszReading); pszReadingW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszReading);
if (pszReadingW == NULL) if (IS_NULL_UNEXPECTEDLY(pszReadingW))
goto Quit; goto Quit;
} }
if (lpszRegister) if (lpszRegister)
{ {
pszRegisterW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszRegister); pszRegisterW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszRegister);
if (pszRegisterW == NULL) if (IS_NULL_UNEXPECTEDLY(pszRegisterW))
goto Quit; goto Quit;
} }
@ -361,6 +364,7 @@ Quit:
ImmLocalFree(pszReadingW); ImmLocalFree(pszReadingW);
ImmLocalFree(pszRegisterW); ImmLocalFree(pszRegisterW);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: %d\n", ret);
return ret; return ret;
} }
@ -378,10 +382,10 @@ ImmRegisterWordW(HKL hKL, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszRegist
debugstr_w(lpszRegister)); debugstr_w(lpszRegister));
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return FALSE; return FALSE;
if (ImeDpi_IsUnicode(pImeDpi)) if (ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
{ {
ret = pImeDpi->ImeRegisterWord(lpszReading, dwStyle, lpszRegister); ret = pImeDpi->ImeRegisterWord(lpszReading, dwStyle, lpszRegister);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
@ -391,14 +395,14 @@ ImmRegisterWordW(HKL hKL, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszRegist
if (lpszReading) if (lpszReading)
{ {
pszReadingA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszReading); pszReadingA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszReading);
if (!pszReadingA) if (IS_NULL_UNEXPECTEDLY(pszReadingA))
goto Quit; goto Quit;
} }
if (lpszRegister) if (lpszRegister)
{ {
pszRegisterA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszRegister); pszRegisterA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszRegister);
if (!pszRegisterA) if (IS_NULL_UNEXPECTEDLY(pszRegisterA))
goto Quit; goto Quit;
} }
@ -408,6 +412,7 @@ Quit:
ImmLocalFree(pszReadingA); ImmLocalFree(pszReadingA);
ImmLocalFree(pszRegisterA); ImmLocalFree(pszRegisterA);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: %d\n", ret);
return ret; return ret;
} }
@ -425,10 +430,10 @@ ImmUnregisterWordA(HKL hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszUnregi
debugstr_a(lpszUnregister)); debugstr_a(lpszUnregister));
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (pImeDpi == NULL) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return FALSE; return FALSE;
if (!ImeDpi_IsUnicode(pImeDpi)) if (!ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
{ {
ret = pImeDpi->ImeUnregisterWord(lpszReading, dwStyle, lpszUnregister); ret = pImeDpi->ImeUnregisterWord(lpszReading, dwStyle, lpszUnregister);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
@ -438,14 +443,14 @@ ImmUnregisterWordA(HKL hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszUnregi
if (lpszReading) if (lpszReading)
{ {
pszReadingW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszReading); pszReadingW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszReading);
if (pszReadingW == NULL) if (IS_NULL_UNEXPECTEDLY(pszReadingW))
goto Quit; goto Quit;
} }
if (lpszUnregister) if (lpszUnregister)
{ {
pszUnregisterW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszUnregister); pszUnregisterW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszUnregister);
if (pszUnregisterW == NULL) if (IS_NULL_UNEXPECTEDLY(pszUnregisterW))
goto Quit; goto Quit;
} }
@ -455,6 +460,7 @@ Quit:
ImmLocalFree(pszReadingW); ImmLocalFree(pszReadingW);
ImmLocalFree(pszUnregisterW); ImmLocalFree(pszUnregisterW);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: %d\n", ret);
return ret; return ret;
} }
@ -472,10 +478,10 @@ ImmUnregisterWordW(HKL hKL, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszUnre
debugstr_w(lpszUnregister)); debugstr_w(lpszUnregister));
pImeDpi = Imm32FindOrLoadImeDpi(hKL); pImeDpi = Imm32FindOrLoadImeDpi(hKL);
if (!pImeDpi) if (IS_NULL_UNEXPECTEDLY(pImeDpi))
return FALSE; return FALSE;
if (ImeDpi_IsUnicode(pImeDpi)) if (ImeDpi_IsUnicode(pImeDpi)) /* No conversion needed */
{ {
ret = pImeDpi->ImeUnregisterWord(lpszReading, dwStyle, lpszUnregister); ret = pImeDpi->ImeUnregisterWord(lpszReading, dwStyle, lpszUnregister);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
@ -485,14 +491,14 @@ ImmUnregisterWordW(HKL hKL, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszUnre
if (lpszReading) if (lpszReading)
{ {
pszReadingA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszReading); pszReadingA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszReading);
if (!pszReadingA) if (IS_NULL_UNEXPECTEDLY(pszReadingA))
goto Quit; goto Quit;
} }
if (lpszUnregister) if (lpszUnregister)
{ {
pszUnregisterA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszUnregister); pszUnregisterA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszUnregister);
if (!pszUnregisterA) if (IS_NULL_UNEXPECTEDLY(pszUnregisterA))
goto Quit; goto Quit;
} }
@ -502,5 +508,6 @@ Quit:
ImmLocalFree(pszReadingA); ImmLocalFree(pszReadingA);
ImmLocalFree(pszUnregisterA); ImmLocalFree(pszUnregisterA);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: %d\n", ret);
return ret; return ret;
} }

View file

@ -15,6 +15,29 @@ WINE_DEFAULT_DEBUG_CHANNEL(imm);
HANDLE ghImmHeap = NULL; // Win: pImmHeap HANDLE ghImmHeap = NULL; // Win: pImmHeap
/* Win: PtiCurrent */
PTHREADINFO FASTCALL Imm32CurrentPti(VOID)
{
if (NtCurrentTeb()->Win32ThreadInfo == NULL)
NtUserGetThreadState(THREADSTATE_GETTHREADINFO);
return NtCurrentTeb()->Win32ThreadInfo;
}
BOOL APIENTRY Imm32IsCrossThreadAccess(HIMC hIMC)
{
DWORD_PTR dwImeThreadId = NtUserQueryInputContext(hIMC, QIC_INPUTTHREADID);
DWORD_PTR dwCurrentThreadId = GetCurrentThreadId();
return dwImeThreadId != dwCurrentThreadId;
}
// Win: TestWindowProcess
BOOL APIENTRY Imm32IsCrossProcessAccess(HWND hWnd)
{
DWORD_PTR WndPID = NtUserQueryWindow(hWnd, QUERY_WINDOW_UNIQUE_PROCESS_ID);
DWORD_PTR CurrentPID = (DWORD_PTR)NtCurrentTeb()->ClientId.UniqueProcess;
return WndPID != CurrentPID;
}
// Win: StrToUInt // Win: StrToUInt
HRESULT APIENTRY HRESULT APIENTRY
Imm32StrToUInt(LPCWSTR pszText, LPDWORD pdwValue, ULONG nBase) Imm32StrToUInt(LPCWSTR pszText, LPDWORD pdwValue, ULONG nBase)
@ -48,7 +71,12 @@ BOOL APIENTRY Imm32IsSystemJapaneseOrKorean(VOID)
LCID lcid = GetSystemDefaultLCID(); LCID lcid = GetSystemDefaultLCID();
LANGID LangID = LANGIDFROMLCID(lcid); LANGID LangID = LANGIDFROMLCID(lcid);
WORD wPrimary = PRIMARYLANGID(LangID); WORD wPrimary = PRIMARYLANGID(LangID);
return (wPrimary == LANG_JAPANESE || wPrimary == LANG_KOREAN); if (wPrimary != LANG_JAPANESE || wPrimary != LANG_KOREAN)
{
WARN("\n");
return FALSE;
}
return TRUE;
} }
typedef struct tagBITMAPCOREINFO256 typedef struct tagBITMAPCOREINFO256
@ -75,7 +103,10 @@ HBITMAP Imm32LoadBitmapFromBytes(const BYTE *pb)
pbmci = (const BITMAPCOREINFO256 *)pb; pbmci = (const BITMAPCOREINFO256 *)pb;
hbm = CreateDIBSection(NULL, (LPBITMAPINFO)pbmci, DIB_RGB_COLORS, &pvBits, NULL, 0); hbm = CreateDIBSection(NULL, (LPBITMAPINFO)pbmci, DIB_RGB_COLORS, &pvBits, NULL, 0);
if (!hbm || !GetObject(hbm, sizeof(BITMAP), &bm)) if (!hbm || !GetObject(hbm, sizeof(BITMAP), &bm))
{
ERR("\n");
return NULL; return NULL;
}
switch (pbmci->bmciHeader.bcBitCount) switch (pbmci->bmciHeader.bcBitCount)
{ {
@ -86,6 +117,7 @@ HBITMAP Imm32LoadBitmapFromBytes(const BYTE *pb)
cColors = 0; cColors = 0;
break; break;
default: default:
ERR("\n");
DeleteObject(hbm); DeleteObject(hbm);
return NULL; return NULL;
} }
@ -99,6 +131,7 @@ HBITMAP Imm32LoadBitmapFromBytes(const BYTE *pb)
ib += bm.bmWidthBytes * bm.bmHeight; ib += bm.bmWidthBytes * bm.bmHeight;
if (ib > cbBytes) if (ib > cbBytes)
{ {
ERR("\n");
DeleteObject(hbm); DeleteObject(hbm);
return NULL; return NULL;
} }
@ -119,7 +152,10 @@ BOOL Imm32StoreBitmapToBytes(HBITMAP hbm, LPBYTE pbData, DWORD cbDataMax)
*(LPDWORD)pb = 0; *(LPDWORD)pb = 0;
if (!GetObject(hbm, sizeof(BITMAP), &bm)) if (!GetObject(hbm, sizeof(BITMAP), &bm))
{
ERR("\n");
return FALSE; return FALSE;
}
ZeroMemory(&bmci, sizeof(bmci)); ZeroMemory(&bmci, sizeof(bmci));
bmci.bmciHeader.bcSize = sizeof(BITMAPCOREHEADER); bmci.bmciHeader.bcSize = sizeof(BITMAPCOREHEADER);
@ -137,6 +173,7 @@ BOOL Imm32StoreBitmapToBytes(HBITMAP hbm, LPBYTE pbData, DWORD cbDataMax)
cColors = 0; cColors = 0;
break; break;
default: default:
ERR("\n");
return FALSE; return FALSE;
} }
@ -145,7 +182,10 @@ BOOL Imm32StoreBitmapToBytes(HBITMAP hbm, LPBYTE pbData, DWORD cbDataMax)
cbBytes += cColors * sizeof(RGBTRIPLE); cbBytes += cColors * sizeof(RGBTRIPLE);
cbBytes += bm.bmWidthBytes * bm.bmHeight; cbBytes += bm.bmWidthBytes * bm.bmHeight;
if (cbBytes > cbDataMax) if (cbBytes > cbDataMax)
{
ERR("\n");
return FALSE; return FALSE;
}
hDC = CreateCompatibleDC(NULL); hDC = CreateCompatibleDC(NULL);
@ -177,7 +217,7 @@ BOOL WINAPI Imm32IsImcAnsi(HIMC hIMC)
{ {
BOOL ret; BOOL ret;
PCLIENTIMC pClientImc = ImmLockClientImc(hIMC); PCLIENTIMC pClientImc = ImmLockClientImc(hIMC);
if (!pClientImc) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return -1; return -1;
ret = !(pClientImc->dwFlags & CLIENTIMC_WIDE); ret = !(pClientImc->dwFlags & CLIENTIMC_WIDE);
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
@ -188,7 +228,7 @@ LPWSTR APIENTRY Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA)
{ {
INT cch = lstrlenA(pszA); INT cch = lstrlenA(pszA);
LPWSTR pszW = ImmLocalAlloc(0, (cch + 1) * sizeof(WCHAR)); LPWSTR pszW = ImmLocalAlloc(0, (cch + 1) * sizeof(WCHAR));
if (pszW == NULL) if (IS_NULL_UNEXPECTEDLY(pszW))
return NULL; return NULL;
cch = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pszA, cch, pszW, cch + 1); cch = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pszA, cch, pszW, cch + 1);
pszW[cch] = 0; pszW[cch] = 0;
@ -200,7 +240,7 @@ LPSTR APIENTRY Imm32AnsiFromWide(UINT uCodePage, LPCWSTR pszW)
INT cchW = lstrlenW(pszW); INT cchW = lstrlenW(pszW);
INT cchA = (cchW + 1) * sizeof(WCHAR); INT cchA = (cchW + 1) * sizeof(WCHAR);
LPSTR pszA = ImmLocalAlloc(0, cchA); LPSTR pszA = ImmLocalAlloc(0, cchA);
if (!pszA) if (IS_NULL_UNEXPECTEDLY(pszA))
return NULL; return NULL;
cchA = WideCharToMultiByte(uCodePage, 0, pszW, cchW, pszA, cchA, NULL, NULL); cchA = WideCharToMultiByte(uCodePage, 0, pszW, cchW, pszA, cchA, NULL, NULL);
pszA[cchA] = 0; pszA[cchA] = 0;
@ -246,7 +286,10 @@ LONG APIENTRY IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
BOOL Imm32GetSystemLibraryPath(LPWSTR pszPath, DWORD cchPath, LPCWSTR pszFileName) BOOL Imm32GetSystemLibraryPath(LPWSTR pszPath, DWORD cchPath, LPCWSTR pszFileName)
{ {
if (!pszFileName[0] || !GetSystemDirectoryW(pszPath, cchPath)) if (!pszFileName[0] || !GetSystemDirectoryW(pszPath, cchPath))
{
ERR("\n");
return FALSE; return FALSE;
}
StringCchCatW(pszPath, cchPath, L"\\"); StringCchCatW(pszPath, cchPath, L"\\");
StringCchCatW(pszPath, cchPath, pszFileName); StringCchCatW(pszPath, cchPath, pszFileName);
return TRUE; return TRUE;
@ -301,7 +344,10 @@ LPVOID FASTCALL ValidateHandleNoErr(HANDLE hObject, UINT uType)
LPVOID ptr; LPVOID ptr;
if (!NtUserValidateHandleSecure(hObject)) if (!NtUserValidateHandleSecure(hObject))
{
WARN("\n");
return NULL; return NULL;
}
ht = gSharedInfo.aheList; /* handle table */ ht = gSharedInfo.aheList; /* handle table */
ASSERT(ht); ASSERT(ht);
@ -345,13 +391,24 @@ LPVOID FASTCALL ValidateHandle(HANDLE hObject, UINT uType)
BOOL APIENTRY Imm32CheckImcProcess(PIMC pIMC) BOOL APIENTRY Imm32CheckImcProcess(PIMC pIMC)
{ {
HIMC hIMC; HIMC hIMC;
DWORD dwProcessID; DWORD_PTR dwPID1, dwPID2;
if (IS_NULL_UNEXPECTEDLY(pIMC))
return FALSE;
if (pIMC->head.pti == Imm32CurrentPti()) if (pIMC->head.pti == Imm32CurrentPti())
return TRUE; return TRUE;
hIMC = pIMC->head.h; hIMC = pIMC->head.h;
dwProcessID = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTPROCESSID); dwPID1 = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTPROCESSID);
return dwProcessID == (DWORD_PTR)NtCurrentTeb()->ClientId.UniqueProcess; dwPID2 = (DWORD_PTR)NtCurrentTeb()->ClientId.UniqueProcess;
if (dwPID1 != dwPID2)
{
WARN("PID 0x%X != 0x%X\n", dwPID1, dwPID2);
return FALSE;
}
return TRUE;
} }
// Win: ImmLocalAlloc // Win: ImmLocalAlloc
@ -360,7 +417,7 @@ LPVOID APIENTRY ImmLocalAlloc(DWORD dwFlags, DWORD dwBytes)
if (!ghImmHeap) if (!ghImmHeap)
{ {
ghImmHeap = RtlGetProcessHeap(); ghImmHeap = RtlGetProcessHeap();
if (ghImmHeap == NULL) if (IS_NULL_UNEXPECTEDLY(ghImmHeap))
return NULL; return NULL;
} }
return HeapAlloc(ghImmHeap, dwFlags, dwBytes); return HeapAlloc(ghImmHeap, dwFlags, dwBytes);
@ -375,7 +432,7 @@ Imm32MakeIMENotify(HIMC hIMC, HWND hwnd, DWORD dwAction, DWORD_PTR dwIndex, DWOR
HKL hKL; HKL hKL;
PIMEDPI pImeDpi; PIMEDPI pImeDpi;
if (dwAction) if (dwAction != 0)
{ {
dwThreadId = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTTHREADID); dwThreadId = (DWORD)NtUserQueryInputContext(hIMC, QIC_INPUTTHREADID);
if (dwThreadId) if (dwThreadId)
@ -409,7 +466,7 @@ DWORD APIENTRY Imm32BuildHimcList(DWORD dwThreadId, HIMC **pphList)
HIMC *phNewList; HIMC *phNewList;
phNewList = ImmLocalAlloc(0, dwCount * sizeof(HIMC)); phNewList = ImmLocalAlloc(0, dwCount * sizeof(HIMC));
if (phNewList == NULL) if (IS_NULL_UNEXPECTEDLY(phNewList))
return 0; return 0;
Status = NtUserBuildHimcList(dwThreadId, dwCount, phNewList, &dwCount); Status = NtUserBuildHimcList(dwThreadId, dwCount, phNewList, &dwCount);
@ -420,7 +477,7 @@ DWORD APIENTRY Imm32BuildHimcList(DWORD dwThreadId, HIMC **pphList)
return 0; return 0;
phNewList = ImmLocalAlloc(0, dwCount * sizeof(HIMC)); phNewList = ImmLocalAlloc(0, dwCount * sizeof(HIMC));
if (phNewList == NULL) if (IS_NULL_UNEXPECTEDLY(phNewList))
return 0; return 0;
Status = NtUserBuildHimcList(dwThreadId, dwCount, phNewList, &dwCount); Status = NtUserBuildHimcList(dwThreadId, dwCount, phNewList, &dwCount);
@ -428,6 +485,7 @@ DWORD APIENTRY Imm32BuildHimcList(DWORD dwThreadId, HIMC **pphList)
if (NT_ERROR(Status) || !dwCount) if (NT_ERROR(Status) || !dwCount)
{ {
ERR("\n");
ImmLocalFree(phNewList); ImmLocalFree(phNewList);
return 0; return 0;
} }
@ -538,12 +596,11 @@ BOOL APIENTRY
Imm32LoadImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL) Imm32LoadImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
{ {
PIME_SUBSTATE pSubState = Imm32FetchImeSubState(pState, hKL); PIME_SUBSTATE pSubState = Imm32FetchImeSubState(pState, hKL);
if (pSubState) if (IS_NULL_UNEXPECTEDLY(pSubState))
{ return FALSE;
pIC->fdwSentence |= pSubState->dwValue;
return TRUE; pIC->fdwSentence |= pSubState->dwValue;
} return TRUE;
return FALSE;
} }
// Win: SavePrivateMode // Win: SavePrivateMode
@ -551,12 +608,11 @@ BOOL APIENTRY
Imm32SaveImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL) Imm32SaveImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
{ {
PIME_SUBSTATE pSubState = Imm32FetchImeSubState(pState, hKL); PIME_SUBSTATE pSubState = Imm32FetchImeSubState(pState, hKL);
if (pSubState) if (IS_NULL_UNEXPECTEDLY(pSubState))
{ return FALSE;
pSubState->dwValue = (pIC->fdwSentence & 0xffff0000);
return TRUE; pSubState->dwValue = (pIC->fdwSentence & 0xffff0000);
} return TRUE;
return FALSE;
} }
/* /*
@ -576,7 +632,10 @@ Imm32ReconvertWideFromAnsi(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc,
LPWSTR pchDest; LPWSTR pchDest;
if (pSrc->dwVersion != 0) if (pSrc->dwVersion != 0)
{
ERR("\n");
return 0; return 0;
}
cchDest = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pchSrc, pSrc->dwStrLen, cchDest = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pchSrc, pSrc->dwStrLen,
NULL, 0); NULL, 0);
@ -585,7 +644,10 @@ Imm32ReconvertWideFromAnsi(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc,
return cbDest; return cbDest;
if (pDest->dwSize < cbDest) if (pDest->dwSize < cbDest)
{
ERR("\n");
return 0; return 0;
}
/* dwSize */ /* dwSize */
pDest->dwSize = cbDest; pDest->dwSize = cbDest;
@ -621,6 +683,7 @@ Imm32ReconvertWideFromAnsi(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc,
pchDest, cchDest); pchDest, cchDest);
pchDest[cchDest] = 0; pchDest[cchDest] = 0;
TRACE("cbDest: 0x%X\n", cbDest);
return cbDest; return cbDest;
} }
@ -641,7 +704,10 @@ Imm32ReconvertAnsiFromWide(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc,
return cbDest; return cbDest;
if (pDest->dwSize < cbDest) if (pDest->dwSize < cbDest)
{
ERR("\n");
return 0; return 0;
}
/* dwSize */ /* dwSize */
pDest->dwSize = cbDest; pDest->dwSize = cbDest;
@ -679,6 +745,7 @@ Imm32ReconvertAnsiFromWide(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc,
pchDest, cchDest, NULL, NULL); pchDest, cchDest, NULL, NULL);
pchDest[cchDest] = 0; pchDest[cchDest] = 0;
TRACE("cchDest: 0x%X\n", cchDest);
return cbDest; return cbDest;
} }
@ -696,11 +763,17 @@ static BOOL APIENTRY Imm32LoadImeFixedInfo(PIMEINFOEX pInfoEx, LPCVOID pVerInfo)
UINT cbFixed = 0; UINT cbFixed = 0;
VS_FIXEDFILEINFO *pFixed; VS_FIXEDFILEINFO *pFixed;
if (!s_fnVerQueryValueW(pVerInfo, L"\\", (LPVOID*)&pFixed, &cbFixed) || !cbFixed) if (!s_fnVerQueryValueW(pVerInfo, L"\\", (LPVOID*)&pFixed, &cbFixed) || !cbFixed)
{
ERR("\n");
return FALSE; return FALSE;
}
/* NOTE: The IME module must contain a version info of input method driver. */ /* NOTE: The IME module must contain a version info of input method driver. */
if (pFixed->dwFileType != VFT_DRV || pFixed->dwFileSubtype != VFT2_DRV_INPUTMETHOD) if (pFixed->dwFileType != VFT_DRV || pFixed->dwFileSubtype != VFT2_DRV_INPUTMETHOD)
{
ERR("\n");
return FALSE; return FALSE;
}
pInfoEx->dwProdVersion = pFixed->dwProductVersionMS; pInfoEx->dwProdVersion = pFixed->dwProductVersionMS;
pInfoEx->dwImeWinVersion = 0x40000; pInfoEx->dwImeWinVersion = 0x40000;
@ -737,10 +810,13 @@ BOOL APIENTRY Imm32LoadImeLangAndDesc(PIMEINFOEX pInfoEx, LPCVOID pVerInfo)
/* Getting the version info. See VerQueryValue */ /* Getting the version info. See VerQueryValue */
ret = s_fnVerQueryValueW(pVerInfo, L"\\VarFileInfo\\Translation", (LPVOID*)&pw, &cbData); ret = s_fnVerQueryValueW(pVerInfo, L"\\VarFileInfo\\Translation", (LPVOID*)&pw, &cbData);
if (!ret || !cbData) if (!ret || !cbData)
{
ERR("\n");
return FALSE; return FALSE;
}
if (pInfoEx->hkl == NULL) if (pInfoEx->hkl == NULL)
pInfoEx->hkl = (HKL)(DWORD_PTR)*pw; /* This is an invalid HKL */ pInfoEx->hkl = (HKL)(DWORD_PTR)*pw;
/* Try the current language and the Unicode codepage (0x04B0) */ /* Try the current language and the Unicode codepage (0x04B0) */
LangID = LANGIDFROMLCID(GetThreadLocale()); LangID = LANGIDFROMLCID(GetThreadLocale());
@ -777,7 +853,7 @@ BOOL APIENTRY Imm32LoadImeVerInfo(PIMEINFOEX pImeInfoEx)
if (!hinstVersion) if (!hinstVersion)
{ {
hinstVersion = LoadLibraryW(szPath); hinstVersion = LoadLibraryW(szPath);
if (!hinstVersion) if (IS_NULL_UNEXPECTEDLY(hinstVersion))
return FALSE; return FALSE;
bLoaded = TRUE; bLoaded = TRUE;
@ -796,11 +872,11 @@ BOOL APIENTRY Imm32LoadImeVerInfo(PIMEINFOEX pImeInfoEx)
Imm32GetSystemLibraryPath(szPath, _countof(szPath), pImeInfoEx->wszImeFile); Imm32GetSystemLibraryPath(szPath, _countof(szPath), pImeInfoEx->wszImeFile);
cbVerInfo = s_fnGetFileVersionInfoSizeW(szPath, &dwHandle); cbVerInfo = s_fnGetFileVersionInfoSizeW(szPath, &dwHandle);
if (!cbVerInfo) if (IS_ZERO_UNEXPECTEDLY(cbVerInfo))
goto Quit; goto Quit;
pVerInfo = ImmLocalAlloc(0, cbVerInfo); pVerInfo = ImmLocalAlloc(0, cbVerInfo);
if (!pVerInfo) if (IS_NULL_UNEXPECTEDLY(pVerInfo))
goto Quit; goto Quit;
/* Load the version info of the IME module */ /* Load the version info of the IME module */
@ -815,6 +891,7 @@ BOOL APIENTRY Imm32LoadImeVerInfo(PIMEINFOEX pImeInfoEx)
Quit: Quit:
if (bLoaded) if (bLoaded)
FreeLibrary(hinstVersion); FreeLibrary(hinstVersion);
TRACE("ret: %d\n", ret);
return ret; return ret;
} }
@ -877,7 +954,7 @@ UINT APIENTRY Imm32GetImeLayout(PREG_IME pLayouts, UINT cLayouts)
/* Open the registry keyboard layouts */ /* Open the registry keyboard layouts */
lError = RegOpenKeyW(HKEY_LOCAL_MACHINE, REGKEY_KEYBOARD_LAYOUTS, &hkeyLayouts); lError = RegOpenKeyW(HKEY_LOCAL_MACHINE, REGKEY_KEYBOARD_LAYOUTS, &hkeyLayouts);
if (lError != ERROR_SUCCESS) if (IS_ERROR_UNEXPECTEDLY(lError))
return 0; return 0;
for (iKey = nCount = 0; ; ++iKey) for (iKey = nCount = 0; ; ++iKey)
@ -900,8 +977,11 @@ UINT APIENTRY Imm32GetImeLayout(PREG_IME pLayouts, UINT cLayouts)
break; break;
lError = RegOpenKeyW(hkeyLayouts, szImeKey, &hkeyIME); /* Open the IME key */ lError = RegOpenKeyW(hkeyLayouts, szImeKey, &hkeyIME); /* Open the IME key */
if (lError != ERROR_SUCCESS) if (IS_ERROR_UNEXPECTEDLY(lError))
{
WARN("\n");
continue; continue;
}
/* Load the "Ime File" value */ /* Load the "Ime File" value */
szImeFileName[0] = 0; szImeFileName[0] = 0;
@ -913,12 +993,18 @@ UINT APIENTRY Imm32GetImeLayout(PREG_IME pLayouts, UINT cLayouts)
/* We don't allow the invalid "IME File" values for security reason */ /* We don't allow the invalid "IME File" values for security reason */
if (!szImeFileName[0] || wcscspn(szImeFileName, L":\\/") != wcslen(szImeFileName)) if (!szImeFileName[0] || wcscspn(szImeFileName, L":\\/") != wcslen(szImeFileName))
{
WARN("\n");
continue; continue;
}
Imm32StrToUInt(szImeKey, &Value, 16); Imm32StrToUInt(szImeKey, &Value, 16);
hKL = (HKL)(DWORD_PTR)Value; hKL = (HKL)(DWORD_PTR)Value;
if (!IS_IME_HKL(hKL)) if (!IS_IME_HKL(hKL))
{
WARN("\n");
continue; continue;
}
/* Store the IME key and the IME filename */ /* Store the IME key and the IME filename */
pLayouts[nCount].hKL = hKL; pLayouts[nCount].hKL = hKL;
@ -946,27 +1032,27 @@ BOOL APIENTRY Imm32WriteImeLayout(HKL hKL, LPCWSTR pchFilePart, LPCWSTR pszLayou
/* Open the registry keyboard layouts */ /* Open the registry keyboard layouts */
lError = RegOpenKeyW(HKEY_LOCAL_MACHINE, REGKEY_KEYBOARD_LAYOUTS, &hkeyLayouts); lError = RegOpenKeyW(HKEY_LOCAL_MACHINE, REGKEY_KEYBOARD_LAYOUTS, &hkeyLayouts);
if (lError != ERROR_SUCCESS) if (IS_ERROR_UNEXPECTEDLY(lError))
return FALSE; return FALSE;
/* Get the IME key from hKL */ /* Get the IME key from hKL */
Imm32UIntToStr((DWORD)(DWORD_PTR)hKL, 16, szImeKey, _countof(szImeKey)); StringCchPrintf(szImeKey, _countof(szImeKey), L"%08X", (DWORD)(DWORD_PTR)hKL);
/* Create a registry IME key */ /* Create a registry IME key */
lError = RegCreateKeyW(hkeyLayouts, szImeKey, &hkeyIME); lError = RegCreateKeyW(hkeyLayouts, szImeKey, &hkeyIME);
if (lError != ERROR_SUCCESS) if (IS_ERROR_UNEXPECTEDLY(lError))
goto Failure; goto Failure;
/* Write "Ime File" */ /* Write "Ime File" */
cbData = (wcslen(pchFilePart) + 1) * sizeof(WCHAR); cbData = (wcslen(pchFilePart) + 1) * sizeof(WCHAR);
lError = RegSetValueExW(hkeyIME, L"Ime File", 0, REG_SZ, (LPBYTE)pchFilePart, cbData); lError = RegSetValueExW(hkeyIME, L"Ime File", 0, REG_SZ, (LPBYTE)pchFilePart, cbData);
if (lError != ERROR_SUCCESS) if (IS_ERROR_UNEXPECTEDLY(lError))
goto Failure; goto Failure;
/* Write "Layout Text" */ /* Write "Layout Text" */
cbData = (wcslen(pszLayoutText) + 1) * sizeof(WCHAR); cbData = (wcslen(pszLayoutText) + 1) * sizeof(WCHAR);
lError = RegSetValueExW(hkeyIME, L"Layout Text", 0, REG_SZ, (LPBYTE)pszLayoutText, cbData); lError = RegSetValueExW(hkeyIME, L"Layout Text", 0, REG_SZ, (LPBYTE)pszLayoutText, cbData);
if (lError != ERROR_SUCCESS) if (IS_ERROR_UNEXPECTEDLY(lError))
goto Failure; goto Failure;
/* Choose "Layout File" from hKL */ /* Choose "Layout File" from hKL */
@ -981,7 +1067,7 @@ BOOL APIENTRY Imm32WriteImeLayout(HKL hKL, LPCWSTR pchFilePart, LPCWSTR pszLayou
/* Write "Layout File" */ /* Write "Layout File" */
cbData = (wcslen(pszLayoutFile) + 1) * sizeof(WCHAR); cbData = (wcslen(pszLayoutFile) + 1) * sizeof(WCHAR);
lError = RegSetValueExW(hkeyIME, L"Layout File", 0, REG_SZ, (LPBYTE)pszLayoutFile, cbData); lError = RegSetValueExW(hkeyIME, L"Layout File", 0, REG_SZ, (LPBYTE)pszLayoutFile, cbData);
if (lError != ERROR_SUCCESS) if (IS_ERROR_UNEXPECTEDLY(lError))
goto Failure; goto Failure;
RegCloseKey(hkeyIME); RegCloseKey(hkeyIME);
@ -1007,6 +1093,7 @@ BOOL APIENTRY Imm32WriteImeLayout(HKL hKL, LPCWSTR pchFilePart, LPCWSTR pszLayou
if (iPreload >= MAX_PRELOAD) /* Not found */ if (iPreload >= MAX_PRELOAD) /* Not found */
{ {
WARN("\n");
RegCloseKey(hkeyPreload); RegCloseKey(hkeyPreload);
return FALSE; return FALSE;
} }
@ -1048,7 +1135,7 @@ BOOL APIENTRY Imm32CopyImeFile(LPWSTR pszOldFile, LPCWSTR pszNewFile)
if (!hinstLZ32) if (!hinstLZ32)
{ {
hinstLZ32 = LoadLibraryW(szLZ32Path); hinstLZ32 = LoadLibraryW(szLZ32Path);
if (!hinstLZ32) if (IS_NULL_UNEXPECTEDLY(hinstLZ32))
return FALSE; return FALSE;
bLoaded = TRUE; bLoaded = TRUE;
} }
@ -1163,7 +1250,7 @@ DWORD WINAPI ImmGetIMCLockCount(HIMC hIMC)
PCLIENTIMC pClientImc; PCLIENTIMC pClientImc;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (pClientImc == NULL) if (IS_NULL_UNEXPECTEDLY(pClientImc))
return 0; return 0;
ret = 0; ret = 0;

View file

@ -16,7 +16,7 @@ DWORD APIENTRY
Imm32JTransCompA(LPINPUTCONTEXTDX pIC, LPCOMPOSITIONSTRING pCS, Imm32JTransCompA(LPINPUTCONTEXTDX pIC, LPCOMPOSITIONSTRING pCS,
const TRANSMSG *pSrc, LPTRANSMSG pDest) const TRANSMSG *pSrc, LPTRANSMSG pDest)
{ {
// FIXME FIXME("\n");
*pDest = *pSrc; *pDest = *pSrc;
return 1; return 1;
} }
@ -26,7 +26,7 @@ DWORD APIENTRY
Imm32JTransCompW(LPINPUTCONTEXTDX pIC, LPCOMPOSITIONSTRING pCS, Imm32JTransCompW(LPINPUTCONTEXTDX pIC, LPCOMPOSITIONSTRING pCS,
const TRANSMSG *pSrc, LPTRANSMSG pDest) const TRANSMSG *pSrc, LPTRANSMSG pDest)
{ {
// FIXME FIXME("\n");
*pDest = *pSrc; *pDest = *pSrc;
return 1; return 1;
} }
@ -52,7 +52,7 @@ WINNLSTranslateMessageJ(DWORD dwCount, LPTRANSMSG pTrans, LPINPUTCONTEXTDX pIC,
// clone the message list // clone the message list
cbTempList = (dwCount + 1) * sizeof(TRANSMSG); cbTempList = (dwCount + 1) * sizeof(TRANSMSG);
pTempList = ImmLocalAlloc(HEAP_ZERO_MEMORY, cbTempList); pTempList = ImmLocalAlloc(HEAP_ZERO_MEMORY, cbTempList);
if (pTempList == NULL) if (IS_NULL_UNEXPECTEDLY(pTempList))
return 0; return 0;
RtlCopyMemory(pTempList, pTrans, dwCount * sizeof(TRANSMSG)); RtlCopyMemory(pTempList, pTrans, dwCount * sizeof(TRANSMSG));
@ -188,19 +188,22 @@ WINNLSTranslateMessage(DWORD dwCount, LPTRANSMSG pEntries, HIMC hIMC, BOOL bAnsi
LPCOMPOSITIONSTRING pCS; LPCOMPOSITIONSTRING pCS;
pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC); pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
if (pIC == NULL) if (IS_NULL_UNEXPECTEDLY(pIC))
return 0; return 0;
pCS = ImmLockIMCC(pIC->hCompStr); pCS = ImmLockIMCC(pIC->hCompStr);
if (pCS) if (IS_NULL_UNEXPECTEDLY(pCS))
{ {
if (wLang == LANG_JAPANESE) ImmUnlockIMC(hIMC);
ret = WINNLSTranslateMessageJ(dwCount, pEntries, pIC, pCS, bAnsi); return 0;
else if (wLang == LANG_KOREAN)
ret = WINNLSTranslateMessageK(dwCount, pEntries, pIC, pCS, bAnsi);
ImmUnlockIMCC(pIC->hCompStr);
} }
if (wLang == LANG_JAPANESE)
ret = WINNLSTranslateMessageJ(dwCount, pEntries, pIC, pCS, bAnsi);
else if (wLang == LANG_KOREAN)
ret = WINNLSTranslateMessageK(dwCount, pEntries, pIC, pCS, bAnsi);
ImmUnlockIMCC(pIC->hCompStr);
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
return ret; return ret;
} }