xref: /reactos/dll/win32/kernel32/wine/actctx.c (revision c9087160)
1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS system libraries
4  * FILE:            dll/win32/kernel32/wine/actctx.c
5  * PURPOSE:         Activation contexts
6  * PROGRAMMERS:     Jacek Caban for CodeWeavers
7  *                  Eric Pouech
8  *                  Jon Griffiths
9  *                  Dmitry Chapyshev (dmitry@reactos.org)
10  *                  Samuel Serapi�n
11  */
12 
13 /* Synched with Wine 1.7.55 */
14 
15 #include <k32.h>
16 
17 #define NDEBUG
18 #include <debug.h>
19 DEBUG_CHANNEL(actctx);
20 
21 /***********************************************************************
22  * CreateActCtxA (KERNEL32.@)
23  *
24  * Create an activation context.
25  */
CreateActCtxA(PCACTCTXA pActCtx)26 HANDLE WINAPI CreateActCtxA(PCACTCTXA pActCtx)
27 {
28     ACTCTXW     actw;
29     SIZE_T      len;
30     HANDLE      ret = INVALID_HANDLE_VALUE;
31     LPWSTR      src = NULL, assdir = NULL, resname = NULL, appname = NULL;
32 
33     TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
34 
35     if (!pActCtx || pActCtx->cbSize != sizeof(*pActCtx))
36     {
37         SetLastError(ERROR_INVALID_PARAMETER);
38         return INVALID_HANDLE_VALUE;
39     }
40 
41     actw.cbSize = sizeof(actw);
42     actw.dwFlags = pActCtx->dwFlags;
43     if (pActCtx->lpSource)
44     {
45         len = MultiByteToWideChar(CP_ACP, 0, pActCtx->lpSource, -1, NULL, 0);
46         src = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
47         if (!src) return INVALID_HANDLE_VALUE;
48         MultiByteToWideChar(CP_ACP, 0, pActCtx->lpSource, -1, src, len);
49     }
50     actw.lpSource = src;
51 
52     if (actw.dwFlags & ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID)
53         actw.wProcessorArchitecture = pActCtx->wProcessorArchitecture;
54     if (actw.dwFlags & ACTCTX_FLAG_LANGID_VALID)
55         actw.wLangId = pActCtx->wLangId;
56     if (actw.dwFlags & ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID)
57     {
58         len = MultiByteToWideChar(CP_ACP, 0, pActCtx->lpAssemblyDirectory, -1, NULL, 0);
59         assdir = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
60         if (!assdir) goto done;
61         MultiByteToWideChar(CP_ACP, 0, pActCtx->lpAssemblyDirectory, -1, assdir, len);
62         actw.lpAssemblyDirectory = assdir;
63     }
64     if (actw.dwFlags & ACTCTX_FLAG_RESOURCE_NAME_VALID)
65     {
66         if ((ULONG_PTR)pActCtx->lpResourceName >> 16)
67         {
68             len = MultiByteToWideChar(CP_ACP, 0, pActCtx->lpResourceName, -1, NULL, 0);
69             resname = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
70             if (!resname) goto done;
71             MultiByteToWideChar(CP_ACP, 0, pActCtx->lpResourceName, -1, resname, len);
72             actw.lpResourceName = resname;
73         }
74         else actw.lpResourceName = (LPCWSTR)pActCtx->lpResourceName;
75     }
76     if (actw.dwFlags & ACTCTX_FLAG_APPLICATION_NAME_VALID)
77     {
78         len = MultiByteToWideChar(CP_ACP, 0, pActCtx->lpApplicationName, -1, NULL, 0);
79         appname = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
80         if (!appname) goto done;
81         MultiByteToWideChar(CP_ACP, 0, pActCtx->lpApplicationName, -1, appname, len);
82         actw.lpApplicationName = appname;
83     }
84     if (actw.dwFlags & ACTCTX_FLAG_HMODULE_VALID)
85         actw.hModule = pActCtx->hModule;
86 
87     ret = CreateActCtxW(&actw);
88 
89 done:
90     HeapFree(GetProcessHeap(), 0, src);
91     HeapFree(GetProcessHeap(), 0, assdir);
92     HeapFree(GetProcessHeap(), 0, resname);
93     HeapFree(GetProcessHeap(), 0, appname);
94     return ret;
95 }
96 
97 /***********************************************************************
98  * CreateActCtxW (KERNEL32.@)
99  *
100  * Create an activation context.
101  */
CreateActCtxW(PCACTCTXW pActCtx)102 HANDLE WINAPI CreateActCtxW(PCACTCTXW pActCtx)
103 {
104     NTSTATUS    status;
105     HANDLE      hActCtx;
106 
107     TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
108 
109     if ((status = RtlCreateActivationContext(0, (PVOID)pActCtx, 0, NULL, NULL, &hActCtx)))
110     {
111         SetLastError(RtlNtStatusToDosError(status));
112         return INVALID_HANDLE_VALUE;
113     }
114     return hActCtx;
115 }
116 
117 #ifndef __REACTOS__
118 /***********************************************************************
119  * ActivateActCtx (KERNEL32.@)
120  *
121  * Activate an activation context.
122  */
ActivateActCtx(HANDLE hActCtx,ULONG_PTR * ulCookie)123 BOOL WINAPI ActivateActCtx(HANDLE hActCtx, ULONG_PTR *ulCookie)
124 {
125     NTSTATUS status;
126 
127     if ((status = RtlActivateActivationContext( 0, hActCtx, ulCookie )))
128     {
129         SetLastError(RtlNtStatusToDosError(status));
130         return FALSE;
131     }
132     return TRUE;
133 }
134 
135 /***********************************************************************
136  * DeactivateActCtx (KERNEL32.@)
137  *
138  * Deactivate an activation context.
139  */
DeactivateActCtx(DWORD dwFlags,ULONG_PTR ulCookie)140 BOOL WINAPI DeactivateActCtx(DWORD dwFlags, ULONG_PTR ulCookie)
141 {
142     RtlDeactivateActivationContext( dwFlags, ulCookie );
143     return TRUE;
144 }
145 
146 /***********************************************************************
147  * GetCurrentActCtx (KERNEL32.@)
148  *
149  * Get the current activation context.
150  */
GetCurrentActCtx(HANDLE * phActCtx)151 BOOL WINAPI GetCurrentActCtx(HANDLE* phActCtx)
152 {
153     NTSTATUS status;
154 
155     if ((status = RtlGetActiveActivationContext(phActCtx)))
156     {
157         SetLastError(RtlNtStatusToDosError(status));
158         return FALSE;
159     }
160     return TRUE;
161 }
162 
163 /***********************************************************************
164  * AddRefActCtx (KERNEL32.@)
165  *
166  * Add a reference to an activation context.
167  */
AddRefActCtx(HANDLE hActCtx)168 void WINAPI AddRefActCtx(HANDLE hActCtx)
169 {
170     RtlAddRefActivationContext(hActCtx);
171 }
172 
173 /***********************************************************************
174  * ReleaseActCtx (KERNEL32.@)
175  *
176  * Release a reference to an activation context.
177  */
ReleaseActCtx(HANDLE hActCtx)178 void WINAPI ReleaseActCtx(HANDLE hActCtx)
179 {
180     RtlReleaseActivationContext(hActCtx);
181 }
182 
183 /***********************************************************************
184  * ZombifyActCtx (KERNEL32.@)
185  *
186  * Deactivate context without releasing it.
187  */
ZombifyActCtx(HANDLE hActCtx)188 BOOL WINAPI ZombifyActCtx(HANDLE hActCtx)
189 {
190     NTSTATUS status;
191 
192     if ((status = RtlZombifyActivationContext(hActCtx)))
193     {
194         SetLastError(RtlNtStatusToDosError(status));
195         return FALSE;
196     }
197     return TRUE;
198 }
199 #endif // !__REACTOS__
200 
201 /***********************************************************************
202  * FindActCtxSectionStringA (KERNEL32.@)
203  *
204  * Find information about a string in an activation context.
205  */
FindActCtxSectionStringA(DWORD dwFlags,const GUID * lpExtGuid,ULONG ulId,LPCSTR lpSearchStr,PACTCTX_SECTION_KEYED_DATA pInfo)206 BOOL WINAPI FindActCtxSectionStringA(DWORD dwFlags, const GUID* lpExtGuid,
207                                     ULONG ulId, LPCSTR lpSearchStr,
208                                     PACTCTX_SECTION_KEYED_DATA pInfo)
209 {
210     LPWSTR  search_str;
211     DWORD   len;
212     BOOL    ret;
213 
214     TRACE("%08x %s %u %s %p\n", dwFlags, debugstr_guid(lpExtGuid),
215           ulId, debugstr_a(lpSearchStr), pInfo);
216 
217     if (!lpSearchStr || !pInfo)
218     {
219         SetLastError(ERROR_INVALID_PARAMETER);
220         return FALSE;
221     }
222 
223     len = MultiByteToWideChar(CP_ACP, 0, lpSearchStr, -1, NULL, 0);
224     search_str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
225     MultiByteToWideChar(CP_ACP, 0, lpSearchStr, -1, search_str, len);
226 
227     ret = FindActCtxSectionStringW(dwFlags, lpExtGuid, ulId, search_str, pInfo);
228 
229     HeapFree(GetProcessHeap(), 0, search_str);
230     return ret;
231 }
232 
233 /***********************************************************************
234  * FindActCtxSectionStringW (KERNEL32.@)
235  *
236  * Find information about a string in an activation context.
237  */
FindActCtxSectionStringW(DWORD dwFlags,const GUID * lpExtGuid,ULONG ulId,LPCWSTR lpSearchStr,PACTCTX_SECTION_KEYED_DATA pInfo)238 BOOL WINAPI FindActCtxSectionStringW(DWORD dwFlags, const GUID* lpExtGuid,
239                                     ULONG ulId, LPCWSTR lpSearchStr,
240                                     PACTCTX_SECTION_KEYED_DATA pInfo)
241 {
242     UNICODE_STRING us;
243     NTSTATUS status;
244 
245     if (!pInfo)
246     {
247         SetLastError(ERROR_INVALID_PARAMETER);
248         return FALSE;
249     }
250 
251     RtlInitUnicodeString(&us, lpSearchStr);
252     if ((status = RtlFindActivationContextSectionString(dwFlags, lpExtGuid, ulId, &us, pInfo)))
253     {
254         SetLastError(RtlNtStatusToDosError(status));
255         return FALSE;
256     }
257     return TRUE;
258 }
259 
260 /***********************************************************************
261  * FindActCtxSectionGuid (KERNEL32.@)
262  *
263  * Find information about a GUID in an activation context.
264  */
FindActCtxSectionGuid(DWORD dwFlags,const GUID * lpExtGuid,ULONG ulId,const GUID * lpSearchGuid,PACTCTX_SECTION_KEYED_DATA pInfo)265 BOOL WINAPI FindActCtxSectionGuid(DWORD dwFlags, const GUID* lpExtGuid,
266                                   ULONG ulId, const GUID* lpSearchGuid,
267                                   PACTCTX_SECTION_KEYED_DATA pInfo)
268 {
269     NTSTATUS status;
270 
271     if ((status = RtlFindActivationContextSectionGuid(dwFlags, lpExtGuid, ulId, lpSearchGuid, pInfo)))
272     {
273         SetLastError(RtlNtStatusToDosError(status));
274         return FALSE;
275     }
276 
277     return TRUE;
278 }
279 
280 #ifndef __REACTOS__
281 /***********************************************************************
282  * QueryActCtxW (KERNEL32.@)
283  *
284  * Get information about an activation context.
285  */
QueryActCtxW(DWORD dwFlags,HANDLE hActCtx,PVOID pvSubInst,ULONG ulClass,PVOID pvBuff,SIZE_T cbBuff,SIZE_T * pcbLen)286 BOOL WINAPI QueryActCtxW(DWORD dwFlags, HANDLE hActCtx, PVOID pvSubInst,
287                          ULONG ulClass, PVOID pvBuff, SIZE_T cbBuff,
288                          SIZE_T *pcbLen)
289 {
290     NTSTATUS status;
291 
292     if ((status = RtlQueryInformationActivationContext( dwFlags, hActCtx, pvSubInst, ulClass,
293                                                         pvBuff, cbBuff, pcbLen )))
294     {
295         SetLastError(RtlNtStatusToDosError(status));
296         return FALSE;
297     }
298     return TRUE;
299 }
300 #endif // !__REACTOS__
301