Fix shlwapi.h layout bugs

Francois Gouget fgouget at free.fr
Thu Aug 19 11:48:32 CDT 2004


Compiling shlwapi/tests/generated.c with MSVC showed that the packing in
shlwapi.h is wrong. It's supposed to be a pshpack8, not a pshpack1.

However, even after that gcc 3.3.4 claims that DLLVERSIONINFI2 requires
only an alignment of 4 bytes although it is declared in a pshpack8
section and contains a ULONGLONG field.

Adding a DECLSPEC_ALIGN(8) directly in the field declaration fixed this
issue. I hope that's the right fix.


Changelog:

 * include/shlwapi.h
   dlls/shlwapi/tests/generated.c

   Fix packing of shlwapi.h
   Add a DECLSPEC_ALIGN(8) to force DLLVERSIONINFO2 to have the correct
alignment.


Index: include/shlwapi.h
===================================================================
RCS file: /var/cvs/wine/include/shlwapi.h,v
retrieving revision 1.47
diff -u -r1.47 shlwapi.h
--- include/shlwapi.h	12 Aug 2004 20:28:12 -0000	1.47
+++ include/shlwapi.h	18 Aug 2004 19:18:54 -0000
@@ -28,7 +28,7 @@
 extern "C" {
 #endif /* defined(__cplusplus) */

-#include <pshpack1.h>
+#include <pshpack8.h>

 #ifndef NO_SHLWAPI_REG

@@ -926,7 +926,7 @@
 typedef struct _DLLVERSIONINFO2 {
     DLLVERSIONINFO info1;
     DWORD          dwFlags;    /* Reserved */
-    ULONGLONG      ullVersion; /* 16 bits each for Major, Minor, Build, QFE */
+    ULONGLONG DECLSPEC_ALIGN(8) ullVersion; /* 16 bits each for Major, Minor, Build, QFE */
 } DLLVERSIONINFO2;

 #define DLLVER_MAJOR_MASK 0xFFFF000000000000
Index: dlls/shlwapi/tests/generated.c
===================================================================
RCS file: /var/cvs/wine/dlls/shlwapi/tests/generated.c,v
retrieving revision 1.5
diff -u -r1.5 generated.c
--- dlls/shlwapi/tests/generated.c	4 May 2004 00:41:11 -0000	1.5
+++ dlls/shlwapi/tests/generated.c	19 Aug 2004 12:04:30 -0000
@@ -129,22 +129,22 @@

 static void test_pack_DLLVERSIONINFO(void)
 {
-    /* DLLVERSIONINFO (pack 1) */
-    TEST_TYPE(DLLVERSIONINFO, 20, 1);
-    TEST_FIELD(DLLVERSIONINFO, DWORD, cbSize, 0, 4, 1);
-    TEST_FIELD(DLLVERSIONINFO, DWORD, dwMajorVersion, 4, 4, 1);
-    TEST_FIELD(DLLVERSIONINFO, DWORD, dwMinorVersion, 8, 4, 1);
-    TEST_FIELD(DLLVERSIONINFO, DWORD, dwBuildNumber, 12, 4, 1);
-    TEST_FIELD(DLLVERSIONINFO, DWORD, dwPlatformID, 16, 4, 1);
+    /* DLLVERSIONINFO (pack 8) */
+    TEST_TYPE(DLLVERSIONINFO, 20, 4);
+    TEST_FIELD(DLLVERSIONINFO, DWORD, cbSize, 0, 4, 4);
+    TEST_FIELD(DLLVERSIONINFO, DWORD, dwMajorVersion, 4, 4, 4);
+    TEST_FIELD(DLLVERSIONINFO, DWORD, dwMinorVersion, 8, 4, 4);
+    TEST_FIELD(DLLVERSIONINFO, DWORD, dwBuildNumber, 12, 4, 4);
+    TEST_FIELD(DLLVERSIONINFO, DWORD, dwPlatformID, 16, 4, 4);
 }

 static void test_pack_DLLVERSIONINFO2(void)
 {
-    /* DLLVERSIONINFO2 (pack 1) */
-    TEST_TYPE(DLLVERSIONINFO2, 32, 1);
-    TEST_FIELD(DLLVERSIONINFO2, DLLVERSIONINFO, info1, 0, 20, 1);
-    TEST_FIELD(DLLVERSIONINFO2, DWORD, dwFlags, 20, 4, 1);
-    TEST_FIELD(DLLVERSIONINFO2, ULONGLONG, ullVersion, 24, 8, 1);
+    /* DLLVERSIONINFO2 (pack 8) */
+    TEST_TYPE(DLLVERSIONINFO2, 32, 8);
+    TEST_FIELD(DLLVERSIONINFO2, DLLVERSIONINFO, info1, 0, 20, 4);
+    TEST_FIELD(DLLVERSIONINFO2, DWORD, dwFlags, 20, 4, 4);
+    TEST_FIELD(DLLVERSIONINFO2, ULONGLONG DECLSPEC_ALIGN(8), ullVersion, 24, 8, 8);
 }

 static void test_pack_HUSKEY(void)


-- 
Francois Gouget         fgouget at free.fr        http://fgouget.free.fr/
        It really galls me that most of the computer power in the world
                          is wasted on screen savers.
                     Chris Caldwell from the GIMPS project
                       http://www.mersenne.org/prime.htm



More information about the wine-patches mailing list