Nikolay Sivov : sxs: Add support for SXS_LOOKUP_CLR_GUID_USE_ACTCTX in SxsLookupClrGuid().

Alexandre Julliard julliard at winehq.org
Tue Jul 21 15:40:21 CDT 2020


Module: wine
Branch: master
Commit: 2cfc85dc55d403a7fcb885a62bb28f8d73498c2d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2cfc85dc55d403a7fcb885a62bb28f8d73498c2d

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Jul 21 15:03:29 2020 +0300

sxs: Add support for SXS_LOOKUP_CLR_GUID_USE_ACTCTX in SxsLookupClrGuid().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/sxs/sxs.c       | 56 +++++++++++++++++++++++++++-------------------------
 dlls/sxs/tests/sxs.c | 24 ++++++++++++++++++++++
 2 files changed, 53 insertions(+), 27 deletions(-)

diff --git a/dlls/sxs/sxs.c b/dlls/sxs/sxs.c
index 92ba18ab0e..7150f55c33 100644
--- a/dlls/sxs/sxs.c
+++ b/dlls/sxs/sxs.c
@@ -112,59 +112,58 @@ BOOL WINAPI SxsLookupClrGuid(DWORD flags, GUID *clsid, HANDLE actctx, void *buff
                              SIZE_T *buffer_len_required)
 {
     ACTCTX_SECTION_KEYED_DATA guid_info = { sizeof(ACTCTX_SECTION_KEYED_DATA) };
-    ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION *assembly_info;
+    ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION *assembly_info = NULL;
     SIZE_T bytes_assembly_info;
     unsigned int len_version = 0, len_name, len_identity;
     const void *ptr_name, *ptr_version, *ptr_identity;
     SXS_GUID_INFORMATION_CLR *ret = buffer;
     BOOL retval = FALSE;
     char *ret_strings;
+    ULONG_PTR cookie;
 
     TRACE("%#x, %s, %p, %p, %lx, %p.\n", flags, wine_dbgstr_guid(clsid), actctx,
           buffer, buffer_len, buffer_len_required);
 
-    if (flags & ~SXS_LOOKUP_CLR_GUID_FIND_ANY)
-        FIXME("Ignored flags: %x\n", flags & ~SXS_LOOKUP_CLR_GUID_FIND_ANY);
+    if (flags & SXS_LOOKUP_CLR_GUID_USE_ACTCTX)
+    {
+        if (!ActivateActCtx(actctx, &cookie))
+        {
+            WARN("Failed to activate context.\n");
+            return FALSE;
+        }
+    }
 
     if (flags & SXS_LOOKUP_CLR_GUID_FIND_SURROGATE)
     {
-        if ((retval = FindActCtxSectionGuid(FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX, 0,
-                ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES, clsid, &guid_info)))
-        {
+        if ((retval = FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES, clsid, &guid_info)))
             flags &= ~SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS;
-        }
     }
 
     if (!retval && (flags & SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS))
     {
-        if ((retval = FindActCtxSectionGuid(FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX, 0,
-                ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION, clsid, &guid_info)))
-        {
+        if ((retval = FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION, clsid, &guid_info)))
             flags &= ~SXS_LOOKUP_CLR_GUID_FIND_SURROGATE;
-        }
     }
 
     if (!retval)
     {
         SetLastError(ERROR_NOT_FOUND);
-        return FALSE;
+        goto out;
     }
 
