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