00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
#include "precomp.h"
00014 
#pragma hdrstop
00015 
00016 
00017 
00018 
00019 #define BPP01_MAXCOLORS     2
00020 #define BPP04_MAXCOLORS    16
00021 #define BPP08_MAXCOLORS   256
00022 
00023 #define RESCLR_BLACK      0x00000000
00024 #define RESCLR_WHITE      0x00FFFFFF
00025 
00026 typedef struct {
00027     ACCEL accel;
00028     WORD  padding;
00029 } 
RESOURCE_ACCEL, *
PRESOURCE_ACCEL;
00030 
00031 
00032 
00033 
00034 #define BMR_ICON    1
00035 #define BMR_BITMAP  2
00036 #define BMR_CURSOR  3
00037 
00038 typedef struct _OLDCURSOR {
00039     BYTE bType;
00040     BYTE bFormat;
00041     WORD 
xHotSpot;  
00042     WORD 
yHotSpot;  
00043     WORD 
cx;
00044     WORD 
cy;
00045     WORD 
cxBytes;
00046     WORD 
wReserved2;
00047     BYTE abBitmap[1];
00048 } 
OLDCURSOR, *
POLDCURSOR;
00049 typedef OLDCURSOR UNALIGNED *
UPOLDCURSOR;
00050 
00051 
00052 
00053 
00054 #define GETINITDC() \
00055 
    (gfSystemInitialized ? NtUserGetDC(NULL) : CreateDCW(L"DISPLAY", L"", NULL, NULL))
00056 
00057 #define RELEASEINITDC(hdc) \
00058 
    (gfSystemInitialized ? ReleaseDC(NULL, hdc) : DeleteDC(hdc))
00059 
00060 #define ISRIFFFORMAT(p) \
00061 
    (((UNALIGNED RTAG *)(p))->ckID == FOURCC_RIFF)
