2 * PE->NE resource conversion functions
4 * Copyright 1998 Ulrich Weigand
8 #include "wine/winuser16.h"
11 #include "debugtools.h"
13 /**********************************************************************
14 * ConvertDialog32To16 (KERNEL.615)
16 VOID WINAPI ConvertDialog32To16( LPVOID dialog32, DWORD size, LPVOID dialog16 )
19 WORD nbItems, data, dialogEx;
22 style = *((DWORD *)dialog16)++ = *((DWORD *)p)++;
23 dialogEx = (style == 0xffff0001); /* DIALOGEX resource */
26 *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* helpID */
27 *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* exStyle */
28 style = *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* style */
31 ((DWORD *)p)++; /* exStyle ignored in 16-bit standard dialog */
33 nbItems = *((BYTE *)dialog16)++ = (BYTE)*((WORD *)p)++;
34 *((WORD *)dialog16)++ = *((WORD *)p)++; /* x */
35 *((WORD *)dialog16)++ = *((WORD *)p)++; /* y */
36 *((WORD *)dialog16)++ = *((WORD *)p)++; /* cx */
37 *((WORD *)dialog16)++ = *((WORD *)p)++; /* cy */
39 /* Transfer menu name */
42 case 0x0000: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0; break;
43 case 0xffff: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0xff;
44 *((WORD *)dialog16)++ = *((WORD *)p)++; break;
45 default: lstrcpyWtoA( (LPSTR)dialog16, (LPWSTR)p );
46 ((LPSTR)dialog16) += lstrlenA( (LPSTR)dialog16 ) + 1;
47 ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1;
51 /* Transfer class name */
54 case 0x0000: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0; break;
55 case 0xffff: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0xff;
56 *((WORD *)dialog16)++ = *((WORD *)p)++; break;
57 default: lstrcpyWtoA( (LPSTR)dialog16, (LPWSTR)p );
58 ((LPSTR)dialog16) += lstrlenA( (LPSTR)dialog16 ) + 1;
59 ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1;
63 /* Transfer window caption */
64 lstrcpyWtoA( (LPSTR)dialog16, (LPWSTR)p );
65 ((LPSTR)dialog16) += lstrlenA( (LPSTR)dialog16 ) + 1;
66 ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1;
68 /* Transfer font info */
69 if (style & DS_SETFONT)
71 *((WORD *)dialog16)++ = *((WORD *)p)++; /* pointSize */
74 *((WORD *)dialog16)++ = *((WORD *)p)++; /* weight */
75 *((WORD *)dialog16)++ = *((WORD *)p)++; /* italic */
77 lstrcpyWtoA( (LPSTR)dialog16, (LPWSTR)p ); /* faceName */
78 ((LPSTR)dialog16) += lstrlenA( (LPSTR)dialog16 ) + 1;
79 ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1;
82 /* Transfer dialog items */
85 /* align on DWORD boundary (32-bit only) */
86 p = (LPVOID)((((int)p) + 3) & ~3);
90 *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* helpID */
91 *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* exStyle */
92 *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* style */
96 style = *((DWORD *)p)++; /* save style */
97 ((DWORD *)p)++; /* ignore exStyle */
100 *((WORD *)dialog16)++ = *((WORD *)p)++; /* x */
101 *((WORD *)dialog16)++ = *((WORD *)p)++; /* y */
102 *((WORD *)dialog16)++ = *((WORD *)p)++; /* cx */
103 *((WORD *)dialog16)++ = *((WORD *)p)++; /* cy */
106 *((DWORD *)dialog16)++ = *((DWORD *)p)++; /* ID */
109 *((WORD *)dialog16)++ = *((WORD *)p)++; /* ID */
110 *((DWORD *)dialog16)++ = style; /* style from above */
113 /* Transfer class name */
114 switch (*((WORD *)p))
116 case 0x0000: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0; break;
117 case 0xffff: ((WORD *)p)++;
118 *((BYTE *)dialog16)++ = (BYTE)*((WORD *)p)++; break;
119 default: lstrcpyWtoA( (LPSTR)dialog16, (LPWSTR)p );
120 ((LPSTR)dialog16) += lstrlenA( (LPSTR)dialog16 ) + 1;
121 ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1;
125 /* Transfer window name */
126 switch (*((WORD *)p))
128 case 0x0000: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0; break;
129 case 0xffff: ((WORD *)p)++; *((BYTE *)dialog16)++ = 0xff;
130 *((WORD *)dialog16)++ = *((WORD *)p)++; break;
131 default: lstrcpyWtoA( (LPSTR)dialog16, (LPWSTR)p );
132 ((LPSTR)dialog16) += lstrlenA( (LPSTR)dialog16 ) + 1;
133 ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1;
138 data = *((WORD *)p)++;
140 *((WORD *)dialog16)++ = data;
142 *((BYTE *)dialog16)++ = (BYTE)data;
146 memcpy( dialog16, p, data );
147 (LPSTR)dialog16 += data;
156 /**********************************************************************
157 * GetDialog32Size (KERNEL.618)
159 WORD WINAPI GetDialog32Size16( LPVOID dialog32 )
162 WORD nbItems, data, dialogEx;
165 style = *((DWORD *)p)++;
166 dialogEx = (style == 0xffff0001); /* DIALOGEX resource */
169 ((DWORD *)p)++; /* helpID */
170 ((DWORD *)p)++; /* exStyle */
171 style = *((DWORD *)p)++; /* style */
174 ((DWORD *)p)++; /* exStyle */
176 nbItems = *((WORD *)p)++;
177 ((WORD *)p)++; /* x */
178 ((WORD *)p)++; /* y */
179 ((WORD *)p)++; /* cx */
180 ((WORD *)p)++; /* cy */
183 switch (*((WORD *)p))
185 case 0x0000: ((WORD *)p)++; break;
186 case 0xffff: ((WORD *)p) += 2; break;
187 default: ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1; break;
190 /* Skip class name */
191 switch (*((WORD *)p))
193 case 0x0000: ((WORD *)p)++; break;
194 case 0xffff: ((WORD *)p) += 2; break;
195 default: ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1; break;
198 /* Skip window caption */
199 ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1;
202 if (style & DS_SETFONT)
204 ((WORD *)p)++; /* pointSize */
207 ((WORD *)p)++; /* weight */
208 ((WORD *)p)++; /* italic */
210 ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1; /* faceName */
213 /* Skip dialog items */
216 /* align on DWORD boundary */
217 p = (LPVOID)((((int)p) + 3) & ~3);
221 ((DWORD *)p)++; /* helpID */
222 ((DWORD *)p)++; /* exStyle */
223 ((DWORD *)p)++; /* style */
227 ((DWORD *)p)++; /* style */
228 ((DWORD *)p)++; /* exStyle */
231 ((WORD *)p)++; /* x */
232 ((WORD *)p)++; /* y */
233 ((WORD *)p)++; /* cx */
234 ((WORD *)p)++; /* cy */
237 ((DWORD *)p)++; /* ID */
239 ((WORD *)p)++; /* ID */
241 /* Skip class name */
242 switch (*((WORD *)p))
244 case 0x0000: ((WORD *)p)++; break;
245 case 0xffff: ((WORD *)p) += 2; break;
246 default: ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1; break;
249 /* Skip window name */
250 switch (*((WORD *)p))
252 case 0x0000: ((WORD *)p)++; break;
253 case 0xffff: ((WORD *)p) += 2; break;
254 default: ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1; break;
258 data = *((WORD *)p)++;
265 return (WORD)((LPSTR)p - (LPSTR)dialog32);
268 /**********************************************************************
269 * ConvertMenu32To16 (KERNEL.616)
271 VOID WINAPI ConvertMenu32To16( LPVOID menu32, DWORD size, LPVOID menu16 )
274 WORD version, headersize, flags, level = 1;
276 version = *((WORD *)menu16)++ = *((WORD *)p)++;
277 headersize = *((WORD *)menu16)++ = *((WORD *)p)++;
280 memcpy( menu16, p, headersize );
281 ((LPSTR)menu16) += headersize;
282 ((LPSTR)p) += headersize;
286 if ( version == 0 ) /* standard */
288 flags = *((WORD *)menu16)++ = *((WORD *)p)++;
289 if ( !(flags & MF_POPUP) )
290 *((WORD *)menu16)++ = *((WORD *)p)++; /* ID */
294 lstrcpyWtoA( (LPSTR)menu16, (LPWSTR)p );
295 ((LPSTR)menu16) += lstrlenA( (LPSTR)menu16 ) + 1;
296 ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1;
298 if ( flags & MF_END )
303 *((DWORD *)menu16)++ = *((DWORD *)p)++; /* fType */
304 *((DWORD *)menu16)++ = *((DWORD *)p)++; /* fState */
305 *((WORD *)menu16)++ = (WORD)*((DWORD *)p)++; /* ID */
306 flags = *((BYTE *)menu16)++ = (BYTE)*((WORD *)p)++;
308 lstrcpyWtoA( (LPSTR)menu16, (LPWSTR)p );
309 ((LPSTR)menu16) += lstrlenA( (LPSTR)menu16 ) + 1;
310 ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1;
312 /* align on DWORD boundary (32-bit only) */
313 p = (LPVOID)((((int)p) + 3) & ~3);
315 /* If popup, transfer helpid */
318 *((DWORD *)menu16)++ = *((DWORD *)p)++;
322 if ( flags & MF_END )
327 /**********************************************************************
328 * GetMenu32Size (KERNEL.617)
330 WORD WINAPI GetMenu32Size16( LPVOID menu32 )
333 WORD version, headersize, flags, level = 1;
335 version = *((WORD *)p)++;
336 headersize = *((WORD *)p)++;
337 ((LPSTR)p) += headersize;
340 if ( version == 0 ) /* standard */
342 flags = *((WORD *)p)++;
343 if ( !(flags & MF_POPUP) )
344 ((WORD *)p)++; /* ID */
348 ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1;
350 if ( flags & MF_END )
355 ((DWORD *)p)++; /* fType */
356 ((DWORD *)p)++; /* fState */
357 ((DWORD *)p)++; /* ID */
358 flags = *((WORD *)p)++;
360 ((LPWSTR)p) += lstrlenW( (LPWSTR)p ) + 1;
362 /* align on DWORD boundary (32-bit only) */
363 p = (LPVOID)((((int)p) + 3) & ~3);
365 /* If popup, skip helpid */
372 if ( flags & MF_END )
376 return (WORD)((LPSTR)p - (LPSTR)menu32);
379 /**********************************************************************
380 * ConvertAccelerator32To16
382 VOID ConvertAccelerator32To16( LPVOID acc32, DWORD size, LPVOID acc16 )
389 type = *((BYTE *)acc16)++ = *((BYTE *)acc32)++;
392 /* Copy event and IDval */
393 *((WORD *)acc16)++ = *((WORD *)acc32)++;
394 *((WORD *)acc16)++ = *((WORD *)acc32)++;
398 } while ( !( type & 0x80 ) );
401 /**********************************************************************
404 HGLOBAL16 NE_LoadPEResource( NE_MODULE *pModule, WORD type, LPVOID bits, DWORD size )
408 TRACE( resource, "module=%04x type=%04x\n", pModule->self, type );
409 if (!pModule || !bits || !size) return 0;
411 handle = GlobalAlloc16( 0, size );
416 ConvertMenu32To16( bits, size, GlobalLock16( handle ) );
420 ConvertDialog32To16( bits, size, GlobalLock16( handle ) );
423 case RT_ACCELERATOR16:
424 ConvertAccelerator32To16( bits, size, GlobalLock16( handle ) );
428 FIXME( resource, "not yet implemented!\n" );
432 memcpy( GlobalLock16( handle ), bits, size );