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