Aric Stewart : ntdll: Update behavior of ActivationContextBasicInformation.

Alexandre Julliard julliard at winehq.org
Wed Oct 22 08:00:41 CDT 2008


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Tue Oct 21 11:36:45 2008 -0500

ntdll: Update behavior of ActivationContextBasicInformation.

---

 dlls/kernel32/tests/actctx.c |   47 ++++++++++++++++++++++++++++++++++++++++++
 dlls/ntdll/actctx.c          |   12 ++++++++--
 2 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/dlls/kernel32/tests/actctx.c b/dlls/kernel32/tests/actctx.c
index 60d1f70..1215ef5 100644
--- a/dlls/kernel32/tests/actctx.c
+++ b/dlls/kernel32/tests/actctx.c
@@ -851,6 +851,42 @@ static void test_find_string_fail(void)
     ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError()=%u\n", GetLastError());
 }
 
+
+static void test_basic_info(HANDLE handle)
+{
+    ACTIVATION_CONTEXT_BASIC_INFORMATION basic;
+    SIZE_T size;
+    BOOL b;
+
+    b = pQueryActCtxW(0, handle, NULL,
+                          ActivationContextBasicInformation, &basic,
+                          sizeof(basic), &size);
+
+    ok (b,"ActivationContextBasicInformation failed\n");
+    ok (size == sizeof(ACTIVATION_CONTEXT_BASIC_INFORMATION),"size mismatch\n");
+    ok (basic.dwFlags == 0, "unexpected flags %x\n",basic.dwFlags);
+    ok (basic.hActCtx == handle, "unexpected handle\n");
+
+    b = pQueryActCtxW(QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX, handle, NULL,
+                          ActivationContextBasicInformation, &basic,
+                          sizeof(basic), &size);
+    if (handle)
+    {
+        ok (!b,"ActivationContextBasicInformation succeeded\n");
+        ok (size == 0,"size mismatch\n");
+        ok (GetLastError() == ERROR_INVALID_PARAMETER, "Wrong last error\n");
+        ok (basic.dwFlags == 0, "unexpected flags %x\n",basic.dwFlags);
+        ok (basic.hActCtx == handle, "unexpected handle\n");
+    }
+    else
+    {
+        ok (b,"ActivationContextBasicInformation failed\n");
+        ok (size == sizeof(ACTIVATION_CONTEXT_BASIC_INFORMATION),"size mismatch\n");
+        ok (basic.dwFlags == 0, "unexpected flags %x\n",basic.dwFlags);
+        ok (basic.hActCtx == handle, "unexpected handle\n");
+    }
+}
+
 static void test_actctx(void)
 {
     ULONG_PTR cookie;
@@ -865,6 +901,7 @@ static void test_actctx(void)
     ok(handle == NULL, "handle = %p, expected NULL\n", handle);
     ok(b, "GetCurrentActCtx failed: %u\n", GetLastError());
     if(b) {
+        test_basic_info(handle);
         test_detailed_info(handle, &detailed_info0);
         pReleaseActCtx(handle);
     }
@@ -879,6 +916,7 @@ static void test_actctx(void)
     handle = test_create("test1.manifest", manifest1);
     DeleteFileA("test1.manifest");
     if(handle != INVALID_HANDLE_VALUE) {
+        test_basic_info(handle);
         test_detailed_info(handle, &detailed_info1);
         test_info_in_assembly(handle, 1, &manifest1_info);
 
@@ -904,6 +942,7 @@ static void test_actctx(void)
     DeleteFileA("test2.manifest");
     DeleteFileA("testdep.manifest");
     if(handle != INVALID_HANDLE_VALUE) {
+        test_basic_info(handle);
         test_detailed_info(handle, &detailed_info2);
         test_info_in_assembly(handle, 1, &manifest2_info);
         test_info_in_assembly(handle, 2, &depmanifest1_info);
@@ -921,6 +960,7 @@ static void test_actctx(void)
     DeleteFileA("test3.manifest");
     DeleteFileA("testdep.manifest");
     if(handle != INVALID_HANDLE_VALUE) {
+        test_basic_info(handle);
         test_detailed_info(handle, &detailed_info2);
         test_info_in_assembly(handle, 1, &manifest2_info);
         test_info_in_assembly(handle, 2, &depmanifest2_info);
@@ -948,6 +988,7 @@ static void test_actctx(void)
     DeleteFileA("test2-3.manifest");
     DeleteFileA("testdep.manifest");
     if(handle != INVALID_HANDLE_VALUE) {
+        test_basic_info(handle);
         test_detailed_info(handle, &detailed_info2);
         test_info_in_assembly(handle, 1, &manifest2_info);
         test_info_in_assembly(handle, 2, &depmanifest3_info);
@@ -976,6 +1017,7 @@ static void test_actctx(void)
     handle = test_create("test3.manifest", manifest3);
     DeleteFileA("test3.manifest");
     if(handle != INVALID_HANDLE_VALUE) {
+        test_basic_info(handle);
         test_detailed_info(handle, &detailed_info1);
         test_info_in_assembly(handle, 1, &manifest3_info);
         test_file_info(handle, 0, 0, testlib_dll);
@@ -1002,6 +1044,7 @@ static void test_actctx(void)
     DeleteFileA("test4.manifest");
     DeleteFileA("testdep.manifest");
     if(handle != INVALID_HANDLE_VALUE) {
+        test_basic_info(handle);
         test_detailed_info(handle, &detailed_info2);
         test_info_in_assembly(handle, 1, &manifest4_info);
         test_info_in_assembly(handle, 2, &manifest_comctrl_info);
@@ -1020,6 +1063,7 @@ static void test_actctx(void)
         handle = test_create("..\\test1.manifest", manifest1);
         DeleteFileA("..\\test1.manifest");
         if(handle != INVALID_HANDLE_VALUE) {
+            test_basic_info(handle);
             test_detailed_info(handle, &detailed_info1);
             test_info_in_assembly(handle, 1, &manifest1_info);
             pReleaseActCtx(handle);
@@ -1039,6 +1083,7 @@ static void test_actctx(void)
     handle = test_create("test1.manifest", manifest1);
     DeleteFileA("test1.manifest");
     if (handle != INVALID_HANDLE_VALUE) {
+        test_basic_info(handle);
         test_detailed_info(handle, &detailed_info1);
         test_info_in_assembly(handle, 1, &manifest1_info);
         pReleaseActCtx(handle);
@@ -1053,6 +1098,7 @@ static void test_actctx(void)
     handle = test_create("test1.manifest", manifest1);
     DeleteFileA("test1.manifest");
     if (handle != INVALID_HANDLE_VALUE) {
+        test_basic_info(handle);
         test_detailed_info(handle, &detailed_info1);
         test_info_in_assembly(handle, 1, &manifest1_info);
         pReleaseActCtx(handle);
@@ -1071,6 +1117,7 @@ static void test_app_manifest(void)
     ok(handle == NULL, "handle != NULL\n");
     ok(b, "GetCurrentActCtx failed: %u\n", GetLastError());
     if(b) {
+        test_basic_info(handle);
         test_detailed_info(handle, &detailed_info1_child);
         test_info_in_assembly(handle, 1, &manifest1_child_info);
         pReleaseActCtx(handle);
diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c
index 80e9e03..f1f9ad7 100644
--- a/dlls/ntdll/actctx.c
+++ b/dlls/ntdll/actctx.c
@@ -2028,12 +2028,14 @@ static NTSTATUS parse_depend_manifests(struct actctx_loader* acl)
 }
 
 /* find the appropriate activation context for RtlQueryInformationActivationContext */
-static NTSTATUS find_query_actctx( HANDLE *handle, DWORD flags )
+static NTSTATUS find_query_actctx( HANDLE *handle, DWORD flags, ULONG class )
 {
     NTSTATUS status = STATUS_SUCCESS;
 
     if (flags & QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX)
     {
+        if (*handle) return STATUS_INVALID_PARAMETER;
+
         if (NtCurrentTeb()->ActivationContextStack.ActiveFrame)
             *handle = NtCurrentTeb()->ActivationContextStack.ActiveFrame->ActivationContext;
     }
@@ -2042,6 +2044,8 @@ static NTSTATUS find_query_actctx( HANDLE *handle, DWORD flags )
         ULONG magic;
         LDR_MODULE *pldr;
 
+        if (!*handle) return STATUS_INVALID_PARAMETER;
+
         LdrLockLoaderLock( 0, NULL, &magic );
         if (!LdrFindEntryForAddress( *handle, &pldr ))
         {
@@ -2053,7 +2057,8 @@ static NTSTATUS find_query_actctx( HANDLE *handle, DWORD flags )
         else status = STATUS_DLL_NOT_FOUND;
         LdrUnlockLoaderLock( 0, magic );
     }
-    else if (!*handle) *handle = process_actctx;
+    else if (!*handle && (class != ActivationContextBasicInformation))
+        *handle = process_actctx;
 
     return status;
 }
@@ -2430,7 +2435,8 @@ NTSTATUS WINAPI RtlQueryInformationActivationContext( ULONG flags, HANDLE handle
     TRACE("%08x %p %p %u %p %ld %p\n", flags, handle,
           subinst, class, buffer, bufsize, retlen);
 
-    if ((status = find_query_actctx( &handle, flags ))) return status;
+    if (retlen) *retlen = 0;
+    if ((status = find_query_actctx( &handle, flags, class ))) return status;
 
     switch (class)
     {




More information about the wine-cvs mailing list