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)
9 /* INCLUDES *******************************************************************/
16 /* GLOBALS ********************************************************************/
20 /* FUNCTIONS ******************************************************************/
24 IsShimInfrastructureDisabled(VOID
)
28 KEY_VALUE_PARTIAL_INFORMATION KeyInfo
;
30 UNICODE_STRING OptionKey
= RTL_CONSTANT_STRING(L
"\\Registry\\MACHINE\\System\\CurrentControlSet\\Control\\SafeBoot\\Option");
31 UNICODE_STRING AppCompatKey
= RTL_CONSTANT_STRING(L
"\\Registry\\MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\AppCompatibility");
32 UNICODE_STRING PolicyKey
= RTL_CONSTANT_STRING(L
"\\Registry\\MACHINE\\Software\\Policies\\Microsoft\\Windows\\AppCompat");
33 UNICODE_STRING OptionValue
= RTL_CONSTANT_STRING(L
"OptionValue");
34 UNICODE_STRING DisableAppCompat
= RTL_CONSTANT_STRING(L
"DisableAppCompat");
35 UNICODE_STRING DisableEngine
= RTL_CONSTANT_STRING(L
"DisableEngine");
36 OBJECT_ATTRIBUTES OptionKeyAttributes
= RTL_CONSTANT_OBJECT_ATTRIBUTES(&OptionKey
, OBJ_CASE_INSENSITIVE
);
37 OBJECT_ATTRIBUTES AppCompatKeyAttributes
= RTL_CONSTANT_OBJECT_ATTRIBUTES(&AppCompatKey
, OBJ_CASE_INSENSITIVE
);
38 OBJECT_ATTRIBUTES PolicyKeyAttributes
= RTL_CONSTANT_OBJECT_ATTRIBUTES(&PolicyKey
, OBJ_CASE_INSENSITIVE
);
41 * This is a TROOLEAN, -1 means we haven't yet figured it out.
42 * 0 means shims are enabled, and 1 means shims are disabled!
44 if (g_ShimsEnabled
== -1)
46 /* Open the safe mode key */
47 Status
= NtOpenKey(&KeyHandle
, KEY_QUERY_VALUE
, &OptionKeyAttributes
);
48 if (NT_SUCCESS(Status
))
50 /* Check if this is safemode */
51 Status
= NtQueryValueKey(KeyHandle
,
53 KeyValuePartialInformation
,
58 if ((NT_SUCCESS(Status
)) &&
59 (KeyInfo
.Type
== REG_DWORD
) &&
60 (KeyInfo
.DataLength
== sizeof(ULONG
)) &&
61 (KeyInfo
.Data
[0] == TRUE
))
63 /* It is, so disable shims! */
64 g_ShimsEnabled
= TRUE
;
68 /* Open the app compatibility engine settings key */
69 Status
= NtOpenKey(&KeyHandle
, KEY_QUERY_VALUE
, &AppCompatKeyAttributes
);
70 if (NT_SUCCESS(Status
))
72 /* Check if the app compat engine is turned off */
73 Status
= NtQueryValueKey(KeyHandle
,
75 KeyValuePartialInformation
,
80 if ((NT_SUCCESS(Status
)) &&
81 (KeyInfo
.Type
== REG_DWORD
) &&
82 (KeyInfo
.DataLength
== sizeof(ULONG
)) &&
83 (KeyInfo
.Data
[0] == TRUE
))
85 /* It is, so disable shims! */
86 g_ShimsEnabled
= TRUE
;
90 /* Finally, open the app compatibility policy key */
91 Status
= NtOpenKey(&KeyHandle
, KEY_QUERY_VALUE
, &PolicyKeyAttributes
);
92 if (NT_SUCCESS(Status
))
94 /* Check if the system policy disables app compat */
95 Status
= NtQueryValueKey(KeyHandle
,
97 KeyValuePartialInformation
,
102 if ((NT_SUCCESS(Status
)) &&
103 (KeyInfo
.Type
== REG_DWORD
) &&
104 (KeyInfo
.DataLength
== sizeof(ULONG
)) &&
105 (KeyInfo
.Data
[0] == TRUE
))
107 /* It does, so disable shims! */
108 g_ShimsEnabled
= TRUE
;
112 /* No keys are set, so enable shims! */
113 g_ShimsEnabled
= FALSE
;
122 /* Return if shims are disabled or not ("Enabled == 1" means disabled!) */
123 return g_ShimsEnabled
? TRUE
: FALSE
;
131 BaseCheckAppcompatCache(IN PWCHAR ApplicationName
,
132 IN HANDLE FileHandle
,
133 IN PWCHAR Environment
,
136 DPRINT("BaseCheckAppcompatCache is UNIMPLEMENTED\n");
138 if (Reason
) *Reason
= 0;
147 BasepCheckBadapp(IN HANDLE FileHandle
,
148 IN PWCHAR ApplicationName
,
149 IN PWCHAR Environment
,
151 IN PVOID
* SdbQueryAppCompatData
,
152 IN PULONG SdbQueryAppCompatDataSize
,
154 IN PULONG SxsDataSize
,
155 OUT PULONG FusionFlags
)
157 NTSTATUS Status
= STATUS_SUCCESS
;
160 /* Is shimming enabled by group policy? */
161 if (IsShimInfrastructureDisabled())
163 /* Nothing to worry about */
164 Status
= STATUS_SUCCESS
;
168 /* It is, check if we know about this app */
169 if (!BaseCheckAppcompatCache(ApplicationName
,
174 /* We don't support this yet */
176 Status
= STATUS_ACCESS_DENIED
;
180 /* Return caller the status */
189 BaseDumpAppcompatCache(VOID
)
199 BaseFlushAppcompatCache(VOID
)
209 BasepFreeAppCompatData(IN PVOID AppCompatData
,
210 IN PVOID AppCompatSxsData
)
212 /* Free the input pointers if present */
213 if (AppCompatData
) RtlFreeHeap(RtlGetProcessHeap(), 0, AppCompatData
);
214 if (AppCompatSxsData
) RtlFreeHeap(RtlGetProcessHeap(), 0, AppCompatSxsData
);
222 BaseUpdateAppcompatCache(ULONG Unknown1
,
234 BaseCleanupAppcompatCache(VOID
)
237 return STATUS_NOT_IMPLEMENTED
;
245 BaseCleanupAppcompatCacheSupport(PVOID pUnknown
)
248 return STATUS_NOT_IMPLEMENTED
;
256 BaseInitAppcompatCache(VOID
)
267 BaseInitAppcompatCacheSupport(VOID
)
278 GetComPlusPackageInstallStatus(VOID
)
289 SetComPlusPackageInstallStatus(LPVOID lpInfo
)
300 SetTermsrvAppInstallMode(IN BOOL bInstallMode
)
310 TermsrvAppInstallMode(VOID
)