/* * Utility routines for comctl32 v6 tests * * Copyright 2006 Mike McCormack for CodeWeavers * Copyright 2007 George Gov * Copyright 2009 Owen Rudge for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #pragma once #ifdef __i386__ #define ARCH "x86" #elif defined __x86_64__ #define ARCH "amd64" #elif defined __arm__ #define ARCH "arm" #elif defined __aarch64__ #define ARCH "arm64" #else #define ARCH "none" #endif static const CHAR manifest_name[] = "cc6.manifest"; static const CHAR manifest[] = "\n" "\n" " \n" "Wine comctl32 test suite\n" "\n" " \n" " \n" "\n" "\n" "\n"; static inline void unload_v6_module(ULONG_PTR cookie, HANDLE hCtx) { DeactivateActCtx(0, cookie); ReleaseActCtx(hCtx); DeleteFileA(manifest_name); } static inline BOOL load_v6_module(ULONG_PTR *pcookie, HANDLE *hCtx) { ACTCTX_SECTION_KEYED_DATA data; DWORD written; HMODULE hmod; ACTCTXA ctx; HANDLE file; BOOL ret; /* create manifest */ file = CreateFileA( manifest_name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL ); if (file != INVALID_HANDLE_VALUE) { ret = (WriteFile( file, manifest, sizeof(manifest)-1, &written, NULL ) && written == sizeof(manifest)-1); CloseHandle( file ); if (!ret) { DeleteFileA( manifest_name ); skip("Failed to fill manifest file. Skipping comctl32 V6 tests.\n"); return FALSE; } else trace("created %s\n", manifest_name); } else { skip("Failed to create manifest file. Skipping comctl32 V6 tests.\n"); return FALSE; } memset(&ctx, 0, sizeof(ctx)); ctx.cbSize = sizeof(ctx); ctx.lpSource = manifest_name; *hCtx = CreateActCtxA(&ctx); ok(*hCtx != 0, "Expected context handle\n"); hmod = GetModuleHandleA("comctl32.dll"); ret = ActivateActCtx(*hCtx, pcookie); ok(ret, "Failed to activate context, error %d.\n", GetLastError()); if (!ret) { win_skip("A problem during context activation occurred.\n"); DeleteFileA(manifest_name); } data.cbSize = sizeof(data); ret = FindActCtxSectionStringA(0, NULL, ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION, "comctl32.dll", &data); ok(ret, "failed to find comctl32.dll in active context, %u\n", GetLastError()); if (ret) { FreeLibrary(hmod); LoadLibraryA("comctl32.dll"); } return ret; } #undef ARCH