Synchronize with trunk revision 59636 (just before Alex's CreateProcess revamp).
[reactos.git] / dll / win32 / kernel32 / client / appcache.c
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
18 ULONG g_ShimsEnabled;
19
20 /* FUNCTIONS ******************************************************************/
21
22 BOOLEAN
23 WINAPI
24 IsShimInfrastructureDisabled(VOID)
25 {
26 HANDLE KeyHandle;
27 NTSTATUS Status;
28 KEY_VALUE_PARTIAL_INFORMATION KeyInfo;
29 ULONG ResultLength;
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);
39
40 /*
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!
43 */
44 if (g_ShimsEnabled == -1)
45 {
46 /* Open the safe mode key */
47 Status = NtOpenKey(&KeyHandle, 1, &OptionKeyAttributes);
48 if (NT_SUCCESS(Status))
49 {
50 /* Check if this is safemode */
51 Status = NtQueryValueKey(KeyHandle,
52 &OptionValue,
53 KeyValuePartialInformation,
54 &KeyInfo,
55 sizeof(KeyInfo),
56 &ResultLength);
57 NtClose(KeyHandle);
58 if ((NT_SUCCESS(Status)) &&
59 (KeyInfo.Type == REG_DWORD) &&
60 (KeyInfo.DataLength == sizeof(ULONG)) &&
61 (KeyInfo.Data[0] == TRUE))
62 {
63 /* It is, so disable shims! */
64 g_ShimsEnabled = TRUE;
65 }
66 else
67 {
68 /* Open the app compatibility engine settings key */
69 Status = NtOpenKey(&KeyHandle, 1, &AppCompatKeyAttributes);
70 if (NT_SUCCESS(Status))
71 {
72 /* Check if the app compat engine is turned off */
73 Status = NtQueryValueKey(KeyHandle,
74 &DisableAppCompat,
75 KeyValuePartialInformation,
76 &KeyInfo,
77 sizeof(KeyInfo),
78 &ResultLength);
79 NtClose(KeyHandle);
80 if ((NT_SUCCESS(Status)) &&
81 (KeyInfo.Type == REG_DWORD) &&
82 (KeyInfo.DataLength == sizeof(ULONG)) &&
83 (KeyInfo.Data[0] == TRUE))
84 {
85 /* It is, so disable shims! */
86 g_ShimsEnabled = TRUE;
87 }
88 else
89 {
90 /* Finally, open the app compatibility policy key */
91 Status = NtOpenKey(&KeyHandle, 1, &PolicyKeyAttributes);
92 if (NT_SUCCESS(Status))
93 {
94 /* Check if the system policy disables app compat */
95 Status = NtQueryValueKey(KeyHandle,
96 &DisableEngine,
97 KeyValuePartialInformation,
98 &KeyInfo,
99 sizeof(KeyInfo),
100 &ResultLength),
101 NtClose(KeyHandle);
102 if ((NT_SUCCESS(Status)) &&
103 (KeyInfo.Type == REG_DWORD) &&
104 (KeyInfo.DataLength == sizeof(ULONG)) &&
105 (KeyInfo.Data[0] == TRUE))
106 {
107 /* It does, so disable shims! */
108 g_ShimsEnabled = TRUE;
109 }
110 else
111 {
112 /* No keys are set, so enable shims! */
113 g_ShimsEnabled = FALSE;
114 }
115 }
116 }
117 }
118 }
119 }
120 }
121
122 /* Return if shims are disabled or not ("Enabled == 1" means disabled!) */
123 return g_ShimsEnabled ? TRUE : FALSE;
124 }
125
126 /*
127 * @unimplemented
128 */
129 BOOL
130 WINAPI
131 BaseCheckAppcompatCache(IN PWCHAR ApplicationName,
132 IN HANDLE FileHandle,
133 IN PWCHAR Environment,
134 OUT PULONG Reason)
135 {
136 UNIMPLEMENTED;
137 if (Reason) *Reason = 0;
138 return TRUE;
139 }
140
141 /*
142 * @implemented
143 */
144 NTSTATUS
145 WINAPI
146 BasepCheckBadapp(IN HANDLE FileHandle,
147 IN PWCHAR ApplicationName,
148 IN PWCHAR Environment,
149 IN USHORT ExeType,
150 IN PVOID* SdbQueryAppCompatData,
151 IN PULONG SdbQueryAppCompatDataSize,
152 IN PVOID* SxsData,
153 IN PULONG SxsDataSize,
154 OUT PULONG FusionFlags)
155 {
156 NTSTATUS Status = STATUS_SUCCESS;
157 ULONG Reason = 0;
158
159 /* Is shimming enabled by group policy? */
160 if (IsShimInfrastructureDisabled())
161 {
162 /* Nothing to worry about */
163 Status = STATUS_SUCCESS;
164 }
165 else
166 {
167 /* It is, check if we know about this app */
168 if (!BaseCheckAppcompatCache(ApplicationName,
169 FileHandle,
170 Environment,
171 &Reason))
172 {
173 /* We don't support this yet */
174 UNIMPLEMENTED;
175 Status = STATUS_ACCESS_DENIED;
176 }
177 }
178
179 /* Return caller the status */
180 return Status;
181 }
182
183 /*
184 * @unimplemented
185 */
186 VOID
187 WINAPI
188 BaseDumpAppcompatCache(VOID)
189 {
190 STUB;
191 }
192
193 /*
194 * @unimplemented
195 */
196 VOID
197 WINAPI
198 BaseFlushAppcompatCache(VOID)
199 {
200 STUB;
201 }
202
203 /*
204 * @implemented
205 */
206 VOID
207 WINAPI
208 BasepFreeAppCompatData(IN PVOID AppCompatData,
209 IN PVOID AppCompatSxsData)
210 {
211 /* Free the input pointers if present */
212 if (AppCompatData) RtlFreeHeap(RtlGetProcessHeap(), 0, AppCompatData);
213 if (AppCompatSxsData) RtlFreeHeap(RtlGetProcessHeap(), 0, AppCompatSxsData);
214 }
215
216 /*
217 * @unimplemented
218 */
219 VOID
220 WINAPI
221 BaseUpdateAppcompatCache(ULONG Unknown1,
222 ULONG Unknown2,
223 ULONG Unknown3)
224 {
225 STUB;
226 }
227
228 /*
229 * @unimplemented
230 */
231 NTSTATUS
232 WINAPI
233 BaseCleanupAppcompatCache(VOID)
234 {
235 STUB;
236 return STATUS_NOT_IMPLEMENTED;
237 }
238
239 /*
240 * @unimplemented
241 */
242 NTSTATUS
243 WINAPI
244 BaseCleanupAppcompatCacheSupport(PVOID pUnknown)
245 {
246 STUB;
247 return STATUS_NOT_IMPLEMENTED;
248 }
249
250 /*
251 * @unimplemented
252 */
253 BOOL
254 WINAPI
255 BaseInitAppcompatCache(VOID)
256 {
257 STUB;
258 return FALSE;
259 }
260
261 /*
262 * @unimplemented
263 */
264 BOOL
265 WINAPI
266 BaseInitAppcompatCacheSupport(VOID)
267 {
268 STUB;
269 return FALSE;
270 }
271
272 /*
273 * @unimplemented
274 */
275 PVOID
276 WINAPI
277 GetComPlusPackageInstallStatus(VOID)
278 {
279 STUB;
280 return NULL;
281 }
282
283 /*
284 * @unimplemented
285 */
286 BOOL
287 WINAPI
288 SetComPlusPackageInstallStatus(LPVOID lpInfo)
289 {
290 STUB;
291 return FALSE;
292 }
293
294 /*
295 * @unimplemented
296 */
297 VOID
298 WINAPI
299 SetTermsrvAppInstallMode(IN BOOL bInstallMode)
300 {
301 STUB;
302 }
303
304 /*
305 * @unimplemented
306 */
307 BOOL
308 WINAPI
309 TermsrvAppInstallMode(VOID)
310 {
311 STUB;
312 return FALSE;
313 }