[PATCH 23/27] [Kernel32]: ActCtx: added implementation for QueryActCtxW for

Eric Pouech eric.pouech at wanadoo.fr
Mon May 7 14:52:12 CDT 2007


AssemblyDetailedInformationInActivationContext
---

 dlls/kernel32/actctx.c |  191 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 191 insertions(+), 0 deletions(-)

diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index d9fe47f..0983ee1 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -24,6 +24,7 @@
 #include "wine/port.h"
 
 #include <stdarg.h>
+#include <stdio.h>
 #include "windef.h"
 #include "winbase.h"
 #include "winerror.h"
@@ -1886,6 +1887,124 @@ BOOL WINAPI FindActCtxSectionGuid(DWORD dwFlags, const GUID* lpExtGuid,
   return FALSE;
 }
 
+static SIZE_T build_version(const struct version* v, LPWSTR buf)
+{
+    static const WCHAR version_format[] =
+        {'%','d','.','%','d','.','%','d','.','%','d',0};
+    return sprintfW(buf, version_format, v->major, v->minor, v->build, v->revision);
+}
+
+static SIZE_T build_assembly_id(struct assembly *assembly, LPWSTR buf)
+{
+    static const WCHAR version_format[] =
+        {',','v','e','r','s','i','o','n','=','\"',0};
+    SIZE_T size = 0, ver_size = 0;
+    WCHAR tmp1[64];
+
+    size = strlenW(assembly->id.name);
+    if (buf) strcpyW(buf, assembly->id.name);
+
+    if (assembly->id.arch == ARCH_X86)
+    {
+        static const WCHAR arch_str[] =
+            {',','p','r','o','c','e','s','s','o','r','A','r','c','h','i','t','e','c','t','u','r','e',
+             '=','"','x','8','6','\"',0};
+
+        if (buf) strcpyW(buf + size, arch_str);
+        size += (sizeof(arch_str) - sizeof(WCHAR)) / sizeof(WCHAR);
+    }
+
+    if (assembly->id.public_key)
+    {
+        static const WCHAR public_key_str[] =
+            {',','p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','"',0};
+
+        if (buf) strcpyW(buf + size, public_key_str);
+        size += (sizeof(public_key_str) - sizeof(WCHAR)) / sizeof(WCHAR);
+
+        if (buf) strcpyW(buf + size, assembly->id.public_key);
+        size += strlenW(assembly->id.public_key);
+
+        if (buf) buf[size] = '\"';
+        size++;
+    }
+
+    if (assembly->id.type == TYPE_WIN32)
+    {
+        static const WCHAR type_str[] =
+            {',','t','y','p','e','=','"','w','i','n','3','2','\"',0};
+
+        if (buf) strcpyW(buf + size, type_str);
+        size += (sizeof(type_str) - sizeof(WCHAR)) / sizeof(WCHAR);
+    }
+
+    if (buf) strcpyW(buf + size, version_format);
+    size += (sizeof(version_format) - sizeof(WCHAR)) / sizeof(WCHAR);
+
+    ver_size = build_version(&assembly->id.version, tmp1);
+    if (buf) strcpyW(buf + size, tmp1);
+    size += ver_size;
+
+    if (buf) buf[size] = '\"';
+    size++;
+
+    if (buf) buf[size] = '\0';
+
+    return size;
+}
+
+static SIZE_T build_dir(struct assembly *assembly, LPWSTR buf)
+{
+    static const WCHAR und[] = {'_',0};
+    static const WCHAR mskey[] = {'x','-','w','w','_','5','6','4','7','e','9','0','e',0};
+
+    SIZE_T size = 0, ver_size = 0;
+    WCHAR tmp[64];
+
+    if (assembly->id.arch == ARCH_X86)
+    {
+        static const WCHAR arch[] = {'x','8','6',0};
+
+        if (buf) strcpyW(buf + size, arch);
+        size += (sizeof(arch) - sizeof(WCHAR)) / sizeof(WCHAR);
+    }
+    if (buf) strcpyW(buf + size, und);
+    size++;
+
+    if (buf) strcpyW(buf + size, assembly->id.name);
+    size += strlenW(assembly->id.name);
+
+    if (buf) strcpyW(buf + size, und);
+    size++;
+
+    if (assembly->id.public_key)
+    {
+        if (buf) strcpyW(buf + size, assembly->id.public_key);
+        size += strlenW(assembly->id.public_key);
+    }
+    else
+    {
+        static const WCHAR nokey[] = {'n','o','-','p','u','b','l','i','c','-','k','e','y',0};
+        if (buf) strcpyW(buf + size, nokey);
+        size += (sizeof(nokey) - sizeof(WCHAR)) / sizeof(WCHAR);
+    }
+
+    if (buf) strcpyW(buf + size, und);
+    size++;
+
+    ver_size = build_version(&assembly->id.version, tmp);
+    if (buf) strcpyW(buf + size, tmp);
+    size += ver_size;
+
+    if (buf) strcpyW(buf + size, und);
+    size++;
+
+    if (buf) strcpyW(buf + size, mskey);
+    size += (sizeof(mskey) - sizeof(WCHAR)) / sizeof(WCHAR);
+
+    return size;
+}
+
 /***********************************************************************
  * QueryActCtxW (KERNEL32.@)
  *
@@ -1978,6 +2097,78 @@ BOOL WINAPI QueryActCtxW(DWORD dwFlags, HANDLE hActCtx, PVOID pvSubInst,
         }
         break;
     case AssemblyDetailedInformationInActivationContext:
+        {
+            DWORD               index;
+            ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION* afdi = pvBuff;
+            unsigned            len, id_len = 0, ad_len = 0, path_len = 0;
+            LPWSTR              ptr;
+            struct assembly*    assembly;
+            BOOL                subcase; /* FIXME: this is a big HACK */
+
+            if (!pvSubInst)
+            {
+                SetLastError(ERROR_INVALID_PARAMETER);
+                return FALSE;
+            }
+            index = *(DWORD*)pvSubInst;
+
+            if (index > actctx->num_assemblies)
+            {
+                SetLastError(ERROR_INVALID_PARAMETER);
+                return FALSE;
+            }
+
+            assembly = &actctx->assemblies[index];
+
+            id_len = build_assembly_id(assembly, NULL) + 1;
+            subcase = index > 1; /* FIXME */
+            if (subcase) ad_len = build_dir(assembly, NULL) + 1;
+
+            if (assembly->manifest.info && assembly->type == ASSEMBLY_MANIFEST)
+                path_len  = strlenW(assembly->manifest.info) + 1;
+
+            len = sizeof(*afdi) + (id_len + ad_len + path_len) * sizeof(WCHAR);
+
+            if (pcbLen) *pcbLen = len;
+
+            if (!pvBuff || cbBuff < len)
+            {
+                SetLastError(ERROR_INSUFFICIENT_BUFFER);
+                return FALSE;
+            }
+            afdi->ulFlags = subcase ? 16 : ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION;
+            afdi->ulEncodedAssemblyIdentityLength = (id_len - 1) * sizeof(WCHAR);
+            afdi->ulManifestPathType = assembly->manifest.type;
+            afdi->ulManifestPathLength = assembly->manifest.info ? (path_len - 1) * sizeof(WCHAR) : 0;
+            /* FIXME afdi->liManifestLastWriteTime = 0; */
+            afdi->ulPolicyPathType = ACTIVATION_CONTEXT_PATH_TYPE_NONE; /* FIXME */
+            afdi->ulPolicyPathLength = 0;
+            /* FIXME afdi->liPolicyLastWriteTime = 0; */
+            afdi->ulMetadataSatelliteRosterIndex = 0; /* FIXME */
+            afdi->ulManifestVersionMajor = 1;
+            afdi->ulManifestVersionMinor = 0;
+            afdi->ulPolicyVersionMajor = 0; /* FIXME */
+            afdi->ulPolicyVersionMinor = 0; /* FIXME */
+            afdi->ulAssemblyDirectoryNameLength = ad_len ? (ad_len - 1) * sizeof(WCHAR) : 0;
+            ptr = (LPWSTR)(afdi + 1);
+            afdi->lpAssemblyEncodedAssemblyIdentity = ptr;
+            strcpyW(ptr, assembly->id.name);
+            ptr += build_assembly_id(assembly, ptr) + 1;
+            if (path_len)
+            {
+                afdi->lpAssemblyManifestPath = ptr;
+                memcpy(ptr, assembly->manifest.info, path_len * sizeof(WCHAR));
+                ptr += path_len;
+            } else afdi->lpAssemblyManifestPath = NULL;
+            afdi->lpAssemblyPolicyPath = NULL; /* FIXME */
+            if (ad_len)
+            {
+                afdi->lpAssemblyDirectoryName = ptr;
+                ptr += build_dir(assembly, ptr) + 1;
+            }
+            else afdi->lpAssemblyDirectoryName = NULL;
+        }
+        break;
     case FileInformationInAssemblyOfAssemblyInActivationContext:
         SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
         return FALSE;





More information about the wine-patches mailing list