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