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
);