-    QueryActCtxW(0, guid_info.hActCtx, &guid_info.ulAssemblyRosterIndex,
+    retval = QueryActCtxW(QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX, NULL, &guid_info.ulAssemblyRosterIndex,
             AssemblyDetailedInformationInActivationContext, NULL, 0, &bytes_assembly_info);
-    if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+    if (!retval && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
     {
-        ReleaseActCtx(guid_info.hActCtx);
-        return FALSE;
+        goto out;
     }
+
     assembly_info = heap_alloc(bytes_assembly_info);
-    if(!QueryActCtxW(0, guid_info.hActCtx, &guid_info.ulAssemblyRosterIndex,
+    if (!(retval = QueryActCtxW(QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX, NULL, &guid_info.ulAssemblyRosterIndex,
             AssemblyDetailedInformationInActivationContext, assembly_info,
-            bytes_assembly_info, &bytes_assembly_info))
+            bytes_assembly_info, &bytes_assembly_info)))
     {
-        heap_free(assembly_info);
-        ReleaseActCtx(guid_info.hActCtx);
-        return FALSE;
+        goto out;
     }
 
     if (flags & SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS)
@@ -192,13 +191,12 @@ BOOL WINAPI SxsLookupClrGuid(DWORD flags, GUID *clsid, HANDLE actctx, void *buff
     ptr_identity = assembly_info->lpAssemblyEncodedAssemblyIdentity;
     len_identity = assembly_info->ulEncodedAssemblyIdentityLength + sizeof(WCHAR);
 
-    *buffer_len_required = sizeof(SXS_GUID_INFORMATION_CLR) + len_identity + len_version + len_name;
+    *buffer_len_required = sizeof(*ret) + len_identity + len_version + len_name;
     if (!buffer || buffer_len < *buffer_len_required)
     {
         SetLastError(ERROR_INSUFFICIENT_BUFFER);
-        heap_free(assembly_info);
-        ReleaseActCtx(guid_info.hActCtx);
-        return FALSE;
+        retval = FALSE;
+        goto out;
     }
 
     ret->cbSize = sizeof(*ret);
@@ -226,7 +224,11 @@ BOOL WINAPI SxsLookupClrGuid(DWORD flags, GUID *clsid, HANDLE actctx, void *buff
 
     SetLastError(0);
 
-    ReleaseActCtx(guid_info.hActCtx);
+out:
+
+    if (flags & SXS_LOOKUP_CLR_GUID_USE_ACTCTX)
+        DeactivateActCtx(0, cookie);
+
     heap_free(assembly_info);
-    return TRUE;
+    return retval;
 }
diff --git a/dlls/sxs/tests/sxs.c b/dlls/sxs/tests/sxs.c
index 9887871422..2a7afcde25 100644
--- a/dlls/sxs/tests/sxs.c
+++ b/dlls/sxs/tests/sxs.c
@@ -86,15 +86,30 @@ static void run_test(void)
     BOOL ret;
     SXS_GUID_INFORMATION_CLR *info;
 
+    SetLastError(0xdeadbeef);
+    ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_ANY | SXS_LOOKUP_CLR_GUID_USE_ACTCTX, (GUID *)&CLSID_Test,
+            NULL, NULL, 0, &buffer_size);
+    ok(!ret, "Unexpected return value %d.\n", ret);
+    ok(GetLastError() == ERROR_NOT_FOUND, "Unexpected error %d.\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_ANY | SXS_LOOKUP_CLR_GUID_USE_ACTCTX, (GUID *)&CLSID_Test,
+            NULL, NULL, 0, &buffer_size);
+    ok(!ret, "Unexpected return value %d.\n", ret);
+    ok(GetLastError() == ERROR_NOT_FOUND, "Unexpected error %d.\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
     ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_ANY, (GUID*)&CLSID_Test, NULL, NULL, 0, &buffer_size);
     ok(!ret, "Unexpected return value %d.\n", ret);
     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got %d\n", GetLastError());
 
+    SetLastError(0xdeadbeef);
     ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS, (GUID*)&CLSID_Test, NULL, NULL, 0, &buffer_size);
     ok(ret == FALSE, "Got %d\n", ret);
     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got %d\n", GetLastError());
 
     info = heap_alloc(buffer_size);
+    SetLastError(0xdeadbeef);
     ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS, (GUID*)&CLSID_Test, NULL, info, buffer_size, &buffer_size);
     ok(ret == TRUE, "Got %d\n", ret);
     ok(GetLastError() == 0, "Got %d\n", GetLastError());
@@ -108,11 +123,13 @@ static void run_test(void)
 
     heap_free(info);
 
+    SetLastError(0xdeadbeef);
     ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_SURROGATE, (GUID *)&CLSID_SurrogateTest, NULL, NULL, 0, &buffer_size);
     ok(!ret, "Unexpected return value %d.\n", ret);
     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got %d\n", GetLastError());
 
     info = heap_alloc(buffer_size);
+    SetLastError(0xdeadbeef);
     ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_SURROGATE, (GUID *)&CLSID_SurrogateTest, NULL, info,
             buffer_size, &buffer_size);
     ok(ret, "Unexpected return value %d.\n", ret);
@@ -127,6 +144,7 @@ static void run_test(void)
 
     heap_free(info);
 
+    SetLastError(0xdeadbeef);
     ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_ANY, (GUID *)&CLSID_SurrogateTest, NULL, NULL, 0, &buffer_size);
     ok(!ret, "Unexpected return value %d.\n", ret);
     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got %d\n", GetLastError());
@@ -231,6 +249,12 @@ static void test_SxsLookupClrGuid(void)
     ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
     ok(GetLastError() == ERROR_NOT_FOUND, "Expected ERROR_NOT_FOUND, got %d\n", GetLastError());
 
+    SetLastError(0xdeadbeef);
+    ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS | SXS_LOOKUP_CLR_GUID_USE_ACTCTX, (GUID *)&CLSID_Test,
+            NULL, NULL, 0, &buffer_size);
+    ok(!ret, "Unexpected return value %d.\n", ret);
+    ok(GetLastError() == ERROR_NOT_FOUND, "Expected ERROR_NOT_FOUND, got %d\n", GetLastError());
+
     SetLastError(0xdeadbeef);
     ret = SxsLookupClrGuid(SXS_LOOKUP_CLR_GUID_FIND_SURROGATE, (GUID *)&CLSID_Test, NULL, NULL, 0, &buffer_size);
     ok(!ret, "Unexpected return value %d.\n", ret);




More information about the wine-cvs mailing list