Module: wine Branch: master Commit: b3f042558035c2f98714d833ed3bae66fd608a1e URL: http://source.winehq.org/git/wine.git/?a=commit;h=b3f042558035c2f98714d833ed...
Author: Marcus Meissner meissner@suse.de Date: Tue Jun 15 11:04:33 2010 +0200
atl: Also handle struct sizes for 64bit.
---
configure | 1 + configure.ac | 1 + dlls/atl/atl_main.c | 13 ++++- dlls/atl/tests/Makefile.in | 11 +++++ dlls/atl/tests/module.c | 104 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 127 insertions(+), 3 deletions(-)
diff --git a/configure b/configure index 5e20b93..a01d5f6 100755 --- a/configure +++ b/configure @@ -14288,6 +14288,7 @@ wine_fn_config_dll amstream enable_amstream wine_fn_config_test dlls/amstream/tests amstream_test wine_fn_config_dll appwiz.cpl enable_appwiz_cpl wine_fn_config_dll atl enable_atl atl +wine_fn_config_test dlls/atl/tests atl_test wine_fn_config_dll authz enable_authz wine_fn_config_dll avicap32 enable_avicap32 avicap32 wine_fn_config_dll avifil32 enable_avifil32 avifil32 diff --git a/configure.ac b/configure.ac index eed1487..61f376e 100644 --- a/configure.ac +++ b/configure.ac @@ -2224,6 +2224,7 @@ WINE_CONFIG_DLL(amstream) WINE_CONFIG_TEST(dlls/amstream/tests) WINE_CONFIG_DLL(appwiz.cpl) WINE_CONFIG_DLL(atl,,[atl]) +WINE_CONFIG_TEST(dlls/atl/tests) WINE_CONFIG_DLL(authz) WINE_CONFIG_DLL(avicap32,,[avicap32]) WINE_CONFIG_DLL(avifil32,,[avifil32]) diff --git a/dlls/atl/atl_main.c b/dlls/atl/atl_main.c index fedfc1a..ea8be78 100644 --- a/dlls/atl/atl_main.c +++ b/dlls/atl/atl_main.c @@ -53,7 +53,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) return TRUE; }
-#define ATLVer1Size 100 +#define ATLVer1Size FIELD_OFFSET(_ATL_MODULEW, dwAtlBuildVer)
HRESULT WINAPI AtlModuleInit(_ATL_MODULEW* pM, _ATL_OBJMAP_ENTRYW* p, HINSTANCE h) { @@ -63,9 +63,16 @@ HRESULT WINAPI AtlModuleInit(_ATL_MODULEW* pM, _ATL_OBJMAP_ENTRYW* p, HINSTANCE FIXME("SEMI-STUB (%p %p %p)\n",pM,p,h);
size = pM->cbSize; - if (size != sizeof(_ATL_MODULEW) && size != ATLVer1Size) + switch (size) { - FIXME("Unknown structure version (size %i)\n",size); + case ATLVer1Size: + case sizeof(_ATL_MODULEW): +#ifdef _WIN64 + case sizeof(_ATL_MODULEW) + sizeof(void *): +#endif + break; + default: + WARN("Unknown structure version (size %i)\n",size); return E_INVALIDARG; }
diff --git a/dlls/atl/tests/Makefile.in b/dlls/atl/tests/Makefile.in new file mode 100644 index 0000000..b9752d4 --- /dev/null +++ b/dlls/atl/tests/Makefile.in @@ -0,0 +1,11 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +TESTDLL = atl.dll +IMPORTS = atl oleaut32 ole32 rpcrt4 user32 gdi32 advapi32 kernel32 + +C_SRCS = \ + module.c + +@MAKE_TEST_RULES@ diff --git a/dlls/atl/tests/module.c b/dlls/atl/tests/module.c new file mode 100644 index 0000000..294d87b --- /dev/null +++ b/dlls/atl/tests/module.c @@ -0,0 +1,104 @@ +/* + * ATL test program + * + * Copyright 2010 Marcus Meissner + * + * + * 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 + */ + +#include <stdarg.h> +#include <stdio.h> + +#define COBJMACROS + +#include <wine/test.h> +#include <windef.h> +#include <winbase.h> +#include <winuser.h> +#include <wingdi.h> +#include <winnls.h> +#include <winerror.h> +#include <winnt.h> +#include <initguid.h> +#include <wtypes.h> +#include <olectl.h> +#include <ocidl.h> + +struct _ATL_OBJMAP_ENTRYW; +struct _AtlCreateWndData; +struct _ATL_TERMFUNC_ELEM; + +struct _ATL_MODULEW +{ + UINT cbSize; + HINSTANCE m_hInst; + HINSTANCE m_hInstResource; + HINSTANCE m_hInstTypeLib; + struct _ATL_OBJMAP_ENTRYW* m_pObjMap; + LONG m_nLockCnt; + HANDLE m_hHeap; + union + { + CRITICAL_SECTION m_csTypeInfoHolder; + CRITICAL_SECTION m_csStaticDataInit; + } u; + CRITICAL_SECTION m_csWindowCreate; + CRITICAL_SECTION m_csObjMap; + + DWORD dwAtlBuildVer; + struct _AtlCreateWndData* m_pCreateWndList; + BOOL m_bDestroyHeap; + GUID* pguidVer; + DWORD m_dwHeaps; + HANDLE* m_phHeaps; + int m_nHeap; + struct _ATL_TERMFUNC_ELEM* m_pTermFuncs; +}; + +HRESULT WINAPI AtlModuleInit(struct _ATL_MODULEW* pM, struct _ATL_OBJMAP_ENTRYW* p, HINSTANCE h); + +#define MAXSIZE 512 +static void test_StructSize(void) +{ + struct _ATL_MODULEW *tst; + HRESULT hres; + int i; + + tst = HeapAlloc (GetProcessHeap(),HEAP_ZERO_MEMORY,MAXSIZE); + + for (i=0;i<MAXSIZE;i++) { + tst->cbSize = i; + hres = AtlModuleInit(tst, NULL, NULL); + + switch (i) { + case FIELD_OFFSET( struct _ATL_MODULEW, dwAtlBuildVer ): + case sizeof(struct _ATL_MODULEW): +#ifdef _WIN64 + case sizeof(struct _ATL_MODULEW) + sizeof(void *): +#endif + ok (hres == S_OK, "AtlModuleInit with %d failed (0x%x).\n", i, (int)hres); + break; + default: + ok (FAILED(hres), "AtlModuleInit with %d succeeded? (0x%x).\n", i, (int)hres); + break; + } + } +} + +START_TEST(module) +{ + test_StructSize(); +}