xref: /reactos/dll/win32/kernel32/wine/actctx.c (revision 463784c5)
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 /* Partly synched with Wine 1.7.17 */
14 
15 #include <k32.h>
16 
17 #define NDEBUG
18 #include <debug.h>
19 DEBUG_CHANNEL(actctx);
20 
21 #define ACTCTX_FAKE_HANDLE ((HANDLE) 0xf00baa)
22 
23 /***********************************************************************
24  * CreateActCtxA (KERNEL32.@)
25  *
26  * Create an activation context.
27  */
28 HANDLE WINAPI CreateActCtxA(PCACTCTXA pActCtx)
29 {
30     ACTCTXW     actw;
31     SIZE_T      len;
32     HANDLE      ret = INVALID_HANDLE_VALUE;
33     LPWSTR      src = NULL, assdir = NULL, resname = NULL, appname = NULL;
34 
35     TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
36 
37     if (!pActCtx || pActCtx->cbSize != sizeof(*pActCtx))
38     {
39         SetLastError(ERROR_INVALID_PARAMETER);
40         return INVALID_HANDLE_VALUE;
41     }
42 
43     actw.cbSize = sizeof(actw);
44     actw.dwFlags = pActCtx->dwFlags;
45     if (pActCtx->lpSource)
46     {
47         len = MultiByteToWideChar(CP_ACP, 0, pActCtx->lpSource, -1, NULL, 0);
48         src = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
49         if (!src) return INVALID_HANDLE_VALUE;
50         MultiByteToWideChar(CP_ACP, 0, pActCtx->lpSource, -1, src, len);
51     }
52     actw.lpSource = src;
53 
54     if (actw.dwFlags & ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID)
55         actw.wProcessorArchitecture = pActCtx->wProcessorArchitecture;
56     if (actw.dwFlags & ACTCTX_FLAG_LANGID_VALID)
57         actw.wLangId = pActCtx->wLangId;
58     if (actw.dwFlags & ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID)
59     {
60         len = MultiByteToWideChar(CP_ACP, 0, pActCtx->lpAssemblyDirectory, -1, NULL, 0);
61         assdir = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
62         if (!assdir) goto done;
63         MultiByteToWideChar(CP_ACP, 0, pActCtx->lpAssemblyDirectory, -1, assdir, len);
64         actw.lpAssemblyDirectory = assdir;
65     }
66     if (actw.dwFlags & ACTCTX_FLAG_RESOURCE_NAME_VALID)
67     {
68         if ((ULONG_PTR)pActCtx->lpResourceName >> 16)
69         {
70             len = MultiByteToWideChar(CP_ACP, 0, pActCtx->lpResourceName, -1, NULL, 0);
71             resname = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
72             if (!resname) goto done;
73             MultiByteToWideChar(CP_ACP, 0, pActCtx->lpResourceName, -1, resname, len);
74             actw.lpResourceName = resname;
75         }
76         else actw.lpResourceName = (LPCWSTR)pActCtx->lpResourceName;
77     }
78     if (actw.dwFlags & ACTCTX_FLAG_APPLICATION_NAME_VALID)
79     {
80         len = MultiByteToWideChar(CP_ACP, 0, pActCtx->lpApplicationName, -1, NULL, 0);
81         appname = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
82         if (!appname) goto done;
83         MultiByteToWideChar(CP_ACP, 0, pActCtx->lpApplicationName, -1, appname, len);
84         actw.lpApplicationName = appname;
85     }
86     if (actw.dwFlags & ACTCTX_FLAG_HMODULE_VALID)
87         actw.hModule = pActCtx->hModule;
88 
89     ret = CreateActCtxW(&actw);
90 
91 done:
92     HeapFree(GetProcessHeap(), 0, src);
93     HeapFree(GetProcessHeap(), 0, assdir);
94     HeapFree(GetProcessHeap(), 0, resname);
95     HeapFree(GetProcessHeap(), 0, appname);
96     return ret;
97 }
98 
99 /***********************************************************************
100  * CreateActCtxW (KERNEL32.@)
101  *
102  * Create an activation context.
103  */
104 HANDLE WINAPI CreateActCtxW(PCACTCTXW pActCtx)
105 {
106     NTSTATUS    status;
107     HANDLE      hActCtx;
108 
109     TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
110 
111     if ((status = RtlCreateActivationContext(0, (PVOID)pActCtx, 0, NULL, NULL, &hActCtx)))
112     {
113         SetLastError(RtlNtStatusToDosError(status));
114         return INVALID_HANDLE_VALUE;
115     }
116     return hActCtx;
117 }
118 
119 /***********************************************************************
120  * FindActCtxSectionStringA (KERNEL32.@)
121  *
122  * Find information about a string in an activation context.
123  */
124 BOOL WINAPI FindActCtxSectionStringA(DWORD dwFlags, const GUID* lpExtGuid,
125                                     ULONG ulId, LPCSTR lpSearchStr,
126                                     PACTCTX_SECTION_KEYED_DATA pInfo)
127 {
128     LPWSTR  search_str;
129     DWORD   len;
130     BOOL    ret;
131 
132     TRACE("%08x %s %u %s %p\n", dwFlags, debugstr_guid(lpExtGuid),
133           ulId, debugstr_a(lpSearchStr), pInfo);
134 
135     if (!lpSearchStr || !pInfo)
136     {
137         SetLastError(ERROR_INVALID_PARAMETER);
138         return FALSE;
139     }
140 
141     len = MultiByteToWideChar(CP_ACP, 0, lpSearchStr, -1, NULL, 0);
142     search_str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
143     MultiByteToWideChar(CP_ACP, 0, lpSearchStr, -1, search_str, len);
144 
145     ret = FindActCtxSectionStringW(dwFlags, lpExtGuid, ulId, search_str, pInfo);
146 
147     HeapFree(GetProcessHeap(), 0, search_str);
148     return ret;
149 }
150 
151 /***********************************************************************
152  * FindActCtxSectionStringW (KERNEL32.@)
153  *
154  * Find information about a string in an activation context.
155  */
156 BOOL WINAPI FindActCtxSectionStringW(DWORD dwFlags, const GUID* lpExtGuid,
157                                     ULONG ulId, LPCWSTR lpSearchStr,
158                                     PACTCTX_SECTION_KEYED_DATA pInfo)
159 {
160     UNICODE_STRING us;
161     NTSTATUS status;
162 
163     if (!pInfo)
164     {
165         SetLastError(ERROR_INVALID_PARAMETER);
166         return FALSE;
167     }
168 
169     RtlInitUnicodeString(&us, lpSearchStr);
170     if ((status = RtlFindActivationContextSectionString(dwFlags, lpExtGuid, ulId, &us, pInfo)))
171     {
172         SetLastError(RtlNtStatusToDosError(status));
173         return FALSE;
174     }
175     return TRUE;
176 }
177 
178 /***********************************************************************
179  * FindActCtxSectionGuid (KERNEL32.@)
180  *
181  * Find information about a GUID in an activation context.
182  */
183 BOOL WINAPI FindActCtxSectionGuid(DWORD dwFlags, const GUID* lpExtGuid,
184                                   ULONG ulId, const GUID* lpSearchGuid,
185                                   PACTCTX_SECTION_KEYED_DATA pInfo)
186 {
187     NTSTATUS status;
188 
189     if ((status = RtlFindActivationContextSectionGuid(dwFlags, lpExtGuid, ulId, lpSearchGuid, pInfo)))
190     {
191         SetLastError(RtlNtStatusToDosError(status));
192         return FALSE;
193     }
194 
195     return TRUE;
196 }
197 
198 /* EOF */
199