If the dibsection is based on a file-mapping object, then make sure
[wine] / dlls / kernel / resource16.c
index 8cfbe60..f227c09 100644 (file)
@@ -25,6 +25,7 @@
 #include "wine/port.h"
 
 #include <stdarg.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/types.h>
@@ -36,7 +37,6 @@
 #include "wine/winuser16.h"
 #include "wine/unicode.h"
 #include "module.h"
-#include "task.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(resource);
@@ -95,10 +95,15 @@ static HRSRC16 MapHRsrc32To16( NE_MODULE *pModule, HRSRC hRsrc32, WORD type )
     /* If no space left, grow table */
     if ( map->nUsed == map->nAlloc )
     {
-        if ( !(newElem = (HRSRC_ELEM *)HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
-                                                    map->elem,
-                                                    (map->nAlloc + HRSRC_MAP_BLOCKSIZE)
-                                                    * sizeof(HRSRC_ELEM) ) ))
+
+       if (map->elem)
+           newElem = (HRSRC_ELEM *)HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+                    map->elem, (map->nAlloc + HRSRC_MAP_BLOCKSIZE) * sizeof(HRSRC_ELEM) );
+       else
+           newElem = (HRSRC_ELEM *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+                    (map->nAlloc + HRSRC_MAP_BLOCKSIZE) * sizeof(HRSRC_ELEM) );
+
+        if ( !newElem )
         {
             ERR("Cannot grow HRSRC map\n" );
             return 0;
@@ -404,143 +409,185 @@ FARPROC16 WINAPI SetResourceHandler16( HMODULE16 hModule, LPCSTR typeId, FARPROC
     return prevHandler;
 }
 
+static inline DWORD get_dword(LPVOID *p)
+{
+    DWORD ret = *(DWORD*)*p;
+    *p = (DWORD *)*p + 1;
+    return ret;
+}
+
+static inline void put_dword(LPVOID *p, DWORD d)
+{
+    *(DWORD*)*p = d;
+    *p = (DWORD *)*p + 1;
+}
+
+static inline WORD get_word(LPVOID *p)
+{
+    WORD ret = *(WORD*)*p;
+    *p = (WORD *)*p + 1;
+    return ret;
+}
+
+static inline void put_word(LPVOID *p, WORD w)
+{
+    *(WORD*)*p = w;
+    *p = (WORD *)*p + 1;
+}
+
+static inline BYTE get_byte(LPVOID *p)
+{
+    BYTE ret = *(BYTE *)*p;
+    *p = (BYTE *)*p + 1;
+    return ret;
+}
+
+static inline void put_byte(LPVOID *p, BYTE b)
+{
+    *(BYTE *)*p = b;
+    *p = (BYTE *)*p + 1;
+}
+
+/* convert a resource name */
+static void convert_name( LPVOID *dst, LPVOID *src )
+{
+    int len;
+    switch (*((WORD *)*src))
+    {
+    case 0x0000:
+        get_word( src );
+        put_byte( dst, 0 );
+        break;
+    case 0xffff:
+        get_word( src );
+        put_byte( dst, 0xff );
+        put_word( dst, get_word(src) );
+        break;
+    default:
+        len = WideCharToMultiByte( CP_ACP, 0, *src, -1, *dst, 0x7fffffff, NULL,NULL );
+        *dst = (char *)*dst + len;
+        *src = (WCHAR *)*src + strlenW( (WCHAR *)*src ) + 1;
+        break;
+    }
+}
 
 /**********************************************************************
  *         ConvertDialog32To16   (KERNEL.615)
  */
 VOID WINAPI ConvertDialog32To16( LPVOID dialog32, DWORD size, LPVOID dialog16 )
 {
-    LPVOID p = dialog32;
     WORD nbItems, data, dialogEx;
     DWORD style;
 
-    style = *((DWORD *)dialog16)++ = *((DWORD *)p)++;
+    style = get_dword( &dialog32 );
+    put_dword( &dialog16, style );
     dialogEx = (style == 0xffff0001);  /* DIALOGEX resource */
     if (dialogEx)
     {
-        *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* helpID */
-        *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* exStyle */
-        style = *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* style */
+        put_dword( &dialog16, get_dword( &dialog32 ) );  /* helpID */
+        put_dword( &dialog16, get_dword( &dialog32 ) );  /* exStyle */
+        style = get_dword( &dialog32 );
+        put_dword( &dialog16, style );                   /* style */
     }
     else
-        ((DWORD *)p)++; /* exStyle ignored in 16-bit standard dialog */
+        dialog32 = (DWORD *)dialog32 + 1; /* exStyle ignored in 16-bit standard dialog */
 
-    nbItems = *((BYTE *)dialog16)++ = (BYTE)*((WORD *)p)++;
-    *((WORD *)dialog16)++ = *((WORD *)p)++; /* x */
-    *((WORD *)dialog16)++ = *((WORD *)p)++; /* y */
-    *((WORD *)dialog16)++ = *((WORD *)p)++; /* cx */
-    *((WORD *)dialog16)++ = *((WORD *)p)++; /* cy */
+    nbItems = get_word( &dialog32 );
+    put_byte( &dialog16, nbItems );
+    put_word( &dialog16, get_word( &dialog32 ) ); /* x */
+    put_word( &dialog16, get_word( &dialog32 ) ); /* y */
+    put_word( &dialog16, get_word( &dialog32 ) ); /* cx */
+    put_word( &dialog16, get_word( &dialog32 ) ); /* cy */
 
     /* Transfer menu name */
-    switch (*((WORD *)p))
-    {
-    case 0x0000:  ((WORD *)p)++; *((BYTE *)dialog16)++ = 0; break;
-    case 0xffff:  ((WORD *)p)++; *((BYTE *)dialog16)++ = 0xff;
-                  *((WORD *)dialog16)++ = *((WORD *)p)++; break;
-    default:      WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)dialog16, 0x7fffffff, NULL,NULL );
-                  ((LPSTR)dialog16) += strlen( (LPSTR)dialog16 ) + 1;
-                  ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
-                  break;
-    }
+    convert_name( &dialog16, &dialog32 );
 
     /* Transfer class name */
