2 * PE->NE resource conversion functions
4 * Copyright 1998 Ulrich Weigand
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #include "wine/winuser16.h"
25 #include "wine/unicode.h"
27 #include "wine/debug.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(resource
);
31 /**********************************************************************
32 * ConvertDialog32To16 (KERNEL.615)
34 VOID WINAPI
ConvertDialog32To16( LPVOID dialog32
, DWORD size
, LPVOID dialog16
)
37 WORD nbItems
, data
, dialogEx
;
40 style
= *((DWORD
*)dialog16
)++ = *((DWORD
*)p
)++;
41 dialogEx
= (style
== 0xffff0001); /* DIALOGEX resource */
44 *((DWORD
*)dialog16
)++ = *((DWORD
*)p
)++; /* helpID */
45 *((DWORD
*)dialog16
)++ = *((DWORD
*)p
)++; /* exStyle */
46 style
= *((DWORD
*)dialog16
)++ = *((DWORD
*)p
)++; /* style */
49 ((DWORD
*)p
)++; /* exStyle ignored in 16-bit standard dialog */
51 nbItems
= *((BYTE
*)dialog16
)++ = (BYTE
)*((WORD
*)p
)++;
52 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; /* x */
53 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; /* y */
54 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; /* cx */
55 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; /* cy */
57 /* Transfer menu name */
60 case 0x0000: ((WORD
*)p
)++; *((BYTE
*)dialog16
)++ = 0; break;
61 case 0xffff: ((WORD
*)p
)++; *((BYTE
*)dialog16
)++ = 0xff;
62 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; break;
63 default: WideCharToMultiByte( CP_ACP
, 0, (LPWSTR
)p
, -1, (LPSTR
)dialog16
, 0x7fffffff, NULL
,NULL
);
64 ((LPSTR
)dialog16
) += strlen( (LPSTR
)dialog16
) + 1;
65 ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1;
69 /* Transfer class name */
72 case 0x0000: ((WORD
*)p
)++; *((BYTE
*)dialog16
)++ = 0; break;
73 case 0xffff: ((WORD
*)p
)++; *((BYTE
*)dialog16
)++ = 0xff;
74 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; break;
75 default: WideCharToMultiByte( CP_ACP
, 0, (LPWSTR
)p
, -1, (LPSTR
)dialog16
, 0x7fffffff, NULL
,NULL
);
76 ((LPSTR
)dialog16
) += strlen( (LPSTR
)dialog16
) + 1;
77 ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1;
81 /* Transfer window caption */
82 WideCharToMultiByte( CP_ACP
, 0, (LPWSTR
)p
, -1, (LPSTR
)dialog16
, 0x7fffffff, NULL
,NULL
);
83 ((LPSTR
)dialog16
) += strlen( (LPSTR
)dialog16
) + 1;
84 ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1;
86 /* Transfer font info */
87 if (style
& DS_SETFONT
)
89 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; /* pointSize */
92 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; /* weight */
93 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; /* italic */
95 WideCharToMultiByte( CP_ACP
, 0, (LPWSTR
)p
, -1, (LPSTR
)dialog16
, 0x7fffffff, NULL
,NULL
); /* faceName */
96 ((LPSTR
)dialog16
) += strlen( (LPSTR
)dialog16
) + 1;
97 ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1;
100 /* Transfer dialog items */
103 /* align on DWORD boundary (32-bit only) */
104 p
= (LPVOID
)((((int)p
) + 3) & ~3);
108 *((DWORD
*)dialog16
)++ = *((DWORD
*)p
)++; /* helpID */
109 *((DWORD
*)dialog16
)++ = *((DWORD
*)p
)++; /* exStyle */
110 *((DWORD
*)dialog16
)++ = *((DWORD
*)p
)++; /* style */
114 style
= *((DWORD
*)p
)++; /* save style */
115 ((DWORD
*)p
)++; /* ignore exStyle */
118 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; /* x */
119 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; /* y */
120 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; /* cx */
121 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; /* cy */
124 *((DWORD
*)dialog16
)++ = *((DWORD
*)p
)++; /* ID */
127 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; /* ID */
128 *((DWORD
*)dialog16
)++ = style
; /* style from above */
131 /* Transfer class name */
132 switch (*((WORD
*)p
))
134 case 0x0000: ((WORD
*)p
)++; *((BYTE
*)dialog16
)++ = 0; break;
135 case 0xffff: ((WORD
*)p
)++;
136 *((BYTE
*)dialog16
)++ = (BYTE
)*((WORD
*)p
)++; break;
137 default: WideCharToMultiByte( CP_ACP
, 0, (LPWSTR
)p
, -1, (LPSTR
)dialog16
, 0x7fffffff, NULL
,NULL
);
138 ((LPSTR
)dialog16
) += strlen( (LPSTR
)dialog16
) + 1;
139 ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1;
143 /* Transfer window name */
144 switch (*((WORD
*)p
))
146 case 0x0000: ((WORD
*)p
)++; *((BYTE
*)dialog16
)++ = 0; break;
147 case 0xffff: ((WORD
*)p
)++; *((BYTE
*)dialog16
)++ = 0xff;
148 *((WORD
*)dialog16
)++ = *((WORD
*)p
)++; break;
149 default: WideCharToMultiByte( CP_ACP
, 0, (LPWSTR
)p
, -1, (LPSTR
)dialog16
, 0x7fffffff, NULL
,NULL
);
150 ((LPSTR
)dialog16
) += strlen( (LPSTR
)dialog16
) + 1;
151 ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1;
156 data
= *((WORD
*)p
)++;
158 *((WORD
*)dialog16
)++ = data
;
160 *((BYTE
*)dialog16
)++ = (BYTE
)data
;
164 memcpy( dialog16
, p
, data
);
165 (LPSTR
)dialog16
+= data
;
174 /**********************************************************************
175 * GetDialog32Size (KERNEL.618)
177 WORD WINAPI
GetDialog32Size16( LPVOID dialog32
)
180 WORD nbItems
, data
, dialogEx
;
183 style
= *((DWORD
*)p
)++;
184 dialogEx
= (style
== 0xffff0001); /* DIALOGEX resource */
187 ((DWORD
*)p
)++; /* helpID */
188 ((DWORD
*)p
)++; /* exStyle */
189 style
= *((DWORD
*)p
)++; /* style */
192 ((DWORD
*)p
)++; /* exStyle */
194 nbItems
= *((WORD
*)p
)++;
195 ((WORD
*)p
)++; /* x */
196 ((WORD
*)p
)++; /* y */
197 ((WORD
*)p
)++; /* cx */
198 ((WORD
*)p
)++; /* cy */
201 switch (*((WORD
*)p
))
203 case 0x0000: ((WORD
*)p
)++; break;
204 case 0xffff: ((WORD
*)p
) += 2; break;
205 default: ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1; break;
208 /* Skip class name */
209 switch (*((WORD
*)p
))
211 case 0x0000: ((WORD
*)p
)++; break;
212 case 0xffff: ((WORD
*)p
) += 2; break;
213 default: ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1; break;
216 /* Skip window caption */
217 ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1;
220 if (style
& DS_SETFONT
)
222 ((WORD
*)p
)++; /* pointSize */
225 ((WORD
*)p
)++; /* weight */
226 ((WORD
*)p
)++; /* italic */
228 ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1; /* faceName */
231 /* Skip dialog items */
234 /* align on DWORD boundary */
235 p
= (LPVOID
)((((int)p
) + 3) & ~3);
239 ((DWORD
*)p
)++; /* helpID */
240 ((DWORD
*)p
)++; /* exStyle */
241 ((DWORD
*)p
)++; /* style */
245 ((DWORD
*)p
)++; /* style */
246 ((DWORD
*)p
)++; /* exStyle */
249 ((WORD
*)p
)++; /* x */
250 ((WORD
*)p
)++; /* y */
251 ((WORD
*)p
)++; /* cx */
252 ((WORD
*)p
)++; /* cy */
255 ((DWORD
*)p
)++; /* ID */
257 ((WORD
*)p
)++; /* ID */
259 /* Skip class name */
260 switch (*((WORD
*)p
))
262 case 0x0000: ((WORD
*)p
)++; break;
263 case 0xffff: ((WORD
*)p
) += 2; break;
264 default: ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1; break;
267 /* Skip window name */
268 switch (*((WORD
*)p
))
270 case 0x0000: ((WORD
*)p
)++; break;
271 case 0xffff: ((WORD
*)p
) += 2; break;
272 default: ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1; break;
276 data
= *((WORD
*)p
)++;
283 return (WORD
)((LPSTR
)p
- (LPSTR
)dialog32
);
286 /**********************************************************************
287 * ConvertMenu32To16 (KERNEL.616)
289 VOID WINAPI
ConvertMenu32To16( LPVOID menu32
, DWORD size
, LPVOID menu16
)
292 WORD version
, headersize
, flags
, level
= 1;
294 version
= *((WORD
*)menu16
)++ = *((WORD
*)p
)++;
295 headersize
= *((WORD
*)menu16
)++ = *((WORD
*)p
)++;
298 memcpy( menu16
, p
, headersize
);
299 ((LPSTR
)menu16
) += headersize
;
300 ((LPSTR
)p
) += headersize
;
304 if ( version
== 0 ) /* standard */
306 flags
= *((WORD
*)menu16
)++ = *((WORD
*)p
)++;
307 if ( !(flags
& MF_POPUP
) )
308 *((WORD
*)menu16
)++ = *((WORD
*)p
)++; /* ID */
312 WideCharToMultiByte( CP_ACP
, 0, (LPWSTR
)p
, -1, (LPSTR
)menu16
, 0x7fffffff, NULL
,NULL
);
313 ((LPSTR
)menu16
) += strlen( (LPSTR
)menu16
) + 1;
314 ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1;
316 if ( flags
& MF_END
)
321 *((DWORD
*)menu16
)++ = *((DWORD
*)p
)++; /* fType */
322 *((DWORD
*)menu16
)++ = *((DWORD
*)p
)++; /* fState */
323 *((WORD
*)menu16
)++ = (WORD
)*((DWORD
*)p
)++; /* ID */
324 flags
= *((BYTE
*)menu16
)++ = (BYTE
)*((WORD
*)p
)++;
326 WideCharToMultiByte( CP_ACP
, 0, (LPWSTR
)p
, -1, (LPSTR
)menu16
, 0x7fffffff, NULL
,NULL
);
327 ((LPSTR
)menu16
) += strlen( (LPSTR
)menu16
) + 1;
328 ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1;
330 /* align on DWORD boundary (32-bit only) */
331 p
= (LPVOID
)((((int)p
) + 3) & ~3);
333 /* If popup, transfer helpid */
336 *((DWORD
*)menu16
)++ = *((DWORD
*)p
)++;
340 if ( flags
& MF_END
)
345 /**********************************************************************
346 * GetMenu32Size (KERNEL.617)
348 WORD WINAPI
GetMenu32Size16( LPVOID menu32
)
351 WORD version
, headersize
, flags
, level
= 1;
353 version
= *((WORD
*)p
)++;
354 headersize
= *((WORD
*)p
)++;
355 ((LPSTR
)p
) += headersize
;
358 if ( version
== 0 ) /* standard */
360 flags
= *((WORD
*)p
)++;
361 if ( !(flags
& MF_POPUP
) )
362 ((WORD
*)p
)++; /* ID */
366 ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1;
368 if ( flags
& MF_END
)
373 ((DWORD
*)p
)++; /* fType */
374 ((DWORD
*)p
)++; /* fState */
375 ((DWORD
*)p
)++; /* ID */
376 flags
= *((WORD
*)p
)++;
378 ((LPWSTR
)p
) += strlenW( (LPWSTR
)p
) + 1;
380 /* align on DWORD boundary (32-bit only) */
381 p
= (LPVOID
)((((int)p
) + 3) & ~3);
383 /* If popup, skip helpid */
390 if ( flags
& MF_END
)
394 return (WORD
)((LPSTR
)p
- (LPSTR
)menu32
);
397 /**********************************************************************
398 * ConvertAccelerator32To16
400 VOID
ConvertAccelerator32To16( LPVOID acc32
, DWORD size
, LPVOID acc16
)
407 type
= *((BYTE
*)acc16
)++ = *((BYTE
*)acc32
)++;
410 /* Copy event and IDval */
411 *((WORD
*)acc16
)++ = *((WORD
*)acc32
)++;
412 *((WORD
*)acc16
)++ = *((WORD
*)acc32
)++;
416 } while ( !( type
& 0x80 ) );
419 /**********************************************************************
422 HGLOBAL16
NE_LoadPEResource( NE_MODULE
*pModule
, WORD type
, LPVOID bits
, DWORD size
)
426 TRACE("module=%04x type=%04x\n", pModule
->self
, type
);
427 if (!pModule
|| !bits
|| !size
) return 0;
429 handle
= GlobalAlloc16( 0, size
);
434 ConvertMenu32To16( bits
, size
, GlobalLock16( handle
) );
438 ConvertDialog32To16( bits
, size
, GlobalLock16( handle
) );
441 case RT_ACCELERATOR16
:
442 ConvertAccelerator32To16( bits
, size
, GlobalLock16( handle
) );
446 FIXME("not yet implemented!\n" );
450 memcpy( GlobalLock16( handle
), bits
, size
);