Eric Pouech : ntdll: Implemented AssemblyDetailedInformationInActivationContext option in RtlQueryInformationActivationContext .

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jul 26 06:36:45 CDT 2007


Module: wine
Branch: master
Commit: 35eb9223c2838efc2bd65a1a4b252fe3f0735610
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=35eb9223c2838efc2bd65a1a4b252fe3f0735610

Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date:   Wed Jul 25 21:41:10 2007 +0200

ntdll: Implemented AssemblyDetailedInformationInActivationContext option in RtlQueryInformationActivationContext.

---

 dlls/ntdll/actctx.c |  121 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 119 insertions(+), 2 deletions(-)

diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c
index fadcf73..7eda748 100644
--- a/dlls/ntdll/actctx.c
+++ b/dlls/ntdll/actctx.c
@@ -227,6 +227,7 @@ struct actctx_loader
 #define MANIFESTV3_NAMESPACE            "urn:schemas-microsoft-com:asm.v3"
 
 static const WCHAR dotManifestW[] = {'.','m','a','n','i','f','e','s','t',0};
+static const WCHAR version_formatW[] = {'%','u','.','%','u','.','%','u','.','%','u',0};
 
 static ACTIVATION_CONTEXT system_actctx = { ACTCTX_MAGIC, 1 };
 static ACTIVATION_CONTEXT *process_actctx = &system_actctx;
@@ -490,7 +491,6 @@ static WCHAR *build_assembly_dir(struct assembly_identity* ai)
     static const WCHAR undW[] = {'_',0};
     static const WCHAR noneW[] = {'n','o','n','e',0};
     static const WCHAR mskeyW[] = {'d','e','a','d','b','e','e','f',0};
-    static const WCHAR versionW[] = {'%','u','.','%','u','.','%','u','.','%','u',0};
 
     const WCHAR *key = ai->public_key ? ai->public_key : noneW;
     const WCHAR *lang = ai->language ? ai->language : noneW;
@@ -506,7 +506,7 @@ static WCHAR *build_assembly_dir(struct assembly_identity* ai)
     strcatW( ret, undW );
     strcatW( ret, key );
     strcatW( ret, undW );
-    sprintfW( ret + strlenW(ret), versionW,
+    sprintfW( ret + strlenW(ret), version_formatW,
               ai->version.major, ai->version.minor, ai->version.build, ai->version.revision );
     strcatW( ret, undW );
     strcatW( ret, lang );
@@ -515,6 +515,54 @@ static WCHAR *build_assembly_dir(struct assembly_identity* ai)
     return ret;
 }
 
+static inline void append_string( WCHAR *buffer, const WCHAR *prefix, const WCHAR *str )
+{
+    WCHAR *p = buffer;
+
+    if (!str) return;
+    strcatW( buffer, prefix );
+    p += strlenW(p);
+    *p++ = '"';
+    strcpyW( p, str );
+    p += strlenW(p);
+    *p++ = '"';
+    *p = 0;
+}
+
+static WCHAR *build_assembly_id( const struct assembly_identity *ai )
+{
+    static const WCHAR archW[] =
+        {',','p','r','o','c','e','s','s','o','r','A','r','c','h','i','t','e','c','t','u','r','e','=',0};
+    static const WCHAR public_keyW[] =
+        {',','p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','"',0};
+    static const WCHAR typeW[] =
+        {',','t','y','p','e','=','"','w','i','n','3','2','"',0};
+    static const WCHAR versionW[] =
+        {',','v','e','r','s','i','o','n','=',0};
+
+    WCHAR version[64], *ret;
+    SIZE_T size = 0;
+
+    sprintfW( version, version_formatW,
+              ai->version.major, ai->version.minor, ai->version.build, ai->version.revision );
+    if (ai->name) size += strlenW(ai->name) * sizeof(WCHAR);
+    if (ai->arch) size += strlenW(archW) + strlenW(ai->arch) + 2;
+    if (ai->public_key) size += strlenW(public_keyW) + strlenW(ai->public_key) + 2;
+    if (ai->type == TYPE_WIN32) size += strlenW(typeW);
+    size += strlenW(versionW) + strlenW(version) + 2;
+
+    if (!(ret = RtlAllocateHeap( GetProcessHeap(), 0, (size + 1) * sizeof(WCHAR) )))
+        return NULL;
+
+    if (ai->name) strcpyW( ret, ai->name );
+    else *ret = 0;
+    append_string( ret, archW, ai->arch );
+    append_string( ret, public_keyW, ai->public_key );
+    if (ai->type == TYPE_WIN32) strcatW( ret, typeW );
+    append_string( ret, versionW, version );
+    return ret;
+}
+
 static ACTIVATION_CONTEXT *check_actctx( HANDLE h )
 {
     ACTIVATION_CONTEXT *actctx = h;
@@ -2269,6 +2317,75 @@ NTSTATUS WINAPI RtlQueryInformationActivationContext( ULONG flags, HANDLE handle
         break;
 
     case AssemblyDetailedInformationInActivationContext:
+        {
+            ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION *afdi = buffer;
+            struct assembly *assembly;
+            WCHAR *assembly_id;
+            DWORD index;
+            SIZE_T len, id_len = 0, ad_len = 0, path_len = 0;
+            LPWSTR ptr;
+
+            if (!(actctx = check_actctx(handle))) return STATUS_INVALID_PARAMETER;
+            if (!subinst) return STATUS_INVALID_PARAMETER;
+
+            index = *(DWORD*)subinst;
+            if (!index || index > actctx->num_assemblies) return STATUS_INVALID_PARAMETER;
+
+            assembly = &actctx->assemblies[index - 1];
+
+            if (!(assembly_id = build_assembly_id( &assembly->id ))) return STATUS_NO_MEMORY;
+            id_len = strlenW(assembly_id) + 1;
+            if (assembly->directory) ad_len = strlenW(assembly->directory) + 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 (retlen) *retlen = len;
+            if (!buffer || bufsize < len)
+            {
+                RtlFreeHeap( GetProcessHeap(), 0, assembly_id );
+                return STATUS_BUFFER_TOO_SMALL;
+            }
+
+            /* FIXME: this is a big HACK */
+            afdi->ulFlags = (index > 1) ? 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;
+            memcpy( ptr, assembly_id, id_len * sizeof(WCHAR) );
+            ptr += id_len;
+            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;
+                memcpy(ptr, assembly->directory, ad_len * sizeof(WCHAR));
+                ptr += ad_len;
+            }
+            else afdi->lpAssemblyDirectoryName = NULL;
+            RtlFreeHeap( GetProcessHeap(), 0, assembly_id );
+        }
+        break;
+
     case FileInformationInAssemblyOfAssemblyInActivationContext:
     default:
         FIXME( "class %u not implemented\n", class );




More information about the wine-cvs mailing list