[IMM32] Add ValidateHandle function (#4467)

Set the last error on failure of handle validation.
CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2022-04-23 08:16:53 +09:00 committed by GitHub
parent e9df3176f7
commit b0b925d2b0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 17 deletions

View file

@ -1692,7 +1692,7 @@ BOOL WINAPI ImmConfigureIMEA(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
TRACE("(%p, %p, 0x%lX, %p)", hKL, hWnd, dwMode, lpData);
if (!ValidateHwndNoErr(hWnd) || Imm32IsCrossProcessAccess(hWnd))
if (!ValidateHwnd(hWnd) || Imm32IsCrossProcessAccess(hWnd))
return FALSE;
pImeDpi = Imm32FindOrLoadImeDpi(hKL);
@ -1746,7 +1746,7 @@ BOOL WINAPI ImmConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
TRACE("(%p, %p, 0x%lX, %p)", hKL, hWnd, dwMode, lpData);
if (!ValidateHwndNoErr(hWnd) || Imm32IsCrossProcessAccess(hWnd))
if (!ValidateHwnd(hWnd) || Imm32IsCrossProcessAccess(hWnd))
return FALSE;
pImeDpi = Imm32FindOrLoadImeDpi(hKL);

View file

@ -509,7 +509,7 @@ HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC)
if (!IS_IMM_MODE())
return NULL;
pWnd = ValidateHwndNoErr(hWnd);
pWnd = ValidateHwnd(hWnd);
if (!pWnd)
return NULL;
@ -555,7 +555,7 @@ BOOL WINAPI ImmAssociateContextEx(HWND hWnd, HIMC hIMC, DWORD dwFlags)
return FALSE;
hwndFocus = (HWND)NtUserQueryWindow(hWnd, QUERY_WINDOW_FOCUS);
pFocusWnd = ValidateHwndNoErr(hwndFocus);
pFocusWnd = ValidateHwnd(hwndFocus);
if (pFocusWnd)
hOldIMC = pFocusWnd->hImc;
@ -566,7 +566,7 @@ BOOL WINAPI ImmAssociateContextEx(HWND hWnd, HIMC hIMC, DWORD dwFlags)
return TRUE;
case 1:
pFocusWnd = ValidateHwndNoErr(hwndFocus);
pFocusWnd = ValidateHwnd(hwndFocus);
if (pFocusWnd)
{
hIMC = pFocusWnd->hImc;
@ -647,7 +647,7 @@ BOOL APIENTRY Imm32DestroyInputContext(HIMC hIMC, HKL hKL, BOOL bKeep)
if (!hIMC || !IS_IMM_MODE())
return FALSE;
pIMC = ValidateHandleNoErr(hIMC, TYPE_INPUTCONTEXT);
pIMC = ValidateHandle(hIMC, TYPE_INPUTCONTEXT);
if (!pIMC || pIMC->head.pti != Imm32CurrentPti())
{
ERR("invalid pIMC: %p\n", pIMC);
@ -916,7 +916,7 @@ PCLIENTIMC WINAPI ImmLockClientImc(HIMC hImc)
if (!hImc)
return NULL;
pIMC = ValidateHandleNoErr(hImc, TYPE_INPUTCONTEXT);
pIMC = ValidateHandle(hImc, TYPE_INPUTCONTEXT);
if (!pIMC || !Imm32CheckImcProcess(pIMC))
return NULL;
@ -986,7 +986,7 @@ static HIMC APIENTRY ImmGetSaveContext(HWND hWnd, DWORD dwContextFlags)
goto Quit;
}
pWnd = ValidateHwndNoErr(hWnd);
pWnd = ValidateHwnd(hWnd);
if (!pWnd || Imm32IsCrossProcessAccess(hWnd))
return NULL;

View file

@ -574,7 +574,7 @@ LRESULT APIENTRY ImmRequestMessageAW(HIMC hIMC, WPARAM wParam, LPARAM lParam, BO
hWnd = pIC->hWnd;
if (hWnd)
pWnd = ValidateHwndNoErr(hWnd);
pWnd = ValidateHwnd(hWnd);
if (pWnd && pWnd->head.pti == Imm32CurrentPti())
ret = Imm32ProcessRequest(hIMC, pWnd, (DWORD)wParam, (LPVOID)lParam, bAnsi);

View file

@ -79,8 +79,10 @@ extern HANDLE ghImmHeap;
BOOL Imm32GetSystemLibraryPath(LPWSTR pszPath, DWORD cchPath, LPCWSTR pszFileName);
VOID APIENTRY LogFontAnsiToWide(const LOGFONTA *plfA, LPLOGFONTW plfW);
VOID APIENTRY LogFontWideToAnsi(const LOGFONTW *plfW, LPLOGFONTA plfA);
PWND FASTCALL ValidateHwndNoErr(HWND hwnd);
LPVOID FASTCALL ValidateHandleNoErr(HANDLE hObject, UINT uType);
LPVOID FASTCALL ValidateHandle(HANDLE hObject, UINT uType);
#define ValidateHwndNoErr(hwnd) ValidateHandleNoErr((hwnd), TYPE_WINDOW)
#define ValidateHwnd(hwnd) ValidateHandle((hwnd), TYPE_WINDOW)
BOOL APIENTRY Imm32CheckImcProcess(PIMC pIMC);
LPVOID APIENTRY ImmLocalAlloc(DWORD dwFlags, DWORD dwBytes);

View file

@ -167,7 +167,7 @@ static PVOID FASTCALL DesktopPtrToUser(PVOID ptr)
return (PVOID)NtUserCallOneParam((DWORD_PTR)ptr, ONEPARAM_ROUTINE_GETDESKTOPMAPPING);
}
// Win: HMValidateHandle
// Win: HMValidateHandleNoRip
LPVOID FASTCALL ValidateHandleNoErr(HANDLE hObject, UINT uType)
{
UINT index;
@ -203,14 +203,18 @@ LPVOID FASTCALL ValidateHandleNoErr(HANDLE hObject, UINT uType)
return ptr;
}
PWND FASTCALL ValidateHwndNoErr(HWND hwnd)
// Win: HMValidateHandle
LPVOID FASTCALL ValidateHandle(HANDLE hObject, UINT uType)
{
/* See if the window is cached */
PCLIENTINFO ClientInfo = GetWin32ClientInfo();
if (hwnd == ClientInfo->CallbackWnd.hWnd)
return ClientInfo->CallbackWnd.pWnd;
LPVOID pvObj = ValidateHandleNoErr(hObject, uType);
if (pvObj)
return pvObj;
return ValidateHandleNoErr(hwnd, TYPE_WINDOW);
if (uType == TYPE_WINDOW)
SetLastError(ERROR_INVALID_WINDOW_HANDLE);
else
SetLastError(ERROR_INVALID_HANDLE);
return NULL;
}
// Win: TestInputContextProcess