Added check whether unaligned memory access is allowed.
Added macros to access unaligned WORDs / DWORDs.

diff --git a/configure b/configure
index ecfda11..711c27c 100755
--- a/configure
+++ b/configure
@@ -5343,24 +5343,67 @@
 
 fi
 
+echo $ac_n "checking "whether unaligned memory access is allowed"""... $ac_c" 1>&6
+echo "configure:5348: checking "whether unaligned memory access is allowed"" >&5
+if eval "test \"`echo '$''{'wine_cv_allow_unaligned_access'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  wine_cv_allow_unaligned_access=no 
+else
+  cat > conftest.$ac_ext <<EOF
+#line 5356 "configure"
+#include "confdefs.h"
+
+long volatile test[2];
+main()
+{
+    long volatile *ua = (long volatile *)((char *)test + 1);
+    *ua = 0;
+    exit(0);
+} 
+EOF
+if { (eval echo configure:5367: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  wine_cv_allow_unaligned_access=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  wine_cv_allow_unaligned_access=no
+fi
+rm -fr conftest*
+fi
+ 
+fi
+
+echo "$ac_t""$wine_cv_allow_unaligned_access" 1>&6
+if test "$wine_allow_unaligned_access" = "yes"
+then
+  cat >> confdefs.h <<\EOF
+#define ALLOW_UNALIGNED_ACCESS 1
+EOF
+
+fi
+
 
 
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:5352: checking for working alloca.h" >&5
+echo "configure:5395: checking for working alloca.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5357 "configure"
+#line 5400 "configure"
 #include "confdefs.h"
 #include <alloca.h>
 int main() {
 void *p = alloca(2 * sizeof(int));
 ; return 0; }
 EOF
-if { (eval echo configure:5364: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5407: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_header_alloca_h=yes
 else
@@ -5381,12 +5424,12 @@
 fi
 
 echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:5385: checking for alloca" >&5
+echo "configure:5428: checking for alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5390 "configure"
+#line 5433 "configure"
 #include "confdefs.h"
 
 #ifdef __GNUC__
@@ -5414,7 +5457,7 @@
 char *p = (char *) alloca(1);
 ; return 0; }
 EOF
-if { (eval echo configure:5418: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5461: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_func_alloca_works=yes
 else
@@ -5446,12 +5489,12 @@
 
 
 echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:5450: checking whether alloca needs Cray hooks" >&5
+echo "configure:5493: checking whether alloca needs Cray hooks" >&5
 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5455 "configure"
+#line 5498 "configure"
 #include "confdefs.h"
 #if defined(CRAY) && ! defined(CRAY2)
 webecray
@@ -5476,12 +5519,12 @@
 if test $ac_cv_os_cray = yes; then
 for ac_func in _getb67 GETB67 getb67; do
   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5480: checking for $ac_func" >&5
+echo "configure:5523: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5485 "configure"
+#line 5528 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -5504,7 +5547,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:5508: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -5531,7 +5574,7 @@
 fi
 
 echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:5535: checking stack direction for C alloca" >&5
+echo "configure:5578: checking stack direction for C alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5539,7 +5582,7 @@
   ac_cv_c_stack_direction=0
 else
   cat > conftest.$ac_ext <<EOF
-#line 5543 "configure"
+#line 5586 "configure"
 #include "confdefs.h"
 find_stack_direction ()
 {
@@ -5558,7 +5601,7 @@
   exit (find_stack_direction() < 0);
 }
 EOF
-if { (eval echo configure:5562: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:5605: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_stack_direction=1
 else
@@ -5615,12 +5658,12 @@
 
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5619: checking for $ac_func" >&5
+echo "configure:5662: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5624 "configure"
+#line 5667 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -5643,7 +5686,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:5647: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5690: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -5724,17 +5767,17 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5728: checking for $ac_hdr" >&5
+echo "configure:5771: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5733 "configure"
+#line 5776 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5738: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5781: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5761,12 +5804,12 @@
 done
 
 echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6
-echo "configure:5765: checking whether stat file-mode macros are broken" >&5
+echo "configure:5808: checking whether stat file-mode macros are broken" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5770 "configure"
+#line 5813 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -5819,12 +5862,12 @@
 
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:5823: checking for working const" >&5
+echo "configure:5866: checking for working const" >&5
 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5828 "configure"
+#line 5871 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -5873,7 +5916,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:5877: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5920: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -5894,21 +5937,21 @@
 fi
 
 echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:5898: checking for inline" >&5
+echo "configure:5941: checking for inline" >&5
 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat > conftest.$ac_ext <<EOF
-#line 5905 "configure"
+#line 5948 "configure"
 #include "confdefs.h"
 
 int main() {
 } int $ac_kw foo() {
 ; return 0; }
 EOF
-if { (eval echo configure:5912: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5955: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline=$ac_kw; break
 else
@@ -5934,12 +5977,12 @@
 esac
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:5938: checking for ANSI C header files" >&5
+echo "configure:5981: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5943 "configure"
+#line 5986 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -5947,7 +5990,7 @@
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5951: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5994: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5964,7 +6007,7 @@
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 5968 "configure"
+#line 6011 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -5982,7 +6025,7 @@
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 5986 "configure"
+#line 6029 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -6003,7 +6046,7 @@
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 6007 "configure"
+#line 6050 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -6014,7 +6057,7 @@
 exit (0); }
 
 EOF
-if { (eval echo configure:6018: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6061: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -6038,12 +6081,12 @@
 fi
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:6042: checking for size_t" >&5
+echo "configure:6085: checking for size_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6047 "configure"
+#line 6090 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -6071,7 +6114,7 @@
 fi
 
 echo $ac_n "checking size of long long""... $ac_c" 1>&6
-echo "configure:6075: checking size of long long" >&5
+echo "configure:6118: checking size of long long" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6079,7 +6122,7 @@
   ac_cv_sizeof_long_long=0
 else
   cat > conftest.$ac_ext <<EOF
-#line 6083 "configure"
+#line 6126 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -6090,7 +6133,7 @@
   exit(0);
 }
 EOF
-if { (eval echo configure:6094: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6137: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_long_long=`cat conftestval`
 else
@@ -6112,12 +6155,12 @@
 
    
 echo $ac_n "checking "whether we can use re-entrant gethostbyname_r Linux style"""... $ac_c" 1>&6
-echo "configure:6116: checking "whether we can use re-entrant gethostbyname_r Linux style"" >&5
+echo "configure:6159: checking "whether we can use re-entrant gethostbyname_r Linux style"" >&5
 if eval "test \"`echo '$''{'wine_cv_linux_gethostbyname_r_6'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6121 "configure"
+#line 6164 "configure"
 #include "confdefs.h"
 
 #include <netdb.h>
@@ -6138,7 +6181,7 @@
     
 ; return 0; }
 EOF
-if { (eval echo configure:6142: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6185: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   wine_cv_linux_gethostbyname_r_6=yes
 else
@@ -6164,12 +6207,12 @@
 if test "$ac_cv_header_linux_joystick_h" = "yes"
 then
    echo $ac_n "checking "whether linux/joystick.h uses the Linux 2.2+ API"""... $ac_c" 1>&6
-echo "configure:6168: checking "whether linux/joystick.h uses the Linux 2.2+ API"" >&5
+echo "configure:6211: checking "whether linux/joystick.h uses the Linux 2.2+ API"" >&5
 if eval "test \"`echo '$''{'wine_cv_linux_joystick_22_api'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6173 "configure"
+#line 6216 "configure"
 #include "confdefs.h"
 
 	#include <sys/ioctl.h>
@@ -6184,7 +6227,7 @@
 /*empty*/
 ; return 0; }
 EOF
-if { (eval echo configure:6188: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6231: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   wine_cv_linux_joystick_22_api=yes
 else
@@ -6211,12 +6254,12 @@
 if test "$ac_cv_header_sys_vfs_h" = "yes"
 then
     echo $ac_n "checking "whether sys/vfs.h defines statfs"""... $ac_c" 1>&6
-echo "configure:6215: checking "whether sys/vfs.h defines statfs"" >&5
+echo "configure:6258: checking "whether sys/vfs.h defines statfs"" >&5
 if eval "test \"`echo '$''{'wine_cv_sys_vfs_has_statfs'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6220 "configure"
+#line 6263 "configure"
 #include "confdefs.h"
 
 	#include <sys/types.h>
@@ -6233,7 +6276,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:6237: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6280: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   wine_cv_sys_vfs_has_statfs=yes
 else
@@ -6260,12 +6303,12 @@
 if test "$ac_cv_header_sys_statfs_h" = "yes"
 then
     echo $ac_n "checking "whether sys/statfs.h defines statfs"""... $ac_c" 1>&6
-echo "configure:6264: checking "whether sys/statfs.h defines statfs"" >&5
+echo "configure:6307: checking "whether sys/statfs.h defines statfs"" >&5
 if eval "test \"`echo '$''{'wine_cv_sys_statfs_has_statfs'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6269 "configure"
+#line 6312 "configure"
 #include "confdefs.h"
 
 	#include <sys/types.h>
@@ -6280,7 +6323,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:6284: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6327: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   wine_cv_sys_statfs_has_statfs=yes
 else
@@ -6307,12 +6350,12 @@
 if test "$ac_cv_header_sys_mount_h" = "yes"
 then
     echo $ac_n "checking "whether sys/mount.h defines statfs"""... $ac_c" 1>&6
-echo "configure:6311: checking "whether sys/mount.h defines statfs"" >&5
+echo "configure:6354: checking "whether sys/mount.h defines statfs"" >&5
 if eval "test \"`echo '$''{'wine_cv_sys_mount_has_statfs'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6316 "configure"
+#line 6359 "configure"
 #include "confdefs.h"
 
 	#include <sys/types.h>
@@ -6327,7 +6370,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:6331: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6374: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   wine_cv_sys_mount_has_statfs=yes
 else
@@ -6353,7 +6396,7 @@
 
 
 echo $ac_n "checking "for statfs.f_bfree"""... $ac_c" 1>&6
-echo "configure:6357: checking "for statfs.f_bfree"" >&5
+echo "configure:6400: checking "for statfs.f_bfree"" >&5
 if eval "test \"`echo '$''{'wine_cv_statfs_bfree'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6362,7 +6405,7 @@
         wine_cv_statfs_bfree=no
     else
     	cat > conftest.$ac_ext <<EOF
-#line 6366 "configure"
+#line 6409 "configure"
 #include "confdefs.h"
 
 	#include <sys/types.h>
@@ -6389,7 +6432,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:6393: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6436: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   wine_cv_statfs_bfree=yes
 else
@@ -6413,7 +6456,7 @@
 fi
 
 echo $ac_n "checking "for statfs.f_bavail"""... $ac_c" 1>&6
-echo "configure:6417: checking "for statfs.f_bavail"" >&5
+echo "configure:6460: checking "for statfs.f_bavail"" >&5
 if eval "test \"`echo '$''{'wine_cv_statfs_bavail'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6422,7 +6465,7 @@
         wine_cv_statfs_bavail=no
     else
     	cat > conftest.$ac_ext <<EOF
-#line 6426 "configure"
+#line 6469 "configure"
 #include "confdefs.h"
 
 	#include <sys/types.h>
@@ -6449,7 +6492,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:6453: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6496: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   wine_cv_statfs_bavail=yes
 else
@@ -6474,12 +6517,12 @@
 
 
 echo $ac_n "checking "for msg_accrights in struct msghdr"""... $ac_c" 1>&6
-echo "configure:6478: checking "for msg_accrights in struct msghdr"" >&5
+echo "configure:6521: checking "for msg_accrights in struct msghdr"" >&5
 if eval "test \"`echo '$''{'ac_cv_c_msg_accrights'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6483 "configure"
+#line 6526 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -6487,7 +6530,7 @@
 struct msghdr hdr; hdr.msg_accrights=0
 ; return 0; }
 EOF
-if { (eval echo configure:6491: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6534: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_msg_accrights="yes"
 else
@@ -6510,12 +6553,12 @@
 
 
 echo $ac_n "checking "for sun_len in struct sockaddr_un"""... $ac_c" 1>&6
-echo "configure:6514: checking "for sun_len in struct sockaddr_un"" >&5
+echo "configure:6557: checking "for sun_len in struct sockaddr_un"" >&5
 if eval "test \"`echo '$''{'ac_cv_c_sun_len'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6519 "configure"
+#line 6562 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -6524,7 +6567,7 @@
 static struct sockaddr_un addr; addr.sun_len = 1
 ; return 0; }
 EOF
-if { (eval echo configure:6528: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6571: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_sun_len="yes"
 else
@@ -6547,12 +6590,12 @@
 
 
 echo $ac_n "checking "whether we need to define __i386__"""... $ac_c" 1>&6
-echo "configure:6551: checking "whether we need to define __i386__"" >&5
+echo "configure:6594: checking "whether we need to define __i386__"" >&5
 if eval "test \"`echo '$''{'ac_cv_cpp_def_i386'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6556 "configure"
+#line 6599 "configure"
 #include "confdefs.h"
 #if (defined(i386) || defined(__i386)) && !defined(__i386__)
 yes
diff --git a/configure.in b/configure.in
index 5a0fbe5..27438c9 100644
--- a/configure.in
+++ b/configure.in
@@ -782,6 +782,21 @@
   AC_DEFINE(BITFIELDS_BIGENDIAN)
 fi
 
+AC_CACHE_CHECK( "whether unaligned memory access is allowed", wine_cv_allow_unaligned_access,
+  [AC_TRY_RUN([
+long volatile test[2];
+main()
+{
+    long volatile *ua = (long volatile *)((char *)test + 1);
+    *ua = 0;
+    exit(0);
+} ], wine_cv_allow_unaligned_access=yes, wine_cv_allow_unaligned_access=no,
+     wine_cv_allow_unaligned_access=no ) ])
+if test "$wine_allow_unaligned_access" = "yes"
+then
+  AC_DEFINE(ALLOW_UNALIGNED_ACCESS)
+fi
+
 
 dnl **** Check for functions ****
 
diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c
index df443c5..28a62ec 100644
--- a/dlls/dplayx/dplay.c
+++ b/dlls/dplayx/dplay.c
@@ -5,6 +5,7 @@
  * <presently under construction - contact hunnise@nortelnetworks.com>
  *
  */
+#include "wine/port.h"
 #include "windef.h"
 #include "winerror.h"
 #include "winbase.h"
diff --git a/dlls/user/exticon.c b/dlls/user/exticon.c
index 4089c2a..c0a419f 100644
--- a/dlls/user/exticon.c
+++ b/dlls/user/exticon.c
@@ -9,6 +9,7 @@
 #include <stdlib.h>	/* abs() */
 #include <sys/types.h>
 #include <unistd.h>
+#include "config.h"
 #include "winbase.h"
 #include "windef.h"
 #include "winerror.h"
diff --git a/dlls/version/resource.c b/dlls/version/resource.c
index cdd9a1e..d8a25b4 100644
--- a/dlls/version/resource.c
+++ b/dlls/version/resource.c
@@ -11,6 +11,8 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include "config.h"
+
 #include "winbase.h"
 #include "wine/winbase16.h"
 #include "winnls.h"
diff --git a/include/acconfig.h b/include/acconfig.h
index d1c7581..b150a19 100644
--- a/include/acconfig.h
+++ b/include/acconfig.h
@@ -6,6 +6,9 @@
 /* Define if bitfields are bigendian */
 #undef BITFIELDS_BIGENDIAN
 
+/* Define if unaligned memory access is allowed */
+#undef ALLOW_UNALIGNED_ACCESS
+
 /* Define if .type asm directive must be inside a .def directive */
 #undef NEED_TYPE_IN_DEF
 
diff --git a/include/config.h.in b/include/config.h.in
index 4226b9c..4a37aeb 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -50,6 +50,9 @@
 /* Define if bitfields are bigendian */
 #undef BITFIELDS_BIGENDIAN
 
+/* Define if unaligned memory access is allowed */
+#undef ALLOW_UNALIGNED_ACCESS
+
 /* Define if .type asm directive must be inside a .def directive */
 #undef NEED_TYPE_IN_DEF
 
diff --git a/include/windef.h b/include/windef.h
index ab98867..1ef09b2 100644
--- a/include/windef.h
+++ b/include/windef.h
@@ -166,33 +166,6 @@
 #define ADD_LOWORD(dw,val)  ((dw) = ((dw) & 0xffff0000) | LOWORD((DWORD)(dw)+(val)))
 #endif
 
-/* Macros to access unaligned or wrong-endian WORDs and DWORDs. */
-/* Note: These macros are semantically broken, at least for wrc.  wrc
-   spits out data in the platform's current binary format, *not* in 
-   little-endian format.  These macros are used throughout the resource
-   code to load and store data to the resources.  Since it is unlikely 
-   that we'll ever be dealing with little-endian resource data, the 
-   byte-swapping nature of these macros has been disabled.  Rather than 
-   remove the use of these macros from the resource loading code, the
-   macros have simply been disabled.  In the future, someone may want 
-   to reactivate these macros for other purposes.  In that case, the
-   resource code will have to be modified to use different macros. */ 
-
-#if 1
-#define PUT_WORD(ptr,w)   (*(WORD *)(ptr) = (w))
-#define GET_WORD(ptr)     (*(WORD *)(ptr))
-#define PUT_DWORD(ptr,dw) (*(DWORD *)(ptr) = (dw))
-#define GET_DWORD(ptr)    (*(DWORD *)(ptr))
-#else
-#define PUT_WORD(ptr,w)   (*(BYTE *)(ptr) = LOBYTE(w), \
-                           *((BYTE *)(ptr) + 1) = HIBYTE(w))
-#define GET_WORD(ptr)     ((WORD)(*(BYTE *)(ptr) | \
-                                  (WORD)(*((BYTE *)(ptr)+1) << 8)))
-#define PUT_DWORD(ptr,dw) (PUT_WORD((ptr),LOWORD(dw)), \
-                           PUT_WORD((WORD *)(ptr)+1,HIWORD(dw)))
-#define GET_DWORD(ptr)    ((DWORD)(GET_WORD(ptr) | \
-                                   ((DWORD)GET_WORD((WORD *)(ptr)+1) << 16)))
-#endif  /* 1 */
 
 /* min and max macros */
 #define __max(a,b) (((a) > (b)) ? (a) : (b))
diff --git a/include/wine/port.h b/include/wine/port.h
index 4465e16..421a9d5 100644
--- a/include/wine/port.h
+++ b/include/wine/port.h
@@ -142,4 +142,55 @@
 #define RTLD_GLOBAL	0x100
 #endif
 
+
+/* Macros to access unaligned or wrong-endian WORDs and DWORDs. */
+
+#define PUT_WORD(ptr, w)  (*(WORD *)(ptr) = (w))
+#define GET_WORD(ptr)     (*(WORD *)(ptr))
+#define PUT_DWORD(ptr, d) (*(DWORD *)(ptr) = (d))
+#define GET_DWORD(ptr)    (*(DWORD *)(ptr))
+
+#define PUT_LE_WORD(ptr, w) \
+        do { ((BYTE *)(ptr))[0] = LOBYTE(w); \
+             ((BYTE *)(ptr))[1] = HIBYTE(w); } while (0)
+#define GET_LE_WORD(ptr) \
+        MAKEWORD( ((BYTE *)(ptr))[0], \
+                  ((BYTE *)(ptr))[1] )
+#define PUT_LE_DWORD(ptr, d) \
+        do { PUT_LE_WORD(&((WORD *)(ptr))[0], LOWORD(d)); \
+             PUT_LE_WORD(&((WORD *)(ptr))[1], HIBYTE(d)); } while (0)
+#define GET_LE_DWORD(ptr) \
+        ((DWORD)MAKELONG( GET_LE_WORD(&((WORD *)(ptr))[0]), \
+                          GET_LE_WORD(&((WORD *)(ptr))[1]) ))
+
+#define PUT_BE_WORD(ptr, w) \
+        do { ((BYTE *)(ptr))[1] = LOBYTE(w); \
+             ((BYTE *)(ptr))[0] = HIBYTE(w); } while (0)
+#define GET_BE_WORD(ptr) \
+        MAKEWORD( ((BYTE *)(ptr))[1], \
+                  ((BYTE *)(ptr))[0] )
+#define PUT_BE_DWORD(ptr, d) \
+        do { PUT_BE_WORD(&((WORD *)(ptr))[1], LOWORD(d)); \
+             PUT_BE_WORD(&((WORD *)(ptr))[0], HIBYTE(d)); } while (0)
+#define GET_BE_DWORD(ptr) \
+        ((DWORD)MAKELONG( GET_BE_WORD(&((WORD *)(ptr))[1]), \
+                          GET_BE_WORD(&((WORD *)(ptr))[0]) ))
+
+#if defined(ALLOW_UNALIGNED_ACCESS)
+#define PUT_UA_WORD(ptr, w)  PUT_WORD(ptr, w)
+#define GET_UA_WORD(ptr)     GET_WORD(ptr)
+#define PUT_UA_DWORD(ptr, d) PUT_DWORD(ptr, d)
+#define GET_UA_DWORD(ptr)    GET_DWORD(ptr)
+#elif defined(WORDS_BIGENDIAN)
+#define PUT_UA_WORD(ptr, w)  PUT_BE_WORD(ptr, w)
+#define GET_UA_WORD(ptr)     GET_BE_WORD(ptr)
+#define PUT_UA_DWORD(ptr, d) PUT_BE_DWORD(ptr, d)
+#define GET_UA_DWORD(ptr)    GET_BE_DWORD(ptr)
+#else
+#define PUT_UA_WORD(ptr, w)  PUT_LE_WORD(ptr, w)
+#define GET_UA_WORD(ptr)     GET_LE_WORD(ptr)
+#define PUT_UA_DWORD(ptr, d) PUT_LE_DWORD(ptr, d)
+#define GET_UA_DWORD(ptr)    GET_LE_DWORD(ptr)
+#endif
+
 #endif /* !defined(__WINE_WINE_PORT_H) */
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index 6549381..41aefdd 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -13,6 +13,8 @@
 #include <stdlib.h>
 #include <sys/types.h>
 
+#include "config.h"
+
 #include "wine/unicode.h"
 #include "windef.h"
 #include "winnls.h"
diff --git a/loader/task.c b/loader/task.c
index f38f2b2..14e1407 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -9,6 +9,7 @@
 #include <assert.h>
 #include <unistd.h>
 
+#include "wine/port.h"
 #include "wine/winbase16.h"
 #include "ntddk.h"
 #include "callback.h"
@@ -272,8 +273,8 @@
 
     pTask->pdb.int20 = 0x20cd;
     pTask->pdb.dispatcher[0] = 0x9a;  /* ljmp */
-    PUT_DWORD(&pTask->pdb.dispatcher[1], (DWORD)GetProcAddress16( GetModuleHandle16("KERNEL"),
-                                                                  "DOS3Call" ));
+    PUT_UA_DWORD(&pTask->pdb.dispatcher[1], 
+                 (DWORD)GetProcAddress16( GetModuleHandle16("KERNEL"), "DOS3Call" ));
     pTask->pdb.savedint22 = INT_GetPMHandler( 0x22 );
     pTask->pdb.savedint23 = INT_GetPMHandler( 0x23 );
     pTask->pdb.savedint24 = INT_GetPMHandler( 0x24 );
diff --git a/memory/environ.c b/memory/environ.c
index 6630137..e7bf71c 100644
--- a/memory/environ.c
+++ b/memory/environ.c
@@ -6,6 +6,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include "wine/port.h"
 #include "windef.h"
 #include "winnls.h"
 #include "winerror.h"
@@ -59,7 +60,7 @@
 /* Fill the extra bytes with the program name and stuff */
 #define FILL_EXTRA_ENV(p) \
     *(p) = '\0'; \
-    PUT_WORD( (p) + 1, 1 ); \
+    PUT_UA_WORD( (p) + 1, 1 ); \
     strcpy( (p) + 3, ENV_program_name );
 
 STARTUPINFOA current_startupinfo =
diff --git a/memory/heap.c b/memory/heap.c
index 0437a0c..c73d52a 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -9,6 +9,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include "config.h"
 #include "wine/winbase16.h"
 #include "wine/unicode.h"
 #include "selectors.h"
@@ -682,6 +683,16 @@
 {
     char *heapEnd = (char *)subheap + subheap->size;
 
+#if !defined(ALLOW_UNALIGNED_ACCESS)
+    /* Check for unaligned pointers */
+    if ( (long)pArena % sizeof(void *) != 0 )
+    {
+        ERR( "Heap %08lx: unaligned arena pointer %08lx\n",
+             (DWORD)subheap->heap, (DWORD)pArena );
+        return FALSE;
+    }
+#endif
+
     /* Check magic number */
     if (pArena->magic != ARENA_FREE_MAGIC)
     {
@@ -766,6 +777,28 @@
 {
     char *heapEnd = (char *)subheap + subheap->size;
 
+#if !defined(ALLOW_UNALIGNED_ACCESS)
+    /* Check for unaligned pointers */
+    if ( (long)pArena % sizeof(void *) != 0 )
+    {
+        if ( quiet == NOISY )
+        {
+            ERR( "Heap %08lx: unaligned arena pointer %08lx\n",
+                  (DWORD)subheap->heap, (DWORD)pArena );
+            if ( TRACE_ON(heap) )
+                HEAP_Dump( subheap->heap );
+        }
+        else if ( WARN_ON(heap) )
+        {
+            WARN( "Heap %08lx: unaligned arena pointer %08lx\n",
+                  (DWORD)subheap->heap, (DWORD)pArena );
+            if ( TRACE_ON(heap) )
+                HEAP_Dump( subheap->heap );
+        }
+        return FALSE;
+    }
+#endif
+
     /* Check magic number */
     if (pArena->magic != ARENA_INUSE_MAGIC)
     {
diff --git a/windows/class.c b/windows/class.c
index e5caf8e..cf335a2 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -20,6 +20,7 @@
 #include "wingdi.h"
 #include "wine/winuser16.h"
 #include "wine/unicode.h"
+#include "wine/port.h"
 #include "heap.h"
 #include "win.h"
 #include "controls.h"
diff --git a/windows/dialog.c b/windows/dialog.c
index 3fb66e2..3dafcf1 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -20,6 +20,7 @@
 #include "wine/winuser16.h"
 #include "wine/winbase16.h"
 #include "wine/unicode.h"
+#include "wine/port.h"
 #include "controls.h"
 #include "heap.h"
 #include "win.h"