-    switch (*((WORD *)p))
-    {
-    case 0x0000:  ((WORD *)p)++; *((BYTE *)dialog16)++ = 0; break;
-    case 0xffff:  ((WORD *)p)++; *((BYTE *)dialog16)++ = 0xff;
-                  *((WORD *)dialog16)++ = *((WORD *)p)++; break;
-    default:      WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)dialog16, 0x7fffffff, NULL,NULL );
-                  ((LPSTR)dialog16) += strlen( (LPSTR)dialog16 ) + 1;
-                  ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
-                  break;
-    }
+    convert_name( &dialog16, &dialog32 );
 
     /* Transfer window caption */
-    WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)dialog16, 0x7fffffff, NULL,NULL );
-    ((LPSTR)dialog16) += strlen( (LPSTR)dialog16 ) + 1;
-    ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+    WideCharToMultiByte( CP_ACP, 0, dialog32, -1, dialog16, 0x7fffffff, NULL, NULL );
+    dialog16 = (LPSTR)dialog16 + strlen( (LPSTR)dialog16 ) + 1;
+    dialog32 = (LPWSTR)dialog32 + strlenW( (LPWSTR)dialog32 ) + 1;
 
     /* Transfer font info */
     if (style & DS_SETFONT)
     {
-        *((WORD *)dialog16)++ = *((WORD *)p)++;  /* pointSize */
+        put_word( &dialog16, get_word( &dialog32 ) );  /* pointSize */
         if (dialogEx)
         {
-            *((WORD *)dialog16)++ = *((WORD *)p)++; /* weight */
-            *((WORD *)dialog16)++ = *((WORD *)p)++; /* italic */
+            put_word( &dialog16, get_word( &dialog32 ) ); /* weight */
+            put_word( &dialog16, get_word( &dialog32 ) ); /* italic */
         }
-        WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)dialog16, 0x7fffffff, NULL,NULL );  /* faceName */
-        ((LPSTR)dialog16) += strlen( (LPSTR)dialog16 ) + 1;
-        ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+        WideCharToMultiByte( CP_ACP, 0, (LPWSTR)dialog32, -1, (LPSTR)dialog16, 0x7fffffff, NULL, NULL );  /* faceName */
+        dialog16 = (LPSTR)dialog16 + strlen( (LPSTR)dialog16 ) + 1;
+        dialog32 = (LPWSTR)dialog32 + strlenW( (LPWSTR)dialog32 ) + 1;
     }
 
     /* Transfer dialog items */
     while (nbItems)
     {
         /* align on DWORD boundary (32-bit only) */
-        p = (LPVOID)((((int)p) + 3) & ~3);
+        dialog32 = (LPVOID)((((int)dialog32) + 3) & ~3);
 
         if (dialogEx)
         {
-            *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* helpID */
-            *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* exStyle */
-            *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* style */
+            put_dword( &dialog16, get_dword( &dialog32 ) ); /* helpID */
+            put_dword( &dialog16, get_dword( &dialog32 ) ); /* exStyle */
+            put_dword( &dialog16, get_dword( &dialog32 ) ); /* style */
         }
         else
         {
-            style = *((DWORD *)p)++; /* save style */
-            ((DWORD *)p)++;          /* ignore exStyle */
+            style = get_dword( &dialog32 );    /* save style */
+            dialog32 = (DWORD *)dialog32 + 1;  /* ignore exStyle */
         }
 
-        *((WORD *)dialog16)++ = *((WORD *)p)++; /* x */
-        *((WORD *)dialog16)++ = *((WORD *)p)++; /* y */
-        *((WORD *)dialog16)++ = *((WORD *)p)++; /* cx */
-        *((WORD *)dialog16)++ = *((WORD *)p)++; /* cy */
+        put_word( &dialog16, get_word( &dialog32 ) ); /* x */
+        put_word( &dialog16, get_word( &dialog32 ) ); /* y */
+        put_word( &dialog16, get_word( &dialog32 ) ); /* cx */
+        put_word( &dialog16, get_word( &dialog32 ) ); /* cy */
 
         if (dialogEx)
-            *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* ID */
+            put_dword( &dialog16, get_dword( &dialog32 ) ); /* ID */
         else
         {
-            *((WORD *)dialog16)++ = *((WORD *)p)++; /* ID */
-            *((DWORD *)dialog16)++ = style;  /* style from above */
+            put_word( &dialog16, get_word( &dialog32 ) ); /* ID */
+            put_dword( &dialog16, style );  /* style from above */
         }
 
         /* Transfer class name */
-        switch (*((WORD *)p))
+        switch (*(WORD *)dialog32)
         {
-        case 0x0000:  ((WORD *)p)++; *((BYTE *)dialog16)++ = 0; break;
-        case 0xffff:  ((WORD *)p)++;
-                      *((BYTE *)dialog16)++ = (BYTE)*((WORD *)p)++; break;
-        default:      WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)dialog16, 0x7fffffff, NULL,NULL );
-                      ((LPSTR)dialog16) += strlen( (LPSTR)dialog16 ) + 1;
-                      ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
-                      break;
+        case 0x0000:
+            get_word( &dialog32 );
+            put_byte( &dialog16, 0 );
+            break;
+        case 0xffff:
+            get_word( &dialog32 );
+            put_byte( &dialog16, get_word( &dialog32 ) );
+            break;
+        default:
+            WideCharToMultiByte( CP_ACP, 0, (LPWSTR)dialog32, -1, (LPSTR)dialog16, 0x7fffffff, NULL, NULL );
+            dialog16 = (LPSTR)dialog16 + strlen( (LPSTR)dialog16 ) + 1;
+            dialog32 = (LPWSTR)dialog32 + strlenW( (LPWSTR)dialog32 ) + 1;
+            break;
         }
 
         /* Transfer window name */
