[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