[RTL]
[reactos.git] / lib / rtl / actctx.c
index 4508876..d5a0d39 100644 (file)
@@ -234,6 +234,16 @@ static WCHAR *xmlstrdupW(const xmlstr_t* str)
     return strW;
 }
 
+static UNICODE_STRING xmlstr2unicode(const xmlstr_t *xmlstr)
+{
+    UNICODE_STRING res;
+
+    res.Buffer = (PWSTR)xmlstr->ptr;
+    res.Length = res.MaximumLength = xmlstr->len;
+
+    return res;
+}
+
 static inline BOOL xmlstr_cmp(const xmlstr_t* xmlstr, const WCHAR *str)
 {
     return !strncmpW(xmlstr->ptr, str, xmlstr->len) && !str[xmlstr->len];
@@ -420,7 +430,7 @@ static BOOL add_dependent_assembly_id(struct actctx_loader* acl,
     for (i = 0; i < acl->actctx->num_assemblies; i++)
         if (is_matching_identity( ai, &acl->actctx->assemblies[i].id ))
         {
-            DPRINT( "reusing existing assembly for %s arch %s version %u.%u.%u.%u\n",
+            DPRINT( "reusing existing assembly for %S arch %S version %u.%u.%u.%u\n",
                    ai->name, ai->arch, ai->version.major, ai->version.minor,
                    ai->version.build, ai->version.revision );
             return TRUE;
@@ -429,7 +439,7 @@ static BOOL add_dependent_assembly_id(struct actctx_loader* acl,
     for (i = 0; i < acl->num_dependencies; i++)
         if (is_matching_identity( ai, &acl->dependencies[i] ))
         {
-            DPRINT( "reusing existing dependency for %s arch %s version %u.%u.%u.%u\n",
+            DPRINT( "reusing existing dependency for %S arch %S version %u.%u.%u.%u\n",
                    ai->name, ai->arch, ai->version.major, ai->version.minor,
                    ai->version.build, ai->version.revision );
             return TRUE;
@@ -551,25 +561,26 @@ static ACTIVATION_CONTEXT *check_actctx( HANDLE h )
     ACTIVATION_CONTEXT *ret = NULL, *actctx = h;
 
     if (!h || h == INVALID_HANDLE_VALUE) return NULL;
-    //__TRY
+    _SEH2_TRY
     {
         if (actctx && actctx->magic == ACTCTX_MAGIC) ret = actctx;
     }
-    //__EXCEPT_PAGE_FAULT
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
+        DPRINT1("Invalid activation context handle!\n");
     }
-    //__ENDTRY
+    _SEH2_END;
     return ret;
 }
 
 static inline void actctx_addref( ACTIVATION_CONTEXT *actctx )
 {
-    _InterlockedExchangeAdd( &actctx->ref_count, 1 );
+    InterlockedExchangeAdd( &actctx->ref_count, 1 );
 }
 
 static void actctx_release( ACTIVATION_CONTEXT *actctx )
 {
-    if (_InterlockedExchangeAdd( &actctx->ref_count, -1 ) == 1)
+    if (InterlockedExchangeAdd( &actctx->ref_count, -1 ) == 1)
     {
         unsigned int i, j;
 
@@ -731,6 +742,7 @@ static BOOL parse_version(const xmlstr_t *str, struct assembly_version *version)
     unsigned int ver[4];
     unsigned int pos;
     const WCHAR *curr;
+    UNICODE_STRING strU;
 
     /* major.minor.build.revision */
     ver[0] = ver[1] = ver[2] = ver[3] = pos = 0;
@@ -754,28 +766,34 @@ static BOOL parse_version(const xmlstr_t *str, struct assembly_version *version)
     return TRUE;
 
 error:
-    DPRINT1( "Wrong version definition in manifest file (%s)\n", str->ptr );
+    strU = xmlstr2unicode(str);
+    DPRINT1( "Wrong version definition in manifest file (%wZ)\n", &strU );
     return FALSE;
 }
 
 static BOOL parse_expect_elem(xmlbuf_t* xmlbuf, const WCHAR* name)
 {
     xmlstr_t    elem;
+    UNICODE_STRING elemU;
     if (!next_xml_elem(xmlbuf, &elem)) return FALSE;
     if (xmlstr_cmp(&elem, name)) return TRUE;
-    DPRINT1( "unexpected element %s\n", elem.ptr );
+    elemU = xmlstr2unicode(&elem);
+    DPRINT1( "unexpected element %wZ\n", &elemU );
     return FALSE;
 }
 
 static BOOL parse_expect_no_attr(xmlbuf_t* xmlbuf, BOOL* end)
 {
     xmlstr_t    attr_name, attr_value;
+    UNICODE_STRING attr_nameU, attr_valueU;
     BOOL        error;
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, end))
     {
-        DPRINT1( "unexpected attr %s=%s\n", attr_name.ptr,
-             attr_value.ptr);
+        attr_nameU = xmlstr2unicode(&attr_name);
+        attr_valueU = xmlstr2unicode(&attr_name);
+        DPRINT1( "unexpected attr %S=%S\n", &attr_nameU,
+             &attr_valueU);
     }
     return !error;
 }
@@ -789,10 +807,12 @@ static BOOL parse_end_element(xmlbuf_t *xmlbuf)
 static BOOL parse_expect_end_elem(xmlbuf_t *xmlbuf, const WCHAR *name)
 {
     xmlstr_t    elem;
+    UNICODE_STRING elemU;
     if (!next_xml_elem(xmlbuf, &elem)) return FALSE;
     if (!xmlstr_cmp_end(&elem, name))
     {
-        DPRINT1( "unexpected element %s\n", elem.ptr );
+        elemU = xmlstr2unicode(&elem);
+        DPRINT1( "unexpected element %wZ\n", &elemU );
         return FALSE;
     }
     return parse_end_element(xmlbuf);
@@ -823,6 +843,7 @@ static BOOL parse_assembly_identity_elem(xmlbuf_t* xmlbuf, ACTIVATION_CONTEXT* a
 {
     xmlstr_t    attr_name, attr_value;
     BOOL        end = FALSE, error;
+    UNICODE_STRING  attr_valueU, attr_nameU;
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
@@ -848,14 +869,15 @@ static BOOL parse_assembly_identity_elem(xmlbuf_t* xmlbuf, ACTIVATION_CONTEXT* a
         }
         else if (xmlstr_cmp(&attr_name, languageW))
         {
-            DPRINT1("Unsupported yet language attribute (%s)\n",
-                 attr_value.ptr);
             if (!(ai->language = xmlstrdupW(&attr_value))) return FALSE;
+            DPRINT1("Unsupported yet language attribute (%S)\n",
+                 ai->language);
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr,
-                 attr_value.ptr);
+            attr_nameU = xmlstr2unicode(&attr_name);
+            attr_valueU = xmlstr2unicode(&attr_value);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -868,6 +890,7 @@ static BOOL parse_com_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
     xmlstr_t elem, attr_name, attr_value;
     BOOL ret, end = FALSE, error;
     struct entity*      entity;
+    UNICODE_STRING  attr_valueU, attr_nameU;
 
     if (!(entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION)))
         return FALSE;
@@ -880,7 +903,9 @@ static BOOL parse_com_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            attr_nameU = xmlstr2unicode(&attr_name);
+            attr_valueU = xmlstr2unicode(&attr_value);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -895,7 +920,8 @@ static BOOL parse_com_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
         }
         else
         {
-            DPRINT1("unknown elem %s\n", elem.ptr);
+            attr_nameU = xmlstr2unicode(&elem);
+            DPRINT1("unknown elem %wZ\n", &attr_nameU);
             ret = parse_unknown_elem(xmlbuf, &elem);
         }
     }
@@ -907,6 +933,7 @@ static BOOL parse_cominterface_proxy_stub_elem(xmlbuf_t* xmlbuf, struct dll_redi
     xmlstr_t    attr_name, attr_value;
     BOOL        end = FALSE, error;
     struct entity*      entity;
+    UNICODE_STRING  attr_valueU, attr_nameU;
 
     if (!(entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION)))
         return FALSE;
@@ -923,7 +950,9 @@ static BOOL parse_cominterface_proxy_stub_elem(xmlbuf_t* xmlbuf, struct dll_redi
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            attr_nameU = xmlstr2unicode(&attr_name);
+            attr_valueU = xmlstr2unicode(&attr_value);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -936,6 +965,7 @@ static BOOL parse_typelib_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
     xmlstr_t    attr_name, attr_value;
     BOOL        end = FALSE, error;
     struct entity*      entity;
+    UNICODE_STRING  attr_valueU, attr_nameU;
 
     if (!(entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION)))
         return FALSE;
@@ -956,7 +986,9 @@ static BOOL parse_typelib_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr , attr_value.ptr);
+            attr_nameU = xmlstr2unicode(&attr_name);
+            attr_valueU = xmlstr2unicode(&attr_value);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -969,6 +1001,7 @@ static BOOL parse_window_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
     xmlstr_t    elem, content;
     BOOL        end = FALSE, ret = TRUE;
     struct entity*      entity;
+    UNICODE_STRING elemU;
 
     if (!(entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION)))
         return FALSE;
@@ -989,7 +1022,8 @@ static BOOL parse_window_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
         }
         else
         {
-            DPRINT1("unknown elem %s\n", elem.ptr);
+            elemU = xmlstr2unicode(&elem);
+            DPRINT1("unknown elem %wZ\n", &elemU);
             ret = parse_unknown_elem(xmlbuf, &elem);
         }
     }