-        switch (*((WORD *)p))
-        {
-        case 0x0000:  ((WORD *)p)++; *((BYTE *)dialog16)++ = 0; break;
-        case 0xffff:  ((WORD *)p)++; *((BYTE *)dialog16)++ = 0xff;
-                      *((WORD *)dialog16)++ = *((WORD *)p)++; break;
-        default:      WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)dialog16, 0x7fffffff, NULL,NULL );
-                      ((LPSTR)dialog16) += strlen( (LPSTR)dialog16 ) + 1;
-                      ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
-                      break;
-        }
+        convert_name( &dialog16, &dialog32 );
 
         /* Transfer data */
-        data = *((WORD *)p)++;
+        data = get_word( &dialog32 );
         if (dialogEx)
-            *((WORD *)dialog16)++ = data;
+            put_word(&dialog16, data);
         else
-            *((BYTE *)dialog16)++ = (BYTE)data;
+            put_byte(&dialog16,(BYTE)data);
 
         if (data)
         {
-            memcpy( dialog16, p, data );
-            (LPSTR)dialog16 += data;
-            (LPSTR)p += data;
+            memcpy( dialog16, dialog32, data );
+            dialog16 = (BYTE *)dialog16 + data;
+            dialog32 = (BYTE *)dialog32 + data;
         }
 
         /* Next item */
