[PATCH 01/27] [Kernel32]: ActCtx: implemented CreateActCtxA on top
of CreateActCtxW
Eric Pouech
eric.pouech at wanadoo.fr
Mon May 7 14:49:40 CDT 2007
---
dlls/kernel32/actctx.c | 78 +++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 70 insertions(+), 8 deletions(-)
diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index a0bd3c1..db463b1 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -2,6 +2,8 @@
* Activation contexts
*
* Copyright 2004 Jon Griffiths
+ * 2007 Eric Pouech
+ * 2007 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -51,15 +53,75 @@ WINE_DEFAULT_DEBUG_CHANNEL(actctx);
*/
HANDLE WINAPI CreateActCtxA(PCACTCTXA pActCtx)
{
- FIXME("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
+ ACTCTXW actw;
+ SIZE_T len;
+ HANDLE ret = INVALID_HANDLE_VALUE;
+ LPWSTR src = NULL, assdir = NULL, resname = NULL, appname = NULL;
- if (!pActCtx)
- return INVALID_HANDLE_VALUE;
- if (pActCtx->cbSize != sizeof *pActCtx)
- return INVALID_HANDLE_VALUE;
- if (pActCtx->dwFlags & ~ACTCTX_FLAGS_ALL)
- return INVALID_HANDLE_VALUE;
- return ACTCTX_FAKE_HANDLE;
+ TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
+
+ if (!pActCtx || pActCtx->cbSize != sizeof(*pActCtx) ||
+ (pActCtx->dwFlags & ~ACTCTX_FLAGS_ALL))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ actw.cbSize = sizeof(actw);
+ actw.dwFlags = pActCtx->dwFlags;
+ if (pActCtx->lpSource)
+ {
+ len = MultiByteToWideChar(CP_ACP, 0, pActCtx->lpSource, -1, NULL, 0);
+ src = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (!src) return INVALID_HANDLE_VALUE;
+ MultiByteToWideChar(CP_ACP, 0, pActCtx->lpSource, -1, src, len);
+ }
+ actw.lpSource = src;
+
+ if (actw.dwFlags & ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID)
+ actw.wProcessorArchitecture = pActCtx->wProcessorArchitecture;
+ if (actw.dwFlags & ACTCTX_FLAG_LANGID_VALID)
+ actw.wLangId = pActCtx->wLangId;
+ if (actw.dwFlags & ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID)
+ {
+ len = MultiByteToWideChar(CP_ACP, 0, pActCtx->lpAssemblyDirectory, -1, NULL, 0);
+ assdir = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (!assdir) goto done;
+ MultiByteToWideChar(CP_ACP, 0, pActCtx->lpAssemblyDirectory, -1, assdir, len);
+ }
+ actw.lpAssemblyDirectory = assdir;
+ if (actw.dwFlags & ACTCTX_FLAG_RESOURCE_NAME_VALID)
+ {
+ if (!HIWORD((ULONG_PTR)pActCtx->lpResourceName))
+ {
+ len = MultiByteToWideChar(CP_ACP, 0, pActCtx->lpResourceName, -1, NULL, 0);
+ resname = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (!resname) goto done;
+ MultiByteToWideChar(CP_ACP, 0, pActCtx->lpResourceName, -1, resname, len);
+ }
+ else actw.lpResourceName = (LPWSTR)pActCtx->lpResourceName;
+ }
+ actw.lpResourceName = resname;
+ if (actw.dwFlags & ACTCTX_FLAG_APPLICATION_NAME_VALID)
+ {
+ len = MultiByteToWideChar(CP_ACP, 0, pActCtx->lpApplicationName, -1, NULL, 0);
+ appname = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (!appname) goto done;
+ MultiByteToWideChar(CP_ACP, 0, pActCtx->lpApplicationName, -1, appname, len);
+ }
+ if (actw.dwFlags & ACTCTX_FLAG_HMODULE_VALID)
+ actw.hModule = pActCtx->hModule;
+
+ ret = CreateActCtxW(&actw);
+ /* FIXME:
+ * which fields are to be copied back to pActCtx ?
+ */
+done:
+ HeapFree(GetProcessHeap(), 0, src);
+ HeapFree(GetProcessHeap(), 0, assdir);
+ HeapFree(GetProcessHeap(), 0, resname);
+ HeapFree(GetProcessHeap(), 0, appname);
+ return ret;
}
/***********************************************************************
More information about the wine-patches
mailing list