@@ -1000,21 +1034,25 @@ static BOOL parse_window_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
 static BOOL parse_binding_redirect_elem(xmlbuf_t* xmlbuf)
 {
     xmlstr_t    attr_name, attr_value;
+    UNICODE_STRING  attr_valueU, attr_nameU;
     BOOL        end = FALSE, error;
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
+        attr_nameU = xmlstr2unicode(&attr_name);
+        attr_valueU = xmlstr2unicode(&attr_value);
+
         if (xmlstr_cmp(&attr_name, oldVersionW))
         {
-            DPRINT1("Not stored yet oldVersion=%s\n", attr_value.ptr);
+            DPRINT1("Not stored yet oldVersion=%wZ\n", &attr_valueU);
         }
         else if (xmlstr_cmp(&attr_name, newVersionW))
         {
-            DPRINT1("Not stored yet newVersion=%s\n", attr_value.ptr);
+            DPRINT1("Not stored yet newVersion=%wZ\n", &attr_valueU);
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -1025,13 +1063,15 @@ static BOOL parse_binding_redirect_elem(xmlbuf_t* xmlbuf)
 static BOOL parse_description_elem(xmlbuf_t* xmlbuf)
 {
     xmlstr_t    elem, content;
+    UNICODE_STRING elemU;
     BOOL        end = FALSE, ret = TRUE;
 
     if (!parse_expect_no_attr(xmlbuf, &end) || end ||
         !parse_text_content(xmlbuf, &content))
         return FALSE;
 
-    DPRINT("Got description %s\n", content.ptr);
+    elemU = xmlstr2unicode(&content);
+    DPRINT("Got description %wZ\n", &elemU);
 
     while (ret && (ret = next_xml_elem(xmlbuf, &elem)))
     {
@@ -1042,7 +1082,8 @@ static BOOL parse_description_elem(xmlbuf_t* xmlbuf)
         }
         else
         {
-            DPRINT1("unknown elem %s\n", elem.ptr);
+            elemU = xmlstr2unicode(&elem);
+            DPRINT1("unknown elem %wZ\n", &elemU);
             ret = parse_unknown_elem(xmlbuf, &elem);
         }
     }
@@ -1072,7 +1113,7 @@ static BOOL parse_com_interface_external_proxy_stub_elem(xmlbuf_t* xmlbuf,
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            DPRINT1("unknown attr %S=%S\n", attr_name.ptr, attr_value.ptr);
         }
     }
 
@@ -1083,6 +1124,7 @@ static BOOL parse_com_interface_external_proxy_stub_elem(xmlbuf_t* xmlbuf,
 static BOOL parse_clr_class_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
 {
     xmlstr_t    attr_name, attr_value;
+    UNICODE_STRING attr_nameU, attr_valueU;
     BOOL        end = FALSE, error;
     struct entity*      entity;
 
@@ -1101,7 +1143,9 @@ static BOOL parse_clr_class_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            attr_nameU = xmlstr2unicode(&attr_name);
+            attr_valueU = xmlstr2unicode(&attr_value);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -1112,6 +1156,7 @@ static BOOL parse_clr_class_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
 static BOOL parse_clr_surrogate_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
 {
     xmlstr_t    attr_name, attr_value;
+    UNICODE_STRING attr_nameU, attr_valueU;
     BOOL        end = FALSE, error;
     struct entity*      entity;
 
@@ -1130,7 +1175,9 @@ static BOOL parse_clr_surrogate_elem(xmlbuf_t* xmlbuf, struct assembly* assembly
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            attr_nameU = xmlstr2unicode(&attr_name);
+            attr_valueU = xmlstr2unicode(&attr_value);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -1169,7 +1216,7 @@ static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader
         }
         else
         {
-            DPRINT1("unknown elem %s\n", elem.ptr);
+            DPRINT1("unknown elem %S\n", elem.ptr);
             ret = parse_unknown_elem(xmlbuf, &elem);
         }
     }
@@ -1180,19 +1227,23 @@ static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader
 static BOOL parse_dependency_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl)
 {
     xmlstr_t attr_name, attr_value, elem;
+    UNICODE_STRING attr_nameU, attr_valueU;
     BOOL end = FALSE, ret = TRUE, error, optional = FALSE;
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
+        attr_nameU = xmlstr2unicode(&attr_name);
+        attr_valueU = xmlstr2unicode(&attr_value);
+
         if (xmlstr_cmp(&attr_name, optionalW))
         {
             static const WCHAR yesW[] = {'y','e','s',0};
             optional = xmlstr_cmpi( &attr_value, yesW );
-            DPRINT1("optional=%s\n", attr_value.ptr);
+            DPRINT1("optional=%wZ\n", &attr_valueU);
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -1209,7 +1260,8 @@ static BOOL parse_dependency_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl)
         }
         else
         {
-            DPRINT1("unknown element %s\n", elem.ptr);
+            attr_nameU = xmlstr2unicode(&elem);
+            DPRINT1("unknown element %wZ\n", &attr_nameU);
             ret = parse_unknown_elem(xmlbuf, &elem);
         }
     }
@@ -1236,6 +1288,7 @@ static BOOL parse_noinheritable_elem(xmlbuf_t* xmlbuf)
 static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
 {
     xmlstr_t    attr_name, attr_value, elem;
+    UNICODE_STRING attr_nameU, attr_valueU;
     BOOL        end = FALSE, error, ret = TRUE;
     struct dll_redirect* dll;
 
@@ -1243,10 +1296,13 @@ static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
+        attr_nameU = xmlstr2unicode(&attr_name);
+        attr_valueU = xmlstr2unicode(&attr_value);
+
         if (xmlstr_cmp(&attr_name, nameW))
         {
             if (!(dll->name = xmlstrdupW(&attr_value))) return FALSE;
-            DPRINT("name=%s\n", attr_value.ptr);
+            DPRINT("name=%wZ\n", &attr_valueU);
         }
         else if (xmlstr_cmp(&attr_name, hashW))
         {
@@ -1256,11 +1312,11 @@ static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
         {
             static const WCHAR sha1W[] = {'S','H','A','1',0};
             if (!xmlstr_cmpi(&attr_value, sha1W))
-                DPRINT1("hashalg should be SHA1, got %s\n", attr_value.ptr);
+                DPRINT1("hashalg should be SHA1, got %wZ\n", &attr_valueU);
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -1297,7 +1353,8 @@ static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
         }
         else
         {
-            DPRINT1("unknown elem %s\n", elem.ptr);
+            attr_nameU = xmlstr2unicode(&elem);
+            DPRINT1("unknown elem %wZ\n", &attr_nameU);
             ret = parse_unknown_elem( xmlbuf, &elem );
         }
     }
@@ -1310,16 +1367,20 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
                                 struct assembly_identity* expected_ai)
 {
     xmlstr_t    attr_name, attr_value, elem;
+    UNICODE_STRING attr_nameU, attr_valueU;
     BOOL        end = FALSE, error, version = FALSE, xmlns = FALSE, ret = TRUE;
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
+        attr_nameU = xmlstr2unicode(&attr_name);
+        attr_valueU = xmlstr2unicode(&attr_value);
+
         if (xmlstr_cmp(&attr_name, manifestVersionW))
         {
             static const WCHAR v10W[] = {'1','.','0',0};
             if (!xmlstr_cmp(&attr_value, v10W))
             {
-                DPRINT1("wrong version %s\n", attr_value.ptr);
+                DPRINT1("wrong version %wZ\n", &attr_valueU);
                 return FALSE;
             }
             version = TRUE;
@@ -1328,14 +1389,14 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
         {
             if (!xmlstr_cmp(&attr_value, manifestv1W) && !xmlstr_cmp(&attr_value, manifestv3W))
             {
-                DPRINT1("wrong namespace %s\n", attr_value.ptr);
+                DPRINT1("wrong namespace %wZ\n", &attr_valueU);
                 return FALSE;
             }
             xmlns = TRUE;
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -1420,7 +1481,8 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
         }
         else
         {
-            DPRINT1("unknown element %s\n", elem.ptr);
+            attr_nameU = xmlstr2unicode(&elem);
+            DPRINT1("unknown element %wZ\n", &attr_nameU);
             ret = parse_unknown_elem(xmlbuf, &elem);
         }
         if (ret) ret = next_xml_elem(xmlbuf, &elem);
@@ -1433,6 +1495,7 @@ static NTSTATUS parse_manifest_buffer( struct actctx_loader* acl, struct assembl
                                        struct assembly_identity* ai, xmlbuf_t *xmlbuf )
 {
     xmlstr_t elem;
+    UNICODE_STRING elemU;
 
     if (!next_xml_elem(xmlbuf, &elem)) return STATUS_SXS_CANT_GEN_ACTCTX;
 
@@ -1442,19 +1505,21 @@ static NTSTATUS parse_manifest_buffer( struct actctx_loader* acl, struct assembl
 
     if (!xmlstr_cmp(&elem, assemblyW))
     {
-        DPRINT1("root element is %s, not <assembly>\n", elem.ptr);
+        elemU = xmlstr2unicode(&elem);
+        DPRINT1("root element is %wZ, not <assembly>\n", &elemU);
         return STATUS_SXS_CANT_GEN_ACTCTX;
     }
 
     if (!parse_assembly_elem(xmlbuf, acl, assembly, ai))
     {
-        DPRINT1("failed to parse manifest %s\n", assembly->manifest.info );
+        DPRINT1("failed to parse manifest %S\n", assembly->manifest.info );
         return STATUS_SXS_CANT_GEN_ACTCTX;
     }
 
     if (next_xml_elem(xmlbuf, &elem))
     {
-        DPRINT1("unexpected element %s\n", elem.ptr);
+        elemU = xmlstr2unicode(&elem);
+        DPRINT1("unexpected element %wZ\n", &elemU);
         return STATUS_SXS_CANT_GEN_ACTCTX;
     }
 
@@ -1475,7 +1540,7 @@ static NTSTATUS parse_manifest( struct actctx_loader* acl, struct assembly_ident
     struct assembly *assembly;
     int unicode_tests;
 
-    DPRINT( "parsing manifest loaded from %s base dir %s\n", filename, directory );
+    DPRINT( "parsing manifest loaded from %S base dir %S\n", filename, directory );
 
     if (!(assembly = add_assembly(acl->actctx, shared ? ASSEMBLY_SHARED_MANIFEST : ASSEMBLY_MANIFEST)))
         return STATUS_SXS_CANT_GEN_ACTCTX;
@@ -1513,6 +1578,7 @@ static NTSTATUS parse_manifest( struct actctx_loader* acl, struct assembly_ident
     {
         /* let's assume utf-8 for now */
         int len;
+        WCHAR *new_buff;
 
         _SEH2_TRY
         {
@@ -1526,20 +1592,19 @@ static NTSTATUS parse_manifest( struct actctx_loader* acl, struct assembly_ident
         _SEH2_END;
 
         DPRINT("len = %x\n", len);
-        WCHAR *new_buff;
 
         if (len == -1)
         {
             DPRINT1( "utf-8 conversion failed\n" );
             return STATUS_SXS_CANT_GEN_ACTCTX;
         }
-        if (!(new_buff = RtlAllocateHeap( RtlGetProcessHeap(), HEAP_ZERO_MEMORY, len * sizeof(WCHAR) )))
+        if (!(new_buff = RtlAllocateHeap( RtlGetProcessHeap(), HEAP_ZERO_MEMORY, len)))
             return STATUS_NO_MEMORY;
 
-        mbstowcs( new_buff, buffer, len);
+        mbstowcs( new_buff, buffer, size);
         xmlbuf.ptr = new_buff;
-        DPRINT("Buffer %S\n", new_buff);
-        xmlbuf.end = xmlbuf.ptr + len;
+
+        xmlbuf.end = xmlbuf.ptr + len / sizeof(WCHAR);
         status = parse_manifest_buffer( acl, assembly, ai, &xmlbuf );
 
         RtlFreeHeap( RtlGetProcessHeap(), 0, new_buff );
@@ -1654,7 +1719,7 @@ static NTSTATUS get_manifest_in_pe_file( struct actctx_loader* acl, struct assem
     SIZE_T              count;
     void               *base;
 
-    DPRINT( "looking for res %s in %s\n", resname, filename );
+    DPRINT( "looking for res %S in %S\n", resname, filename );
 
     attr.Length                   = sizeof(attr);
     attr.RootDirectory            = 0;
@@ -1747,7 +1812,7 @@ static NTSTATUS get_manifest_in_associated_manifest( struct actctx_loader* acl,
 
     if (!((ULONG_PTR)resname >> 16)) resid = (ULONG_PTR)resname & 0xffff;
 
-    DPRINT( "looking for manifest associated with %s id %lu\n", filename, resid );
+    DPRINT( "looking for manifest associated with %S id %lu\n", filename, resid );
 
     if (module) /* use the module filename */
     {
@@ -1849,7 +1914,7 @@ static WCHAR *lookup_manifest_file( HANDLE dir, struct assembly_identity *ai )
             break;
         }
     }
-    else DPRINT1("no matching file for %s\n", lookup);
+    else DPRINT1("no matching file for %S\n", lookup);
     RtlFreeHeap( RtlGetProcessHeap(), 0, lookup );
     return ret;
 }
@@ -2031,6 +2096,8 @@ static NTSTATUS find_query_actctx( HANDLE *handle, DWORD flags, ULONG class )
 
     if (flags & QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX)
     {
+        if (*handle) return STATUS_INVALID_PARAMETER;
+
         if (NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame)
             *handle = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame->ActivationContext;
     }
@@ -2039,6 +2106,8 @@ static NTSTATUS find_query_actctx( HANDLE *handle, DWORD flags, ULONG class )
         ULONG magic;
         LDR_DATA_TABLE_ENTRY *pldr;
 
+        if (!*handle) return STATUS_INVALID_PARAMETER;
+
         LdrLockLoaderLock( 0, NULL, &magic );
         if (!LdrFindEntryForAddress( *handle, &pldr ))
         {
@@ -2203,10 +2272,12 @@ NTSTATUS WINAPI RtlCreateActivationContext( HANDLE *handle,  void *ptr )
     {
         UNICODE_STRING dir;
         WCHAR *p;
+        HMODULE module;
 
-        if ((status = get_module_filename( NtCurrentTeb()->ProcessEnvironmentBlock->ImageBaseAddress, &dir, 0 )))
-            goto error;
+        if (pActCtx->dwFlags & ACTCTX_FLAG_HMODULE_VALID) module = pActCtx->hModule;
+        else module = NtCurrentTeb()->ProcessEnvironmentBlock->ImageBaseAddress;
 
+        if ((status = get_module_filename( module, &dir, 0 ))) goto error;
         if ((p = strrchrW( dir.Buffer, '\\' ))) p[1] = 0;
         actctx->appdir.info = dir.Buffer;
     }
@@ -2270,7 +2341,6 @@ NTSTATUS WINAPI RtlCreateActivationContext( HANDLE *handle,  void *ptr )
 
     if (status == STATUS_SUCCESS) *handle = actctx;
     else actctx_release( actctx );
-
     return status;
 
 error: