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

198 lines
4.8 KiB
C

/*++
*
* WOW v1.0
*
* Copyright (c) 1991, Microsoft Corporation
*
* WCURCASH.H
* WOW32 Cursor & Icon cash worker routines.
*
* History:
* Created on Jan 27th-93 by ChandanC
*
--*/
#include "precomp.h"
#pragma hdrstop
STATIC PCURICON pCurIconFirst = NULL; // pointer to first hCurIcon entry
HICON16 W32CheckWOWCashforIconCursors(VPVOID pData, WORD ResType)
{
register PICONCUR16 parg16;
HICON16 hIcon16;
HICON16 hRes16;
PSZ psz;
HAND32 h32;
GETMISCPTR(pData, parg16);
GETPSZIDPTR(parg16->lpStr, psz);
hIcon16 = W32FindCursorIcon (parg16->hInst, psz, ResType, &hRes16);
if (hIcon16) {
if (ResType == (WORD) RT_ICON) {
h32 = HICON32(hIcon16);
ResType = HANDLE_TYPE_ICON;
}
else {
h32 = HCURSOR32(hIcon16);
ResType = HANDLE_TYPE_CURSOR;
}
hIcon16 = SetupResCursorIconAlias((HAND16) parg16->hInst, h32, (HANDLE) hRes16, (UINT) ResType);
}
FREEPSZIDPTR(psz);
FREEMISCPTR(parg16);
return (hIcon16);
}
HICON16 W32FindCursorIcon (WORD hInst, LPSTR psz, WORD ResType, HICON16 *phRes16)
{
PCURICON pTemp;
pTemp = pCurIconFirst;
while (pTemp) {
if (pTemp->ResType == ResType) {
if (pTemp->hInst == hInst) {
if ((HIWORD(psz) != 0) && (HIWORD(pTemp->lpszIcon) != 0)) {
if (!(WOW32_stricmp(psz, (LPSTR)pTemp->lpszIcon))) {
*phRes16 = pTemp->hRes16;
return (pTemp->hIcon16);
}
}
else if ((HIWORD(psz) == 0) && (HIWORD(pTemp->lpszIcon) == 0)) {
if ((WORD) pTemp->lpszIcon == (WORD)psz) {
*phRes16 = pTemp->hRes16;
return (pTemp->hIcon16);
}
}
}
}
pTemp = pTemp->pNext;
}
return 0;
}
BOOL W32AddCursorIconCash (WORD hInst, LPSTR psz1, HICON16 hIcon16, HICON16 hRes16, WORD ResType)
{
PCURICON pCurIcon;
PSZ psz2;
WORD cb;
// if "psz1" is a string, allocate the memory for it
if ((WORD)HIWORD(psz1) != (WORD)NULL) {
cb = strlen(psz1)+1;
if (psz2 = malloc_w_small(cb)) {
memcpy (psz2, psz1, cb);
}
else {
LOGDEBUG (0, ("WOW::W32AddCursorIcon: Memory allocation failed *** \n"));
return (0);
}
}
else {
psz2 = psz1;
}
if (pCurIcon = malloc_w_small (sizeof(CURICON))) {
pCurIcon->pNext = pCurIconFirst;
pCurIconFirst = pCurIcon; // update list head
pCurIcon->hInst = hInst;
pCurIcon->lpszIcon = (DWORD)psz2;
pCurIcon->hIcon16 = hIcon16;
pCurIcon->hRes16 = hRes16;
pCurIcon->ResType = ResType;
pCurIcon->dwThreadID = CURRENTPTD()->dwThreadID;
return (TRUE);
}
else {
LOGDEBUG(0, ("WOW::WAddCursorIcon(): *** memory allocation failed *** \n"));
return (FALSE);
}
}
// This routine deletes a resource (Cursor or Icon) from the cash.
VOID W32DeleteCursorIconCash (HICON16 hRes16)
{
PCURICON pTemp;
PCURICON pTempLast;
pTemp = pCurIconFirst;
while (pTemp) {
if (pTemp->hRes16 == hRes16) {
if (pTemp == pCurIconFirst) {
pCurIconFirst = pTemp->pNext;
}
else {
pTempLast->pNext = pTemp->pNext;
}
// if its a string, delete the memory that we allocated for it
if ((WORD)HIWORD(pTemp->lpszIcon) != (WORD)NULL) {
free_w_small ((PVOID)pTemp->lpszIcon);
}
free_w_small (pTemp);
pTemp = NULL;
}
else {
pTempLast = pTemp;
pTemp = pTemp->pNext;
}
}
}
// This routine deletes all the cursors and Icons when a task terminates.
VOID W32DeleteCursorIconCashForTask ()
{
DWORD dwThreadID;
PCURICON pTemp;
PCURICON pTempLast;
PCURICON pTempNext;
dwThreadID = CURRENTPTD()->dwThreadID;
pTemp = pCurIconFirst;
while (pTemp) {
if (pTemp->dwThreadID == dwThreadID) {
if (pTemp == pCurIconFirst) {
pCurIconFirst = pTemp->pNext;
}
else {
pTempLast->pNext = pTemp->pNext;
}
// if its a string, delete the memory that we allocated for it
if ((WORD)HIWORD(pTemp->lpszIcon) != (WORD)NULL) {
free_w_small ((PVOID)pTemp->lpszIcon);
}
pTempNext = pTemp->pNext;
free_w_small (pTemp);
pTemp = pTempNext;
}
else {
pTempLast = pTemp;
pTemp = pTemp->pNext;
}
}
}