Mark Jansen : kernel32/tests: Parameter validation tests for FindActCtxSectionString.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Mar 17 11:01:59 CDT 2015
Module: wine
Branch: master
Commit: f091ff5851d2d1e2a9088c59eabba7b17152c5d4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f091ff5851d2d1e2a9088c59eabba7b17152c5d4
Author: Mark Jansen <learn0more at gmail.com>
Date: Sun Mar 15 23:39:09 2015 +0100
kernel32/tests: Parameter validation tests for FindActCtxSectionString.
---
dlls/kernel32/tests/actctx.c | 150 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 148 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/actctx.c b/dlls/kernel32/tests/actctx.c
index 60763b1..887c6b0 100644
--- a/dlls/kernel32/tests/actctx.c
+++ b/dlls/kernel32/tests/actctx.c
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
#include "wine/test.h"
#include <winbase.h>
#include <windef.h>
@@ -39,6 +41,10 @@ static BOOL (WINAPI *pQueryActCtxW)(DWORD,HANDLE,PVOID,ULONG,PVOID,SIZE_T,SIZE
static VOID (WINAPI *pReleaseActCtx)(HANDLE);
static BOOL (WINAPI *pFindActCtxSectionGuid)(DWORD,const GUID*,ULONG,const GUID*,PACTCTX_SECTION_KEYED_DATA);
+static NTSTATUS(NTAPI *pRtlFindActivationContextSectionString)(DWORD,const GUID *,ULONG,PUNICODE_STRING,PACTCTX_SECTION_KEYED_DATA);
+static BOOLEAN (NTAPI *pRtlCreateUnicodeStringFromAsciiz)(PUNICODE_STRING, PCSZ);
+static VOID (NTAPI *pRtlFreeUnicodeString)(PUNICODE_STRING);
+
static const char* strw(LPCWSTR x)
{
static char buffer[1024];
@@ -2048,6 +2054,140 @@ static void test_app_manifest(void)
}
}
+static HANDLE create_manifest(const char *filename, const char *data, int line)
+{
+ HANDLE handle;
+ create_manifest_file(filename, data, -1, NULL, NULL);
+
+ handle = test_create(filename);
+ ok_(__FILE__, line)(handle != INVALID_HANDLE_VALUE,
+ "handle == INVALID_HANDLE_VALUE, error %u\n", GetLastError());
+
+ DeleteFileA(filename);
+ return handle;
+}
+
+static void kernel32_find(ULONG section, const char *string_to_find, BOOL should_find, BOOL todo, int line)
+{
+ UNICODE_STRING string_to_findW;
+ ACTCTX_SECTION_KEYED_DATA data;
+ BOOL ret;
+ DWORD err;
+
+ pRtlCreateUnicodeStringFromAsciiz(&string_to_findW, string_to_find);
+
+ memset(&data, 0xfe, sizeof(data));
+ data.cbSize = sizeof(data);
+
+ SetLastError(0);
+ ret = pFindActCtxSectionStringA(0, NULL, section, string_to_find, &data);
+ err = GetLastError();
+ ok_(__FILE__, line)(ret == should_find,
+ "FindActCtxSectionStringA: expected ret = %u, got %u\n", should_find, ret);
+ if (todo)
+ todo_wine
+ ok_(__FILE__, line)(err == (should_find ? ERROR_SUCCESS : ERROR_SXS_KEY_NOT_FOUND),
+ "FindActCtxSectionStringA: unexpected error %u\n", err);
+ else
+ ok_(__FILE__, line)(err == (should_find ? ERROR_SUCCESS : ERROR_SXS_KEY_NOT_FOUND),
+ "FindActCtxSectionStringA: unexpected error %u\n", err);
+
+ memset(&data, 0xfe, sizeof(data));
+ data.cbSize = sizeof(data);
+
+ SetLastError(0);
+ ret = pFindActCtxSectionStringW(0, NULL, section, string_to_findW.Buffer, &data);
+ err = GetLastError();
+ ok_(__FILE__, line)(ret == should_find,
+ "FindActCtxSectionStringW: expected ret = %u, got %u\n", should_find, ret);
+ if (todo)
+ todo_wine
+ ok_(__FILE__, line)(err == (should_find ? ERROR_SUCCESS : ERROR_SXS_KEY_NOT_FOUND),
+ "FindActCtxSectionStringW: unexpected error %u\n", err);
+ else
+ ok_(__FILE__, line)(err == (should_find ? ERROR_SUCCESS : ERROR_SXS_KEY_NOT_FOUND),
+ "FindActCtxSectionStringW: unexpected error %u\n", err);
+
+ SetLastError(0);
+ ret = pFindActCtxSectionStringA(0, NULL, section, string_to_find, NULL);
+ err = GetLastError();
+ ok_(__FILE__, line)(!ret,
+ "FindActCtxSectionStringA: expected failure, got %u\n", ret);
+ ok_(__FILE__, line)(err == ERROR_INVALID_PARAMETER,
+ "FindActCtxSectionStringA: unexpected error %u\n", err);
+
+ SetLastError(0);
+ ret = pFindActCtxSectionStringW(0, NULL, section, string_to_findW.Buffer, NULL);
+ err = GetLastError();
+ ok_(__FILE__, line)(!ret,
+ "FindActCtxSectionStringW: expected failure, got %u\n", ret);
+ ok_(__FILE__, line)(err == ERROR_INVALID_PARAMETER,
+ "FindActCtxSectionStringW: unexpected error %u\n", err);
+
+ pRtlFreeUnicodeString(&string_to_findW);
+}
+
+static void ntdll_find(ULONG section, const char *string_to_find, BOOL should_find, BOOL todo, int line)
+{
+ UNICODE_STRING string_to_findW;
+ ACTCTX_SECTION_KEYED_DATA data;
+ NTSTATUS ret;
+
+ pRtlCreateUnicodeStringFromAsciiz(&string_to_findW, string_to_find);
+
+ memset(&data, 0xfe, sizeof(data));
+ data.cbSize = sizeof(data);
+
+ ret = pRtlFindActivationContextSectionString(0, NULL, section, &string_to_findW, &data);
+ if (todo)
+ todo_wine
+ ok_(__FILE__, line)(ret == (should_find ? STATUS_SUCCESS : STATUS_SXS_KEY_NOT_FOUND),
+ "RtlFindActivationContextSectionString: unexpected status 0x%x\n", ret);
+ else
+ ok_(__FILE__, line)(ret == (should_find ? STATUS_SUCCESS : STATUS_SXS_KEY_NOT_FOUND),
+ "RtlFindActivationContextSectionString: unexpected status 0x%x\n", ret);
+
+ ret = pRtlFindActivationContextSectionString(0, NULL, section, &string_to_findW, NULL);
+ todo_wine
+ ok_(__FILE__, line)(ret == (should_find ? STATUS_SUCCESS : STATUS_SXS_KEY_NOT_FOUND),
+ "RtlFindActivationContextSectionString: unexpected status 0x%x\n", ret);
+
+ pRtlFreeUnicodeString(&string_to_findW);
+}
+
+static void test_findsectionstring(void)
+{
+ HANDLE handle;
+ BOOL ret;
+ ULONG_PTR cookie;
+
+ handle = create_manifest("test.manifest", testdep_manifest3, __LINE__);
+ ret = pActivateActCtx(handle, &cookie);
+ ok(ret, "ActivateActCtx failed: %u\n", GetLastError());
+
+ /* first we show the parameter validation from kernel32 */
+ kernel32_find(ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION, "testdep", FALSE, TRUE, __LINE__);
+ kernel32_find(ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION, "testlib.dll", TRUE, FALSE, __LINE__);
+ kernel32_find(ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION, "testlib2.dll", TRUE, FALSE, __LINE__);
+ kernel32_find(ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION, "testlib3.dll", FALSE, FALSE, __LINE__);
+ kernel32_find(ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION, "wndClass", TRUE, FALSE, __LINE__);
+ kernel32_find(ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION, "wndClass2", TRUE, FALSE, __LINE__);
+ kernel32_find(ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION, "wndClass3", FALSE, FALSE, __LINE__);
+
+ /* then we show that ntdll plays by different rules */
+ ntdll_find(ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION, "testdep", FALSE, TRUE, __LINE__);
+ ntdll_find(ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION, "testlib.dll", TRUE, FALSE, __LINE__);
+ ntdll_find(ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION, "testlib2.dll", TRUE, FALSE, __LINE__);
+ ntdll_find(ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION, "testlib3.dll", FALSE, FALSE, __LINE__);
+ ntdll_find(ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION, "wndClass", TRUE, FALSE, __LINE__);
+ ntdll_find(ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION, "wndClass2", TRUE, FALSE, __LINE__);
+ ntdll_find(ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION, "wndClass3", FALSE, FALSE, __LINE__);
+
+ ret = pDeactivateActCtx(0, cookie);
+ ok(ret, "DeactivateActCtx failed: %u\n", GetLastError());
+ pReleaseActCtx(handle);
+}
+
static void run_child_process(void)
{
char cmdline[MAX_PATH];
@@ -2263,9 +2403,9 @@ todo_wine
static BOOL init_funcs(void)
{
- HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
+ HMODULE hLibrary = GetModuleHandleA("kernel32.dll");
-#define X(f) if (!(p##f = (void*)GetProcAddress(hKernel32, #f))) return FALSE;
+#define X(f) if (!(p##f = (void*)GetProcAddress(hLibrary, #f))) return FALSE;
X(ActivateActCtx);
X(CreateActCtxA);
X(CreateActCtxW);
@@ -2277,6 +2417,11 @@ static BOOL init_funcs(void)
X(QueryActCtxW);
X(ReleaseActCtx);
X(FindActCtxSectionGuid);
+
+ hLibrary = GetModuleHandleA("ntdll.dll");
+ X(RtlFindActivationContextSectionString);
+ X(RtlCreateUnicodeStringFromAsciiz);
+ X(RtlFreeUnicodeString);
#undef X
return TRUE;
@@ -2303,5 +2448,6 @@ START_TEST(actctx)
test_actctx();
test_CreateActCtx();
+ test_findsectionstring();
run_child_process();
}
More information about the wine-cvs
mailing list