00062 
00063 #define MR_FAILFOR40    0x01
00064 #define MR_MONOCHROME   0x02
00065 
00066 
00067 typedef struct tagMAPRES {
00068     WORD 
idDisp;                
00069     WORD 
idUser;                
00070     BYTE bFlags;                
00071     BYTE bReserved;             
00072 } 
MAPRES, *
LPMAPRES, *
PMAPRES;
00073 
00074 
00075 HBITMAP 
CopyBmp(HBITMAP hbmpOrg, 
int cxNew, 
int cyNew, UINT LR_flags);
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 HANDLE 
SplFindResource(
00089     HINSTANCE hmod,
00090     LPCWSTR   lpName,
00091     LPCWSTR   lpType)
00092 {
00093     
return FINDRESOURCEW(hmod, lpName, lpType);
00094 }
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 VOID SplFreeResource(
00106     HANDLE    hRes,
00107     HINSTANCE hmod,
00108     UINT      lrFlags)
00109 {
00110     
if (!
FREERESOURCE(hRes, hmod) &&
00111         ((hmod == 
hmodUser) || (lrFlags & LR_SHARED))) {
00112 
00113         
FREERESOURCE(hRes, hmod);
00114     }
00115 }
00116 
00117 
00118 
00119 
00120 
00121 
00122 
00123 
00124 
00125 
00126 
00127 
00128 BOOL WowGetModuleFileName(
00129     HMODULE hModule,
00130     LPWSTR  pwsz,
00131     DWORD   cchMax)
00132 {
00133     
if (!GetModuleFileName(hModule, pwsz, cchMax)) {
00134 
00135         
if (cchMax < 10) {
00136             RIPMSG0(RIP_WARNING, 
"WowGetModuleFileName: exceeded Char-Max");
00137             
return FALSE;
00138         }
00139 
00140         wsprintf(pwsz, TEXT(
"\001%08lx"), hModule);
00141     }
00142 
00143     
return TRUE;
00144 }
00145 
00146 
00147 
00148 
00149 
00150 
00151 
00152 
00153 
00154 
00155 
00156 
00157 HMODULE 
WowGetModuleHandle(
00158     LPCWSTR pwsz)
00159 {
00160     HMODULE hMod = 
NULL;
00161     
DWORD   digit;
00162 
00163     
if (pwsz[0] == TEXT(
'\001')) {
00164 
00165         
00166 
00167 
00168 
00169         
while (*(++pwsz)) {
00170 
00171             
if (*pwsz == TEXT(
' '))
00172                 
continue;
00173 
00174             digit = *pwsz - TEXT(
'0');
00175 
00176             
if (digit > 9)
00177                 digit += (
DWORD)(TEXT(
'0') - TEXT(
'a') + 10);
00178 
00179             (ULONG_PTR)hMod <<= 4;
00180             (ULONG_PTR)hMod += digit;
00181         }
00182 
00183     } 
else {
00184 
00185         hMod = GetModuleHandle(pwsz);
00186     }
00187 
00188     
return hMod;
00189 }
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197 
00198 
00199 HACCEL WINAPI 
CreateAcceleratorTableA(
00200     LPACCEL paccel,
00201     
int     cAccel)
00202 {
00203     
int     nAccel = cAccel;
00204     LPACCEL pAccelT = paccel;
00205 
00206     
00207 
00208 
00209     
while (nAccel--) {
00210 
00211         
if ((pAccelT->fVirt & FVIRTKEY) == 0) {
00212 
00213             
if (!
NT_SUCCESS(
RtlMultiByteToUnicodeN((LPWSTR)&(pAccelT->key),
00214                                                    
sizeof(WCHAR),
00215                                                    
NULL,
00216                                                    (LPSTR)&(pAccelT->key),
00217                                                    
sizeof(
CHAR)))) {
00218                 pAccelT->key = 0xFFFF;
00219             }
00220         }
00221 
00222         pAccelT++;
00223     }
00224 
00225     
return NtUserCreateAcceleratorTable(paccel, cAccel);
00226 }
00227 
00228 
00229 
00230 
00231 
00232 
00233 
00234 
00235 
00236 int CopyAcceleratorTableA(
00237     HACCEL hacc,
00238     LPACCEL paccel,
00239     
int length)
00240 {
00241     
int retval;
00242 
00243     retval = 
NtUserCopyAcceleratorTable(hacc, paccel, length);
00244 
00245     
00246 
00247 
00248     
if ((paccel != 
NULL) && (retval > 0)) {
00249 
00250         
00251 
00252 
00253         
int nAccel = retval;
00254         LPACCEL pAccelT = paccel;
00255 
00256         
while (nAccel--) {
00257             
if ((pAccelT->fVirt & FVIRTKEY) == 0) {
00258                 
if (!
NT_SUCCESS(
RtlUnicodeToMultiByteN((PCHAR)&(pAccelT->key),
00259                                                        
sizeof(WCHAR),
00260                                                        
NULL,
00261                                                        (PWSTR)&(pAccelT->key),
00262                                                         
sizeof(pAccelT->key)))) {
00263                         pAccelT->key = 0;
00264                     }
00265                 }
00266             pAccelT++;
00267         }
00268     }
00269 
00270     
return retval;
00271 }
00272 
00273 
00274 
00275 
00276 
00277 
00278 
00279 
00280 
00281 
00282 
00283 
00284 
00285 PACCELCACHE * 
FindAccResource (HACCEL hAccel, PVOID pRes)
00286 {
00287      
00288 
00289 
00290 
00291     
PACCELCACHE * ppacNext = &
gpac;
00292     
PACCELCACHE pac;
00293 
00294     
00295 
00296 
00297 
00298     UserAssert(!(hAccel && pRes));
00299     
00300 
00301 
00302     
while (*ppacNext != 
NULL) {
00303         pac = *ppacNext;
00304         
if ((pac->
pRes == pRes) || (pac->
hAccel == hAccel)) {
00305             
00306 
00307 
00308             UserAssert(pac->
dwLockCount != 0);
00309             UserAssert(
HMValidateHandleNoDesktop(pac->
hAccel, 
TYPE_ACCELTABLE));
00310             
break;
00311         }
00312 
00313         ppacNext = &(pac->
pacNext);
00314     }
00315 
00316     
return ppacNext;
00317 }
00318 
00319 
00320 
00321 
00322 
00323 
00324 
00325 
00326 
00327 void AddAccResource (HACCEL hAccel, PVOID pRes)
00328 {
00329     
PACCELCACHE pac;
00330 
00331     UserAssert(
HMValidateHandleNoDesktop(hAccel, 
TYPE_ACCELTABLE));
00332     UserAssert(pRes != 
NULL);
00333 
00334     
00335 
00336 
00337     pac = (
PACCELCACHE)LocalAlloc(LPTR, 
sizeof(
ACCELCACHE));
00338     
if (pac != 
NULL) {
00339         pac->
dwLockCount = 1;
00340         pac->
hAccel = hAccel;
00341         pac->
pRes = pRes;
00342 
00343         
00344 
00345 
00346         RtlEnterCriticalSection(&
gcsAccelCache);
00347             pac->
pacNext = 
gpac;
00348             
gpac = pac;
00349         RtlLeaveCriticalSection(&
gcsAccelCache);
00350 
00351     }
00352 }
00353 
00354 
00355 
00356 
00357 
00358 BOOL DestroyAcceleratorTable (HACCEL hAccel)
00359 {
00360     
BOOL fUnlocked = 
TRUE;
00361     
PACCELCACHE *ppacNext, pac;
00362 
00363     
00364 
00365 
00366     RtlEnterCriticalSection(&
gcsAccelCache);
00367         ppacNext = 
FindAccResource(hAccel, 
NULL);
00368         
if (*ppacNext != 
NULL) {
00369             pac = *ppacNext;
00370             
00371 
00372 
00373             UserAssert(pac->
dwLockCount != 0);
00374             fUnlocked = (--pac->
dwLockCount == 0);
00375             
00376 
00377 
00378             
if (fUnlocked) {
00379                 *ppacNext = pac->
pacNext;
00380                 LocalFree(pac);
00381             }
00382         }
00383     RtlLeaveCriticalSection(&
gcsAccelCache);
00384 
00385     
00386 
00387 
00388     
if (fUnlocked) {
00389         
return NtUserDestroyAcceleratorTable(hAccel);
00390     } 
else {
00391         
return FALSE;
00392     }
00393 }
00394 
00395 
00396 
00397 
00398 
00399 
00400 
00401 #define FACCEL_VALID (FALT | FCONTROL | FNOINVERT | FSHIFT | FVIRTKEY | FLASTKEY)
00402 
00403 HANDLE 
LoadAcc(
00404     HINSTANCE hmod,
00405     HANDLE    hrl)
00406 {
00407     
PACCELCACHE * ppacNext;
00408     HANDLE handle = 
NULL;
00409 
00410     
if (hrl != 
NULL) {
00411 
00412         
if (hrl = 
LOADRESOURCE(hmod, hrl)) {
00413 
00414             
PRESOURCE_ACCEL paccel;
00415 
00416             
if ((paccel = (
PRESOURCE_ACCEL)
LOCKRESOURCE(hrl, hmod)) != 
NULL) {
00417 
00418                 
int nAccel = 0;
00419                 
int i;
00420                 LPACCEL paccelT;
00421 
00422                 
00423 
00424 
00425 
00426                 RtlEnterCriticalSection(&
gcsAccelCache);
00427                     ppacNext = 
FindAccResource(
NULL, paccel);
00428                     
if (*ppacNext != 
NULL) {
00429                         (*ppacNext)->dwLockCount++;
00430                         handle = (*ppacNext)->hAccel;
00431                     }
00432                 RtlLeaveCriticalSection(&
gcsAccelCache);
00433                 
00434 
00435 
00436 
00437                 
if (handle != 
NULL) {
00438                     
goto UnlockAndFree;
00439                 }
00440 
00441                 
while (!((paccel[nAccel].accel.fVirt) & 
FLASTKEY)) {
00442 
00443                     
if (paccel[nAccel].accel.fVirt & ~
FACCEL_VALID) {
00444                         RIPMSG0(RIP_WARNING, 
"LoadAcc: Invalid Parameter");
00445                         
goto UnlockAndFree;
00446                     }
00447 
00448                     nAccel++;
00449                 }
00450 
00451                 
if (paccel[nAccel].accel.fVirt & ~
FACCEL_VALID) {
00452                     RIPMSG0(RIP_WARNING, 
"LoadAcc: Invalid Parameter");
00453                     
goto UnlockAndFree;
00454                 }
00455 
00456                 
00457 
00458 
00459 
00460 
00461                 paccelT = 
UserLocalAlloc(0, 
sizeof(ACCEL) * (nAccel + 1));
00462                 
if (paccelT == 
NULL) {
00463                     
goto UnlockAndFree;
00464                 }
00465                 
for (i = 0; i < nAccel + 1; i++) {
00466                     paccelT[i] = paccel[i].accel;
00467                 }
00468 
00469                 handle = 
NtUserCreateAcceleratorTable(paccelT,
00470                                                       nAccel + 1);
00471 
00472                 
UserLocalFree(paccelT);
00473 
00474                 
00475 
00476 
00477 
00478                 
if (handle != 
NULL) {
00479                     
AddAccResource(handle, paccel);
00480                 }
00481 UnlockAndFree:
00482 
00483                 
UNLOCKRESOURCE(hrl, hmod);
00484             }
00485 
00486             
FREERESOURCE(hrl, hmod);
00487         }
00488     }
00489 
00490     
return handle;
00491 }
00492 
00493 
00494 
00495 
00496 
00497 
00498 
00499 
00500 
00501 HACCEL WINAPI 
LoadAcceleratorsA(
00502     HINSTANCE hmod,
00503     LPCSTR    lpAccName)
00504 {
00505     HANDLE hRes;
00506 
00507     hRes = 
FINDRESOURCEA((HANDLE)hmod, lpAccName, (LPSTR)RT_ACCELERATOR);
00508 
00509     
return (HACCEL)
LoadAcc(hmod, hRes);
00510 }
00511 
00512 HACCEL WINAPI 
LoadAcceleratorsW(
00513     HINSTANCE hmod,
00514     LPCWSTR   lpAccName)
00515 {
00516     HANDLE hRes;
00517 
00518     hRes = 
FINDRESOURCEW((HANDLE)hmod, lpAccName, RT_ACCELERATOR);
00519 
00520     
return (HACCEL)
LoadAcc(hmod, hRes);
00521 }
00522 
00523 
00524 
00525 
00526 
00527 
00528 
00529 
00530 
00531 int WINAPI 
LoadStringA(
00532     HINSTANCE hmod,
00533     UINT      wID,
00534     LPSTR     lpAnsiBuffer,
00535     
int       cchBufferMax)
00536 {
00537     LPWSTR          lpUniBuffer;
00538     
INT             cchUnicode;
00539     
INT             cbAnsi = 0;
00540 
00541     
00542 
00543 
00544 
00545     cchUnicode = 
LoadStringOrError((HANDLE)hmod,
00546                                       wID,
00547                                       (LPWSTR)&lpUniBuffer,
00548                                       0,
00549                                       0);
00550 
00551     
if (cchUnicode) {
00552 
00553         cbAnsi = WCSToMB(lpUniBuffer,
00554                          cchUnicode,
00555                          &lpAnsiBuffer,
00556                          cchBufferMax - 1,
00557                          
FALSE);
00558 
00559         cbAnsi = 
min(cbAnsi, cchBufferMax - 1);
00560     }
00561 
00562     
00563 
00564 
00565     lpAnsiBuffer[cbAnsi] = 0;
00566     
return cbAnsi;
00567 }
00568 
00569 int WINAPI 
LoadStringW(
00570     HINSTANCE hmod,
00571     UINT      wID,
00572     LPWSTR    lpBuffer,
00573     
int       cchBufferMax)
00574 {
00575     
return LoadStringOrError((HANDLE)hmod,
00576                                 wID,
00577                                 lpBuffer,
00578                                 cchBufferMax,
00579                                 0);
00580 }
00581 
00582 
00583 
00584 
00585 
00586 
00587 
00588 
00589 PBYTE SkipIDorString(
00590     LPBYTE pb)
00591 {
00592     
if (*((LPWORD)pb) == 0xFFFF)
00593         
return (pb + 4);
00594 
00595     
while (*((PWCHAR)pb)++ != 0);
00596 
00597     
return pb;
00598 }
00599 
00600 
00601 
00602 
00603 
00604 
00605 
00606 
00607 
00608 
00609 DWORD GetSizeDialogTemplate(
00610     HINSTANCE      hmod,
00611     LPCDLGTEMPLATE pdt)
00612 {
00613     
UINT           cdit;
00614     LPBYTE         pb;
00615     
BOOL           fChicago;
00616     LPDLGTEMPLATE2 pdt2;
00617 
00618     
if (HIWORD(pdt->style) == 0xFFFF) {
00619 
00620         pdt2 = (LPDLGTEMPLATE2)pdt;
00621         fChicago = 
TRUE;
00622 
00623         
00624 
00625 
00626         
if (pdt2->style & ~(DS_VALID40 | 0xffff0000)) {
00627             RIPMSG0(RIP_WARNING, 
"Bad dialog style bits - please remove");
00628             
return 0;
00629         }
00630 
00631         pb = (LPBYTE)(((LPDLGTEMPLATE2)pdt) + 1);
00632 
00633     } 
else {
00634 
00635         fChicago = 
FALSE;
00636 
00637         
00638 
00639 
00640 
00641 
00642         
if ((pdt->style & ~(DS_VALID40 | 0xffff0000)) &&
00643                 (
GETEXPWINVER(hmod) >= 
VER40)) {
00644 
00645             
00646 
00647 
00648             RIPMSG0(RIP_WARNING, 
"Bad dialog style bits - please remove");
00649             
return 0;
00650         }
00651 
00652         pb = (LPBYTE)(pdt + 1);
00653     }
00654 
00655     
00656 
00657 
00658 
00659     pb = 
SkipIDorString(pb);
00660 
00661     
00662 
00663 
00664     pb = 
SkipIDorString(pb);
00665     pb = 
SkipIDorString(pb);
00666 
00667     
00668 
00669 
00670     
if ((fChicago ? pdt2->style : pdt->style) & DS_SETFONT) {
00671         pb += fChicago ? 
sizeof(
DWORD) + 
sizeof(WORD): 
sizeof(WORD);
00672         pb = 
SkipIDorString(pb);
00673     }
00674     pb = (LPBYTE)(((ULONG_PTR)pb + 3) & ~3);
00675 
00676     
00677 
00678 
00679     cdit = fChicago ? pdt2->cDlgItems : pdt->cdit;
00680 
00681     
while (cdit-- != 0) {
00682 
00683         
UINT cbCreateParams;
00684 
00685         pb += fChicago ? 
sizeof(DLGITEMTEMPLATE2) : 
sizeof(DLGITEMTEMPLATE);
00686 
00687         
00688 
00689 
00690         pb = 
SkipIDorString(pb);
00691 
00692         
00693 
00694 
00695         pb = 
SkipIDorString(pb);
00696 
00697         cbCreateParams = *((LPWORD)pb);
00698 
00699         
00700 
00701 
00702         
if (cbCreateParams)
00703             pb += cbCreateParams;
00704 
00705         pb += 
sizeof(WORD);
00706 
00707         
00708 
00709 
00710         pb = (LPBYTE)(((ULONG_PTR)pb + 3) & ~3);
00711     }
00712 
00713     
00714 
00715 
00716     
return (
DWORD)(pb - (LPBYTE)pdt);
00717 }
00718 
00719 
00720 
00721 
00722 
00723 
00724 
00725 
00726 
00727 
00728 INT_PTR WINAPI 
DialogBoxIndirectParamA(
00729     HINSTANCE       hmod,
00730     LPCDLGTEMPLATEA lpDlgTemplate,
00731     HWND            hwndOwner,
00732     DLGPROC         lpDialogFunc,
00733     LPARAM          dwInitParam)
00734 {
00735     
return DialogBoxIndirectParamAorW(hmod,
00736                                       (LPCDLGTEMPLATEW)lpDlgTemplate,
00737                                       hwndOwner,
00738                                       lpDialogFunc,
00739                                       dwInitParam,
00740                                       SCDLG_ANSI);
00741 }
00742 
00743 INT_PTR WINAPI 
DialogBoxIndirectParamW(
00744     HINSTANCE       hmod,
00745     LPCDLGTEMPLATEW lpDlgTemplate,
00746     HWND            hwndOwner,
00747     DLGPROC         lpDialogFunc,
00748     LPARAM          dwInitParam)
00749 {
00750     
return DialogBoxIndirectParamAorW(hmod,
00751                                       lpDlgTemplate,
00752                                       hwndOwner,
00753                                       lpDialogFunc,
00754                                       dwInitParam,
00755                                       0);
00756 }
00757 
00758 INT_PTR WINAPI 
DialogBoxIndirectParamAorW(
00759     HINSTANCE       hmod,
00760     LPCDLGTEMPLATEW lpDlgTemplate,
00761     HWND            hwndOwner,
00762     DLGPROC         lpDialogFunc,
00763     LPARAM          dwInitParam,
00764     UINT            fAnsiFlags)
00765 {
00766     
DWORD cb;
00767 
00768     
00769 
00770 
00771     cb = 
GetSizeDialogTemplate(hmod, lpDlgTemplate);
00772 
00773     
if (!cb) {
00774         RIPMSG0(RIP_WARNING, 
"DialogBoxIndirectParam: Invalid Paramter");
00775         
return -1;
00776     }
00777 
00778     
return InternalDialogBox(hmod,
00779                             (LPDLGTEMPLATE)lpDlgTemplate,
00780                             hwndOwner,
00781                             lpDialogFunc,
00782                             dwInitParam,
00783                             SCDLG_CLIENT | (fAnsiFlags & (SCDLG_ANSI | SCDLG_16BIT)));
00784 }
00785 
00786 
00787 
00788 
00789 
00790 
00791 
00792 
00793 
00794 
00795 
00796 HWND WINAPI 
CreateDialogIndirectParamA(
00797     HINSTANCE       hmod,
00798     LPCDLGTEMPLATEA lpDlgTemplate,
00799     HWND            hwndOwner,
00800     DLGPROC         lpDialogFunc,
00801     LPARAM          dwInitParam)
00802 {
00803     
return CreateDialogIndirectParamAorW(hmod,
00804                                          (LPCDLGTEMPLATE)lpDlgTemplate,
00805                                          hwndOwner,
00806                                          lpDialogFunc,
00807                                          dwInitParam,
00808                                          SCDLG_ANSI);
00809 }
00810 
00811 HWND WINAPI 
CreateDialogIndirectParamW(
00812     HINSTANCE       hmod,
00813     LPCDLGTEMPLATEW lpDlgTemplate,
00814     HWND            hwndOwner,
00815     DLGPROC         lpDialogFunc,
00816     LPARAM          dwInitParam)
00817 {
00818     
return CreateDialogIndirectParamAorW(hmod,
00819                                          (LPCDLGTEMPLATE)lpDlgTemplate,
00820                                          hwndOwner,
00821                                          lpDialogFunc,
00822                                          dwInitParam,
00823                                          0);
00824 }
00825 
00826 HWND WINAPI 
CreateDialogIndirectParamAorW(
00827     HANDLE         hmod,
00828     LPCDLGTEMPLATE lpDlgTemplate,
00829     HWND           hwndOwner,
00830     DLGPROC        lpDialogFunc,
00831     LPARAM         dwInitParam,
00832     UINT           fAnsi)
00833 {
00834     
DWORD cb;
00835     HWND  hwndRet;
00836 
00837     
00838 
00839 
00840     cb = 
GetSizeDialogTemplate(hmod, lpDlgTemplate);
00841 
00842     
if (!cb) {
00843         RIPMSG0(RIP_WARNING, 
"CreateDialogIndirect: Invalid Parameter");
00844         
return NULL;
00845     }
00846 
00847     hwndRet = 
InternalCreateDialog(hmod,
00848                                    (LPDLGTEMPLATE)lpDlgTemplate,
00849                                    cb,
00850                                    hwndOwner,
00851                                    lpDialogFunc,
00852                                    dwInitParam,
00853                                    SCDLG_CLIENT | (fAnsi & (SCDLG_ANSI|SCDLG_16BIT)));
00854 
00855     
return hwndRet;
00856 }
00857 
00858 
00859 
00860 
00861 
00862 
00863 
00864 
00865 
00866 
00867 
00868 INT_PTR WINAPI 
DialogBoxParamA(
00869     HINSTANCE hmod,
00870     LPCSTR    lpName,
00871     HWND      hwndOwner,
00872     DLGPROC   lpDialogFunc,
00873     LPARAM    dwInitParam)
00874 {
00875     HANDLE h;
00876     PVOID  p;
00877     INT_PTR i = -1;
00878 
00879     
if (h = 
FINDRESOURCEA(hmod, (LPSTR)lpName, (LPSTR)RT_DIALOG)) {
00880 
00881         
if (h = 
LOADRESOURCE(hmod, h)) {
00882 
00883             
if (p = 
LOCKRESOURCE(h, hmod)) {
00884 
00885                 i = 
DialogBoxIndirectParamAorW(hmod,
00886                                                p,
00887                                                hwndOwner,
00888                                                lpDialogFunc,
00889                                                dwInitParam,
00890                                                SCDLG_ANSI);
00891 
00892                 
UNLOCKRESOURCE(h, hmod);
00893             }
00894 
00895             
FREERESOURCE(h, hmod);
00896         }
00897     }
00898 
00899     
return i;
00900 }
00901 
00902 INT_PTR WINAPI 
DialogBoxParamW(
00903     HINSTANCE hmod,
00904     LPCWSTR   lpName,
00905     HWND      hwndOwner,
00906     DLGPROC   lpDialogFunc,
00907     LPARAM    dwInitParam)
00908 {
00909     HANDLE h;
00910     PVOID  p;
00911     INT_PTR i = -1;
00912 
00913     UserAssert(LOWORD(hmod) == 0); 
00914 
00915     
if (h = 
FINDRESOURCEW(hmod, lpName, RT_DIALOG)) {
00916 
00917         
if (p = LoadResource(hmod, h)) {
00918 
00919             i = 
DialogBoxIndirectParamAorW(hmod,
00920                                            p,
00921                                            hwndOwner,
00922                                            lpDialogFunc,
00923                                            dwInitParam,
00924                                            0);
00925         }
00926     }
00927 
00928     
return i;
00929 }
00930 
00931 
00932 
00933 
00934 
00935 
00936 
00937 
00938 
00939 
00940 
00941 HWND WINAPI 
CreateDialogParamA(
00942     HINSTANCE hmod,
00943     LPCSTR    lpName,
00944     HWND      hwndOwner,
00945     DLGPROC   lpDialogFunc,
00946     LPARAM    dwInitParam)
00947 {
00948     HANDLE         h;
00949     LPDLGTEMPLATEA p;
00950     HWND           hwnd = 
NULL;
00951 
00952     
if (h = 
FINDRESOURCEA(hmod, lpName, (LPSTR)RT_DIALOG)) {
00953 
00954         
if (h = 
LOADRESOURCE(hmod, h)) {
00955 
00956             
if (p = (LPDLGTEMPLATEA)
LOCKRESOURCE(h, hmod)) {
00957 
00958                 hwnd = 
CreateDialogIndirectParamAorW(hmod,
00959                                                      (LPCDLGTEMPLATE)p,
00960                                                      hwndOwner,
00961                                                      lpDialogFunc,
00962                                                      dwInitParam,
00963                                                      SCDLG_ANSI);
00964 
00965                 
UNLOCKRESOURCE(h, hmod);
00966             }
00967 
00968             
FREERESOURCE(h, hmod);
00969         }
00970     }
00971 
00972     
return hwnd;
00973 }
00974 
00975 HWND WINAPI 
CreateDialogParamW(
00976     HINSTANCE hmod,
00977     LPCWSTR   lpName,
00978     HWND      hwndOwner,
00979     DLGPROC   lpDialogFunc,
00980     LPARAM    dwInitParam)
00981 {
00982     HANDLE h;
00983     PVOID  p;
00984     HWND   hwnd = 
NULL;
00985 
00986     
if (h = 
FINDRESOURCEW(hmod, lpName, RT_DIALOG)) {
00987 
00988         
if (h = 
LOADRESOURCE(hmod, h)) {
00989 
00990             
if (p = 
LOCKRESOURCE(h, hmod)) {
00991 
00992                 hwnd = 
CreateDialogIndirectParamAorW(hmod,
00993                                                      p,
00994                                                      hwndOwner,
00995                                                      lpDialogFunc,
00996                                                      dwInitParam,
00997                                                      0);
00998 
00999                 
UNLOCKRESOURCE(h, hmod);
01000             }
01001 
01002             
FREERESOURCE(h, hmod);
01003         }
01004     }
01005 
01006     
return hwnd;
01007 }
01008 
01009 
01010 
01011 
01012 
01013 
01014 
01015 
01016 
01017 BOOL WINAPI 
DestroyCursor(
01018     HCURSOR hcur)
01019 {
01020     
return NtUserDestroyCursor(hcur, 
CURSOR_CALLFROMCLIENT);
01021 }
01022 
01023 
01024 
01025 
01026 
01027 
01028 
01029 HICON 
CreateIcoCur(
01030     
PCURSORDATA lpi)
01031 {
01032     HCURSOR hcur;
01033 
01034     UserAssert(lpi->
hbmColor || lpi->
hbmMask);
01035 
01036     hcur = (HCURSOR)
NtUserCallOneParam((lpi->
CURSORF_flags & 
CURSORF_GLOBAL),
01037                                        SFI__CREATEEMPTYCURSOROBJECT);
01038 
01039     
if (hcur == 
NULL)
01040         
return NULL;
01041 
01042 
#if DBG
01043 
    {
01044         BITMAP bmMask;
01045         BITMAP bmColor;
01046 
01047         UserAssert(GetObject(lpi->
hbmMask, 
sizeof(BITMAP), &bmMask));
01048         
01049         
01050 
01051 
01052 
01053 
01054         
if (bmMask.bmWidth != (LONG)lpi->
cx) {
01055            RIPMSG1(RIP_WARNING, 
"Mask width not equal to requested width: lpi %#p", lpi);
01056         }
01057 
01058         
if (bmMask.bmHeight != (LONG)lpi->
cy) {
01059            RIPMSG1(RIP_WARNING, 
"Mask height not equal to requested height: lpi %#p", lpi);
01060         }
01061 
01062         
if (lpi->
hbmColor) {
01063             UserAssert(GetObject(lpi->
hbmColor, 
sizeof(BITMAP), &bmColor));
01064             UserAssert(bmMask.bmHeight == bmColor.bmHeight * 2);
01065             UserAssert(bmMask.bmWidth  == bmColor.bmWidth);
01066         }
01067     }
01068 
#endif
01069 
01070     
if (
_SetCursorIconData(hcur, lpi))
01071         
return hcur;
01072 
01073     
NtUserDestroyCursor(hcur, 
CURSOR_ALWAYSDESTROY);
01074 
01075     
return NULL;
01076 }
01077 
01078 
01079 
01080 
01081 
01082 
01083 
01084 HCURSOR 
CreateIcoCurIndirect(
01085     
PCURSORDATA pcurCreate,
01086     UINT        cPlanes,
01087     UINT        cBitsPixel,
01088     CONST BYTE  *lpANDbits,
01089     CONST BYTE  *lpXORbits)
01090 {
01091     
int     cbBits;
01092     HCURSOR hcurNew;
01093     
BOOL    bColor;
01094     
UINT    cx;
01095     
UINT    cy;
01096     LPBYTE  pBits = 
NULL;
01097 
01098     
01099 
01100 
01101     hcurNew = (HCURSOR)
NtUserCallOneParam(0, SFI__CREATEEMPTYCURSOROBJECT);
01102 
01103     
if (hcurNew == 
NULL)
01104         
return NULL;
01105 
01106     
01107 
01108 
01109 
01110     bColor = (cPlanes | cBitsPixel) > 1;
01111 
01112     
if (!bColor) {
01113 
01114         cbBits = (((pcurCreate->
cx + 0x0F) & ~0x0F) >> 3) * pcurCreate->
cy;
01115 
01116         pBits = (LPBYTE)
UserLocalAlloc(HEAP_ZERO_MEMORY, (cbBits * 2));
01117 
01118         
if (pBits == 
NULL) {
01119             
NtUserDestroyCursor(hcurNew, 
CURSOR_ALWAYSDESTROY);
01120             
return NULL;
01121         }
01122 
01123         RtlCopyMemory(pBits, lpANDbits, cbBits);
01124         RtlCopyMemory(pBits + cbBits, lpXORbits, cbBits);
01125         lpANDbits = pBits;
01126     }
01127 
01128     
01129 
01130 
01131     cx = pcurCreate->
cx;
01132     
cy = pcurCreate->
cy * 2;
01133 
01134     pcurCreate->
hbmMask = CreateBitmap(cx, 
cy, 1, 1, lpANDbits);
01135 
01136     
if (pcurCreate->
hbmMask == 
NULL) {
01137 
01138         
01139 
01140 
01141 
01142 
01143 
01144 
01145 
01146         
if (bColor) {
01147 
01148             RIPMSG0(RIP_WARNING, 
"CreateIcoCurIndirect: Retrying hbmMask creation.");
01149 
01150             cbBits = (((pcurCreate->
cx + 0x0F) & ~0x0F) >> 3) * pcurCreate->
cy;
01151             pBits = (LPBYTE)
UserLocalAlloc(HEAP_ZERO_MEMORY, cbBits*2);
01152 
01153             
if (pBits == 
NULL) {
01154                 
NtUserDestroyCursor(hcurNew, 
CURSOR_ALWAYSDESTROY);
01155                 
return NULL;
01156             }
01157 
01158             RtlCopyMemory(pBits, lpANDbits, cbBits);
01159             pcurCreate->
hbmMask = CreateBitmap(cx, 
cy, 1, 1, pBits);
01160             
UserLocalFree(pBits);
01161 
01162             pBits = 
NULL;
01163         }
01164 
01165         
if (pcurCreate->
hbmMask == 
NULL) {
01166 
01167             
01168 
01169 
01170             
NtUserDestroyCursor(hcurNew, 
CURSOR_ALWAYSDESTROY);
01171 
01172             
if (pBits != 
NULL)
01173                 
UserLocalFree(pBits);
01174 
01175             
return NULL;
01176         }
01177     }
01178 
01179     
01180 
01181 
01182 
01183     
if (bColor) {
01184         pcurCreate->
hbmColor = CreateBitmap(cx,
01185                                             
cy / 2,
01186                                             cPlanes,
01187                                             cBitsPixel,
01188                                             lpXORbits);
01189 
01190         
if (pcurCreate->
hbmColor == 
NULL) {
01191 
01192             
01193 
01194 
01195             DeleteObject(pcurCreate->
hbmMask);
01196             
NtUserDestroyCursor(hcurNew, 
CURSOR_ALWAYSDESTROY);
01197             
return NULL;
01198         }
01199 
01200         pcurCreate->
bpp = (cPlanes * cBitsPixel);
01201 
01202     } 
else {
01203         pcurCreate->
hbmColor = 
NULL;
01204         pcurCreate->
bpp      = 1;
01205     }
01206 
01207     
01208 
01209 
01210     pcurCreate->
cy            = 
cy;
01211     pcurCreate->
lpModName     = 
NULL;
01212     pcurCreate->
lpName        = 
NULL;
01213     pcurCreate->
rt            = 0;
01214     pcurCreate->
CURSORF_flags = 0;
01215 
01216     
if (
_SetCursorIconData(hcurNew, pcurCreate)) {
01217         
if (pBits != 
NULL)
01218             
UserLocalFree(pBits);
01219         
return hcurNew;
01220     }
01221 
01222     
01223 
01224 
01225     
NtUserDestroyCursor(hcurNew, 
CURSOR_ALWAYSDESTROY);
01226     DeleteObject(pcurCreate->
hbmMask);
01227 
01228     
if (pcurCreate->
hbmColor)
01229         DeleteObject(pcurCreate->
hbmColor);
01230     
if (pBits != 
NULL)
01231         
UserLocalFree(pBits);
01232 
01233     
return NULL;
01234 }
01235 
01236 
01237 
01238 
01239 
01240 
01241 
01242 
01243 
01244 HCURSOR WINAPI 
CreateCursor(
01245     HINSTANCE hModule,
01246     
int       iXhotspot,
01247     
int       iYhotspot,
01248     
int       iWidth,
01249     
int       iHeight,
01250     LPBYTE    lpANDplane,
01251     LPBYTE    lpXORplane)
01252 {
01253     
CURSORDATA cur;
01254     UNREFERENCED_PARAMETER(hModule);
01255 
01256     
if ((iXhotspot < 0) || (iXhotspot > iWidth) ||
01257         (iYhotspot < 0) || (iYhotspot > iHeight)) {
01258         
return 0;
01259     }
01260 
01261     RtlZeroMemory(&cur, 
sizeof(cur));
01262     cur.xHotspot = (
SHORT)iXhotspot;
01263     cur.yHotspot = (
SHORT)iYhotspot;
01264     cur.cx       = (
DWORD)iWidth;
01265     cur.cy       = (
DWORD)iHeight;
01266 
01267     
return CreateIcoCurIndirect(&cur, 1, 1, lpANDplane, lpXORplane);
01268 }
01269 
01270 
01271 
01272 
01273 
01274 
01275 
01276 
01277 
01278 HICON WINAPI 
CreateIcon(
01279     HINSTANCE  hModule,
01280     
int        iWidth,
01281     
int        iHeight,
01282     BYTE       planes,
01283     BYTE       bpp,
01284     CONST BYTE *lpANDplane,
01285     CONST BYTE *lpXORplane)
01286 {
01287     
CURSORDATA cur;
01288     UNREFERENCED_PARAMETER(hModule);
01289 
01290     RtlZeroMemory(&cur, 
sizeof(cur));
01291     cur.xHotspot = (
SHORT)(iWidth / 2);
01292     cur.yHotspot = (
SHORT)(iHeight / 2);
01293     cur.cx       = (
DWORD)iWidth;
01294     cur.cy       = (
DWORD)iHeight;
01295 
01296     
return CreateIcoCurIndirect(&cur, planes, bpp, lpANDplane, lpXORplane);
01297 }
01298 
01299 
01300 
01301 
01302 
01303 
01304 
01305 
01306 
01307 HICON WINAPI 
CreateIconIndirect(
01308     PICONINFO piconinfo)
01309 {
01310     HCURSOR    hcur;
01311     
CURSORDATA cur;
01312     BITMAP     bmMask;
01313     BITMAP     bmColor;
01314     HBITMAP    hbmpBits2, hbmpMem;
01315     HDC        hdcMem;
01316 
01317     
01318 
01319 
01320     
if (!GetObjectW(piconinfo->hbmMask, 
sizeof(BITMAP), &bmMask))
01321         
return NULL;
01322 
01323     
if (piconinfo->hbmColor != 
NULL) {
01324         
if (!GetObjectW(piconinfo->hbmColor, 
sizeof(BITMAP), &bmColor))
01325             
return NULL;
01326     }
01327 
01328     
01329 
01330 
01331     hcur = (HCURSOR)
NtUserCallOneParam(0, SFI__CREATEEMPTYCURSOROBJECT);
01332     
if (hcur == 
NULL)
01333         
return NULL;
01334 
01335     
01336 
01337 
01338 
01339 
01340 
01341 
01342 
01343 
01344 
01345     RtlZeroMemory(&cur, 
sizeof(cur));
01346     cur.cx = bmMask.bmWidth;
01347 
01348     
if (piconinfo->hbmColor == 
NULL) {
01349 
01350         cur.cy  = bmMask.bmHeight;
01351         cur.bpp = 1;
01352 
01353     } 
else {
01354         cur.cy       = bmMask.bmHeight * 2;
01355         cur.bpp      = (
DWORD)(bmColor.bmBitsPixel * bmColor.bmPlanes);
01356         cur.hbmColor = 
CopyBmp(piconinfo->hbmColor, 0, 0, LR_DEFAULTCOLOR);
01357 
01358         
if (cur.hbmColor == 
NULL) {
01359             RIPMSG0(RIP_WARNING, 
"CreateIconIndirect: Failed to copy piconinfo->hbmColor");
01360             
goto CleanUp;
01361         }
01362     }
01363 
01364     
01365 
01366 
01367 
01368 
01369 
01370 
01371     cur.hbmMask  =  CreateBitmap(cur.cx, cur.cy, 1, 1, 
NULL);
01372 
01373     
if (cur.hbmMask == 
NULL) {
01374         RIPMSG0(RIP_WARNING, 
"CreateIconIndirect: Failed to create cur.hbmMask");
01375         
goto CleanUp;
01376     }
01377 
01378     RtlEnterCriticalSection(&
gcsHdc);
01379 
01380 
01381     
if (hdcMem = CreateCompatibleDC (
ghdcBits2)) {
01382 
01383         hbmpMem = SelectObject(hdcMem, cur.hbmMask);
01384         hbmpBits2 = SelectObject(
ghdcBits2, piconinfo->hbmMask);
01385 
01386         BitBlt(hdcMem,
01387                0,
01388                0,
01389                bmMask.bmWidth,
01390                bmMask.bmHeight,
01391                
ghdcBits2,
01392                0,
01393                0,
01394                SRCCOPY);
01395 
01396         SelectObject(hdcMem, hbmpMem);
01397         SelectObject(
ghdcBits2, hbmpBits2);
01398         DeleteDC (hdcMem);
01399 
01400     } 
else {
01401 
01402         RtlLeaveCriticalSection(&
gcsHdc);
01403         RIPMSG0(RIP_WARNING, 
"CreateIconIndirect: CreateCompatibleDC failed");
01404         
goto CleanUp;
01405     }
01406 
01407     RtlLeaveCriticalSection(&
gcsHdc);
01408 
01409     
01410 
01411 
01412     
if (piconinfo->fIcon) {
01413         cur.rt        = 
PTR_TO_ID(RT_ICON);
01414         cur.xHotspot = (
SHORT)(cur.cx / 2);
01415         cur.yHotspot = (
SHORT)(cur.cy / 4);
01416     } 
else {
01417         cur.rt        = 
PTR_TO_ID(RT_CURSOR);
01418         cur.xHotspot = ((
SHORT)piconinfo->xHotspot);
01419         cur.yHotspot = ((
SHORT)piconinfo->yHotspot);
01420     }
01421 
01422 
01423     
if (
_SetCursorIconData(hcur, &cur)) {
01424         
return hcur;
01425     }
01426 
01427 CleanUp:
01428     
01429 
01430 
01431     
if (cur.hbmMask != 
NULL) {
01432         DeleteObject(cur.hbmMask);
01433     }
01434     
if (cur.hbmColor != 
NULL) {
01435         DeleteObject(cur.hbmColor);
01436     }
01437 
01438     
NtUserDestroyCursor(hcur, 
CURSOR_ALWAYSDESTROY);
01439     
return NULL;
01440 }
01441 
01442 
01443 
01444 
01445 
01446 
01447 
01448 
01449 
01450 BOOL WINAPI 
GetIconInfo(
01451     HICON     hicon,
01452     PICONINFO piconinfo)
01453 {
01454     
return NtUserGetIconInfo(hicon, piconinfo, 
NULL, 
NULL, 
NULL, 
FALSE);
01455 }
01456 
01457 
01458 
01459 
01460 
01461 
01462 
01463 
01464 
01465 HCURSOR WINAPI 
GetCursorFrameInfo(
01466     HCURSOR hcur,
01467     LPWSTR  lpName,
01468     
int     iFrame,
01469     LPDWORD pjifRate,
01470     LPINT   pccur)
01471 {
01472     
01473 
01474 
01475 
01476     
if (hcur == 
NULL) {
01477 
01478         
return LoadIcoCur(
NULL,
01479                           lpName,
01480                           RT_CURSOR,
01481                           0,
01482                           0,
01483                           LR_DEFAULTSIZE);
01484     }
01485 
01486     
return NtUserGetCursorFrameInfo(hcur, iFrame, pjifRate, pccur);
01487 }
01488 
01489 
01490 
01491 
01492 
01493 
01494 
01495 
01496 
01497 
01498 
01499 BOOL WINAPI 
_FreeResource(
01500     HANDLE    hResData,
01501     HINSTANCE hModule)
01502 {
01503     UNREFERENCED_PARAMETER(hResData);
01504     UNREFERENCED_PARAMETER(hModule);
01505 
01506     
return FALSE;
01507 }
01508 
01509 LPSTR WINAPI 
_LockResource(
01510     HANDLE    hResData,
01511     HINSTANCE hModule)
01512 {
01513     UNREFERENCED_PARAMETER(hModule);
01514 
01515     
return (LPSTR)(hResData);
01516 }
01517 
01518 BOOL WINAPI 
_UnlockResource(
01519     HANDLE    hResData,
01520     HINSTANCE hModule)
01521 {
01522     UNREFERENCED_PARAMETER(hResData);
01523     UNREFERENCED_PARAMETER(hModule);
01524 
01525     
return TRUE;
01526 }
01527 
01528 
01529 
01530 
01531 
01532 
01533 
01534 
01535 
01536 
01537 int WINAPI 
LookupIconIdFromDirectory(
01538     PBYTE presbits,
01539     BOOL  fIcon)
01540 {
01541     
return LookupIconIdFromDirectoryEx(presbits, fIcon, 0, 0, 0);
01542 }
01543 
01544 
01545 
01546 
01547 
01548 
01549 
01550 int WINAPI 
LookupIconIdFromDirectoryEx(
01551     PBYTE           presbits,
01552     BOOL            fIcon,
01553     
int             cxDesired,
01554     
int             cyDesired,
01555     UINT            LR_flags)
01556 {
01557     
ConnectIfNecessary();
01558 
01559     
return RtlGetIdFromDirectory(presbits,
01560                                  fIcon,
01561                                  cxDesired,
01562                                  cyDesired,
01563                                  LR_flags,
01564                                  
NULL);
01565 }
01566 
01567 
01568 
01569 
01570 
01571 
01572 
01573 HANDLE 
LoadCursorIconFromResource(
01574     PBYTE   presbits,
01575     LPCWSTR lpName,
01576     
int     cxDesired,
01577     
int     cyDesired,
01578     UINT    LR_flags)
01579 {
01580     
BOOL     fAni;
01581     
FILEINFO fi;
01582     LPWSTR   lpwszRT;
01583 
01584     fi.
pFileMap = presbits;
01585     fi.
pFilePtr = fi.
pFileMap;
01586     fi.
pFileEnd = fi.
pFileMap + 
sizeof (RTAG) + ((RTAG *)presbits)->ckSize;
01587     fi.
pszName  = lpName;
01588 
01589     
return LoadCursorIconFromFileMap(&fi,
01590                                      &lpwszRT,
01591                                      cxDesired,
01592                                      cyDesired,
01593                                      LR_flags,
01594                                      &fAni);
01595 }
01596 
01597 
01598 
01599 
01600 
01601 
01602 
01603 
01604 HICON WINAPI 
CreateIconFromResource(
01605     PBYTE presbits,
01606     DWORD dwResSize,
01607     BOOL  fIcon,
01608     DWORD dwVer)
01609 {
01610     
return CreateIconFromResourceEx(presbits,
01611                                     dwResSize,
01612                                     fIcon,
01613                                     dwVer,
01614                                     0,
01615                                     0,
01616                                     LR_DEFAULTSIZE | LR_SHARED);
01617 }
01618 
01619 
01620 
01621 
01622 
01623 
01624 
01625 
01626 
01627 HICON WINAPI 
CreateIconFromResourceEx(
01628     PBYTE presbits,
01629     DWORD dwResSize,
01630     BOOL  fIcon,
01631     DWORD dwVer,
01632     
int   cxDesired,
01633     
int   cyDesired,
01634     UINT  LR_flags)
01635 {
01636     UNREFERENCED_PARAMETER(dwResSize);
01637 
01638     
01639 
01640 
01641     
if ((dwVer < 0x00020000) || (dwVer > 0x00030000)) {
01642         RIPMSG0(RIP_WARNING, 
"CreateIconFromResourceEx: Invalid Paramter");
01643         
return NULL;
01644     }
01645 
01646     
01647 
01648 
01649 
01650     cxDesired = 
GetIcoCurWidth(cxDesired , fIcon, LR_flags, 0);
01651     cyDesired = 
GetIcoCurHeight(cyDesired, fIcon, LR_flags, 0);
01652 
01653     
if (
ISRIFFFORMAT(presbits)) {
01654         
return LoadCursorIconFromResource (presbits, 
NULL, cxDesired, cyDesired, LR_flags);
01655     } 
else {
01656         
return ConvertDIBIcon((LPBITMAPINFOHEADER)presbits,
01657                               
NULL,
01658                               
NULL,
01659                               fIcon,
01660                               cxDesired,
01661                               cyDesired,
01662                               LR_flags);
01663     }
01664 }
01665 
01666 
01667 
01668 
01669 
01670 
01671 
01672 
01673 
01674 
01675 
01676 
01677 
01678 
01679 
01680 HBITMAP 
Convert1BppToMonoBitmap(
01681     HDC     hdcSrc,
01682     HBITMAP hbm1Bpp)
01683 {
01684     HBITMAP hbmMono = hbm1Bpp;
01685     HBITMAP hbmDst;
01686     HBITMAP hbmS;
01687     HBITMAP hbmD;
01688     HDC     hdcDst;
01689     BITMAP  bm;
01690 
01691     
if (hdcDst = CreateCompatibleDC(hdcSrc)) {
01692 
01693         GetObject(hbm1Bpp, 
sizeof(BITMAP), &bm);
01694 
01695         
if (hbmDst = CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, 
NULL)) {
01696 
01697             hbmS = SelectBitmap(hdcSrc, hbm1Bpp);
01698             hbmD = SelectBitmap(hdcDst, hbmDst);
01699 
01700             BitBlt(hdcDst,
01701                    0,
01702                    0,
01703                    bm.bmWidth,
01704                    bm.bmHeight,
01705                    hdcSrc,
01706                    0,
01707                    0,
01708                    SRCCOPY);
01709 
01710             SelectBitmap(hdcSrc, hbmS);
01711             SelectBitmap(hdcDst, hbmD);
01712 
01713             hbmMono = hbmDst;
01714             DeleteObject(hbm1Bpp);
01715         }
01716 
01717         DeleteDC(hdcDst);
01718     }
01719 
01720     
return hbmMono;
01721 }
01722 
01723 
01724 
01725 
01726 
01727 
01728 
01729 
01730 
01731 
01732 HBITMAP 
CreateScreenBitmap(
01733     
int    cx,
01734     
int    cy,
01735     UINT   planes,
01736     UINT   bpp,
01737     LPSTR  lpBits,
01738     LPBOOL pf1Bpp)
01739 {
01740     HDC     hdcScreen;
01741     HBITMAP hbm = 
NULL;
01742     
DWORD   dwCount;
01743 
01744     
static struct {
01745         BITMAPINFOHEADER bi;
01746         
DWORD            ct[16];
01747     } dib4Vga = {{
sizeof(BITMAPINFOHEADER),
01748                   0,
01749                   0,
01750                   1,
01751                   4,
01752                   BI_RGB,
01753                   0,
01754                   0,
01755                   0,
01756                   16,
01757                   0
01758                  },
01759                  {0x00000000,
01760                   0x00800000,
01761                   0x00008000,
01762                   0x00808000,
01763                   0x00000080,
01764                   0x00800080,
01765                   0x00008080,
01766                   0x00C0C0C0,
01767                   0x00808080,
01768                   0x00FF0000,
01769                   0x0000FF00,
01770                   0x00FFFF00,
01771                   0x000000FF,
01772                   0x00FF00FF,
01773                   0x0000FFFF,
01774                   0x00FFFFFF
01775                  }
01776                 };
01777 
01778     
static struct {
01779         BITMAPINFOHEADER bi;
01780         
DWORD            ct[2];
01781     } dib1Vga = {{
sizeof(BITMAPINFOHEADER),
01782                   0,
01783                   0,
01784                   1,
01785                   1,
01786                   BI_RGB,
01787                   0,
01788                   0,
01789                   0,
01790                   2,
01791                   0
01792                  },
01793                  {0x00000000,
01794                   0x00FFFFFF
01795                  }
01796                 };
01797 
01798 
01799     
01800 
01801 
01802     
if (hdcScreen = 
GETINITDC()) {
01803 
01804         
01805 
01806 
01807 
01808 
01809 
01810 
01811 
01812 
01813 
01814 
01815 
01816         
if ((bpp == 1) && (planes == 1)) {
01817 
01818             dib1Vga.bi.biWidth  = cx;
01819             dib1Vga.bi.biHeight = 
cy;
01820 
01821             hbm = CreateDIBitmap(hdcScreen,
01822                                  (LPBITMAPINFOHEADER)&dib1Vga,
01823                                  CBM_CREATEDIB,
01824                                  
NULL,
01825                                  (LPBITMAPINFO)&dib1Vga,
01826                                  DIB_RGB_COLORS);
01827 
01828             *pf1Bpp = 
TRUE;
01829 
01830         } 
else {
01831 
01832             
if (((planes == 0) || (planes == 
gpsi->Planes)) &&
01833                 ((bpp == 0) || (bpp == 
gpsi->BitsPixel))) {
01834 
01835                 hbm = CreateCompatibleBitmap(hdcScreen, cx, 
cy);
01836 
01837             } 
else {
01838 
01839                 dib4Vga.bi.biBitCount = planes * bpp ? planes * bpp : 
gpsi->BitCount;
01840 
01841 
#if 0 // We use to do the dib-section create, but this breaks icons
01842 
      
01843       
01844       
01845                 {
01846                 
DWORD dwDummy;
01847 
01848                 dib4Vga.bi.biWidth    =  cx;
01849                 dib4Vga.bi.biHeight   = -
cy;     
01850 
01851                 hbm = CreateDIBSection(hdcScreen,
01852                                        (LPBITMAPINFO)&dib4Vga,
01853                                        DIB_RGB_COLORS,
01854                                        (
LPVOID)&dwDummy,
01855                                        0,
01856                                        0);
01857                 }
01858 
#else
01859 
                dib4Vga.bi.biWidth  = cx;
01860                 dib4Vga.bi.biHeight = 
cy;
01861 
01862                 hbm = CreateDIBitmap(hdcScreen,
01863                                      (LPBITMAPINFOHEADER)&dib4Vga,
01864                                      CBM_CREATEDIB,
01865                                      
NULL,
01866                                      (LPBITMAPINFO)&dib4Vga,
01867                                      DIB_RGB_COLORS);
01868 
#endif
01869 
            }
01870         }
01871 
01872         
RELEASEINITDC(hdcScreen);
01873     }
01874 
01875     
if (hbm && lpBits) {
01876 
01877         BITMAP bm;
01878 
01879         GetObject(hbm, 
sizeof(BITMAP), &bm);
01880         dwCount = (
DWORD)(
UINT)(bm.bmWidthBytes * bm.bmPlanes) * (
DWORD)(
UINT)
cy;
01881         SetBitmapBits(hbm, dwCount, lpBits);
01882     }
01883 
01884     
return hbm;
01885 }
01886 
01887 
01888 
01889 
01890 
01891 
01892 
01893 
01894 
01895 
01896 
01897 
01898 
01899 HBITMAP 
LoadBmp(
01900     HINSTANCE hmod,
01901     LPCWSTR   lpName,
01902     
int       cxDesired,
01903     
int       cyDesired,
01904     UINT      flags)
01905 {
01906     HBITMAP hbmp = 
NULL;
01907     
BOOL    fFree = 
FALSE;
01908     
BOOL    f1Bpp = 
FALSE;
01909 
01910 
01911 
01912 
01913 
01914 
01915 
01916 
01917 
01918 
01919 
01920 
01921 
01922 
01923 
#define MAX_BMPMAP  32
01924 
01925     CONST 
static MAPRES MapOemBmp[
MAX_BMPMAP] = {
01926 
01927         {OBM_BTNCORNERS , 
OBI_RADIOMASK      ,               },
01928         {OBM_BTSIZE     , 
OBI_NCGRIP         ,               },
01929         {OBM_CHECK      , 
OBI_MENUCHECK      , 
MR_MONOCHROME },
01930         {OBM_CHECKBOXES , 
OBI_CHECK          ,               },
01931         {OBM_COMBO      , 
OBI_DNARROW        ,               },
01932         {OBM_DNARROW    , 
OBI_DNARROW        ,               },
01933         {OBM_DNARROWD   , 
OBI_DNARROW_D      ,               },
01934         {OBM_DNARROWI   , 
OBI_DNARROW_I      ,               },
01935         {OBM_LFARROW    , 
OBI_LFARROW        ,               },
01936         {OBM_LFARROWD   , 
OBI_LFARROW_D      ,               },
01937         {OBM_LFARROWI   , 
OBI_LFARROW_I      ,               },
01938 
01939         
01940 
01941 
01942         {OBM_OLD_DNARROW, 
OBI_DNARROW        , 
MR_FAILFOR40  },
01943         {OBM_OLD_LFARROW, 
OBI_LFARROW        , 
MR_FAILFOR40  },
01944         {OBM_OLD_REDUCE , 
OBI_REDUCE_MBAR    , 
MR_FAILFOR40  },
01945         {OBM_OLD_RESTORE, 
OBI_RESTORE_MBAR   , 
MR_FAILFOR40  },
01946         {OBM_OLD_RGARROW, 
OBI_RGARROW        , 
MR_FAILFOR40  },
01947         {OBM_OLD_UPARROW, 
OBI_UPARROW        , 
MR_FAILFOR40  },
01948         {OBM_OLD_ZOOM   , 
OBI_ZOOM           , 
MR_FAILFOR40  },
01949 
01950         {OBM_MNARROW    , 
OBI_MENUARROW      , 
MR_MONOCHROME },
01951         {OBM_REDUCE     , 
OBI_REDUCE_MBAR    ,               },
01952         {OBM_REDUCED    , 
OBI_REDUCE_MBAR_D  ,               },
01953         {OBM_RESTORE    , 
OBI_RESTORE_MBAR   ,               },
01954         {OBM_RESTORED   , 
OBI_RESTORE_MBAR_D ,               },
01955         {OBM_RGARROW    , 
OBI_RGARROW        ,               },
01956         {OBM_RGARROWD   , 
OBI_RGARROW_D      ,               },
01957         {OBM_RGARROWI   , 
OBI_RGARROW_I      ,               },
01958         {OBM_SIZE       , 
OBI_NCGRIP         ,               },
01959         {OBM_UPARROW    , 
OBI_UPARROW        ,               },
01960         {OBM_UPARROWD   , 
OBI_UPARROW_D      ,               },
01961         {OBM_UPARROWI   , 
OBI_UPARROW_I      ,               },
01962         {OBM_ZOOM       , 
OBI_ZOOM           ,               },
01963         {OBM_ZOOMD      , 
OBI_ZOOM_D         ,               }
01964     };
01965 
01966 
01967     
01968 
01969 
01970     
if (hmod == 
NULL) {
01971 
01972         HBITMAP hOldBmp;
01973         WORD    bm;
01974         WORD    wID;
01975         
BOOL    fCombo;
01976         
BOOL    fCheckBoxes;
01977         
int     i;
01978         RECT    rc;
01979         
BOOL    fSysMenu = 
FALSE;
01980         
BOOL    fMenu = 
FALSE;
01981         
BOOL    fMono = 
FALSE;
01982 
01983         hmod = 
hmodUser;
01984 
01985         
01986 
01987 
01988 
01989         wID = 
PTR_TO_ID(lpName);
01990 
01991         
switch(wID) {
01992         
case OBM_OLD_CLOSE:
01993             
if (
GETAPPVER() >= 
VER40)
01994                 
goto FailOldLoad;
01995 
01996             
01997 
01998 
01999 
02000         
case OBM_CLOSE:
02001             
02002 
02003 
02004 
02005 
02006             cxDesired = (
SYSMET(CXMENUSIZE) + 
SYSMET(CXEDGE)) * 2;
02007             cyDesired = 
SYSMET(CYMENUSIZE) + (2 * 
SYSMET(CYEDGE));
02008             fSysMenu  = 
TRUE;
02009             
break;
02010 
02011         
case OBM_TRUETYPE: {
02012 
02013                 PVOID  p;
02014                 HANDLE h;
02015                 
int    nOffset;
02016 
02017                 
02018 
02019 
02020                 
if (
gpsi->dmLogPixels == 120) {
02021                     nOffset = 
OFFSET_120_DPI;
02022                 } 
else {
02023                     nOffset = 
OFFSET_96_DPI;
02024                 }
02025 
02026                 lpName = (LPWSTR)(
MAX_RESOURCE_INDEX -
02027                         ((ULONG_PTR)lpName) + nOffset);
02028 
02029                 
if (h = 
FINDRESOURCEW(hmod, (LPWSTR)lpName, RT_BITMAP)) {
02030 
02031                     
if (h = 
LOADRESOURCE(hmod, h)) {
02032 
02033                         
if (p = 
LOCKRESOURCE(h, hmod)) {
02034 
02035 
02036                             hbmp = (HBITMAP)
ObjectFromDIBResource(hmod,
02037                                                                   lpName,
02038                                                                   RT_BITMAP,
02039                                                                   cxDesired,
02040                                                                   cyDesired,
02041                                                                   flags);
02042 
02043                             
UNLOCKRESOURCE(h, hmod);
02044                         }
02045 
02046                         
FREERESOURCE(h, hmod);
02047                     }
02048                 }
02049 
02050                 
goto LoadBmpDone;
02051             }
02052             
break;
02053 
02054         
default:
02055             fCombo      = (wID == OBM_COMBO);
02056             fCheckBoxes = (wID == OBM_CHECKBOXES);
02057 
02058             
02059 
02060 
02061             
for (i=0; (i < 
MAX_BMPMAP) && (MapOemBmp[i].idDisp != wID); i++);
02062 
02063             
if (i == 
MAX_BMPMAP)
02064                 
goto LoadForReal;
02065 
02066             
if ((MapOemBmp[i].bFlags & 
MR_FAILFOR40) &&
02067                     (
GETAPPVER() >= 
VER40)) {
02068 
02069 FailOldLoad:
02070                 RIPMSG0(RIP_WARNING, 
"LoadBitmap: old IDs not allowed for 4.0 apps");
02071                 
return NULL;
02072             }
02073 
02074             
if (MapOemBmp[i].bFlags & 
MR_MONOCHROME)
02075                 fMono = 
TRUE;
02076 
02077             bm = MapOemBmp[i].idUser;
02078 
02079             
if ((bm == 
OBI_REDUCE_MBAR) || (bm == 
OBI_RESTORE_MBAR))
02080                 fMenu = 
TRUE;
02081 
02082             cxDesired = 
gpsi->oembmi[bm].cx;
02083             cyDesired = 
gpsi->oembmi[bm].cy;
02084 
02085             
if (fMenu)
02086                 cyDesired += (2 * 
SYSMET(CYEDGE));
02087 
02088             
if (fCheckBoxes) {
02089                 cxDesired *= 
NUM_BUTTON_STATES;
02090                 cyDesired *= 
NUM_BUTTON_TYPES;
02091             } 
else if (fCombo) {
02092                 cxDesired -= (2 * 
SYSMET(CXEDGE));
02093                 cyDesired -= (2 * 
SYSMET(CYEDGE));
02094             }
02095             
break;
02096         }
02097 
02098         
02099 
02100 
02101         
if (fMono) {
02102 
02103             
02104 
02105 
02106 
02107 
02108 
02109 
02110 
02111 
02112 
02113 
02114             hbmp = 
CreateScreenBitmap(cxDesired, cyDesired, 1, 1, 
NULL, &f1Bpp);
02115 
02116         } 
else {
02117 
02118             hbmp = 
CreateScreenBitmap(cxDesired, cyDesired, 0, 0, 
NULL, &f1Bpp);
02119         }
02120 
02121         
if (hbmp == 
NULL)
02122             
goto LoadBmpDone;
02123 
02124         RtlEnterCriticalSection(&
gcsHdc);
02125         hOldBmp = SelectBitmap(
ghdcBits2, hbmp);
02126         UserAssert(GetBkColor(
ghdcBits2) == RGB(255,255,255));
02127         UserAssert(GetTextColor(
ghdcBits2) == RGB(0, 0, 0));
02128 
02129         rc.top    = 0;
02130         rc.left   = 0;
02131         rc.bottom = cyDesired;
02132         rc.right  = cxDesired;
02133 
02134         
if (fMono) {
02135             PatBlt(
ghdcBits2, 0, 0, cxDesired, cyDesired, WHITENESS);
02136         } 
else {
02137             
FillRect(
ghdcBits2,
02138                      &rc,
02139                      ((fMenu | fSysMenu) ? 
SYSHBR(
MENU) : 
SYSHBR(
WINDOW)));
02140         }
02141 
02142         
if (fSysMenu) {
02143             
int x = 
SYSMET(CXEDGE);
02144             
int i;
02145 
02146             cxDesired /= 2;
02147 
02148             
for (i=0; i < 2; i++) {
02149 
02150                 
DrawIconEx(
ghdcBits2,
02151                            x,
02152                            
SYSMET(CYEDGE),
02153                            
gpsi->hIconSmWindows,
02154                            cxDesired - 2 * 
SYSMET(CXEDGE),
02155                            
SYSMET(CYMENUSIZE) - 
SYSMET(CYEDGE),
02156                            0,
02157                            
NULL,
02158                            DI_NORMAL);
02159 
02160                 x += cxDesired;
02161             }
02162 
02163         } 
else if (fCombo) {
02164 
02165             
02166 
02167 
02168 
02169             rc.top     = -
SYSMET(CYEDGE);
02170             rc.bottom +=  
SYSMET(CYEDGE);
02171             rc.left    = -
SYSMET(CXEDGE);
02172             rc.right  +=  
SYSMET(CXEDGE);
02173 
02174             
DrawFrameControl(
ghdcBits2,
02175                              &rc,
02176                              DFC_SCROLL,
02177                              DFCS_SCROLLDOWN);
02178 
02179         } 
else if (fCheckBoxes) {
02180 
02181             
int   wType;
02182             
int   wState;
02183             
int   x;
02184             
DWORD clrTextSave;
02185             
DWORD clrBkSave;
02186             
int   y = 0;
02187 
02188             
for (wType=0; wType < 
NUM_BUTTON_TYPES; wType++) {
02189 
02190                 x = 0;
02191 
02192                 cxDesired = 
gpsi->oembmi[bm].cx;
02193                 cyDesired = 
gpsi->oembmi[bm].cy;
02194 
02195                 
if (wType == 1) {
02196 
02197                     
02198 
02199 
02200 
02201 
02202                     clrTextSave = SetTextColor(
ghdcBits2, 
RESCLR_BLACK);
02203                     clrBkSave   = SetBkColor  (
ghdcBits2, 
RESCLR_WHITE);
02204 
02205                     
for (wState = 0; wState < 
NUM_BUTTON_STATES; wState++) {
02206 
02207                         
NtUserBitBltSysBmp(
ghdcBits2,
02208                                            x,
02209                                            y,
02210                                            cxDesired,
02211                                            cyDesired,
02212                                            
gpsi->oembmi[
OBI_RADIOMASK].x,
02213                                            
gpsi->oembmi[
OBI_RADIOMASK].y,
02214                                            SRCAND);
02215 
02216                         
NtUserBitBltSysBmp(
ghdcBits2,
02217                                            x,
02218                                            y,
02219                                            cxDesired,
02220                                            cyDesired,
02221                                            
gpsi->oembmi[bm].x,
02222                                            
gpsi->oembmi[bm].y,
02223                                            SRCINVERT);
02224                         x += cxDesired;
02225                         bm++;
02226                     }
02227 
02228                     SetTextColor(
ghdcBits2, clrTextSave);
02229                     SetBkColor(
ghdcBits2, clrBkSave);
02230 
02231                 } 
else {
02232 
02233                     
for (wState=0; wState < 
NUM_BUTTON_STATES; wState++) {
02234 
02235                         
BitBltSysBmp(
ghdcBits2, x, y, bm);
02236                         x += cxDesired;
02237                         bm++;
02238                     }
02239 
02240                     
02241 
02242 
02243                     bm++;
02244                 }
02245 
02246                 y += cyDesired;
02247             }
02248 
02249         } 
else {
02250 
02251             
BitBltSysBmp(
ghdcBits2, 0, fMenu ? 
SYSMET(CYEDGE) : 0, bm);
02252         }
02253 
02254         SelectBitmap(
ghdcBits2, hOldBmp);
02255 
02256         
02257 
02258 
02259 
02260 
02261         
if (f1Bpp && hbmp)
02262             hbmp = 
Convert1BppToMonoBitmap(
ghdcBits2, hbmp);
02263 
02264         RtlLeaveCriticalSection(&
gcsHdc);
02265 
02266     } 
else {
02267 
02268 LoadForReal:
02269 
02270         hbmp = (HBITMAP)
ObjectFromDIBResource(hmod,
02271                                               lpName,
02272                                               RT_BITMAP,
02273                                               cxDesired,
02274                                               cyDesired,
02275                                               flags);
02276     }
02277 
02278 LoadBmpDone:
02279 
02280     
return hbmp;
02281 }
02282 
02283 
02284 
02285 
02286 
02287 
02288 
02289 
02290 
02291 
02292 HBITMAP WINAPI 
LoadBitmapA(
02293     HINSTANCE hmod,
02294     LPCSTR    lpName)
02295 {
02296     LPWSTR  lpUniName;
02297     HBITMAP hRet;
02298 
02299     
if (
ID(lpName))
02300         
return LoadBmp(hmod, (LPCWSTR)lpName, 0, 0, 0);
02301 
02302     
if (!MBToWCS(lpName, -1, &lpUniName, -1, 
TRUE))
02303         
return NULL;
02304 
02305     hRet = 
LoadBmp(hmod, lpUniName, 0, 0, 0);
02306 
02307     
UserLocalFree(lpUniName);
02308 
02309     
return hRet;
02310 }
02311 
02312 HBITMAP WINAPI 
LoadBitmapW(
02313     HINSTANCE hmod,
02314     LPCWSTR   lpName)
02315 {
02316     
return LoadBmp(hmod, lpName, 0, 0, 0);
02317 }
02318 
02319 
02320 
02321 
02322 
02323 
02324 
02325 
02326 
02327 
02328 
02329 HCURSOR WINAPI 
LoadCursorA(
02330     HINSTANCE hmod,
02331     LPCSTR    lpName)
02332 {
02333     HCURSOR hRet;
02334     LPWSTR  lpUniName;
02335 
02336     
if (
ID(lpName))
02337         
return LoadCursorW(hmod, (LPWSTR)lpName);
02338 
02339     
if (!MBToWCS(lpName, -1, &lpUniName, -1, 
TRUE))
02340         
return NULL;
02341 
02342     hRet = 
LoadCursorW(hmod, lpUniName);
02343 
02344     
UserLocalFree(lpUniName);
02345 
02346     
return hRet;
02347 }
02348 
02349 HCURSOR WINAPI 
LoadCursorW(
02350     HINSTANCE hmod,
02351     LPCWSTR   lpName)
02352 {
02353 
02354     
return LoadIcoCur(hmod,
02355                       lpName,
02356                       RT_CURSOR,
02357                       0,
02358                       0,
02359                       LR_DEFAULTSIZE | LR_SHARED);
02360 
02361 }
02362 
02363 
02364 
02365 
02366 
02367 
02368 
02369 
02370 
02371 
02372 
02373 HICON WINAPI 
LoadIconA(
02374     HINSTANCE hmod,
02375     LPCSTR    lpName)
02376 {
02377     HICON  hRet;
02378     LPWSTR lpUniName;
02379 
02380     
if (
ID(lpName))
02381         
return LoadIconW(hmod, (LPWSTR)lpName);
02382 
02383     
if (!MBToWCS(lpName, -1, &lpUniName, -1, 
TRUE))
02384         
return NULL;
02385 
02386     hRet = 
LoadIconW(hmod, lpUniName);
02387 
02388     
UserLocalFree(lpUniName);
02389 
02390     
return hRet;
02391 }
02392 
02393 HICON WINAPI 
LoadIconW(
02394     HINSTANCE hmod,
02395     LPCWSTR   lpName)
02396 {
02397     
return LoadIcoCur(hmod,
02398                       lpName,
02399                       RT_ICON,
02400                       0,
02401                       0,
02402                       LR_DEFAULTSIZE | LR_SHARED);
02403 }
02404 
02405 
02406 
02407 
02408 
02409 
02410 
02411 
02412 
02413 
02414 HANDLE WINAPI 
LoadImageA(
02415     HINSTANCE hmod,
02416     LPCSTR    lpName,
02417     UINT      type,
02418     
int       cxDesired,
02419     
int       cyDesired,
02420     UINT      flags)
02421 {
02422     LPWSTR lpUniName;
02423     HANDLE hRet;
02424 
02425     
if (
ID(lpName))
02426         
return LoadImageW(hmod,
02427                           (LPCWSTR)lpName,
02428                           
type,
02429                           cxDesired,
02430                           cyDesired,
02431                           flags);
02432 
02433     
if (!MBToWCS(lpName, -1, &lpUniName, -1, 
TRUE))
02434         
return NULL;
02435 
02436     hRet = 
LoadImageW(hmod, lpUniName, 
type, cxDesired, cyDesired, flags);
02437 
02438     
UserLocalFree(lpUniName);
02439 
02440     
return hRet;
02441 }
02442 
02443 HANDLE WINAPI 
LoadImageW(
02444     HINSTANCE hmod,
02445     LPCWSTR   lpName,
02446     UINT      IMAGE_code,
02447     
int       cxDesired,
02448     
int       cyDesired,
02449     UINT      flags)
02450 {
02451     
02452 
02453 
02454 
02455     
if (flags & LR_LOADFROMFILE)
02456         flags &= ~LR_SHARED;
02457 
02458     
switch (IMAGE_code) {
02459     
case IMAGE_BITMAP:
02460         
return (HANDLE)
LoadBmp(hmod, lpName, cxDesired, cyDesired, flags);
02461 
02462     
case IMAGE_CURSOR:
02463 
#if 0 //CHRISWIL : oemInfo.fColorCursors doesn't exist on NT.
02464 
        if (!oemInfo.fColorCursors)
02465             flags |= LR_MONOCHROME;
02466 
#endif
02467 
02468     
case IMAGE_ICON:
02469 
02470         
02471 
02472 
02473 
02474 
02475 
02476 
02477         
if (!hmod && 
GETEXPWINVER(
NULL) < 
VER40) {
02478             flags |= LR_SHARED;
02479         }
02480 
02481         
return (HANDLE)
LoadIcoCur(hmod,
02482                                   lpName,
02483                                   ((IMAGE_code == IMAGE_ICON) ? RT_ICON : RT_CURSOR),
02484                                   cxDesired,
02485                                   cyDesired,
02486                                   flags);
02487 
02488     
default:
02489         RIPMSG0(RIP_WARNING, 
"LoadImage: invalid IMAGE_code");
02490         
return NULL;
02491     }
02492 }
02493 
02494 
02495 
02496 
02497 
02498 
02499 
02500 
02501 
02502 UINT GetIconIdEx(
02503     HINSTANCE hmod,
02504     HANDLE    hrsd,
02505     LPCWSTR   lpszType,
02506     DWORD     cxDesired,
02507     DWORD     cyDesired,
02508     UINT      LR_flags)
02509 {
02510     
int         idIcon = 0;
02511     LPNEWHEADER lpnh;
02512 
02513     
if (lpnh = (LPNEWHEADER)
LOCKRESOURCE(hrsd, hmod)) {
02514 
02515         
02516 
02517 
02518 
02519 
02520         
if ((lpnh->Reserved == 0) &&
02521             ((lpnh->ResType == IMAGE_ICON) || (lpnh->ResType == IMAGE_CURSOR))) {
02522 
02523             idIcon = 
LookupIconIdFromDirectoryEx((
PBYTE)lpnh,
02524                                                  (lpszType == RT_ICON),
02525                                                  cxDesired,
02526                                                  cyDesired,
02527                                                  LR_flags);
02528         }
02529 
02530         
UNLOCKRESOURCE(hrsd, hmod);
02531     }
02532 
02533     
return idIcon;
02534 }
02535 
02536 
02537 
02538 
02539 
02540 
02541 
02542 
02543 
02544 HANDLE 
LoadDIB(
02545     HINSTANCE hmod,
02546     LPCWSTR   lpName,
02547     LPWSTR    type,
02548     DWORD     cxDesired,
02549     DWORD     cyDesired,
02550     UINT      LR_flags)
02551 {
02552     HANDLE  hDir;
02553     
UINT    idIcon;
02554     LPWSTR  lpszGroupType;
02555     HANDLE  hRes = 
NULL;
02556 
02557     
switch (
PTR_TO_ID(
type)) {
02558 
02559     
case PTR_TO_ID(RT_ICON):
02560     
case PTR_TO_ID(RT_CURSOR):
02561 
02562         lpszGroupType = RT_GROUP_CURSOR + (
type - RT_CURSOR);
02563 
02564         
02565 
02566 
02567 
02568 
02569 
02570 
02571 
02572 
02573         
if (hmod == 
hmodUser) {
02574 
02575             
switch ((ULONG_PTR)lpName) {
02576             
case OCR_SIZE:
02577                 lpName = (LPCWSTR)OCR_SIZEALL_DEFAULT;
02578                 
break;
02579 
02580             
case OCR_ICON:
02581                 lpName = (LPCWSTR)OCR_ICON_DEFAULT;
02582                 
break;
02583             }
02584         }
02585         
02586 
02587 
02588 
02589 
02590         
if (hDir = 
SplFindResource(hmod, lpName, (LPCWSTR)lpszGroupType)) {
02591 
02592             
02593 
02594 
02595             
if (hDir = 
LOADRESOURCE(hmod, hDir)) {
02596 
02597                 
02598 
02599 
02600                 
if (idIcon = 
GetIconIdEx(hmod,
02601                                          hDir,
02602                                          
type,
02603                                          cxDesired,
02604                                          cyDesired,
02605                                          LR_flags)) {
02606 
02607                     
02608 
02609 
02610 
02611 
02612 
02613                     hRes = 
FINDRESOURCEW(hmod, MAKEINTRESOURCE(idIcon), 
type);
02614                 }
02615 
02616                 
02617 
02618 
02619 
02620 
02621 
02622 
02623 
02624                 
SplFreeResource(hDir, hmod, LR_flags);
02625             }
02626         } 
else {
02627             
02628 
02629 
02630 
02631             hRes = 
SplFindResource(hmod, lpName,
02632                     
PTR_TO_ID(
type) == 
PTR_TO_ID(RT_CURSOR) ? RT_ANICURSOR : RT_ANIICON);
02633         }
02634         
break;
02635 
02636     
case PTR_TO_ID(RT_BITMAP):
02637         hRes = 
SplFindResource(hmod, lpName, RT_BITMAP);
02638         
break;
02639 
02640     
default:
02641         RIPMSG0(RIP_WARNING, 
"LoadDIB: Invalid resource type");
02642         
break;
02643     }
02644 
02645     
if (hRes)
02646         hRes = 
LOADRESOURCE(hmod, hRes);
02647 
02648     
return hRes;
02649 }
02650 
02651 
02652 
02653 
02654 
02655 
02656 
02657 HICON 
LoadIcoCur(
02658     HINSTANCE hmod,
02659     LPCWSTR   pszResName,
02660     LPWSTR    type,
02661     DWORD     cxDesired,
02662     DWORD     cyDesired,
02663     UINT      LR_flags)
02664 {
02665     HICON     hico;
02666     LPWSTR    pszModName;
02667     WCHAR     achModName[
MAX_PATH];
02668 
02669     
ConnectIfNecessary();
02670 
02671     
02672 
02673 
02674     
if (hmod == 
NULL)  {
02675 
02676         hmod = 
hmodUser;
02677         pszModName = 
szUSER32;
02678 
02679     } 
else {
02680 
02681         
WowGetModuleFileName(hmod,
02682                              achModName,
02683                              
sizeof(achModName) / 
sizeof(WCHAR));
02684 
02685         pszModName = achModName;
02686     }
02687 
02688     
if (LR_flags & LR_CREATEDIBSECTION)
02689         LR_flags = (LR_flags & ~LR_CREATEDIBSECTION) | LR_CREATEREALDIB;
02690 
02691     
02692 
02693 
02694     
if ((hmod == 
hmodUser) && !
IS_PTR(pszResName)) {
02695 
02696         
int      imapMax;
02697         
LPMAPRES lpMapRes;
02698 
02699         
02700 
02701 
02702         
if (
type == RT_ICON) {
02703 
02704             
static MAPRES MapOemOic[] = {
02705                 {OCR_ICOCUR, OIC_WINLOGO, 
MR_FAILFOR40}
02706             };
02707 
02708             lpMapRes = MapOemOic;
02709             imapMax  = 1;
02710 
02711         } 
else {
02712 
02713             
static MAPRES MapOemOcr[] = {
02714                 {OCR_ICON, OCR_ICON, 
MR_FAILFOR40},
02715                 {OCR_SIZE, OCR_SIZE, 
MR_FAILFOR40}
02716             };
02717 
02718             lpMapRes = MapOemOcr;
02719             imapMax  = 2;
02720         }
02721 
02722         
while (--imapMax >= 0) {
02723 
02724             
if (lpMapRes->
idDisp == 
PTR_TO_ID(pszResName)) {
02725 
02726                 
if ((lpMapRes->
bFlags & 
MR_FAILFOR40) &&
02727                     
GETAPPVER() >= 
VER40) {
02728 
02729                     RIPMSG1(RIP_WARNING,
02730                           
"LoadIcoCur: Old ID 0x%x not allowed for 4.0 apps",
02731                           
PTR_TO_ID(pszResName));
02732 
02733                     
return NULL;
02734                 }
02735 
02736                 pszResName = MAKEINTRESOURCE(lpMapRes->
idUser);
02737                 
break;
02738             }
02739 
02740             ++lpMapRes;
02741         }
02742     }
02743 
02744     
02745 
02746 
02747     cxDesired = 
GetIcoCurWidth(cxDesired , (
type == RT_ICON), LR_flags, 0);
02748     cyDesired = 
GetIcoCurHeight(cyDesired, (
type == RT_ICON), LR_flags, 0);
02749 
02750     
02751 
02752 
02753 
02754     
if (LR_flags & LR_SHARED) {
02755 
02756         
CURSORFIND cfSearch;
02757 
02758         
02759 
02760 
02761 
02762 
02763 
02764 
02765 
02766 
02767 
02768         cfSearch.
hcur = (HCURSOR)
NULL;
02769         cfSearch.
rt   = PtrToUlong(
type);
02770 
02771         
if (hmod == 
hmodUser) {
02772 
02773             cfSearch.
cx  = 0;
02774             cfSearch.
cy  = 0;
02775             cfSearch.
bpp = 0;
02776 
02777         } 
else {
02778 
02779             cfSearch.
cx  = cxDesired;
02780             cfSearch.
cy  = cyDesired;
02781 
02782 
02783 
02784 
02785 
02786 
02787 
02788 
#if 0
02789 
            cfSearch.
bpp = 
GetIcoCurBpp(LR_flags);
02790 
#else
02791 
            cfSearch.
bpp = 0;
02792 
#endif
02793 
        }
02794 
02795         hico = 
FindExistingCursorIcon(pszModName, pszResName, &cfSearch);
02796 
02797         
if (hico != 
NULL)
02798             
goto IcoCurFound;
02799     }
02800 
02801 
#ifdef LATER // SanfordS
02802 
    
02803 
02804 
02805 
02806 
02807 
02808 
02809 
02810     
if (hmod == 
hmodUser) {
02811         hico = 
FindExistingCursorIcon(
NULL,
02812                                       szUSER,
02813                                       
type,
02814                                       pszResName,
02815                                       0,
02816                                       0,
02817                                       0);
02818         
if (hico != 
NULL) {
02819             
02820 
02821 
02822 
02823 
02824             _GetIconInfo(....);
02825             
return LoadIcoCur(....);
02826         }
02827     }
02828 
#endif
02829 
02830     hico = (HICON)
ObjectFromDIBResource(hmod,
02831                                         pszResName,
02832                                         
type,
02833                                         cxDesired,
02834                                         cyDesired,
02835                                         LR_flags);
02836 
02837 IcoCurFound:
02838 
02839     
return hico;
02840 }
02841 
02842 
02843 
02844 
02845 
02846 
02847 HANDLE 
ObjectFromDIBResource(
02848     HINSTANCE hmod,
02849     LPCWSTR   lpName,
02850     LPWSTR    type,
02851     DWORD     cxDesired,
02852     DWORD     cyDesired,
02853     UINT      LR_flags)
02854 {
02855     HANDLE  hObj = 
NULL;
02856 
02857     
if (LR_flags & LR_LOADFROMFILE) {
02858 
02859         hObj = 
RtlLoadObjectFromDIBFile(lpName,
02860                                         
type,
02861                                         cxDesired,
02862                                         cyDesired,
02863                                         LR_flags);
02864     } 
else {
02865 
02866         HANDLE hdib;
02867 
02868         hdib = 
LoadDIB(hmod, lpName, 
type, cxDesired, cyDesired, LR_flags);
02869 
02870         
if (hdib != 
NULL) {
02871 
02872             LPBITMAPINFOHEADER lpbih;
02873 
02874             
02875 
02876 
02877 
02878 
02879 
02880 
02881             
if(lpbih = (LPBITMAPINFOHEADER)
LOCKRESOURCE(hdib, hmod)) {
02882 
02883                 
switch (
PTR_TO_ID(
type)) {
02884                 
case PTR_TO_ID(RT_BITMAP):
02885                     
02886 
02887 
02888                     hObj = 
ConvertDIBBitmap(lpbih,
02889                                             cxDesired,
02890                                             cyDesired,
02891                                             LR_flags,
02892                                             
NULL,
02893                                             
NULL);
02894                     
break;
02895 
02896                 
case PTR_TO_ID(RT_ICON):
02897                 
case PTR_TO_ID(RT_CURSOR):
02898                 
case PTR_TO_ID(RT_ANICURSOR):
02899                 
case PTR_TO_ID(RT_ANIICON):
02900                     
02901 
02902 
02903                     
if (
ISRIFFFORMAT(lpbih)) {
02904                         hObj = 
LoadCursorIconFromResource ((
PBYTE)lpbih, lpName, cxDesired, cyDesired, LR_flags);
02905                     } 
else {
02906                         
02907 
02908 
02909                         hObj = 
ConvertDIBIcon(lpbih,
02910                                               hmod,
02911                                               lpName,
02912                                               (
type == RT_ICON),
02913                                               cxDesired,
02914                                               cyDesired,
02915                                               LR_flags);
02916                     }
02917                     
break;
02918                 }
02919 
02920                 
UNLOCKRESOURCE(hdib, hmod);
02921             }
02922 
02923             
02924 
02925 
02926 
02927 
02928 
02929 
02930 
02931 
02932 
02933 
02934             
SplFreeResource(hdib, hmod, LR_flags);
02935         }
02936     }
02937 
02938     
return hObj;
02939 }
02940 
02941 
02942 
02943 
02944 
02945 
02946 
02947 
02948 
02949 
02950 HBITMAP 
BitmapFromDIB(
02951     
int          cxNew,
02952     
int          cyNew,
02953     WORD         bPlanesNew,
02954     WORD         bBitsPixelNew,
02955     UINT         LR_flags,
02956     
int          cxOld,
02957     
int          cyOld,
02958     LPSTR        lpBits,
02959     LPBITMAPINFO lpbi,
02960     HPALETTE     hpal)
02961 {
02962     HBITMAP hbmpNew = 
NULL;
02963     
BOOL    fStretch;
02964     
BOOL    f1Bpp = 
FALSE;
02965 
02966     RtlEnterCriticalSection(&
gcsHdc);
02967 
02968     
if (cxNew == 0)
02969         cxNew = cxOld;
02970 
02971     
if (cyNew == 0)
02972         cyNew = cyOld;
02973 
02974     fStretch = ((cxNew != cxOld) || (cyNew != cyOld));
02975 
02976     
02977 
02978 
02979 
02980     
if (LR_flags & (LR_CREATEDIBSECTION | LR_CREATEREALDIB)) {
02981 
02982         
int   cxTemp;
02983         
int   cyTemp;
02984         
BOOL  fOldFormat;
02985         
LPVOID dwDummy;
02986         
DWORD dwTemp;
02987 
02988 
#define lpbch ((LPBITMAPCOREHEADER)lpbi)
02989 
02990         fOldFormat = ((WORD)lpbi->bmiHeader.biSize == 
sizeof(BITMAPCOREHEADER));
02991 
02992         
if (fOldFormat) {
02993 
02994             cxTemp = 
lpbch->bcWidth;
02995             cyTemp = 
lpbch->bcHeight;
02996 
02997             
lpbch->bcWidth  = (WORD)cxNew;
02998             
lpbch->bcHeight = (WORD)cyNew;
02999 
03000         } 
else {
03001 
03002             cxTemp = lpbi->bmiHeader.biWidth;
03003             cyTemp = lpbi->bmiHeader.biHeight;
03004             dwTemp = lpbi->bmiHeader.biCompression;
03005 
03006             lpbi->bmiHeader.biWidth  = cxNew;
03007             lpbi->bmiHeader.biHeight = cyNew;
03008 
03009             
if (dwTemp != BI_BITFIELDS)
03010                 lpbi->bmiHeader.biCompression = BI_RGB;
03011         }
03012 
03013         
if (LR_flags & LR_CREATEREALDIB) {
03014             hbmpNew = CreateDIBitmap(
ghdcBits2,
03015                                      (LPBITMAPINFOHEADER)lpbi,
03016                                      CBM_CREATEDIB,
03017                                      
NULL,
03018                                      lpbi,
03019                                      DIB_RGB_COLORS);
03020         } 
else {
03021             hbmpNew = CreateDIBSection(
ghdcBits2,
03022                                        lpbi,
03023                                        DIB_RGB_COLORS,
03024                                        &dwDummy,
03025                                        0,
03026                                        0);
03027         }
03028 
03029         
if (fOldFormat) {
03030             
lpbch->bcWidth  = (WORD)cxTemp;
03031             
lpbch->bcHeight = (WORD)cyTemp;
03032         } 
else {
03033             lpbi->bmiHeader.biWidth       = cxTemp;
03034             lpbi->bmiHeader.biHeight      = cyTemp;
03035             lpbi->bmiHeader.biCompression = dwTemp;
03036         }
03037 
#undef lpbch
03038 
    }
03039 
03040     
if (hbmpNew == 
NULL) {
03041 
03042         hbmpNew = 
CreateScreenBitmap(cxNew,
03043                                      cyNew,
03044                                      bPlanesNew,
03045                                      bBitsPixelNew,
03046                                      
NULL,
03047                                      &f1Bpp);
03048     }
03049 
03050     
if (hbmpNew) {
03051 
03052         
int     nStretchMode;
03053         
DWORD   rgbBk;
03054         
DWORD   rgbText;
03055         HBITMAP hbmpT;
03056         
BOOL    fFail;
03057 
03058         
03059 
03060 
03061 
03062 
03063         hbmpT = SelectBitmap(
ghdcBits2, hbmpNew);
03064 
03065         
03066 
03067 
03068         
if (fStretch) {
03069             nStretchMode = 
SetBestStretchMode(
ghdcBits2,
03070                                               bPlanesNew,
03071                                               bBitsPixelNew);
03072         }
03073 
03074         rgbBk   = SetBkColor(
ghdcBits2, 
RESCLR_WHITE);
03075         rgbText = SetTextColor(
ghdcBits2, 
RESCLR_BLACK);
03076 
03077         
03078 
03079 
03080         
if (hpal) {
03081 
#if DBG
03082 
            UserAssert(
TEST_PUSIF(
PUSIF_PALETTEDISPLAY));
03083 
#endif // DBG
03084 
03085             hpal = 
SelectPalette(
ghdcBits2, hpal, 
FALSE);
03086             
RealizePalette(
ghdcBits2);
03087         }
03088 
03089         
if (fStretch) {
03090 
03091             fFail = 
SmartStretchDIBits(
ghdcBits2,
03092                                0,
03093                                0,
03094                                cxNew,
03095                                cyNew,
03096                                0,
03097                                0,
03098                                cxOld,
03099                                cyOld,
03100                                lpBits,
03101                                lpbi,
03102                                DIB_RGB_COLORS,
03103                                SRCCOPY) <= 0;
03104         } 
else {
03105 
03106             fFail = SetDIBits(
ghdcBits2,
03107                       hbmpNew,
03108                       0,
03109                       cyNew,
03110                       lpBits,
03111                       lpbi,
03112                       DIB_RGB_COLORS) <= 0;
03113         }
03114 
03115         
03116 
03117 
03118         
if (hpal) {
03119             
SelectPalette(
ghdcBits2, hpal, 
TRUE);
03120             
RealizePalette(
ghdcBits2);
03121         }
03122 
03123         
03124 
03125 
03126         SetTextColor(
ghdcBits2, rgbText);
03127         SetBkColor(
ghdcBits2, rgbBk);
03128         
if (fStretch)
03129             SetStretchBltMode(
ghdcBits2, nStretchMode);
03130 
03131         SelectBitmap(
ghdcBits2, hbmpT);
03132 
03133         
03134 
03135 
03136 
03137 
03138 
03139 
03140 
03141         
if (fFail) {
03142             DeleteObject(hbmpNew);
03143             hbmpNew = 
NULL;
03144         }
03145     }
03146 
03147     
03148 
03149 
03150 
03151 
03152     
if (f1Bpp && hbmpNew)
03153         hbmpNew = 
Convert1BppToMonoBitmap(
ghdcBits2, hbmpNew);
03154 
03155     RtlLeaveCriticalSection(&
gcsHdc);
03156     
return hbmpNew;
03157 }
03158 
03159 
03160 
03161 
03162 
03163 
03164 
03165 DWORD HowManyColors(
03166     IN  
UPBITMAPINFOHEADER upbih,
03167     IN  BOOL               fOldFormat,
03168     OUT OPTIONAL LPBYTE    *ppColorTable)
03169 {
03170 
#define upbch ((UPBITMAPCOREHEADER)upbih)
03171 
03172     
if (fOldFormat) {
03173         
if (ppColorTable != 
NULL) {
03174             *ppColorTable = (LPBYTE)(
upbch + 1);
03175         }
03176         
if (
upbch->bcBitCount <= 8)
03177             
return (1 << 
upbch->bcBitCount);
03178     } 
else {
03179         
if (ppColorTable != 
NULL) {
03180             *ppColorTable = (LPBYTE)(upbih + 1);
03181         }
03182         
if (upbih->biClrUsed)
03183             
return (
DWORD)upbih->biClrUsed;
03184         
else if (upbih->biBitCount <= 8)
03185             
return (1 << upbih->biBitCount);
03186         
else if ((upbih->biBitCount == 16) || (upbih->biBitCount == 32))
03187             
return 3;
03188     }
03189     
return 0;
03190 
03191 
#undef upbch
03192 
}
03193 
03194 
03195 
03196 
03197 
03198 
03199 
03200 
03201 
03202 
03203 VOID ChangeDibColors(
03204     IN LPBITMAPINFOHEADER lpbih,
03205     IN UINT               LR_flags)
03206 {
03207     LPDWORD lpColorTable;
03208     
DWORD  rgb;
03209     
UINT   iColor;
03210     
UINT   cColors;
03211 
03212     cColors = 
HowManyColors(lpbih, 
FALSE, &(LPBYTE)lpColorTable);
03213 
03214     
03215 
03216 
03217 
03218 
03219 
03220 
03221     
03222 
03223 
03224     
if (LR_flags & LR_MONOCHROME) {
03225         
03226 
03227 
03228 
03229 
03230 
03231 
03232 
03233 
03234 
03235         lpbih->biBitCount = lpbih->biPlanes = 1;
03236         lpColorTable[0] = 
RESCLR_BLACK;
03237         lpColorTable[1] = 
RESCLR_WHITE;
03238     } 
else if (LR_flags & LR_LOADTRANSPARENT) {
03239 
03240         LPBYTE pb;
03241 
03242         
03243 
03244 
03245         
if (cColors == 0) {
03246             RIPMSG0(RIP_WARNING, 
"ChangeDibColors: DIB doesn't have a color table");
03247             
return;
03248         }
03249 
03250         pb = (LPBYTE)(lpColorTable + cColors);
03251 
03252         
03253 
03254 
03255 
03256         
if (lpbih->biCompression == 0)
03257             iColor = (
UINT)pb[0];
03258         
else
03259             
03260 
03261 
03262             iColor = (
UINT)(pb[0] == 0 ? pb[2] : pb[1]);
03263 
03264         
switch (cColors) {
03265         
case BPP01_MAXCOLORS:
03266             iColor &= 0x01;
03267             
break;
03268 
03269         
case BPP04_MAXCOLORS:
03270             iColor &= 0x0F;
03271             
break;
03272 
03273         
case BPP08_MAXCOLORS:
03274             iColor &= 0xFF;
03275             
break;
03276         }
03277 
03278         rgb = (LR_flags & LR_LOADMAP3DCOLORS ? 
SYSRGB(3DFACE) : 
SYSRGB(
WINDOW));
03279 
03280         lpColorTable[iColor] = 
RGBX(rgb);
03281 
03282     } 
else  if (LR_flags & LR_LOADMAP3DCOLORS) {
03283 
03284         
03285 
03286 
03287 
03288         
for (iColor = 0; iColor < cColors; iColor++) {
03289 
03290             
switch (*lpColorTable & 0x00FFFFFF) {
03291 
03292             
case RGBX(RGB(223, 223, 223)):
03293                 rgb = 
SYSRGB(3DLIGHT);
03294                 
goto ChangeColor;
03295 
03296             
case RGBX(RGB(192, 192, 192)):
03297                 rgb = 
SYSRGB(3DFACE);
03298                 
goto ChangeColor;
03299 
03300             
case RGBX(RGB(128, 128, 128)):
03301                 rgb = 
SYSRGB(3DSHADOW);
03302 
03303                 
03304 
03305 
03306 
ChangeColor:
03307                 *lpColorTable = 
RGBX(rgb);
03308                 
break;
03309             }
03310             lpColorTable++;
03311         }
03312     }
03313 }
03314 
03315 
03316 
03317 
03318 
03319 
03320 
03321 
03322 
03323 
03324 
03325 
03326 
03327 
03328 
03329 
03330 
03331 
03332 
03333 
03334 
03335 
03336 
03337 
03338 
03339 
03340 
03341 
03342 
03343 
03344 HICON 
ConvertDIBIcon(
03345     LPBITMAPINFOHEADER lpbih,
03346     HINSTANCE          hmod,
03347     LPCWSTR            lpName,
03348     BOOL               fIcon,
03349     DWORD              cxNew,
03350     DWORD              cyNew,
03351     UINT               LR_flags)
03352 {
03353     LPBITMAPINFOHEADER lpbihNew = 
NULL;
03354     LPSTR              lpBitsNextMask = 
NULL;
03355     HICON              hicoNew = 
NULL;
03356     
BOOL               fOldFormat = 
FALSE;
03357     
CURSORDATA         cur;
03358     WCHAR              achModName[
MAX_PATH];
03359 
03360     
03361 
03362 
03363 
03364     
if (LR_flags & LR_CREATEDIBSECTION)
03365         LR_flags = (LR_flags & ~LR_CREATEDIBSECTION) | LR_CREATEREALDIB;
03366 
03367     RtlZeroMemory(&cur, 
sizeof(cur));
03368 
03369     
if (!fIcon) {
03370         
03371 
03372 
03373 
03374 
03375         cur.xHotspot = (
short)(
int)*(((LPWORD)lpbih)++);
03376         cur.yHotspot = (
short)(
int)*(((LPWORD)lpbih)++);
03377     }
03378 
03379     
03380 
03381 
03382 
03383 
03384 
03385     lpBitsNextMask = 
NULL;  
03386     cur.hbmColor = 
ConvertDIBBitmap(lpbih,
03387                                     cxNew,
03388                                     cyNew,
03389                                     LR_flags,
03390                                     &lpbihNew,
03391                                     &lpBitsNextMask);
03392     
if (cur.hbmColor == 
NULL)
03393         
return NULL;
03394 
03395     
if (hmod == 
NULL) {
03396         cur.lpModName = 
NULL;
03397     } 
else {
03398         cur.CURSORF_flags = 
CURSORF_FROMRESOURCE;
03399         
if (hmod == 
hmodUser) {
03400             cur.lpModName     = 
szUSER32;
03401         } 
else  {
03402             
WowGetModuleFileName(hmod,
03403                               achModName,
03404                               
sizeof(achModName) / 
sizeof(WCHAR));
03405             cur.lpModName = achModName;
03406         }
03407     }
03408     cur.rt     = (fIcon ? 
PTR_TO_ID(RT_ICON) : 
PTR_TO_ID(RT_CURSOR));
03409     cur.lpName = (LPWSTR)lpName;
03410     cur.bpp    = lpbihNew->biBitCount * lpbihNew->biPlanes;
03411 
03412     
if (cxNew == 0)
03413         cxNew = lpbihNew->biWidth;
03414 
03415     
if (cyNew == 0)
03416         cyNew = lpbihNew->biHeight / 2;
03417 
03418     
if (!fIcon) {
03419 
03420         cur.xHotspot = 
MultDiv(cur.xHotspot,
03421                                cxNew,
03422                                lpbihNew->biWidth);
03423         cur.yHotspot = 
MultDiv(cur.yHotspot,
03424                                cyNew,
03425                                lpbihNew->biHeight / 2);
03426     } 
else {
03427 
03428         
03429 
03430 
03431         cur.xHotspot = (
INT)(cxNew) / 2;
03432         cur.yHotspot = (
INT)(cyNew) / 2;
03433     }
03434 
03435     
03436 
03437 
03438     
ChangeDibColors(lpbihNew, LR_MONOCHROME);
03439 
03440     
if (lpBitsNextMask != 
NULL) {
03441         cur.hbmMask = 
BitmapFromDIB(cxNew,
03442                                     cyNew * 2,
03443                                     1,
03444                                     1,
03445                                     0,
03446                                     lpbihNew->biWidth,
03447                                     lpbihNew->biHeight,
03448                                     lpBitsNextMask,
03449                                     (LPBITMAPINFO)lpbihNew,
03450                                     
NULL);
03451         
if (cur.hbmMask == 
NULL) {
03452             DeleteObject(cur.hbmColor);
03453             
UserLocalFree(lpbihNew);
03454             
return NULL;
03455         }
03456 
03457     } 
else {
03458         cur.hbmMask = cur.hbmColor;
03459         cur.hbmColor = 
NULL;
03460     }
03461 
03462     cur.cx = cxNew;
03463     cur.cy = cyNew * 2;
03464 
03465     
03466 
03467 
03468     
UserLocalFree(lpbihNew);
03469 
03470     
if (LR_flags & LR_SHARED)
03471         cur.CURSORF_flags |= 
CURSORF_LRSHARED;
03472 
03473     
if (LR_flags & LR_GLOBAL)
03474         cur.CURSORF_flags |= 
CURSORF_GLOBAL;
03475 
03476     
if (LR_flags & LR_ACONFRAME)
03477         cur.CURSORF_flags |= 
CURSORF_ACONFRAME;
03478 
03479     
return CreateIcoCur(&cur);
03480 }
03481 
03482 
03483 
03484 
03485 
03486 
03487 
03488 
03489 
03490 BOOL TrulyMonochrome(
03491     LPVOID lpColorTable,
03492     BOOL   fOldFormat)
03493 {
03494 
    #define lpRGB  ((UNALIGNED LONG *)lpColorTable)
03495 
    #define lpRGBw ((UNALIGNED WORD *)lpColorTable)
03496 
03497     
if (fOldFormat) {
03498 
03499         
03500 
03501 
03502         
if (
lpRGBw[0] == 0x0000)
03503             
return (
lpRGBw[1] == 0xFF00) && (
lpRGBw[2] == 0xFFFF);
03504         
else if (
lpRGBw[0] == 0xFFFF)
03505             
return (
lpRGBw[1] == 0x00FF) && (
lpRGBw[2] == 0x0000);
03506 
03507     } 
else {
03508 
03509         
03510 
03511 
03512         
if (
lpRGB[0] == 
RESCLR_BLACK)
03513             
return (
lpRGB[1] == 
RESCLR_WHITE);
03514         
else if (
lpRGB[0] == 
RESCLR_WHITE)
03515             
return (
lpRGB[1] == 
RESCLR_BLACK);
03516     }
03517 
03518 
    #undef lpRGB
03519 
    #undef lpRGBw
03520 
03521     
return FALSE;
03522 }
03523 
03524 
03525 
03526 
03527 
03528 
03529 
03530 
03531 
03532 
03533 
03534 
03535 
03536 
03537 
03538 
03539 
03540 
03541 
03542 
03543 
03544 
03545 
03546 LPBITMAPINFOHEADER 
CopyDibHdr(
03547     IN  UPBITMAPINFOHEADER upbih,
03548     OUT LPSTR             *lplpBits,
03549     OUT LPBOOL             lpfMono)
03550 {
03551 
03552 
#define upbch ((UPBITMAPCOREHEADER)upbih)
03553 
03554     
DWORD              cColors;
03555     
DWORD              i;
03556     LPBITMAPINFOHEADER lpbihNew;
03557     
DWORD              cbAlloc;
03558     LPBYTE             lpColorTable;
03559     
struct  {
03560         BITMAPINFOHEADER   bih;
03561         
DWORD              rgb[256];
03562         
DWORD              dwBuffer;
03563     } Fake;
03564 
03565     
switch (upbih->biSize) {
03566     
case sizeof(BITMAPINFOHEADER):
03567         
03568 
03569 
03570         cColors   = 
HowManyColors(upbih, 
FALSE, &lpColorTable);
03571         *lplpBits = (LPSTR)(((LPDWORD)lpColorTable) + cColors);
03572         
break;
03573 
03574     
case sizeof(BITMAPCOREHEADER):
03575         
03576 
03577 
03578         Fake.bih.biSize          = 
sizeof(BITMAPINFOHEADER);
03579         Fake.bih.biWidth         = 
upbch->bcWidth;
03580         Fake.bih.biHeight        = 
upbch->bcHeight;
03581         Fake.bih.biPlanes        = 
upbch->bcPlanes;
03582         Fake.bih.biBitCount      = 
upbch->bcBitCount;
03583         Fake.bih.biCompression   =
03584         Fake.bih.biXPelsPerMeter =
03585         Fake.bih.biYPelsPerMeter =
03586         Fake.bih.biClrImportant  = 0;
03587         Fake.bih.biClrUsed       = cColors =
03588                                    
HowManyColors(upbih, 
TRUE, &lpColorTable);
03589         Fake.bih.biSizeImage     =
03590                 
BitmapWidth(Fake.bih.biWidth, Fake.bih.biBitCount) *
03591                             Fake.bih.biHeight;
03592         
03593 
03594 
03595         
for (i = 0; i < cColors; i++, lpColorTable += 3) {
03596 
03597             Fake.rgb[i] = lpColorTable[0]        +
03598                           (lpColorTable[1] << 8) +
03599                           (lpColorTable[2] << 16);
03600         }
03601 
03602         Fake.rgb[i] = *(
DWORD UNALIGNED *)lpColorTable;  
03603         upbih       = (
UPBITMAPINFOHEADER)&Fake;
03604         *lplpBits   = lpColorTable;
03605         
break;
03606 
03607     
default:
03608 
03609 
#define upOldIcoCur ((UPOLDCURSOR)upbih)
03610 
03611         
if (
upOldIcoCur->bType == 
BMR_ICON ||
03612                 
upOldIcoCur->bType == 
BMR_CURSOR) {
03613             
03614 
03615 
03616             RIPMSG0(RIP_WARNING, 
"USER32:Converting a OLD header. - email sanfords if you see this");
03617             Fake.bih.biSize          = 
sizeof(BITMAPINFOHEADER);
03618             Fake.bih.biWidth         = 
upOldIcoCur->cx;
03619             Fake.bih.biHeight        = 
upOldIcoCur->cy * 2;
03620             Fake.bih.biPlanes        =
03621             Fake.bih.biBitCount      = 1;
03622             Fake.bih.biCompression   =
03623             Fake.bih.biXPelsPerMeter =
03624             Fake.bih.biYPelsPerMeter =
03625             Fake.bih.biClrImportant  = 0;
03626             Fake.bih.biClrUsed       = cColors = 
BPP01_MAXCOLORS;
03627             Fake.bih.biSizeImage     =
03628                     
BitmapWidth(
upOldIcoCur->cx, 1) * 
upOldIcoCur->cy;
03629             Fake.rgb[0]              = 
RESCLR_BLACK;
03630             Fake.rgb[1]              = 
RESCLR_WHITE;
03631             upbih                    = (LPBITMAPINFOHEADER)&Fake;
03632             *lplpBits                = 
upOldIcoCur->abBitmap;
03633             Fake.rgb[2]              = *((LPDWORD)*lplpBits);  
03634 
03635         } 
else {
03636 
03637             RIPMSG0(RIP_WARNING, 
"ConvertDIBBitmap: not a valid format");
03638             
return NULL;
03639         }
03640 
03641 
#undef pOldIcoCur
03642 
03643         
break;
03644     }
03645 
03646     *lpfMono = (cColors == 
BPP01_MAXCOLORS) &&
03647             
TrulyMonochrome((LPBYTE)upbih + 
sizeof(BITMAPINFOHEADER), 
FALSE);
03648 
03649     cbAlloc = 
sizeof(BITMAPINFOHEADER) + (cColors * 
sizeof(RGBQUAD)) + 4;
03650 
03651     
if (lpbihNew = 
UserLocalAlloc(0, cbAlloc))
03652         RtlCopyMemory(lpbihNew, upbih, cbAlloc);
03653 
03654     
return lpbihNew;
03655 
03656 
#undef upbch
03657 
03658 }
03659 
03660 
03661 
03662 
03663 
03664 
03665 
03666 
03667 
03668 
03669 
03670 
03671 
03672 
03673 
03674 
03675 
03676 
03677 
03678 
03679 HBITMAP 
ConvertDIBBitmap(
03680     IN  UPBITMAPINFOHEADER           upbih,
03681     IN  DWORD                        cxDesired,
03682     IN  DWORD                        cyDesired,
03683     IN  UINT                         LR_flags,
03684     OUT OPTIONAL LPBITMAPINFOHEADER *lplpbih,
03685     IN OUT OPTIONAL LPSTR           *lplpBits)
03686 {
03687     LPBITMAPINFOHEADER lpbihNew;
03688     
BOOL               fMono, fMonoGiven;
03689     
BYTE               bPlanesDesired;
03690     
BYTE               bppDesired;
03691     LPSTR              lpBits;
03692     HBITMAP            hBmpRet;
03693 
03694     
03695 
03696 
03697 
03698 
03699     
if ((lpbihNew = 
CopyDibHdr(upbih, &lpBits, &fMono)) == 
NULL)
03700         
return NULL;
03701 
03702     
03703 
03704 
03705 
03706     
if (lplpBits && *lplpBits)
03707         lpBits = *lplpBits;
03708 
03709     fMonoGiven = fMono;
03710 
03711     
if (!fMono) {
03712 
03713         
if (LR_flags & (LR_LOADTRANSPARENT | LR_LOADMAP3DCOLORS))
03714             
ChangeDibColors(lpbihNew, LR_flags & ~LR_MONOCHROME);
03715 
03716         bPlanesDesired = 
gpsi->Planes;
03717         bppDesired     = 
gpsi->BitsPixel;
03718         fMono          = LR_flags & LR_MONOCHROME;
03719     }
03720 
03721     
if (fMono) {
03722         bPlanesDesired =
03723         bppDesired     = 1;
03724     }
03725 
03726     
03727 
03728 
03729     
if (lplpbih != 
NULL) {
03730 
03731         
03732 
03733 
03734         *lplpbih = lpbihNew;
03735 
03736         
03737 
03738 
03739 
03740         
if (!fMono && !
SYSMET(SAMEDISPLAYFORMAT)) {
03741             bPlanesDesired = 1;
03742             bppDesired = 4;
03743         }
03744 
03745         
03746 
03747 
03748 
03749 
03750 
03751 
03752 
03753 
03754 
03755 
03756 
03757 
03758 
03759 
03760         
if (fMonoGiven) {
03761 
03762             *lplpBits = 
NULL;
03763 
03764             
if (cyDesired)
03765                 cyDesired <<= 1;    
03766 
03767         } 
else {
03768 
03769             UserAssert(!(lpbihNew->biHeight & 1));
03770             lpbihNew->biHeight >>= 1;  
03771 
03772             
03773 
03774 
03775 
03776 
03777 
03778             *lplpBits = lpBits +
03779                     (
BitmapWidth(lpbihNew->biWidth, lpbihNew->biBitCount) -
03780                     
BitmapWidth(lpbihNew->biWidth, 1)) *
03781                     lpbihNew->biHeight;
03782         }
03783     }
03784 
03785     
if (cxDesired == 0)
03786         cxDesired = lpbihNew->biWidth;
03787 
03788     
if (cyDesired == 0)
03789         cyDesired = lpbihNew->biHeight;
03790 
03791     hBmpRet = 
BitmapFromDIB(cxDesired,
03792                             cyDesired,
03793                             bPlanesDesired,
03794                             bppDesired,
03795                             LR_flags,
03796                             lpbihNew->biWidth,
03797                             lpbihNew->biHeight,
03798                             lpBits,
03799                             (LPBITMAPINFO)lpbihNew,
03800                             
NULL);
03801 
03802     
if (lplpbih == 
NULL || hBmpRet == 
NULL) {
03803         
UserLocalFree(lpbihNew);
03804     } 
else if (!fMonoGiven) {
03805         lpbihNew->biHeight <<= 1;   
03806     }
03807 
03808     
return hBmpRet;
03809 }
03810 
03811 
03812 
03813 
03814 
03815 
03816 
03817 
03818 
03819 
03820 
03821 
03822 
03823 UINT MyAbs(
03824     
int valueHave,
03825     
int valueWant)
03826 {
03827     
int diff = (valueHave - valueWant);
03828 
03829     
if (diff < 0)
03830         diff = 2 * (-diff);
03831 
03832     
return (
UINT)diff;
03833 }
03834 
03835 
03836 
03837 
03838 
03839 
03840 
03841 
03842 
03843 
03844 UINT Magnitude(
03845     
int nValue)
03846 {
03847     
if (nValue < 4)
03848         
return 1;
03849     
else if (nValue < 8)
03850         
return 2;
03851     
else if (nValue < 16)
03852         
return 3;
03853     
else if (nValue < 256)
03854         
return 4;
03855     
else
03856         
return 8;
03857 }
03858 
03859 
03860 
03861 
03862 
03863 
03864 
03865 
03866 
03867 
03868 
03869 
03870 
03871 
03872 
03873 
03874 
03875 
03876 
03877 
03878 
03879 
03880 
03881 
03882 
03883 
03884 
03885 
03886 
03887 
03888 
03889 
03890 
03891 
03892 
03893 
03894 
03895 
03896 
03897 
03898 
03899 
03900 
03901 
03902 
03903 UINT MatchImage(
03904     LPRESDIR lprd,
03905     LPINT    lpcxWant,
03906     LPINT    lpcyWant,
03907     UINT     uColorsWant,
03908     BOOL     fIcon)
03909 {
03910     
UINT uColorsNew;
03911     
int  cxNew;
03912     
int  cyNew;
03913 
03914     cxNew = lprd->Icon.Width;
03915     cyNew = lprd->Icon.Height;
03916 
03917     
if (fIcon) {
03918         uColorsNew = lprd->Icon.ColorCount;
03919     } 
else {
03920         cyNew >>= 1;
03921         uColorsNew = 
BPP01_MAXCOLORS;
03922     }
03923 
03924     
03925 
03926 
03927     
if (!cxNew)
03928         cxNew = 
BPP08_MAXCOLORS;
03929 
03930     
if (!*lpcxWant)
03931         *lpcxWant = cxNew;
03932 
03933     
if (!cyNew)
03934         cyNew = 
BPP08_MAXCOLORS;
03935 
03936     
if (!*lpcyWant)
03937         *lpcyWant = cyNew;
03938 
03939     
if (!uColorsNew)
03940         uColorsNew = 
BPP08_MAXCOLORS;
03941 
03942     
03943 
03944 
03945 
03946 
03947 
03948 
03949 
03950 
03951 
#if 0 //CHRISWIL: Not in Win95
03952 
03953     
return (MagnitudeDiff(uColorsWant, uColorsNew) +
03954             MagnitudeDiff(cxNew, *lpcxWant) +
03955             MagnitudeDiff(cyNew, *lpcyWant));
03956 
03957 
#else
03958 
03959     
return( 2*
MyAbs(
Magnitude(uColorsWant), 
Magnitude(uColorsNew)) +
03960               
MyAbs(cxNew, *lpcxWant) +
03961               
MyAbs(cyNew, *lpcyWant));
03962 
#endif
03963 
}
03964 
03965 
03966 
03967 
03968 
03969 
03970 
03971 
03972 
03973 
03974 
03975 
03976 
03977 
03978 
03979 
03980 UINT GetBestImage(
03981     LPRESDIR lprd,
03982     UINT     uCount,
03983     
int      cxDesired,
03984     
int      cyDesired,
03985     UINT     bpp,
03986     BOOL     fIcon)
03987 {
03988     
UINT uIndex;
03989     
UINT uT;
03990     
UINT uIndexBest = 0;
03991     
UINT uBest = (
UINT)-1;
03992 
03993 
03994     
03995 
03996 
03997 
03998 
03999 
04000 
04001 
04002     
if (bpp == 0)
04003         bpp = (
UINT)
gpsi->BitCount;
04004 
04005     
if (bpp > 8)
04006         bpp = 8;
04007 
04008     bpp = 1 << bpp;
04009 
04010     
04011 
04012 
04013 
04014 
04015 
04016 
04017     
for (uIndex = 0; uIndex < uCount; uIndex++, lprd++) {
04018 
04019         
04020 
04021 
04022         uT = 
MatchImage(lprd, &cxDesired, &cyDesired, bpp, fIcon);
04023 
04024         
if (!uT) {
04025 
04026             
04027 
04028 
04029             
return uIndex;
04030 
04031         } 
else if (uT < uBest) {
04032 
04033             
04034 
04035 
04036             uBest = uT;
04037             uIndexBest = uIndex;
04038         }
04039     }
04040 
04041     
return uIndexBest;
04042 }
04043 
04044 
04045 
04046 
04047 
04048 
04049 
04050 
04051 
04052 _inline 
DWORD GetIcoCurWidth(
04053     DWORD cxOrg,
04054     BOOL  fIcon,
04055     UINT  lrFlags,
04056     DWORD cxDes)
04057 {
04058     
if (cxOrg) {
04059         
return cxOrg;
04060     } 
else if (lrFlags & LR_DEFAULTSIZE) {
04061         
return (fIcon ? 
SYSMET(CXICON) : 
SYSMET(CXCURSOR));
04062     } 
else {
04063         
return cxDes;
04064     }
04065 }
04066 
04067 
04068 
04069 
04070 
04071 
04072 
04073 
04074 _inline 
DWORD GetIcoCurHeight(
04075     DWORD cyOrg,
04076     BOOL  fIcon,
04077     UINT  lrFlags,
04078     DWORD cyDes)
04079 {
04080     
if (cyOrg) {
04081         
return cyOrg;
04082     } 
else if (lrFlags & LR_DEFAULTSIZE) {
04083         
return (fIcon ? 
SYSMET(CYICON) : 
SYSMET(CYCURSOR));
04084     } 
else {
04085         
return cyDes;
04086     }
04087 }
04088 
04089 
04090 
04091 
04092 
04093 
04094 
04095 
04096 _inline 
DWORD GetIcoCurBpp(
04097     UINT lrFlags)
04098 {
04099     
if (lrFlags & LR_MONOCHROME) {
04100 
04101 
#if DBG
04102 
        if (lrFlags & LR_VGACOLOR) {
04103             RIPMSG0(RIP_WARNING, 
"lrFlags has both MONOCHROME and VGACOLOR; assuming MONOCHROME");
04104         }
04105 
#endif
04106 
        return 1;
04107 
04108     } 
else if (
04109             
TEST_PUSIF(
PUSIF_PALETTEDISPLAY) ||
04110             (lrFlags & LR_VGACOLOR) ||
04111             !
SYSMET(SAMEDISPLAYFORMAT)) {
04112 
04113         
return 4;
04114     } 
else {
04115         
return 0;
04116     }
04117 }
04118 
04119 
04120 
04121 
04122 
04123 
04124 
04125 
04126 
04127 HANDLE 
WOWFindResourceExWCover(
04128     HANDLE  hmod,
04129     LPCWSTR rt,
04130     LPCWSTR lpUniName,
04131     WORD    LangId)
04132 {
04133     LPSTR  lpAnsiName;
04134     HANDLE hRes;
04135 
04136     
if (
ID(lpUniName))
04137         
return FINDRESOURCEEXA(hmod, (LPSTR)lpUniName, (LPSTR)rt, LangId);
04138 
04139     
04140 
04141 
04142     
if (!WCSToMB(lpUniName, -1, &lpAnsiName, -1, 
TRUE))
04143         
return NULL;
04144 
04145     hRes = 
FINDRESOURCEEXA(hmod, lpAnsiName, (LPSTR)rt, LangId);
04146 
04147     
UserLocalFree(lpAnsiName);
04148 
04149     
return hRes;
04150 }
04151 
04152 
04153 
04154 
04155 
04156 
04157 
04158 HBITMAP 
WOWLoadBitmapA(
04159     HINSTANCE hmod,
04160     LPCSTR    lpName,
04161     LPBYTE    pResData,
04162     DWORD     cbResData)
04163 {
04164     LPWSTR  lpUniName;
04165     HBITMAP hRet;
04166 
04167     UNREFERENCED_PARAMETER(cbResData);
04168 
04169     
if (pResData == 
NULL) {
04170 
04171         
if (
ID(lpName))
04172             
return LoadBmp(hmod, (LPCWSTR)lpName, 0, 0, 0);
04173 
04174         
if (!MBToWCS(lpName, -1, &lpUniName, -1, 
TRUE))
04175             
return NULL;
04176 
04177         hRet = 
LoadBmp(hmod, lpUniName, 0, 0, 0);
04178 
04179         
UserLocalFree(lpUniName);
04180 
04181     } 
else {
04182 
04183         hRet = 
ConvertDIBBitmap((LPBITMAPINFOHEADER)pResData,
04184                                 0,
04185                                 0,
04186                                 LR_DEFAULTSIZE,
04187                                 
NULL,
04188                                 
NULL);
04189     }
04190 
04191     
return hRet;
04192 }
04193 
04194 
04195 
04196 
04197 
04198 
04199 
04200 HICON 
WowServerLoadCreateCursorIcon(
04201     HANDLE  hmod,
04202     LPWSTR  pszModName,
04203     DWORD   dwExpWinVer,
04204     LPCWSTR lpName,
04205     DWORD   cb,
04206     PVOID   pResData,
04207     LPWSTR  type,
04208     BOOL    fClient)
04209 {
04210     HICON hRet;
04211     
BOOL  fIcon = (
type == RT_ICON);
04212     
UINT  LR_Flags = LR_SHARED;
04213 
04214     UNREFERENCED_PARAMETER(pszModName);
04215     UNREFERENCED_PARAMETER(dwExpWinVer);
04216     UNREFERENCED_PARAMETER(cb);
04217     UNREFERENCED_PARAMETER(fClient);
04218 
04219     
if (!fIcon)
04220         LR_Flags |= LR_MONOCHROME;
04221 
04222     
if (pResData == 
NULL) {
04223 
04224         hRet = 
LoadIcoCur(hmod,
04225                           lpName,
04226                           
type,
04227                           0,
04228                           0,
04229                           LR_Flags | LR_DEFAULTSIZE);
04230 
04231     } 
else {
04232 
04233         hRet = 
ConvertDIBIcon((LPBITMAPINFOHEADER)pResData,
04234                               hmod,
04235                               lpName,
04236                               fIcon,
04237                               
GetIcoCurWidth(0 , fIcon, LR_DEFAULTSIZE, 0),
04238                               
GetIcoCurHeight(0, fIcon, LR_DEFAULTSIZE, 0),
04239                               LR_Flags);
04240     }
04241 
04242     
return hRet;
04243 }
04244 
04245 
04246 
04247 
04248 
04249 
04250 HMENU 
WowServerLoadCreateMenu(
04251     HANDLE hMod,
04252     LPCSTR lpName,
04253     CONST  LPMENUTEMPLATE pmt,
04254     DWORD  cb,
04255     BOOL   fCallClient)
04256 {
04257     UNREFERENCED_PARAMETER(cb);
04258     UNREFERENCED_PARAMETER(fCallClient);
04259 
04260     
if (pmt == 
NULL) {
04261         
return LoadMenuA(hMod, lpName);
04262     } 
else
04263         
return CreateMenuFromResource(pmt);
04264 }
04265 
04266 
04267 
04268 
04269 
04270 
04271 
04272 
04273 
04274 
04275 
04276 
04277 
04278 
04279 PVOID 
DIBFromBitmap(
04280     HBITMAP hbmp,
04281     HDC     hdc)
04282 {
04283     BITMAP             bmp;
04284     LPBITMAPINFOHEADER lpbi;
04285     
DWORD              cbBits;
04286     
DWORD              cbPalette;
04287     
DWORD              cbTotal;
04288     WORD               cBits;
04289 
04290     UserAssert(hbmp);
04291     UserAssert(hdc);
04292 
04293     
if (GetObject(hbmp, 
sizeof(BITMAP), &bmp) == 0)
04294         
return NULL;
04295 
04296     cBits = ((WORD)bmp.bmPlanes * (WORD)bmp.bmBitsPixel);
04297 
04298 TrySmallerDIB:
04299 
04300     cbBits = (
DWORD)
WIDTHBYTES((WORD)bmp.bmWidth * cBits) * (
DWORD)bmp.bmHeight;
04301 
04302     cbPalette = 0;
04303     
if (cBits <= 8)
04304         cbPalette = (1 << cBits) * 
sizeof(RGBQUAD);
04305     
else
04306         cbPalette = 3 * 
sizeof(RGBQUAD);
04307 
04308     cbTotal  = 
sizeof(BITMAPINFOHEADER) + cbPalette + cbBits;
04309     lpbi = (LPBITMAPINFOHEADER)
UserLocalAlloc(HEAP_ZERO_MEMORY, cbTotal);
04310     
if (lpbi == 
NULL) {
04311 
04312         
04313 
04314 
04315         
switch (cBits) {
04316         
case 4:
04317             cBits = 1;
04318             
break;
04319 
04320         
case 8:
04321             cBits = 4;
04322             
break;
04323 
04324         
case 16:
04325             cBits = 8;
04326             
break;
04327 
04328         
case 24:
04329             cBits = 16;
04330             
break;
04331 
04332         
case 32:
04333             cBits = 24;
04334             
break;
04335 
04336         
default:
04337             
return NULL;   
04338         }
04339 
04340         RIPMSG1(RIP_WARNING, 
"Not enough memory to create large color DIB, trying %d bpp.", cBits);
04341         
goto TrySmallerDIB;
04342     }
04343 
04344     RtlZeroMemory(lpbi, 
sizeof(BITMAPINFOHEADER));
04345     lpbi->biSize        = 
sizeof(BITMAPINFOHEADER);
04346     lpbi->biWidth       = bmp.bmWidth;
04347     lpbi->biHeight      = bmp.bmHeight;
04348     lpbi->biPlanes      = 1;
04349     lpbi->biBitCount    = cBits;
04350 
04351     
04352 
04353 
04354     GetDIBits(hdc,
04355               hbmp,
04356               0,
04357               lpbi->biHeight,
04358               ((LPSTR)lpbi) + lpbi->biSize + cbPalette,
04359               (LPBITMAPINFO)lpbi,
04360               DIB_RGB_COLORS);
04361 
04362     lpbi->biClrUsed   = cbPalette / 
sizeof(RGBQUAD);
04363     lpbi->biSizeImage = cbBits;
04364 
04365     
return lpbi;
04366 }
04367 
04368 
04369 
04370 
04371 
04372 
04373 
04374 
04375 
04376 
04377 HBITMAP 
CopyBmp(
04378     HBITMAP hbmpOrg,
04379     
int     cxNew,
04380     
int     cyNew,
04381     UINT    LR_flags)
04382 {
04383     HBITMAP hbmNew = 
NULL;
04384     LPBITMAPINFOHEADER pdib;
04385 
04386     RtlEnterCriticalSection(&
gcsHdc);
04387 
04388     
if (pdib = 
DIBFromBitmap(hbmpOrg, 
ghdcBits2)) {
04389 
04390 
#if 0  // Win-9x comments this code out
04391 
        if (LR_flags & LR_COPYRETURNORG) {
04392 
04393             
DWORD bpp = 
GetIcoCurBpp(LR_flags);
04394 
04395             
if ((cxNew == 0 || cxNew == pdib->biWidth)  &&
04396                 (cyNew == 0 || cyNew == pdib->biHeight) &&
04397                 (bpp == 0 || bpp == pdib->biBitCount)) {
04398 
04399                 hbmNew = hbmpOrg;
04400             }
04401         }
04402 
04403         
if (hbmNew == 
NULL)
04404             hbmNew = 
ConvertDIBBitmap(pdib, cxNew, cyNew, LR_flags, 
NULL, 
NULL);
04405 
#endif
04406 
04407         hbmNew = 
ConvertDIBBitmap(pdib, cxNew, cyNew, LR_flags, 
NULL, 
NULL);
04408 
04409         
UserLocalFree(pdib);
04410     }
04411 
04412     RtlLeaveCriticalSection(&
gcsHdc);
04413 
04414     
if ((LR_flags & LR_COPYDELETEORG) && hbmNew && (hbmNew != hbmpOrg))
04415         DeleteObject(hbmpOrg);
04416 
04417     
return hbmNew;
04418 }
04419 
04420 
04421 
04422 
04423 
04424 
04425 
04426 
04427 
04428 
04429 
04430 
04431 
04432 
04433 
04434 
04435 
04436 HICON 
CopyImageFromRes(
04437     LPWSTR      pszModName,
04438     LPWSTR      pszResName,
04439     
PCURSORFIND pcfSearch,
04440     UINT        LR_flags)
04441 {
04442     HINSTANCE hmod;
04443     HICON     hicoDst = 
NULL;
04444 
04445     
04446 
04447 
04448 
04449 
04450     hmod = (pszModName ? 
WowGetModuleHandle(pszModName) : 
hmodUser);
04451 
04452     
if (hmod == 
hmodUser) {
04453 
04454         pcfSearch->
cx  = 0;
04455         pcfSearch->
cy  = 0;
04456         pcfSearch->
bpp = 0;
04457 
04458         pszModName = 
szUSER32;
04459     }
04460 
04461     
04462 
04463 
04464 
04465     
if (
FindExistingCursorIcon(pszModName, pszResName, pcfSearch)) {
04466 
04467         hicoDst = 
LoadIcoCur(hmod,
04468                              pszResName,
04469                              (LPWSTR)ULongToPtr( pcfSearch->
rt ),
04470                              pcfSearch->
cx,
04471                              pcfSearch->
cy,
04472                              LR_flags);
04473     }
04474 
04475     
return hicoDst;
04476 }
04477 
04478 
04479 
04480 
04481 
04482 
04483 
04484 
04485 
04486 
04487 
04488 
04489 
04490 
04491 
04492 
04493 HICON 
CopyIcoCur(
04494     HICON hicoSrc,
04495     BOOL  fIcon,
04496     
int   cxNew,
04497     
int   cyNew,
04498     UINT  LR_flags)
04499 {
04500     HBITMAP        hbmMaskNew;
04501     HBITMAP        hbmColorNew;
04502     
int            cx;
04503     
int            cy;
04504     
DWORD          bpp;
04505     
DWORD          bppDesired;
04506     HICON          hicoDst = 
NULL;
04507     ICONINFO       ii;
04508     
CURSORDATA     cur;
04509     UNICODE_STRING strModName;
04510     UNICODE_STRING strResName;
04511     WCHAR          awszModName[
MAX_PATH];
04512     WCHAR          awszResName[
MAX_PATH];
04513 
04514     
04515 
04516 
04517     
if (!
NtUserGetIconSize(hicoSrc, 0, &cx, &
cy))
04518         
return NULL;
04519 
04520     
cy >>= 1;
04521 
04522     
if (LR_flags & LR_CREATEDIBSECTION)
04523         LR_flags = (LR_flags & ~LR_CREATEDIBSECTION) | LR_CREATEREALDIB;
04524 
04525     
04526 
04527 
04528     strModName.Length        = 0;
04529     strModName.MaximumLength = 
MAX_PATH;
04530     strModName.Buffer        = awszModName;
04531 
04532     strResName.Length        = 0;
04533     strResName.MaximumLength = 
MAX_PATH;
04534     strResName.Buffer        = awszResName;
04535 
04536     
04537 
04538 
04539 
04540     
if (!
NtUserGetIconInfo(hicoSrc,
04541                            &ii,
04542                            &strModName,
04543                            &strResName,
04544                            &bpp,
04545                            
TRUE)) {
04546 
04547         
return NULL;
04548     }
04549 
04550     cxNew = 
GetIcoCurWidth(cxNew, fIcon, LR_flags, cx);
04551     cyNew = 
GetIcoCurHeight(cyNew, fIcon, LR_flags, 
cy);
04552 
04553     
if (LR_flags & LR_COPYFROMRESOURCE) {
04554 
04555         
CURSORFIND cfSearch;
04556         LPWSTR     pszModName;
04557 
04558         
04559 
04560 
04561         cfSearch.
hcur = hicoSrc;
04562         cfSearch.
rt   = PtrToUlong((fIcon ? RT_ICON : RT_CURSOR));
04563         cfSearch.
cx   = cxNew;
04564         cfSearch.
cy   = cyNew;
04565         cfSearch.
bpp  = bpp;
04566 
04567         
04568 
04569 
04570 
04571 
04572 
04573 
04574         pszModName = (strModName.Length ? strModName.Buffer : 
NULL);
04575 
04576         hicoDst = 
CopyImageFromRes(pszModName,
04577                                    strResName.Buffer,
04578                                    &cfSearch,
04579                                    LR_flags);
04580 
04581         
if (hicoDst)
04582             
goto CleanupExit;
04583     }
04584 
04585     bppDesired = 
GetIcoCurBpp(LR_flags);
04586 
04587     
if ((cxNew != cx) ||
04588         (cyNew != 
cy) ||
04589         ((bpp != 1) && (bppDesired != 0) && (bppDesired != bpp))) {
04590 
04591         
04592 
04593 
04594 
04595         hbmMaskNew = 
CopyBmp(ii.hbmMask, cxNew, cyNew * 2, LR_MONOCHROME);
04596 
04597         
if (hbmMaskNew == 
NULL)
04598             
goto CleanupExit;
04599 
04600         hbmColorNew = 
NULL;
04601 
04602         
if (ii.hbmColor) {
04603 
04604             hbmColorNew = 
CopyBmp(ii.hbmColor, cxNew, cyNew, LR_flags);
04605 
04606             
if (hbmColorNew == 
NULL) {
04607                 DeleteObject(hbmMaskNew);
04608                 
goto CleanupExit;
04609             }
04610         }
04611 
04612         
04613 
04614 
04615         DeleteObject(ii.hbmMask);
04616         ii.hbmMask = hbmMaskNew;
04617 
04618         
if (ii.hbmColor && (ii.hbmColor != hbmColorNew)) {
04619             DeleteObject(ii.hbmColor);
04620             ii.hbmColor = hbmColorNew;
04621         }
04622 
04623         
04624 
04625 
04626         
if (cxNew != cx)
04627             ii.xHotspot = 
MultDiv(ii.xHotspot, cxNew, cx);
04628 
04629         
if (cyNew != 
cy)
04630             ii.yHotspot = 
MultDiv(ii.yHotspot, cyNew, 
cy);
04631 
04632     } 
else if (LR_flags & LR_COPYRETURNORG) {
04633 
04634         hicoDst = hicoSrc;
04635 
04636 CleanupExit:
04637 
04638         
04639 
04640 
04641         DeleteObject(ii.hbmMask);
04642 
04643         
if (ii.hbmColor)
04644             DeleteObject(ii.hbmColor);
04645 
04646         
goto Exit;
04647     }
04648 
04649     
04650 
04651 
04652 
04653     hicoDst = (HICON)
NtUserCallOneParam(0, SFI__CREATEEMPTYCURSOROBJECT);
04654 
04655     
if (hicoDst == 
NULL)
04656         
goto CleanupExit;
04657 
04658     RtlZeroMemory(&cur, 
sizeof(cur));
04659     cur.lpName    = strResName.Length ? strResName.Buffer : 
NULL;
04660     cur.lpModName = strModName.Length ? strModName.Buffer : 
NULL;
04661     cur.rt        = ii.fIcon ? 
PTR_TO_ID(RT_ICON) : 
PTR_TO_ID(RT_CURSOR);
04662     cur.bpp       = bpp;
04663     cur.cx        = cxNew;
04664     cur.cy        = cyNew * 2;
04665     cur.xHotspot  = (
short)ii.xHotspot;
04666     cur.yHotspot  = (
short)ii.yHotspot;
04667     cur.hbmMask   = ii.hbmMask;
04668     cur.hbmColor  = ii.hbmColor;
04669 
04670     
if (!
_SetCursorIconData(hicoDst, &cur)) {
04671         
NtUserDestroyCursor(hicoDst, 
CURSOR_ALWAYSDESTROY);
04672         
return NULL;
04673     }
04674 
04675 Exit:
04676 
04677     
04678 
04679 
04680     
if (hicoDst != hicoSrc && (LR_flags & LR_COPYDELETEORG))
04681         
DestroyCursor(hicoSrc);
04682 
04683     
return hicoDst;
04684 }
04685 
04686 
04687 
04688 
04689 
04690 
04691 
04692 
04693 
04694 
04695 
04696 
04697 HANDLE WINAPI 
CopyImage(
04698     HANDLE hImage,
04699     UINT   IMAGE_flag,
04700     
int    cxNew,
04701     
int    cyNew,
04702     UINT   LR_flags)
04703 {
04704     
if (LR_flags & ~LR_VALID) {
04705         RIPERR0(ERROR_INVALID_PARAMETER, RIP_WARNING, 
"CopyImage: bad LR_flags.");
04706         
return NULL;
04707     }
04708 
04709     
return InternalCopyImage(hImage, IMAGE_flag, cxNew, cyNew, LR_flags);
04710 }
04711 
04712 
04713 
04714 
04715 
04716 
04717 
04718 
04719 HANDLE 
InternalCopyImage(
04720     HANDLE hImage,
04721     UINT   IMAGE_flag,
04722     
int    cxNew,
04723     
int    cyNew,
04724     UINT   LR_flags)
04725 {
04726     
switch (IMAGE_flag) {
04727 
04728     
case IMAGE_BITMAP:
04729         
if (GetObjectType(hImage) != OBJ_BITMAP) {
04730             RIPMSG0(RIP_ERROR, 
"CopyImage: invalid bitmap");
04731             
return NULL;
04732         }
04733 
04734         
return (HICON)
CopyBmp(hImage, cxNew, cyNew, LR_flags);
04735 
04736     
case IMAGE_CURSOR:
04737     
case IMAGE_ICON:
04738 
04739         
return CopyIcoCur(hImage,
04740                           (IMAGE_flag == IMAGE_ICON),
04741                           cxNew,
04742                           cyNew,
04743                           LR_flags);
04744     }
04745 
04746     RIPERR0(ERROR_INVALID_PARAMETER, RIP_WARNING, 
"CopyImage: bad IMAGE_flag.");
04747 
04748     
return NULL;
04749 }
04750 
04751 
04752 
04753 
04754 
04755 
04756 
04757 
04758 
04759 int RtlGetIdFromDirectory(
04760     PBYTE  presbits,
04761     BOOL   fIcon,
04762     
int    cxDesired,
04763     
int    cyDesired,
04764     DWORD  LR_flags,
04765     PDWORD pdwResSize)
04766 {
04767     LPNEWHEADER lpnh;
04768     LPRESDIR    lprsd;
04769     
UINT        iImage;
04770     
UINT        cImage;
04771     
UINT        bpp;
04772 
04773     
04774 
04775 
04776     
if (presbits == 
NULL)
04777         
return 0;
04778 
04779     lpnh = (LPNEWHEADER)presbits;
04780 
04781     
04782 
04783 
04784     cxDesired = 
GetIcoCurWidth(cxDesired, fIcon, LR_flags, 0);
04785     cyDesired = 
GetIcoCurHeight(cyDesired, fIcon, LR_flags, 0);
04786 
04787     bpp = 
GetIcoCurBpp(LR_flags);
04788 
04789     
04790 
04791 
04792 
04793     cImage = lpnh->ResCount;
04794     lprsd  = (LPRESDIR)(lpnh + 1);
04795 
04796     iImage = 
GetBestImage(lprsd, cImage, cxDesired, cyDesired, bpp, fIcon);
04797 
04798     
if (iImage == cImage)
04799         iImage = 0;
04800 
04801     
if (pdwResSize != 
NULL)
04802         *pdwResSize = (lprsd + iImage)->BytesInRes;
04803 
04804     
return ((LPRESDIR)(lprsd + iImage))->idIcon;
04805 }