| /* |
| * 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 |
| */ |
| |
| #define expect(expected, got) ok(got == expected, "Expected %d, got %d\n", expected, got) |
| |
| #ifdef __i386__ |
| #define ARCH "x86" |
| #elif defined __x86_64__ |
| #define ARCH "amd64" |
| #else |
| #define ARCH "none" |
| #endif |
| |
| static const CHAR manifest_name[] = "cc6.manifest"; |
| |
| static const CHAR manifest[] = |
| "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" |
| "<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">\n" |
| " <assemblyIdentity\n" |
| " type=\"win32\"\n" |
| " name=\"Wine.ComCtl32.Tests\"\n" |
| " version=\"1.0.0.0\"\n" |
| " processorArchitecture=\"" ARCH "\"\n" |
| " />\n" |
| "<description>Wine comctl32 test suite</description>\n" |
| "<dependency>\n" |
| " <dependentAssembly>\n" |
| " <assemblyIdentity\n" |
| " type=\"win32\"\n" |
| " name=\"microsoft.windows.common-controls\"\n" |
| " version=\"6.0.0.0\"\n" |
| " processorArchitecture=\"" ARCH "\"\n" |
| " publicKeyToken=\"6595b64144ccf1df\"\n" |
| " language=\"*\"\n" |
| " />\n" |
| "</dependentAssembly>\n" |
| "</dependency>\n" |
| "</assembly>\n"; |
| |
| static void unload_v6_module(ULONG_PTR cookie, HANDLE hCtx) |
| { |
| HANDLE hKernel32; |
| BOOL (WINAPI *pDeactivateActCtx)(DWORD, ULONG_PTR); |
| VOID (WINAPI *pReleaseActCtx)(HANDLE); |
| |
| hKernel32 = GetModuleHandleA("kernel32.dll"); |
| pDeactivateActCtx = (void*)GetProcAddress(hKernel32, "DeactivateActCtx"); |
| pReleaseActCtx = (void*)GetProcAddress(hKernel32, "ReleaseActCtx"); |
| if (!pDeactivateActCtx || !pReleaseActCtx) |
| { |
| win_skip("Activation contexts unsupported\n"); |
| return; |
| } |
| |
| pDeactivateActCtx(0, cookie); |
| pReleaseActCtx(hCtx); |
| |
| DeleteFileA(manifest_name); |
| } |
| |
| static BOOL load_v6_module(ULONG_PTR *pcookie, HANDLE *hCtx) |
| { |
| HANDLE hKernel32; |
| HANDLE (WINAPI *pCreateActCtxA)(ACTCTXA*); |
| BOOL (WINAPI *pActivateActCtx)(HANDLE, ULONG_PTR*); |
| |
| ACTCTXA ctx; |
| BOOL ret; |
| HANDLE file; |
| DWORD written; |
| |
| hKernel32 = GetModuleHandleA("kernel32.dll"); |
| pCreateActCtxA = (void*)GetProcAddress(hKernel32, "CreateActCtxA"); |
| pActivateActCtx = (void*)GetProcAddress(hKernel32, "ActivateActCtx"); |
| if (!(pCreateActCtxA && pActivateActCtx)) |
| { |
| win_skip("Activation contexts unsupported. No version 6 tests possible.\n"); |
| return FALSE; |
| } |
| |
| /* 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 = pCreateActCtxA(&ctx); |
| ok(*hCtx != 0, "Expected context handle\n"); |
| |
| ret = pActivateActCtx(*hCtx, pcookie); |
| expect(TRUE, ret); |
| |
| if (!ret) |
| { |
| win_skip("A problem during context activation occurred.\n"); |
| DeleteFileA(manifest_name); |
| } |
| |
| return ret; |
| } |
| |
| #undef expect |
| #undef ARCH |