[IMM32][KERNEL32][SDK] Half-implement BaseCheckAppcompatCache (#6069)

- And add it to <compat_undoc.h>.
- Use <compat_undoc.h> in IMM32.
- Modify kernel32.spec.
CORE-19268
This commit is contained in:
Katayama Hirofumi MZ 2023-12-03 23:40:49 +09:00 committed by GitHub
parent d8ba5920a2
commit 6e449d47e8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 122 additions and 18 deletions

View file

@ -8,6 +8,7 @@
#include "precomp.h"
#include <msctf.h> /* for ITfLangBarMgr */
#include <objidl.h> /* for IInitializeSpy */
#include <compat_undoc.h> /* for BaseCheckAppcompatCache */
WINE_DEFAULT_DEBUG_CHANNEL(imm);
@ -228,13 +229,6 @@ HINSTANCE g_hCtfIme = NULL;
/* The type of ApphelpCheckIME function in apphelp.dll */
typedef BOOL (WINAPI *FN_ApphelpCheckIME)(_In_z_ LPCWSTR AppName);
/* FIXME: This is kernel32 function. We have to declare this in some header. */
BOOL WINAPI
BaseCheckAppcompatCache(_In_z_ LPCWSTR ApplicationName,
_In_ HANDLE FileHandle,
_In_opt_z_ LPCWSTR Environment,
_Out_ PULONG pdwReason);
/***********************************************************************
* This function checks whether the app's IME is disabled by application
* compatibility patcher.

View file

@ -139,20 +139,122 @@ IsShimInfrastructureDisabled(VOID)
* @unimplemented
*/
BOOL
WINAPI
BaseCheckAppcompatCache(IN PWCHAR ApplicationName,
IN HANDLE FileHandle,
IN PWCHAR Environment,
OUT PULONG Reason)
BasepShimCacheCheckBypass(
_In_ PCWSTR ApplicationName,
_In_ HANDLE FileHandle,
_In_opt_ PCWSTR Environment,
_In_ BOOL bUnknown,
_Out_opt_ PULONG pdwReason)
{
DPRINT("BaseCheckAppcompatCache is UNIMPLEMENTED\n");
if (Reason) *Reason = 0;
// We don't know this app.
DPRINT("fixme:(%S, %p, %S, %d, %p)\n", ApplicationName, FileHandle, Environment, bUnknown,
pdwReason);
return FALSE;
}
/*
* @implemented
*/
BOOL
BasepShimCacheSearch(
_In_ PCWSTR ApplicationName,
_In_ HANDLE FileHandle)
{
APPHELP_CACHE_SERVICE_LOOKUP Lookup;
RtlInitUnicodeString(&Lookup.ImageName, ApplicationName);
Lookup.ImageHandle = FileHandle;
return NT_SUCCESS(NtApphelpCacheControl(ApphelpCacheServiceLookup, &Lookup));
}
/*
* @unimplemented
*/
BOOL
BasepCheckCacheExcludeList(
_In_ PCWSTR ApplicationName)
{
return FALSE;
}
/*
* @unimplemented
*/
BOOL
BasepCheckCacheExcludeCustom(
_In_ PCWSTR ApplicationName)
{
return FALSE;
}
/*
* @implemented
*/
VOID
BasepShimCacheRemoveEntry(
_In_ PCWSTR ApplicationName)
{
APPHELP_CACHE_SERVICE_LOOKUP Lookup;
RtlInitUnicodeString(&Lookup.ImageName, ApplicationName);
Lookup.ImageHandle = INVALID_HANDLE_VALUE;
NtApphelpCacheControl(ApphelpCacheServiceRemove, &Lookup);
}
/*
* @unimplemented
*/
BOOL
BasepShimCacheLookup(
_In_ PCWSTR ApplicationName,
_In_ HANDLE FileHandle)
{
DPRINT("fixme:(%S, %p)\n", ApplicationName, FileHandle);
if (!BasepShimCacheSearch(ApplicationName, FileHandle))
return FALSE;
if (!BasepCheckCacheExcludeList(ApplicationName) ||
!BasepCheckCacheExcludeCustom(ApplicationName))
{
BasepShimCacheRemoveEntry(ApplicationName);
return FALSE;
}
return TRUE;
}
/*
* @implemented
*/
BOOL
WINAPI
BaseCheckAppcompatCache(
_In_ PCWSTR ApplicationName,
_In_ HANDLE FileHandle,
_In_opt_ PCWSTR Environment,
_Out_opt_ PULONG pdwReason)
{
BOOL ret = FALSE;
ULONG dwReason;
DPRINT("(%S, %p, %S, %p)\n", ApplicationName, FileHandle, Environment, pdwReason);
dwReason = 0;
if (BasepShimCacheCheckBypass(ApplicationName, FileHandle, Environment, TRUE, &dwReason))
{
dwReason |= 2;
}
else
{
ret = BasepShimCacheLookup(ApplicationName, FileHandle);
if (!ret)
dwReason |= 1;
}
if (pdwReason)
*pdwReason = dwReason;
return ret;
}
static
VOID
BaseInitApphelp(VOID)

View file

@ -24,7 +24,7 @@
@ stdcall BackupRead(ptr ptr long ptr long long ptr)
@ stdcall BackupSeek(ptr long long ptr ptr ptr)
@ stdcall BackupWrite(ptr ptr long ptr long long ptr)
@ stdcall BaseCheckAppcompatCache(long long long ptr)
@ stdcall BaseCheckAppcompatCache(wstr ptr wstr ptr)
@ stdcall BaseCheckRunApp(long ptr long long long long long long long long)
@ stdcall BaseCleanupAppcompatCacheSupport(ptr)
@ stdcall BaseDumpAppcompatCache()

View file

@ -46,4 +46,12 @@ UINT RosGetProcessEffectiveVersion(VOID)
return (peb->OSMajorVersion << 8) | (peb->OSMinorVersion);
}
BOOL
WINAPI
BaseCheckAppcompatCache(
_In_ PCWSTR ApplicationName,
_In_ HANDLE FileHandle,
_In_opt_ PCWSTR Environment,
_Out_opt_ PULONG pdwReason);
#endif // COMPAT_UNDOC_H