ReactOS 0.4.15-dev-6056-gb29b268
appcache.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Win32 Base API
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/kernel32/client/appcache.c
5 * PURPOSE: Application Compatibility Cache
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 */
8
9/* INCLUDES *******************************************************************/
10
11#include <k32.h>
12
13#define NDEBUG
14#include <debug.h>
15
16/* GLOBALS ********************************************************************/
17
22
27
28#define APPHELP_VALID_RESULT 0x10000
29#define APPHELP_RESULT_NOTFOUND 0x20000
30#define APPHELP_RESULT_FOUND 0x40000
31
32
33/* FUNCTIONS ******************************************************************/
34
38{
43 UNICODE_STRING OptionKey = RTL_CONSTANT_STRING(L"\\Registry\\MACHINE\\System\\CurrentControlSet\\Control\\SafeBoot\\Option");
44 UNICODE_STRING AppCompatKey = RTL_CONSTANT_STRING(L"\\Registry\\MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\AppCompatibility");
45 UNICODE_STRING PolicyKey = RTL_CONSTANT_STRING(L"\\Registry\\MACHINE\\Software\\Policies\\Microsoft\\Windows\\AppCompat");
46 UNICODE_STRING OptionValue = RTL_CONSTANT_STRING(L"OptionValue");
47 UNICODE_STRING DisableAppCompat = RTL_CONSTANT_STRING(L"DisableAppCompat");
48 UNICODE_STRING DisableEngine = RTL_CONSTANT_STRING(L"DisableEngine");
52
53 /*
54 * This is a TROOLEAN, -1 means we haven't yet figured it out.
55 * 0 means shims are enabled, and 1 means shims are disabled!
56 */
57 if (g_ShimsDisabled == -1)
58 {
59 ULONG DisableShims = FALSE;
60
61 /* Open the safe mode key */
62 Status = NtOpenKey(&KeyHandle, KEY_QUERY_VALUE, &OptionKeyAttributes);
63 if (NT_SUCCESS(Status))
64 {
65 /* Check if this is safemode */
67 &OptionValue,
69 &KeyInfo,
70 sizeof(KeyInfo),
73 if ((NT_SUCCESS(Status)) &&
74 (KeyInfo.Type == REG_DWORD) &&
75 (KeyInfo.DataLength == sizeof(ULONG)) &&
76 (KeyInfo.Data[0] != FALSE))
77 {
78 /* It is, so disable shims! */
79 DisableShims = TRUE;
80 }
81 }
82
83 if (!DisableShims)
84 {
85 /* Open the app compatibility engine settings key */
87 if (NT_SUCCESS(Status))
88 {
89 /* Check if the app compat engine is turned off */
91 &DisableAppCompat,
93 &KeyInfo,
94 sizeof(KeyInfo),
97 if ((NT_SUCCESS(Status)) &&
98 (KeyInfo.Type == REG_DWORD) &&
99 (KeyInfo.DataLength == sizeof(ULONG)) &&
100 (KeyInfo.Data[0] == TRUE))
101 {
102 /* It is, so disable shims! */
103 DisableShims = TRUE;
104 }
105 }
106 }
107 if (!DisableShims)
108 {
109 /* Finally, open the app compatibility policy key */
110 Status = NtOpenKey(&KeyHandle, KEY_QUERY_VALUE, &PolicyKeyAttributes);
111 if (NT_SUCCESS(Status))
112 {
113 /* Check if the system policy disables app compat */
115 &DisableEngine,
117 &KeyInfo,
118 sizeof(KeyInfo),
119 &ResultLength);
121 if ((NT_SUCCESS(Status)) &&
122 (KeyInfo.Type == REG_DWORD) &&
123 (KeyInfo.DataLength == sizeof(ULONG)) &&
124 (KeyInfo.Data[0] == TRUE))
125 {
126 /* It does, so disable shims! */
127 DisableShims = TRUE;
128 }
129 }
130 }
131 g_ShimsDisabled = DisableShims;
132 }
133
134 /* Return if shims are disabled or not ("Enabled == 1" means disabled!) */
135 return g_ShimsDisabled ? TRUE : FALSE;
136}
137
138/*
139 * @unimplemented
140 */
141BOOL
142WINAPI
147{
148 DPRINT("BaseCheckAppcompatCache is UNIMPLEMENTED\n");
149
150 if (Reason) *Reason = 0;
151
152 // We don't know this app.
153 return FALSE;
154}
155
156static
157VOID
159{
162 PVOID ApphelpAddress;
163 PVOID pApphelpCheckRunAppEx = NULL, pSdbPackAppCompatData = NULL;
164
165 RtlInitEmptyUnicodeString(&DllPath, Buffer, sizeof(Buffer));
167 RtlAppendUnicodeToString(&DllPath, L"\\system32\\apphelp.dll");
168
169 if (NT_SUCCESS(LdrLoadDll(NULL, NULL, &DllPath, &ApphelpAddress)))
170 {
171 ANSI_STRING ProcName;
172
173 RtlInitAnsiString(&ProcName, "ApphelpCheckRunAppEx");
174 if (!NT_SUCCESS(LdrGetProcedureAddress(ApphelpAddress, &ProcName, 0, &pApphelpCheckRunAppEx)))
175 pApphelpCheckRunAppEx = NULL;
176
177 RtlInitAnsiString(&ProcName, "SdbPackAppCompatData");
178 if (!NT_SUCCESS(LdrGetProcedureAddress(ApphelpAddress, &ProcName, 0, &pSdbPackAppCompatData)))
179 pSdbPackAppCompatData = NULL;
180 }
181
183 {
184 g_pSdbPackAppCompatData = RtlEncodeSystemPointer(pSdbPackAppCompatData);
185 }
186}
187
188/*
189 *
190 */
191BOOL
192WINAPI
197 IN PULONG pReason,
203{
204 ULONG Reason = 0;
205 ULONG64 Flags1 = 0;
206 ULONG Flags2 = 0;
207 BOOL Continue, NeedCleanup = FALSE;
208 tApphelpCheckRunAppEx pApphelpCheckRunAppEx;
209 tSdbPackAppCompatData pSdbPackAppCompatData;
210 PVOID QueryResult = NULL;
211 ULONG QueryResultSize = 0;
212
214 {
217 }
218
219 pApphelpCheckRunAppEx = RtlDecodeSystemPointer(g_pApphelpCheckRunAppEx);
220 pSdbPackAppCompatData = RtlDecodeSystemPointer(g_pSdbPackAppCompatData);
221
222 if (!pApphelpCheckRunAppEx || !pSdbPackAppCompatData)
223 return TRUE;
224
225 if (pReason)
226 Reason = *pReason;
227
228 Continue = pApphelpCheckRunAppEx(FileHandle, NULL, NULL, ApplicationName, Environment, ExeType, &Reason,
229 &QueryResult, &QueryResultSize, SxsData, SxsDataSize, FusionFlags, &Flags1, &Flags2);
230
231 if (pReason)
232 *pReason = Reason;
233
234 if (Continue)
235 {
237 {
238 if (!pSdbPackAppCompatData(NULL, QueryResult, SdbQueryAppCompatData, SdbQueryAppCompatDataSize))
239 {
240 DPRINT1("SdbPackAppCompatData returned a failure!\n");
241 NeedCleanup = TRUE;
242 }
243 }
244 else
245 {
246 NeedCleanup = TRUE;
247 }
248 }
249
250 if (QueryResult)
251 RtlFreeHeap(RtlGetProcessHeap(), 0, QueryResult);
252
253 if (NeedCleanup)
254 {
259 *SxsData = NULL;
260 if (SxsDataSize)
261 *SxsDataSize = 0;
262 }
263
264 return Continue;
265}
266
267/*
268 * @implemented
269 */
271WINAPI
281{
283 ULONG Reason = 0;
284
285 /* Is shimming enabled by group policy? */
287 {
288 /* Nothing to worry about */
290 }
291 else
292 {
293 /* It is, check if we know about this app */
297 &Reason))
298 {
301 {
303 }
304 }
305 }
306
307 /* Return caller the status */
308 return Status;
309}
310
311/*
312 * @implemented
313 */
314BOOL
315WINAPI
317{
319
321 return NT_SUCCESS(Status);
322}
323
324/*
325 * @implemented
326 */
327BOOL
328WINAPI
330{
332
334 return NT_SUCCESS(Status);
335}
336
337/*
338 * @implemented
339 */
340VOID
341WINAPI
343 IN PVOID AppCompatSxsData)
344{
345 /* Free the input pointers if present */
346 if (AppCompatData) RtlFreeHeap(RtlGetProcessHeap(), 0, AppCompatData);
347 if (AppCompatSxsData) RtlFreeHeap(RtlGetProcessHeap(), 0, AppCompatSxsData);
348}
349
350/*
351 * @unimplemented
352 */
353VOID
354WINAPI
356 ULONG Unknown2,
358{
359 STUB;
360}
361
362/*
363 * @unimplemented
364 */
366WINAPI
368{
369 STUB;
371}
372
373/*
374 * @unimplemented
375 */
377WINAPI
379{
380 STUB;
382}
383
384/*
385 * @unimplemented
386 */
387BOOL
388WINAPI
390{
391 STUB;
392 return FALSE;
393}
394
395/*
396 * @unimplemented
397 */
398BOOL
399WINAPI
401{
402 STUB;
403 return FALSE;
404}
405
406/*
407 * @unimplemented
408 */
409PVOID
410WINAPI
412{
413 STUB;
414 return NULL;
415}
416
417/*
418 * @unimplemented
419 */
420BOOL
421WINAPI
423{
424 STUB;
425 return FALSE;
426}
427
428/*
429 * @unimplemented
430 */
431VOID
432WINAPI
434{
435 STUB;
436}
437
438/*
439 * @unimplemented
440 */
441BOOL
442WINAPI
444{
445 STUB;
446 return FALSE;
447}
unsigned char BOOLEAN
BOOL WINAPI BaseInitAppcompatCache(VOID)
Definition: appcache.c:389
static PVOID g_pSdbPackAppCompatData
Definition: appcache.c:21
VOID WINAPI SetTermsrvAppInstallMode(IN BOOL bInstallMode)
Definition: appcache.c:433
BOOL WINAPI BaseInitAppcompatCacheSupport(VOID)
Definition: appcache.c:400
ULONG g_ShimsDisabled
Definition: appcache.c:18
BOOL(WINAPI * tApphelpCheckRunAppEx)(HANDLE FileHandle, PVOID Unk1, PVOID Unk2, PWCHAR ApplicationName, PVOID Environment, USHORT ExeType, PULONG Reason, PVOID *SdbQueryAppCompatData, PULONG SdbQueryAppCompatDataSize, PVOID *SxsData, PULONG SxsDataSize, PULONG FusionFlags, PULONG64 SomeFlag1, PULONG SomeFlag2)
Definition: appcache.c:23
#define APPHELP_VALID_RESULT
Definition: appcache.c:28
BOOL WINAPI BaseCheckRunApp(IN HANDLE FileHandle, IN PWCHAR ApplicationName, IN PWCHAR Environment, IN USHORT ExeType, IN PULONG pReason, IN PVOID *SdbQueryAppCompatData, IN PULONG SdbQueryAppCompatDataSize, IN PVOID *SxsData, IN PULONG SxsDataSize, OUT PULONG FusionFlags)
Definition: appcache.c:193
static VOID BaseInitApphelp(VOID)
Definition: appcache.c:158
NTSTATUS WINAPI BasepCheckBadapp(IN HANDLE FileHandle, IN PWCHAR ApplicationName, IN PWCHAR Environment, IN USHORT ExeType, IN PVOID *SdbQueryAppCompatData, IN PULONG SdbQueryAppCompatDataSize, IN PVOID *SxsData, IN PULONG SxsDataSize, OUT PULONG FusionFlags)
Definition: appcache.c:272
BOOL WINAPI BaseDumpAppcompatCache(VOID)
Definition: appcache.c:316
BOOL WINAPI SetComPlusPackageInstallStatus(LPVOID lpInfo)
Definition: appcache.c:422
BOOLEAN WINAPI IsShimInfrastructureDisabled(VOID)
Definition: appcache.c:37
VOID WINAPI BasepFreeAppCompatData(IN PVOID AppCompatData, IN PVOID AppCompatSxsData)
Definition: appcache.c:342
BOOL WINAPI BaseCheckAppcompatCache(IN PWCHAR ApplicationName, IN HANDLE FileHandle, IN PWCHAR Environment, OUT PULONG Reason)
Definition: appcache.c:143
NTSTATUS WINAPI BaseCleanupAppcompatCache(VOID)
Definition: appcache.c:367
static PVOID g_pApphelpCheckRunAppEx
Definition: appcache.c:20
static BOOL g_ApphelpInitialized
Definition: appcache.c:19
NTSTATUS WINAPI BaseCleanupAppcompatCacheSupport(PVOID pUnknown)
Definition: appcache.c:378
PVOID WINAPI GetComPlusPackageInstallStatus(VOID)
Definition: appcache.c:411
VOID WINAPI BaseUpdateAppcompatCache(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3)
Definition: appcache.c:355
BOOL(WINAPI * tSdbPackAppCompatData)(PVOID hsdb, PVOID pQueryResult, PVOID *ppData, DWORD *dwSize)
Definition: appcache.c:26
BOOL WINAPI TermsrvAppInstallMode(VOID)
Definition: appcache.c:443
#define APPHELP_RESULT_FOUND
Definition: appcache.c:30
BOOL WINAPI BaseFlushAppcompatCache(VOID)
Definition: appcache.c:329
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
Definition: bufpool.h:45
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES IN DWORD Unknown3
Definition: conport.c:37
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define MAX_PATH
Definition: compat.h:34
UNICODE_STRING BaseWindowsDirectory
Definition: path.c:20
_In_ PUNKNOWN pUnknown
Definition: drmk.h:76
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
Definition: string_lib.cpp:62
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
Definition: fltkernel.h:1231
localAdvHdr Flags2
Definition: fsrtlfuncs.h:1692
Status
Definition: gdiplustypes.h:25
@ ApphelpCacheServiceDump
Definition: pstypes.h:977
@ ApphelpCacheServiceFlush
Definition: pstypes.h:976
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define InterlockedCompareExchangePointer
Definition: interlocked.h:129
#define STUB
Definition: kernel32.h:27
NTSTATUS NTAPI LdrGetProcedureAddress(IN PVOID BaseAddress, IN PANSI_STRING Name, IN ULONG Ordinal, OUT PVOID *ProcedureAddress)
Definition: ldrapi.c:823
NTSTATUS NTAPI DECLSPEC_HOTPATCH LdrLoadDll(IN PWSTR SearchPath OPTIONAL, IN PULONG DllCharacteristics OPTIONAL, IN PUNICODE_STRING DllName, OUT PVOID *BaseAddress)
Definition: ldrapi.c:310
static IN LPSTR IN PVOID Unk2
Definition: ldrinit.c:47
static IN LPSTR Unk1
Definition: ldrinit.c:47
unsigned __int64 * PULONG64
Definition: imports.h:198
unsigned __int64 ULONG64
Definition: imports.h:198
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG PULONG PULONG64 PULONG SomeFlag2
Definition: env.c:49
LPCWSTR LPCWSTR LPCWSTR DWORD PSDBQUERYRESULT_VISTA pQueryResult
Definition: env.c:37
PVOID PVOID PWCHAR PVOID USHORT ExeType
Definition: env.c:47
PVOID PVOID PWCHAR PVOID USHORT PULONG Reason
Definition: env.c:47
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID * SdbQueryAppCompatData
Definition: env.c:48
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG SxsDataSize
Definition: env.c:48
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG PULONG PULONG64 SomeFlag1
Definition: env.c:49
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID * SxsData
Definition: env.c:48
PSDBQUERYRESULT_VISTA PVOID * ppData
Definition: env.c:56
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG PULONG FusionFlags
Definition: env.c:49
PVOID PVOID PWCHAR PVOID Environment
Definition: env.c:47
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG SdbQueryAppCompatDataSize
Definition: env.c:48
PVOID PVOID PWCHAR ApplicationName
Definition: env.c:47
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static const char const char * DllPath
Definition: image.c:34
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define BOOL
Definition: nt_native.h:43
NTSYSAPI NTSTATUS NTAPI NtOpenKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
Definition: ntapi.c:336
@ KeyValuePartialInformation
Definition: nt_native.h:1182
NTSYSAPI NTSTATUS NTAPI NtQueryValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, IN PVOID KeyValueInformation, IN ULONG Length, IN PULONG ResultLength)
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3402
NTSYSAPI VOID NTAPI RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
#define RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a)
NTSTATUS NTAPI NtApphelpCacheControl(_In_ APPHELPCACHESERVICECLASS Service, _In_opt_ PAPPHELP_CACHE_SERVICE_LOOKUP ServiceData)
Definition: apphelp.c:728
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:239
#define L(x)
Definition: ntvdm.h:50
unsigned short USHORT
Definition: pedump.c:61
#define REG_DWORD
Definition: sdbapi.c:596
PVOID NTAPI RtlEncodeSystemPointer(IN PVOID Pointer)
Definition: process.c:429
PVOID NTAPI RtlDecodeSystemPointer(IN PVOID Pointer)
Definition: process.c:439
#define STATUS_SUCCESS
Definition: shellext.h:65
OBJECT_ATTRIBUTES AppCompatKeyAttributes
Definition: shimdbg.c:228
#define DPRINT
Definition: sndvol32.h:71
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
uint32_t * PULONG
Definition: typedefs.h:59
#define IN
Definition: typedefs.h:39
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG _Out_ PULONG ResultLength
Definition: wdfdevice.h:3776
#define WINAPI
Definition: msvc.h:6
__wchar_t WCHAR
Definition: xmlstorage.h:180