@@ -558,52 +605,52 @@ WORD WINAPI GetDialog32Size16( LPVOID dialog32 )
     WORD nbItems, data, dialogEx;
     DWORD style;
 
-    style = *((DWORD *)p)++;
+    style = get_dword(&p);
     dialogEx = (style == 0xffff0001);  /* DIALOGEX resource */
     if (dialogEx)
     {
-        ((DWORD *)p)++; /* helpID */
-        ((DWORD *)p)++; /* exStyle */
-        style = *((DWORD *)p)++; /* style */
+        p = (DWORD *)p + 1; /* helpID */
+        p = (DWORD *)p + 1; /* exStyle */
+        style = get_dword(&p); /* style */
     }
     else
-        ((DWORD *)p)++; /* exStyle */
+        p = (DWORD *)p + 1; /* exStyle */
 
-    nbItems = *((WORD *)p)++;
-    ((WORD *)p)++; /* x */
-    ((WORD *)p)++; /* y */
-    ((WORD *)p)++; /* cx */
-    ((WORD *)p)++; /* cy */
+    nbItems = get_word(&p);
+    p = (WORD *)p + 1; /* x */
+    p = (WORD *)p + 1; /* y */
+    p = (WORD *)p + 1; /* cx */
+    p = (WORD *)p + 1; /* cy */
 
     /* Skip menu name */
     switch (*((WORD *)p))
     {
-    case 0x0000:  ((WORD *)p)++; break;
-    case 0xffff:  ((WORD *)p) += 2; break;
-    default:      ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1; break;
+    case 0x0000:  p = (WORD *)p + 1; break;
+    case 0xffff:  p = (WORD *)p + 2; break;
+    default:      p = (LPWSTR)p + strlenW( (LPWSTR)p ) + 1; break;
     }
 
     /* Skip class name */
     switch (*((WORD *)p))
     {
-    case 0x0000:  ((WORD *)p)++; break;
-    case 0xffff:  ((WORD *)p) += 2; break;
-    default:      ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1; break;
+    case 0x0000:  p = (WORD *)p + 1; break;
+    case 0xffff:  p = (WORD *)p + 2; break;
+    default:      p = (LPWSTR)p + strlenW( (LPWSTR)p ) + 1; break;
     }
 
     /* Skip window caption */
-    ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+    p = (LPWSTR)p + strlenW( (LPWSTR)p ) + 1;
 
     /* Skip font info */
     if (style & DS_SETFONT)
     {
-        ((WORD *)p)++;  /* pointSize */
+        p = (WORD *)p + 1;  /* pointSize */
         if (dialogEx)
         {
-            ((WORD *)p)++; /* weight */
-            ((WORD *)p)++; /* italic */
+            p = (WORD *)p + 1; /* weight */
+            p = (WORD *)p + 1; /* italic */
         }
-        ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;  /* faceName */
+        p = (LPWSTR)p + strlenW( (LPWSTR)p ) + 1;  /* faceName */
     }
 
     /* Skip dialog items */
@@ -614,45 +661,45 @@ WORD WINAPI GetDialog32Size16( LPVOID dialog32 )
 
         if (dialogEx)
         {
-            ((DWORD *)p)++; /* helpID */
-            ((DWORD *)p)++; /* exStyle */
-            ((DWORD *)p)++; /* style */
+            p = (DWORD *)p + 1; /* helpID */
+            p = (DWORD *)p + 1; /* exStyle */
+            p = (DWORD *)p + 1; /* style */
         }
         else
         {
-            ((DWORD *)p)++; /* style */
-            ((DWORD *)p)++; /* exStyle */
+            p = (DWORD *)p + 1; /* style */
+            p = (DWORD *)p + 1; /* exStyle */
         }
 
-        ((WORD *)p)++; /* x */
-        ((WORD *)p)++; /* y */
-        ((WORD *)p)++; /* cx */
-        ((WORD *)p)++; /* cy */
+        p = (WORD *)p + 1; /* x */
+        p = (WORD *)p + 1; /* y */
+        p = (WORD *)p + 1; /* cx */
+        p = (WORD *)p + 1; /* cy */
 
         if (dialogEx)
-            ((DWORD *)p)++; /* ID */
+            p = (DWORD *)p + 1; /* ID */
         else
