2 static char RCSId[] = "$Id: resource.c,v 1.4 1993/07/04 04:04:21 root Exp root $";
3 static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
25 #include "../rc/sysresbm.h"
27 #define MIN(a,b) ((a) < (b) ? (a) : (b))
31 extern int NE_FindResource(HANDLE
, LPSTR
, LPSTR
, RESOURCE
*);
32 extern int PE_FindResource(HANDLE
, LPSTR
, LPSTR
, RESOURCE
*);
33 extern HBITMAP
OBM_LoadOEMBitmap( WORD id
); /* objects/oembitmap.c */
35 #define PrintId(name) \
36 if (HIWORD((DWORD)name)) \
37 printf(", %s", name); \
39 printf(", #%d", (int) name);
41 /**********************************************************************
42 * FindResource [KERNEL.60]
44 HANDLE
FindResource(HANDLE instance
, LPSTR name
, LPSTR type
)
50 if(debugging_resource
){
51 printf("FindResource(%04X", instance
);
57 if (instance
== (HANDLE
)NULL
)
60 /* FIXME: did we already find this one ? */
62 if ((rh
= GlobalAlloc(GMEM_MOVEABLE
, sizeof(RESOURCE
))) == 0)
65 r
= (RESOURCE
*)GlobalLock(rh
);
71 if (HIWORD((DWORD
)name
))
72 r
->name
= strdup(name
);
76 if (HIWORD((DWORD
)type
))
77 r
->type
= strdup(type
);
81 r
->wpnt
= GetFileInfo(instance
);
82 r
->fd
= dup(r
->wpnt
->fd
);
84 status
= NE_FindResource(instance
, name
, type
, r
);
86 status
= PE_FindResource(instance
, name
, type
, r
);
89 if (HIWORD((DWORD
)r
->name
))
92 if (HIWORD((DWORD
)r
->type
))
103 /**********************************************************************
104 * AllocResource [KERNEL.66]
106 HANDLE
AllocResource(HANDLE instance
, HANDLE hResInfo
, DWORD dwSize
)
111 dprintf_resource(stddeb
, "AllocResource(%04X, %04X, %08X);\n",
112 instance
, hResInfo
, (int) dwSize
);
114 if (instance
== (HANDLE
)NULL
)
117 if ((r
= (RESOURCE
*)GlobalLock(hResInfo
)) == NULL
)
120 image_size
= r
->size
;
123 r
->rsc_mem
= GlobalAlloc(GMEM_MOVEABLE
, image_size
);
125 r
->rsc_mem
= GlobalAlloc(GMEM_MOVEABLE
, dwSize
);
127 GlobalUnlock(hResInfo
);
132 /**********************************************************************
133 * AccessResource [KERNEL.64]
135 int AccessResource(HANDLE instance
, HANDLE hResInfo
)
140 dprintf_resource(stddeb
, "AccessResource(%04X, %04X);\n",
143 if (instance
== (HANDLE
)NULL
)
146 if ((r
= (RESOURCE
*)GlobalLock(hResInfo
)) == NULL
)
150 lseek(fd
, r
->offset
, SEEK_SET
);
151 GlobalUnlock(hResInfo
);
156 /**********************************************************************
157 * SizeofResource [KERNEL.65]
159 WORD
SizeofResource(HANDLE instance
, HANDLE hResInfo
)
164 dprintf_resource(stddeb
, "SizeofResource(%04X, %04X);\n",
167 if (instance
== (HANDLE
)NULL
)
170 if ((r
= (RESOURCE
*)GlobalLock(hResInfo
)) == NULL
)
174 GlobalUnlock(hResInfo
);
179 /**********************************************************************
180 * LoadResource [KERNEL.61]
182 HANDLE
LoadResource(HANDLE instance
, HANDLE hResInfo
)
189 dprintf_resource(stddeb
, "LoadResource(%04X, %04X);\n", instance
, hResInfo
);
191 if (instance
== (HANDLE
)NULL
)
194 if ((r
= (RESOURCE
*)GlobalLock(hResInfo
)) == NULL
)
197 h
= r
->rsc_mem
= AllocResource(instance
, hResInfo
, 0);
198 image
= GlobalLinearLock(h
);
199 image_size
= r
->size
;
200 fd
= AccessResource(instance
, hResInfo
);
202 if (image
== NULL
|| read(fd
, image
, image_size
) != image_size
) {
204 GlobalUnlock(hResInfo
);
209 GlobalLinearUnlock(h
);
210 GlobalUnlock(hResInfo
);
214 /**********************************************************************
215 * LockResource [KERNEL.62]
217 LPSTR
LockResource(HANDLE hResData
)
219 return GlobalLock(hResData
);
222 /**********************************************************************
223 * FreeResource [KERNEL.63]
225 HANDLE
FreeResource(HANDLE hResData
)
229 dprintf_resource(stddeb
, "FreeResource: handle %04x\n", hResData
);
231 for (r
= rp
= Top
; r
; r
= r
->next
) {
232 if (r
->rsc_mem
== hResData
) {
239 if (HIWORD((DWORD
)r
->name
))
241 if (HIWORD((DWORD
)r
->type
))
243 GlobalFree(r
->rsc_mem
);
244 GlobalFree(r
->info_mem
);
254 /**********************************************************************
257 HBITMAP
ConvertCoreBitmap( HDC hdc
, BITMAPCOREHEADER
* image
)
259 BITMAPINFO
* bmpInfo
;
262 int i
, size
, n_colors
;
264 n_colors
= 1 << image
->bcBitCount
;
265 if (image
->bcBitCount
< 24)
267 size
= sizeof(BITMAPINFOHEADER
) + n_colors
* sizeof(RGBQUAD
);
268 bits
= (char *) (image
+ 1) + (n_colors
* sizeof(RGBTRIPLE
));
272 size
= sizeof(BITMAPINFOHEADER
);
273 bits
= (char *) (image
+ 1);
275 bmpInfo
= (BITMAPINFO
*) malloc( size
);
277 bmpInfo
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
278 bmpInfo
->bmiHeader
.biWidth
= image
->bcWidth
;
279 bmpInfo
->bmiHeader
.biHeight
= image
->bcHeight
;
280 bmpInfo
->bmiHeader
.biPlanes
= image
->bcPlanes
;
281 bmpInfo
->bmiHeader
.biBitCount
= image
->bcBitCount
;
282 bmpInfo
->bmiHeader
.biCompression
= 0;
283 bmpInfo
->bmiHeader
.biSizeImage
= 0;
284 bmpInfo
->bmiHeader
.biXPelsPerMeter
= 0;
285 bmpInfo
->bmiHeader
.biYPelsPerMeter
= 0;
286 bmpInfo
->bmiHeader
.biClrUsed
= 0;
287 bmpInfo
->bmiHeader
.biClrImportant
= 0;
289 if (image
->bcBitCount
< 24)
291 RGBTRIPLE
* oldMap
= (RGBTRIPLE
*)(image
+ 1);
292 RGBQUAD
* newMap
= bmpInfo
->bmiColors
;
293 for (i
= 0; i
< n_colors
; i
++, oldMap
++, newMap
++)
295 newMap
->rgbRed
= oldMap
->rgbtRed
;
296 newMap
->rgbGreen
= oldMap
->rgbtGreen
;
297 newMap
->rgbBlue
= oldMap
->rgbtBlue
;
298 newMap
->rgbReserved
= 0;
302 hbitmap
= CreateDIBitmap( hdc
, &bmpInfo
->bmiHeader
, CBM_INIT
,
303 bits
, bmpInfo
, DIB_RGB_COLORS
);
308 /**********************************************************************
311 HBITMAP
ConvertInfoBitmap( HDC hdc
, BITMAPINFO
* image
)
313 char * bits
= ((char *)image
) + DIB_BitmapInfoSize(image
, DIB_RGB_COLORS
);
314 return CreateDIBitmap( hdc
, &image
->bmiHeader
, CBM_INIT
,
315 bits
, image
, DIB_RGB_COLORS
);
318 /**********************************************************************
322 RSC_LoadResource(int instance
, LPSTR rsc_name
, LPSTR type
, int *image_size_ret
)
327 if (instance
== (HANDLE
)NULL
)
330 dprintf_resource(stddeb
, "RSC_LoadResource: instance = %04x, name = %08x, type = %08x\n",
331 instance
, (int) rsc_name
, (int) type
);
333 if ((hResInfo
= FindResource(instance
, rsc_name
, (LPSTR
) type
)) == (HANDLE
) NULL
) {
336 r
= (RESOURCE
*)GlobalLock(hResInfo
);
338 *image_size_ret
= r
->size
;
340 GlobalUnlock(hResInfo
);
341 return LoadResource(instance
, hResInfo
);
344 /**********************************************************************
345 * LoadIcon [USER.174]
347 HICON
LoadIcon(HANDLE instance
, LPSTR icon_name
)
352 ICONDESCRIP
*lpicodesc
;
356 BITMAPINFOHEADER
*bih
;
362 HBITMAP hbmpOld1
, hbmpOld2
;
364 if(debugging_resource
){
365 printf("LoadIcon(%04X", instance
);
370 if (!(hdc
= GetDC(GetDesktopWindow()))) return 0;
371 rsc_mem
= RSC_LoadResource(instance
, icon_name
, (LPSTR
) NE_RSCTYPE_GROUP_ICON
,
373 if (rsc_mem
== (HANDLE
)NULL
) {
374 printf("LoadIcon / Icon %04X not Found !\n", (int) icon_name
);
375 ReleaseDC(GetDesktopWindow(), hdc
);
378 lp
= (WORD
*)GlobalLock(rsc_mem
);
381 ReleaseDC(GetDesktopWindow(), hdc
);
384 lpicodesc
= (ICONDESCRIP
*)(lp
+ 3);
385 hIcon
= GlobalAlloc(GMEM_MOVEABLE
, sizeof(ICONALLOC
) + 1024);
386 if (hIcon
== (HICON
)NULL
) {
388 ReleaseDC(GetDesktopWindow(), hdc
);
391 lpico
= (ICONALLOC
*)GlobalLock(hIcon
);
392 lpico
->descriptor
= *lpicodesc
;
393 width
= lpicodesc
->Width
;
394 height
= lpicodesc
->Height
;
395 GlobalUnlock(rsc_mem
);
397 rsc_mem
= RSC_LoadResource(instance
,
398 MAKEINTRESOURCE(lpicodesc
->icoDIBOffset
),
399 (LPSTR
) NE_RSCTYPE_ICON
, &image_size
);
400 if (rsc_mem
== (HANDLE
)NULL
) {
401 printf("LoadIcon / Icon %04X Bitmaps not Found !\n", (int) icon_name
);
402 ReleaseDC(GetDesktopWindow(), hdc
);
405 lp
= (WORD
*)GlobalLock(rsc_mem
);
408 ReleaseDC(GetDesktopWindow(), hdc
);
411 bmi
= (BITMAPINFO
*)lp
;
412 bih
= (BITMAPINFOHEADER
*)lp
;
413 rgbq
= &bmi
->bmiColors
[0];
414 bih
->biHeight
= bih
->biHeight
/ 2;
416 printf("LoadIcon / image_size=%d width=%d height=%d bih->biBitCount=%d bih->biSizeImage=%ld\n",
417 image_size, width, height, bih->biBitCount, bih->biSizeImage);
419 if (bih
->biSize
== sizeof(BITMAPINFOHEADER
))
420 lpico
->hBitmap
= ConvertInfoBitmap(hdc
, (BITMAPINFO
*)bih
);
424 bih
->biClrUsed
= bih
->biClrImportant
= 2;
425 rgbq
[0].rgbBlue
= 0xFF;
426 rgbq
[0].rgbGreen
= 0xFF;
427 rgbq
[0].rgbRed
= 0xFF;
428 rgbq
[0].rgbReserved
= 0x00;
429 rgbq
[1].rgbBlue
= 0x00;
430 rgbq
[1].rgbGreen
= 0x00;
431 rgbq
[1].rgbRed
= 0x00;
432 rgbq
[1].rgbReserved
= 0x00;
433 if (bih
->biSizeImage
== 0) {
434 if (bih
->biCompression
!= BI_RGB
) {
435 fprintf(stderr
,"Unknown size for compressed Icon bitmap.\n");
437 ReleaseDC(GetDesktopWindow(), hdc
);
440 bih
->biSizeImage
= (bih
->biWidth
* bih
->biHeight
* bih
->biBitCount
443 lpico
->hBitMask
= CreateDIBitmap(hdc
, bih
, CBM_INIT
,
444 (LPSTR
)lp
+ bih
->biSizeImage
- sizeof(BITMAPINFOHEADER
) / 2 - 4,
445 (BITMAPINFO
*)bih
, DIB_RGB_COLORS
);
446 GlobalUnlock(rsc_mem
);
448 hMemDC
= CreateCompatibleDC(hdc
);
449 hMemDC2
= CreateCompatibleDC(hdc
);
450 hbmpOld1
= SelectObject(hMemDC
, lpico
->hBitmap
);
451 hbmpOld2
= SelectObject(hMemDC2
, lpico
->hBitMask
);
452 BitBlt(hMemDC
, 0, 0, bih
->biWidth
, bih
->biHeight
, hMemDC2
, 0, 0,SRCINVERT
);
453 SelectObject( hMemDC
, hbmpOld1
);
454 SelectObject( hMemDC2
, hbmpOld2
);
457 ReleaseDC(GetDesktopWindow(), hdc
);
459 dprintf_resource(stddeb
,"LoadIcon Alloc hIcon=%X\n", hIcon
);
463 /**********************************************************************
464 * CreateIcon [USER.407]
466 HICON
CreateIcon(HANDLE hInstance
, int nWidth
, int nHeight
,
467 BYTE nPlanes
, BYTE nBitsPixel
, LPSTR lpANDbits
,
473 dprintf_resource(stddeb
, "CreateIcon: hInstance = %04x, nWidth = %08x, nHeight = %08x \n",
474 hInstance
, nWidth
, nHeight
);
475 dprintf_resource(stddeb
, " nPlanes = %04x, nBitsPixel = %04x,",nPlanes
, nBitsPixel
);
476 dprintf_resource(stddeb
, " lpANDbits= %04x, lpXORbits = %04x, \n", (int)lpANDbits
,
479 if (hInstance
== (HANDLE
)NULL
) {
480 printf("CreateIcon / hInstance %04x not Found!\n",hInstance
);
483 hIcon
= GlobalAlloc(GMEM_MOVEABLE
, sizeof(ICONALLOC
) + 1024);
484 if (hIcon
== (HICON
)NULL
) {
485 printf("Can't allocate memory for Icon in CreateIcon\n");
488 lpico
= (ICONALLOC
*)GlobalLock(hIcon
);
490 lpico
->descriptor
.Width
=nWidth
;
491 lpico
->descriptor
.Height
=nHeight
;
492 lpico
->descriptor
.ColorCount
=16; /* Dummy Value */
493 lpico
->descriptor
.Reserved1
=0;
494 lpico
->descriptor
.Reserved2
=nPlanes
;
495 lpico
->descriptor
.Reserved3
=nWidth
*nHeight
;
497 /* either nPlanes and/or nBitCount is set to one */
498 lpico
->descriptor
.icoDIBSize
=nWidth
*nHeight
*nPlanes
*nBitsPixel
;
499 lpico
->descriptor
.icoDIBOffset
=0;
501 if( !(lpico
->hBitmap
=CreateBitmap(nWidth
, nHeight
, nPlanes
, nBitsPixel
,
503 printf("CreateIcon: couldn't create the XOR bitmap\n");
507 /* the AND BitMask is always monochrome */
508 if( !(lpico
->hBitMask
=CreateBitmap(nWidth
, nHeight
, 1, 1, lpANDbits
)) ) {
509 printf("CreateIcon: couldn't create the AND bitmap\n");
514 dprintf_resource(stddeb
, "CreateIcon Alloc hIcon=%X\n", hIcon
);
518 /**********************************************************************
519 * DestroyIcon [USER.457]
521 BOOL
DestroyIcon(HICON hIcon
)
525 if (hIcon
== (HICON
)NULL
)
527 lpico
= (ICONALLOC
*)GlobalLock(hIcon
);
528 if (lpico
->hBitmap
!= (HBITMAP
)NULL
)
529 DeleteObject(lpico
->hBitmap
);
534 /**********************************************************************
535 * LoadAccelerators [USER.177]
537 HANDLE
LoadAccelerators(HANDLE instance
, LPSTR lpTableName
)
542 ACCELHEADER
*lpAccelTbl
;
543 int i
, image_size
, n
;
546 printf("LoadAccelerators(%04X", instance
);
547 PrintId(lpTableName
);
551 rsc_mem
= RSC_LoadResource(instance
, lpTableName
, (LPSTR
) NE_RSCTYPE_ACCELERATOR
,
553 if (rsc_mem
== (HANDLE
)NULL
) {
554 printf("LoadAccelerators(%04X", instance
);
555 PrintId(lpTableName
);
556 printf(") not found !\n");
559 lp
= (BYTE
*)GlobalLock(rsc_mem
);
564 dprintf_accel(stddeb
,"LoadAccelerators / image_size=%d\n", image_size
);
566 hAccel
= GlobalAlloc(GMEM_MOVEABLE
,
567 sizeof(ACCELHEADER
) + (n
+ 1)*sizeof(ACCELENTRY
));
568 lpAccelTbl
= (LPACCELHEADER
)GlobalLock(hAccel
);
569 lpAccelTbl
->wCount
= 0;
570 for (i
= 0; i
< n
; i
++) {
571 lpAccelTbl
->tbl
[i
].type
= *(lp
++);
572 lpAccelTbl
->tbl
[i
].wEvent
= *((WORD
*)lp
);
574 lpAccelTbl
->tbl
[i
].wIDval
= *((WORD
*)lp
);
576 if (lpAccelTbl
->tbl
[i
].wEvent
== 0) break;
577 dprintf_accel(stddeb
,
578 "Accelerator #%u / event=%04X id=%04X type=%02X \n",
579 i
, lpAccelTbl
->tbl
[i
].wEvent
, lpAccelTbl
->tbl
[i
].wIDval
,
580 lpAccelTbl
->tbl
[i
].type
);
581 lpAccelTbl
->wCount
++;
583 GlobalUnlock(hAccel
);
584 GlobalUnlock(rsc_mem
);
589 /**********************************************************************
590 * TranslateAccelerator [USER.178]
592 int TranslateAccelerator(HWND hWnd
, HANDLE hAccel
, LPMSG msg
)
594 ACCELHEADER
*lpAccelTbl
;
597 if (hAccel
== 0 || msg
== NULL
) return 0;
598 if (msg
->message
!= WM_KEYDOWN
&&
599 msg
->message
!= WM_KEYUP
&&
600 msg
->message
!= WM_CHAR
) return 0;
602 dprintf_accel(stddeb
, "TranslateAccelerators hAccel=%04X !\n", hAccel
);
604 lpAccelTbl
= (LPACCELHEADER
)GlobalLock(hAccel
);
605 for (i
= 0; i
< lpAccelTbl
->wCount
; i
++) {
606 if (lpAccelTbl
->tbl
[i
].type
& VIRTKEY_ACCEL
) {
607 if (msg
->wParam
== lpAccelTbl
->tbl
[i
].wEvent
&&
608 msg
->message
== WM_KEYDOWN
) {
609 if ((lpAccelTbl
->tbl
[i
].type
& SHIFT_ACCEL
) &&
610 !(GetKeyState(VK_SHIFT
) & 0xf)) {
611 GlobalUnlock(hAccel
);
614 if ((lpAccelTbl
->tbl
[i
].type
& CONTROL_ACCEL
) &&
615 !(GetKeyState(VK_CONTROL
) & 0xf)) {
616 GlobalUnlock(hAccel
);
619 if ((lpAccelTbl
->tbl
[i
].type
& ALT_ACCEL
) &&
620 !(GetKeyState(VK_MENU
) & 0xf)) {
621 GlobalUnlock(hAccel
);
624 SendMessage(hWnd
, WM_COMMAND
, lpAccelTbl
->tbl
[i
].wIDval
, 0x00010000L
);
625 GlobalUnlock(hAccel
);
628 if (msg
->message
== WM_KEYUP
) return 1;
631 if (msg
->wParam
== lpAccelTbl
->tbl
[i
].wEvent
&&
632 msg
->message
== WM_CHAR
) {
633 SendMessage(hWnd
, WM_COMMAND
, lpAccelTbl
->tbl
[i
].wIDval
, 0x00010000L
);
634 GlobalUnlock(hAccel
);
639 GlobalUnlock(hAccel
);
643 /**********************************************************************
647 LoadString(HANDLE instance
, WORD resource_id
, LPSTR buffer
, int buflen
)
655 dprintf_resource(stddeb
, "LoadString: instance = %04x, id = %d, buffer = %08x, "
656 "length = %d\n", instance
, resource_id
, (int) buffer
, buflen
);
658 hmem
= RSC_LoadResource(instance
, (char *) ((resource_id
>> 4) + 1),
659 (LPSTR
) NE_RSCTYPE_STRING
, &rsc_size
);
663 p
= GlobalLock(hmem
);
664 string_num
= resource_id
& 0x000f;
665 for (i
= 0; i
< string_num
; i
++)
668 i
= MIN(buflen
- 1, *p
);
670 memcpy(buffer
, p
+ 1, i
);
678 fprintf(stderr
,"LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen
, *p
);
679 fprintf(stderr
,"LoadString // and try to obtain string '%s'\n", p
+ 1);
683 dprintf_resource(stddeb
,"LoadString // '%s' copied !\n", buffer
);
687 /**********************************************************************
688 * LoadMenu [USER.150]
690 HMENU
LoadMenu(HINSTANCE instance
, char *menu_name
)
694 MENU_HEADER
*menu_desc
;
697 printf("LoadMenu(%04X", instance
);
701 if (menu_name
== NULL
)
704 if ((hMenu_desc
= RSC_LoadResource(instance
, menu_name
, (LPSTR
) NE_RSCTYPE_MENU
, NULL
)) == (HANDLE
) NULL
)
707 menu_desc
= (MENU_HEADER
*) GlobalLock(hMenu_desc
);
708 hMenu
= LoadMenuIndirect((LPSTR
)menu_desc
);
712 /**********************************************************************
716 LoadBitmap(HANDLE instance
, LPSTR bmp_name
)
725 if(debugging_resource
){
726 printf("LoadBitmap(%04X", instance
);
732 struct ResourceTable
*it
;
733 hbitmap
= OBM_LoadOEMBitmap(((int) bmp_name
) & 0xffff);
736 /* Load from sysresbm */
737 dprintf_resource(stddeb
,"Searching for %d\n", (int) bmp_name
);
738 for(it
=sysresbmTable
;it
->value
;it
++){
739 if(it
->type
==NE_RSCTYPE_BITMAP
)
740 if((((int)bmp_name
& 0xFFFF0000) == 0))
741 {if(it
->id
==(int)bmp_name
)break;}
742 else if(!strcmp(it
->name
,bmp_name
))break;
744 if(!it
->value
)return 0;
745 dprintf_resource(stddeb
,"Found %s\n",it
->name
);
746 lp
=(long *)it
->value
;
747 rsc_mem
=(HANDLE
)NULL
;
748 } else { /* Load from file - indent this code properly later */
750 rsc_mem
= RSC_LoadResource(instance
, bmp_name
, (LPSTR
) NE_RSCTYPE_BITMAP
,
752 if (rsc_mem
== (HANDLE
)NULL
) {
753 printf("LoadBitmap(%04X", instance
);
755 printf(") NOT found!\n");
758 lp
= (long *) GlobalLinearLock(rsc_mem
);
764 } /* Load from file */
765 if (!(hdc
= GetDC(0))) lp
= NULL
;
766 size
= CONV_LONG (*lp
);
767 if (size
== sizeof(BITMAPCOREHEADER
)){
768 CONV_BITMAPCOREHEADER (lp
);
769 hbitmap
= ConvertCoreBitmap( hdc
, (BITMAPCOREHEADER
*) lp
);
770 } else if (size
== sizeof(BITMAPINFOHEADER
)){
771 CONV_BITMAPINFO (lp
);
772 hbitmap
= ConvertInfoBitmap( hdc
, (BITMAPINFO
*) lp
);