ReactOS  0.4.15-dev-1389-g828d5fa
actctx.c
Go to the documentation of this file.
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>
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;
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  {
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:
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 {
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  {
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  */
125  ULONG ulId, LPCSTR lpSearchStr,
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  {
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  */
157  ULONG ulId, LPCWSTR lpSearchStr,
159 {
162 
163  if (!pInfo)
164  {
166  return FALSE;
167  }
168 
169  RtlInitUnicodeString(&us, lpSearchStr);
170  if ((status = RtlFindActivationContextSectionString(dwFlags, lpExtGuid, ulId, &us, pInfo)))
171  {
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  */
184  ULONG ulId, const GUID* lpSearchGuid,
186 {
188 
189  if ((status = RtlFindActivationContextSectionGuid(dwFlags, lpExtGuid, ulId, lpSearchGuid, pInfo)))
190  {
192  return FALSE;
193  }
194 
195  return TRUE;
196 }
197 
198 /* EOF */
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
NTSTATUS NTAPI RtlCreateActivationContext(IN ULONG Flags, IN PACTIVATION_CONTEXT_DATA ActivationContextData, IN ULONG ExtraBytes, IN PVOID NotificationRoutine, IN PVOID NotificationContext, OUT PACTIVATION_CONTEXT *ActCtx)
Definition: actctx.c:5031
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define TRUE
Definition: types.h:120
static const BYTE us[]
Definition: encode.c:689
#define CP_ACP
Definition: compat.h:109
DEBUG_CHANNEL(actctx)
LONG NTSTATUS
Definition: precomp.h:26
#define INVALID_HANDLE_VALUE
Definition: compat.h:590
uint32_t ULONG_PTR
Definition: typedefs.h:65
BOOL WINAPI FindActCtxSectionStringW(DWORD dwFlags, const GUID *lpExtGuid, ULONG ulId, LPCWSTR lpSearchStr, PACTCTX_SECTION_KEYED_DATA pInfo)
Definition: actctx.c:156
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define actctx
Definition: kernel32.h:8
const char * LPCSTR
Definition: xmlstorage.h:183
#define debugstr_guid
Definition: kernel32.h:35
BOOL WINAPI FindActCtxSectionStringA(DWORD dwFlags, const GUID *lpExtGuid, ULONG ulId, LPCSTR lpSearchStr, PACTCTX_SECTION_KEYED_DATA pInfo)
Definition: actctx.c:124
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define debugstr_a
Definition: kernel32.h:31
#define WINAPI
Definition: msvc.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetLastError(x)
Definition: compat.h:611
int ret
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
GLenum GLsizei len
Definition: glext.h:6722
GLenum src
Definition: glext.h:6340
NTSTATUS WINAPI RtlFindActivationContextSectionGuid(ULONG flags, const GUID *extguid, ULONG section_kind, const GUID *guid, void *ptr)
Definition: actctx.c:5764
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define NULL
Definition: types.h:112
#define MultiByteToWideChar
Definition: compat.h:110
static const GUID LPCWSTR
Definition: actctx.c:37
HANDLE WINAPI CreateActCtxW(PCACTCTXW pActCtx)
Definition: actctx.c:104
unsigned int ULONG
Definition: retypes.h:1
HANDLE WINAPI CreateActCtxA(PCACTCTXA pActCtx)
Definition: actctx.c:28
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
static const GUID PACTCTX_SECTION_KEYED_DATA
Definition: actctx.c:36
WCHAR * LPWSTR
Definition: xmlstorage.h:184
BOOL WINAPI FindActCtxSectionGuid(DWORD dwFlags, const GUID *lpExtGuid, ULONG ulId, const GUID *lpSearchGuid, PACTCTX_SECTION_KEYED_DATA pInfo)
Definition: actctx.c:183
NTSTATUS NTAPI RtlFindActivationContextSectionString(ULONG flags, const GUID *guid, ULONG section_kind, const UNICODE_STRING *section_name, PVOID ptr)
Definition: actctx.c:5713
static SERVICE_STATUS status
Definition: service.c:31
#define HeapFree(x, y, z)
Definition: compat.h:594
Definition: ps.c:97