-            ((WORD *)p)++; /* ID */
+            p = (WORD *)p + 1; /* ID */
 
         /* Skip class name */
         switch (*((WORD *)p))
         {
-        case 0x0000:  ((WORD *)p)++; break;
-        case 0xffff:  ((WORD *)p) += 2; break;
-        default:      ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1; break;
+        case 0x0000:  p = (WORD *)p + 1; break;
+        case 0xffff:  p = (WORD *)p + 2; break;
+        default:      p = (LPWSTR)p + strlenW( (LPWSTR)p ) + 1; break;
         }
 
         /* Skip window name */
         switch (*((WORD *)p))
         {
-        case 0x0000:  ((WORD *)p)++; break;
-        case 0xffff:  ((WORD *)p) += 2; break;
-        default:      ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1; break;
+        case 0x0000:  p = (WORD *)p + 1; break;
+        case 0xffff:  p = (WORD *)p + 2; break;
+        default:      p = (LPWSTR)p + strlenW( (LPWSTR)p ) + 1; break;
         }
 
         /* Skip data */
-        data = *((WORD *)p)++;
-        (LPSTR)p += data;
+        data = get_word(&p);
+        p = (BYTE *)p + data;
 
         /* Next item */
         nbItems--;
@@ -667,52 +714,55 @@ WORD WINAPI GetDialog32Size16( LPVOID dialog32 )
  */
 VOID WINAPI ConvertMenu32To16( LPVOID menu32, DWORD size, LPVOID menu16 )
 {
-    LPVOID p = menu32;
     WORD version, headersize, flags, level = 1;
 
-    version = *((WORD *)menu16)++ = *((WORD *)p)++;
-    headersize = *((WORD *)menu16)++ = *((WORD *)p)++;
+    version = get_word( &menu32 );
+    headersize = get_word( &menu32 );
+    put_word( &menu16, version );
+    put_word( &menu16, headersize );
     if ( headersize )
     {
-        memcpy( menu16, p, headersize );
-        ((LPSTR)menu16) += headersize;
-        ((LPSTR)p) += headersize;
+        memcpy( menu16, menu32, headersize );
+        menu16 = (BYTE *)menu16 + headersize;
+        menu32 = (BYTE *)menu32 + headersize;
     }
 
     while ( level )
         if ( version == 0 )  /* standard */
         {
-            flags = *((WORD *)menu16)++ = *((WORD *)p)++;
+            flags = get_word( &menu32 );
+            put_word( &menu16, flags );
             if ( !(flags & MF_POPUP) )
-                *((WORD *)menu16)++ = *((WORD *)p)++;  /* ID */
+                put_word( &menu16, get_word( &menu32 ) );  /* ID */
             else
                 level++;
 
-            WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)menu16, 0x7fffffff, NULL,NULL );
-            ((LPSTR)menu16) += strlen( (LPSTR)menu16 ) + 1;
-            ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+            WideCharToMultiByte( CP_ACP, 0, (LPWSTR)menu32, -1, (LPSTR)menu16, 0x7fffffff, NULL, NULL );
+            menu16 = (LPSTR)menu16 + strlen( (LPSTR)menu16 ) + 1;
+            menu32 = (LPWSTR)menu32 + strlenW( (LPWSTR)menu32 ) + 1;
 
             if ( flags & MF_END )
                 level--;
         }
         else  /* extended */
         {
-            *((DWORD *)menu16)++ = *((DWORD *)p)++;  /* fType */
-            *((DWORD *)menu16)++ = *((DWORD *)p)++;  /* fState */
-            *((WORD *)menu16)++ = (WORD)*((DWORD *)p)++; /* ID */
-            flags = *((BYTE *)menu16)++ = (BYTE)*((WORD *)p)++;
+            put_dword( &menu16, get_dword( &menu32 ) );  /* fType */
+            put_dword( &menu16, get_dword( &menu32 ) );  /* fState */
+            put_word( &menu16, get_dword( &menu32 ) );   /* ID */
+            flags = get_word( &menu32 );
+            put_byte(&menu16,flags);
 
-            WideCharToMultiByte( CP_ACP, 0, (LPWSTR)p, -1, (LPSTR)menu16, 0x7fffffff, NULL,NULL );
-            ((LPSTR)menu16) += strlen( (LPSTR)menu16 ) + 1;
-            ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+            WideCharToMultiByte( CP_ACP, 0, (LPWSTR)menu32, -1, (LPSTR)menu16, 0x7fffffff, NULL, NULL );
+            menu16 = (LPSTR)menu16 + strlen( (LPSTR)menu16 ) + 1;
+            menu32 = (LPWSTR)menu32 + strlenW( (LPWSTR)menu32 ) + 1;
 
             /* align on DWORD boundary (32-bit only) */
-            p = (LPVOID)((((int)p) + 3) & ~3);
+            menu32 = (LPVOID)((((int)menu32) + 3) & ~3);
 
             /* If popup, transfer helpid */
             if ( flags & 1)
             {
-                *((DWORD *)menu16)++ = *((DWORD *)p)++;
+                put_dword( &menu16, get_dword( &menu32 ) );
                 level++;
             }
 
@@ -730,32 +780,32 @@ WORD WINAPI GetMenu32Size16( LPVOID menu32 )
     LPVOID p = menu32;
     WORD version, headersize, flags, level = 1;
 
-    version = *((WORD *)p)++;
-    headersize = *((WORD *)p)++;
-    ((LPSTR)p) += headersize;
+    version = get_word(&p);
+    headersize = get_word(&p);
+    p = (BYTE *)p + headersize;
 
     while ( level )
         if ( version == 0 )  /* standard */
         {
-            flags = *((WORD *)p)++;
+            flags = get_word(&p);
             if ( !(flags & MF_POPUP) )
-                ((WORD *)p)++;  /* ID */
+                p = (WORD *)p + 1;  /* ID */
             else
                 level++;
 
-            ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+            p = (LPWSTR)p + strlenW( (LPWSTR)p ) + 1;
 
             if ( flags & MF_END )
                 level--;
         }
         else  /* extended */
         {
-            ((DWORD *)p)++; /* fType */
-            ((DWORD *)p)++; /* fState */
-            ((DWORD *)p)++; /* ID */
-            flags = *((WORD *)p)++;
+            p = (DWORD *)p + 1; /* fType */
+            p = (DWORD *)p + 1; /* fState */
+            p = (DWORD *)p + 1; /* ID */
+            flags = get_word(&p);
 
-            ((LPWSTR)p) += strlenW( (LPWSTR)p ) + 1;
+            p = (LPWSTR)p + strlenW( (LPWSTR)p ) + 1;
 
             /* align on DWORD boundary (32-bit only) */
             p = (LPVOID)((((int)p) + 3) & ~3);
@@ -763,7 +813,7 @@ WORD WINAPI GetMenu32Size16( LPVOID menu32 )
             /* If popup, skip helpid */
             if ( flags & 1)
             {
-                ((DWORD *)p)++;
+                p = (DWORD *)p + 1;
                 level++;
             }
 
@@ -780,19 +830,20 @@ WORD WINAPI GetMenu32Size16( LPVOID menu32 )
  */
 static void ConvertAccelerator32To16( LPVOID acc32, DWORD size, LPVOID acc16 )
 {
-    int type;
+    BYTE type;
 
     do
     {
         /* Copy type */
-        type = *((BYTE *)acc16)++ = *((BYTE *)acc32)++;
+        type = get_byte(&acc32);
+        put_byte(&acc16, type);
         /* Skip padding */
-        ((BYTE *)acc32)++;
+        get_byte(&acc32);
         /* Copy event and IDval */
-        *((WORD *)acc16)++ = *((WORD *)acc32)++;
-        *((WORD *)acc16)++ = *((WORD *)acc32)++;
+        put_word(&acc16, get_word(&acc32));
+        put_word(&acc16, get_word(&acc32));
         /* Skip padding */
-        ((WORD *)acc32)++;
+        get_word(&acc32);
 
     } while ( !( type & 0x80 ) );
 }
@@ -811,16 +862,16 @@ static HGLOBAL16 NE_LoadPEResource( NE_MODULE *pModule, WORD type, LPVOID bits,
 
     switch (type)
     {
-    case RT_MENU16:
+    case RT_MENU:
         ConvertMenu32To16( bits, size, GlobalLock16( handle ) );
         break;
-    case RT_DIALOG16:
+    case RT_DIALOG:
         ConvertDialog32To16( bits, size, GlobalLock16( handle ) );
         break;
-    case RT_ACCELERATOR16:
+    case RT_ACCELERATOR:
         ConvertAccelerator32To16( bits, size, GlobalLock16( handle ) );
         break;
-    case RT_STRING16:
+    case RT_STRING:
         FIXME("not yet implemented!\n" );
         /* fall through */
     default: