windows-nt/Source/XPSP1/NT/base/mvdm/wow16/user/fastres.c
2020-09-26 16:20:57 +08:00

432 lines
11 KiB
C

/*++
*
* WOW v1.0
*
* Copyright (c) 1991, Microsoft Corporation
*
* FASTRES.C
* WOW16 user resource services
*
* History:
*
* Created 12-Jan-1993 by Chandan Chuahan (ChandanC)
*
* This file provides the Win 3.1 routines for loading BITMAP, MENU, ICON,
* CURSOR, and DIALOG resources. These routines load the resources from the
* App EXE and then pass the pointers to the corresponding 32 bit WOW
* thunks. Thus saving the call backs from USER client to find, load, lock,
* size, unlock, and free the resources.
*
--*/
#include "user.h"
HBITMAP FAR PASCAL WOWLoadBitmap (HINSTANCE hInst, LPCSTR lpszBitmap, LPBYTE lpByte, DWORD ResSize);
HMENU FAR PASCAL WOWLoadMenu (HINSTANCE hInst, LPCSTR lpszMenuName, LPBYTE lpByte, DWORD ResSize, WORD WinVer);
HCURSOR FAR PASCAL WOWLoadCursorIcon (HINSTANCE hInst, LPCSTR lpszCursor, LPBYTE lpByte, DWORD ResSize, HGLOBAL hGbl, WORD WinVer, WORD wRttype);
//
// fDialogApi is TRUE for DialogBox* apis
// fDialogApi is FALSE for CreateDialog* apis
//
HWND FAR PASCAL WOWDialogBoxParam (HINSTANCE hInst, LPBYTE lpByte,
HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit,
DWORD ResSize, WORD fDialogApi);
DWORD FAR PASCAL NotifyWOW (WORD Id, LPBYTE pData);
#define LR_DEFAULTSIZE 0x0040 // from \nt\public\sdk\inc\winuser.h
int FAR PASCAL LookupIconIdFromDirectoryEx(LPBYTE lpByte, BOOL fIcon,
int cxDesired, int cyDesired,
WORD wFlags);
HANDLE FAR PASCAL WOWSetClipboardData (UINT, HANDLE);
typedef struct _ICONCUR16 { /* iconcur */
WORD hInst;
DWORD lpStr;
} ICONCUR16;
/* These must match counterparts in mvdm\inc\wowusr.h */
#define NW_LOADICON 1 // Internal
#define NW_LOADCURSOR 2 // Internal
HINSTANCE CheckDispHandle (HINSTANCE hInst)
{
HMODULE hIns;
if (hInst) {
hIns = GetModuleHandle ("DISPLAY");
return ((hInst == (HINSTANCE) hIns) ? 0:hInst);
}
else {
return (0);
}
}
HBITMAP API ILoadBitmap (HINSTANCE hInst, LPCSTR lpszBitmap)
{
HRSRC hRsrc = 0;
HGLOBAL hGbl = 0;
DWORD ResSize = 0;
LPBYTE lpByte = (LPBYTE) NULL;
HBITMAP ul = (HBITMAP)0;
if (hInst = CheckDispHandle (hInst)) {
hRsrc = FindResource (hInst, lpszBitmap, RT_BITMAP);
if (!hRsrc) {
goto lbm_exit;
}
ResSize = SizeofResource (hInst, hRsrc);
if (!ResSize) {
goto lbm_exit;
}
hGbl = LoadResource (hInst, hRsrc);
if (!hGbl) {
goto lbm_exit;
}
lpByte = LockResource (hGbl);
if (!lpByte) {
goto lbm_exit;
}
}
ul = (HBITMAP) WOWLoadBitmap (hInst, lpszBitmap, lpByte, ResSize);
lbm_exit:
if (lpByte) {
GlobalUnlock (hGbl);
}
if (hGbl) {
FreeResource(hGbl);
}
return (ul);
}
HMENU API ILoadMenu (HINSTANCE hInst, LPCSTR lpszMenuName)
{
HRSRC hRsrc;
HGLOBAL hGbl;
DWORD ResSize = 0;
LPBYTE lpByte = (LPBYTE) NULL;
HMENU ul;
WORD WinVer;
if (hRsrc = FindResource (hInst, lpszMenuName, RT_MENU)) {
if (ResSize = SizeofResource (hInst, hRsrc))
if (hGbl = LoadResource (hInst, hRsrc))
if (lpByte = LockResource (hGbl))
WinVer = GetExpWinVer (hInst);
}
if (!lpByte) {
return (NULL);
}
ul = (HMENU) WOWLoadMenu (hInst, lpszMenuName, lpByte, ResSize, WinVer);
if (hInst) {
GlobalUnlock (hGbl);
}
return (ul);
}
HICON API ILoadIcon (HINSTANCE hInst, LPCSTR lpszIcon)
{
HRSRC hRsrc;
HGLOBAL hGbl;
DWORD ResSize = 0;
LPBYTE lpByte = (LPBYTE) NULL;
HICON ul;
DWORD IconId;
WORD WinVer;
ICONCUR16 IconCur;
WinVer = GetExpWinVer (hInst);
if (!(hInst = CheckDispHandle (hInst))) {
ul = WOWLoadCursorIcon (hInst, lpszIcon, lpByte, ResSize, NULL, WinVer, (WORD)RT_ICON);
}
else {
IconCur.hInst = (WORD) hInst;
IconCur.lpStr = (DWORD) lpszIcon;
if (!(ul = (HICON) NotifyWOW (NW_LOADICON, (LPBYTE) &IconCur))) {
if (WinVer >= VER30) {
if (hRsrc = FindResource (hInst, lpszIcon, RT_GROUP_ICON)) {
if (ResSize = SizeofResource (hInst, hRsrc))
if (hGbl = LoadResource (hInst, hRsrc))
lpByte = LockResource (hGbl);
}
if (!lpByte) {
return (NULL);
}
IconId = LookupIconIdFromDirectoryEx(lpByte, TRUE, 0, 0, LR_DEFAULTSIZE);
GlobalUnlock (hGbl);
}
else {
IconId = (DWORD)lpszIcon;
}
if (hRsrc = FindResource (hInst, (LPCSTR) IconId, RT_ICON)) {
if (ResSize = SizeofResource (hInst, hRsrc))
if (hGbl = LoadResource (hInst, hRsrc))
lpByte = LockResource (hGbl);
}
if (!lpByte) {
return (NULL);
}
ul = WOWLoadCursorIcon (hInst, lpszIcon, lpByte, ResSize, hGbl, WinVer, (WORD)RT_ICON);
GlobalUnlock (hGbl);
}
}
return (ul);
}
HCURSOR API ILoadCursor (HINSTANCE hInst, LPCSTR lpszCursor)
{
HRSRC hRsrc;
HGLOBAL hGbl;
DWORD ResSize = 0;
LPBYTE lpByte = (LPBYTE) NULL;
HCURSOR ul;
DWORD CursorId;
WORD WinVer;
ICONCUR16 IconCur;
WinVer = GetExpWinVer (hInst);
if (!(hInst = CheckDispHandle (hInst))) {
ul = WOWLoadCursorIcon (hInst, lpszCursor, lpByte, ResSize, NULL, WinVer, (WORD)RT_CURSOR);
}
else {
IconCur.hInst = (WORD) hInst;
IconCur.lpStr = (DWORD) lpszCursor;
if (!(ul = (HICON) NotifyWOW (NW_LOADCURSOR, (LPBYTE) &IconCur))) {
if (WinVer >= VER30) {
if (hRsrc = FindResource (hInst, lpszCursor, RT_GROUP_CURSOR)) {
if (ResSize = SizeofResource (hInst, hRsrc))
if (hGbl = LoadResource (hInst, hRsrc))
lpByte = LockResource (hGbl);
}
if (!lpByte) {
return (NULL);
}
CursorId = LookupIconIdFromDirectoryEx((LPBYTE)lpByte, FALSE, 0, 0, LR_DEFAULTSIZE);
GlobalUnlock (hGbl);
}
else {
CursorId = (DWORD)lpszCursor;
}
if (hRsrc = FindResource (hInst, (LPCSTR) CursorId, RT_CURSOR)) {
if (ResSize = SizeofResource (hInst, hRsrc))
if (hGbl = LoadResource (hInst, hRsrc))
if (lpByte = LockResource (hGbl))
WinVer = GetExpWinVer (hInst);
}
if (!lpByte) {
return (NULL);
}
ul = WOWLoadCursorIcon (hInst, lpszCursor, lpByte, ResSize, hGbl, WinVer, (WORD)RT_CURSOR);
GlobalUnlock (hGbl);
}
}
return (ul);
}
HWND API ICreateDialogParam (HINSTANCE hInst, LPCSTR lpszDlgTemp, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit)
{
HRSRC hRsrc;
HGLOBAL hGbl;
DWORD ResSize = 0;
LPBYTE lpByte = (LPBYTE) NULL;
HWND ul;
if (hRsrc = FindResource (hInst, lpszDlgTemp, RT_DIALOG)) {
if (ResSize = SizeofResource (hInst, hRsrc))
if (hGbl = LoadResource (hInst, hRsrc))
lpByte = LockResource (hGbl);
}
if (!lpByte) {
return (NULL);
}
ul = (HWND) WOWDialogBoxParam (hInst, lpByte, hwndOwner,
dlgprc, lParamInit, ResSize, FALSE);
if (hInst) {
GlobalUnlock (hGbl);
}
return (ul);
}
HWND API ICreateDialog (HINSTANCE hInst, LPCSTR lpszDlgTemp, HWND hwndOwner, DLGPROC dlgprc)
{
return (ICreateDialogParam (hInst, lpszDlgTemp, hwndOwner, dlgprc, 0L));
}
HWND API ICreateDialogIndirectParam (HINSTANCE hInst, LPCSTR lpszDlgTemp, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit)
{
return WOWDialogBoxParam (hInst, (LPBYTE)lpszDlgTemp, hwndOwner,
dlgprc, lParamInit, 0, FALSE);
}
HWND API ICreateDialogIndirect (HINSTANCE hInst, LPCSTR lpszDlgTemp, HWND hwndOwner, DLGPROC dlgprc)
{
return WOWDialogBoxParam (hInst, (LPBYTE)lpszDlgTemp, hwndOwner,
dlgprc, 0, 0, FALSE);
}
int API IDialogBoxParam (HINSTANCE hInst, LPCSTR lpszDlgTemp, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit)
{
HRSRC hRsrc;
HGLOBAL hGbl;
DWORD ResSize = 0;
LPBYTE lpByte = (LPBYTE) NULL;
int ul;
if (hRsrc = FindResource (hInst, lpszDlgTemp, RT_DIALOG)) {
if (ResSize = SizeofResource (hInst, hRsrc))
if (hGbl = LoadResource (hInst, hRsrc))
lpByte = LockResource (hGbl);
}
if (!lpByte) {
return (-1);
}
ul = (int)WOWDialogBoxParam (hInst, lpByte, hwndOwner, dlgprc,
lParamInit, ResSize, TRUE);
if (hInst) {
GlobalUnlock (hGbl);
}
return (ul);
}
int API IDialogBox (HINSTANCE hInst, LPCSTR lpszDlgTemp, HWND hwndOwner, DLGPROC dlgprc)
{
return (IDialogBoxParam (hInst, lpszDlgTemp, hwndOwner, dlgprc, 0L));
}
int API IDialogBoxIndirectParam (HINSTANCE hInst, HGLOBAL hGbl, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit)
{
DWORD ResSize;
LPBYTE lpByte;
int ul;
if (lpByte = LockResource (hGbl)) {
ResSize = GlobalSize(hGbl);
ul = (int)WOWDialogBoxParam (hInst, lpByte, hwndOwner, dlgprc,
lParamInit, ResSize, TRUE);
GlobalUnlock (hGbl);
}
else {
ul = -1;
}
return (ul);
}
int API IDialogBoxIndirect(HINSTANCE hInst, HGLOBAL hGbl, HWND hwndOwner, DLGPROC dlgprc)
{
return IDialogBoxIndirectParam (hInst, hGbl, hwndOwner, dlgprc, 0);
}
HANDLE API SetClipboardData (UINT cbformat, HANDLE hMem)
{
HANDLE ul;
LPMETAFILEPICT lpMf;
switch (cbformat) {
case CF_DSPMETAFILEPICT:
case CF_METAFILEPICT:
if (hMem) {
lpMf = (LPMETAFILEPICT) GlobalLock(hMem);
if (lpMf) {
/* If the handle is bad make hMF = NULL. This is needed
* for Micrograpfx. They don't check for failure when rendering
* data
*/
if (!(GlobalReAlloc (lpMf->hMF, 0L, GMEM_MODIFY | GMEM_SHARE))) {
lpMf->hMF = NULL;
}
}
GlobalUnlock(hMem);
}
// It is intentional to let it thru to the "case statements".
// ChandanC 5/11/92.
/*
* These are the defaults.
*
* case CF_DIB:
* case CF_TEXT:
* case CF_DSPTEXT:
* case CF_SYLK:
* case CF_DIF:
* case CF_TIFF:
* case CF_OEMTEXT:
* case CF_PENDATA:
* case CF_RIFF:
* case CF_WAVE:
* case CF_OWNERDISPLAY:
*/
default:
if (hMem) {
hMem = GlobalReAlloc (hMem, 0L, GMEM_MODIFY | GMEM_DDESHARE);
}
break;
case CF_DSPBITMAP:
case CF_BITMAP:
case CF_PALETTE:
break;
}
ul = WOWSetClipboardData (cbformat, hMem);
return (ul);
}