Marcus Meissner : atl: Also handle struct sizes for 64bit.

Alexandre Julliard julliard at winehq.org
Tue Jun 15 13:46:51 CDT 2010


Module: wine
Branch: master
Commit: b3f042558035c2f98714d833ed3bae66fd608a1e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b3f042558035c2f98714d833ed3bae66fd608a1e

Author: Marcus Meissner <meissner at 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
+
+ at 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();
+}




More information about the wine-cvs mailing list