[PATCH 02/27] [Kernel32]: ActCtx: set the new definition for an activation context, and

Eric Pouech eric.pouech at wanadoo.fr
Mon May 7 14:49:47 CDT 2007


implement adding / releasing references to it
---

 dlls/kernel32/actctx.c |   71 ++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 62 insertions(+), 9 deletions(-)

diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index db463b1..7cc0593 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -46,6 +46,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(actctx);
 #define ACTCTX_FAKE_HANDLE ((HANDLE) 0xf00baa)
 #define ACTCTX_FAKE_COOKIE ((ULONG_PTR) 0xf00bad)
 
+#define ACTCTX_MAGIC       0xC07E3E11
+
+struct actctx
+{
+    ULONG               magic;
+    ULONG               ref_count;
+};
+
 /***********************************************************************
  * CreateActCtxA (KERNEL32.@)
  *
@@ -131,15 +139,44 @@ done:
  */
 HANDLE WINAPI CreateActCtxW(PCACTCTXW pActCtx)
 {
-  FIXME("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
+    struct actctx*      actctx;
+    DWORD               ret = ERROR_SUCCESS;
 
-  if (!pActCtx)
-    return INVALID_HANDLE_VALUE;
-  if (pActCtx->cbSize != sizeof *pActCtx)
-    return INVALID_HANDLE_VALUE;
-  if (pActCtx->dwFlags & ~ACTCTX_FLAGS_ALL)
+    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;
+    }
+    actctx = HeapAlloc(GetProcessHeap(), 0, sizeof(*actctx));
+    if (!actctx) return INVALID_HANDLE_VALUE;
+
+    actctx->magic = ACTCTX_MAGIC;
+    actctx->ref_count = 1;
+
+    if (ret == ERROR_SUCCESS)
+    {
+        return (HANDLE)actctx;
+    }
+
+    ReleaseActCtx((HANDLE)actctx);
+    SetLastError(ret);
     return INVALID_HANDLE_VALUE;
-  return ACTCTX_FAKE_HANDLE;
+}
+
+static struct actctx* check_actctx(HANDLE h)
+{
+    struct actctx*      actctx = (struct actctx*)h;
+
+    switch (actctx->magic)
+    {
+    case ACTCTX_MAGIC: return actctx;
+    default:
+        SetLastError(ERROR_INVALID_HANDLE);
+        return NULL;
+    }
 }
 
 /***********************************************************************
@@ -205,7 +242,12 @@ BOOL WINAPI GetCurrentActCtx(HANDLE* phActCtx)
  */
 void WINAPI AddRefActCtx(HANDLE hActCtx)
 {
-  FIXME("%p\n", hActCtx);
+    struct actctx*      actctx;
+
+    TRACE("%p\n", hActCtx);
+
+    if ((actctx = check_actctx(hActCtx)))
+        actctx->ref_count++;
 }
 
 /***********************************************************************
@@ -215,7 +257,18 @@ void WINAPI AddRefActCtx(HANDLE hActCtx)
  */
 void WINAPI ReleaseActCtx(HANDLE hActCtx)
 {
-  FIXME("%p\n", hActCtx);
+    struct actctx*      actctx;
+
+    TRACE("%p\n", hActCtx);
+
+    if ((actctx = check_actctx(hActCtx)))
+    {
+        if (--actctx->ref_count == 0)
+        {
+            actctx->magic = 0;
+            HeapFree(GetProcessHeap(), 0, actctx);
+        }
+    }
 }
 
 /***********************************************************************





More information about the wine-patches mailing list