From 8444d4afb32d14139099dcc4cacf82a4aa32eb26 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 5 Feb 2007 00:59:59 +0000 Subject: [PATCH] Make LoadCursorIconImage() find shared icons, even if they don't have the desired width/height. Now explorer doesn't leak icons / bitmaps anymore. fixes bug 1554 See issue #1554 for more details. svn path=/trunk/; revision=25726 --- reactos/dll/win32/user32/windows/bitmap.c | 52 +++++++++++++++-------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/reactos/dll/win32/user32/windows/bitmap.c b/reactos/dll/win32/user32/windows/bitmap.c index 36dc9afa9c4..c04bc45a73b 100644 --- a/reactos/dll/win32/user32/windows/bitmap.c +++ b/reactos/dll/win32/user32/windows/bitmap.c @@ -186,9 +186,8 @@ LoadCursorIconImage( UINT fuLoad, ULONG uType) { + HRSRC hResInfo; HANDLE hResource; - HANDLE h2Resource; - HANDLE hfRes; HANDLE hFile; HANDLE hSection; CURSORICONFILEDIR *IconDIR; @@ -211,52 +210,69 @@ LoadCursorIconImage( if (hinst == NULL) hinst = User32Instance; - hResource = hfRes = FindResourceW(hinst, lpszName, + hResInfo = FindResourceW(hinst, lpszName, Icon ? RT_GROUP_ICON : RT_GROUP_CURSOR); - if (hResource == NULL) + if (hResInfo == NULL) return NULL; - if (fuLoad & LR_SHARED) - { - hIcon = NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes, width, height); - if (hIcon) - return hIcon; - } - - hResource = LoadResource(hinst, hResource); + hResource = LoadResource(hinst, hResInfo); if (hResource == NULL) return NULL; IconResDir = LockResource(hResource); if (IconResDir == NULL) + { + FreeResource(hResource); return NULL; + } /* Find the best fitting in the IconResDir for this resolution */ id = LookupIconIdFromDirectoryEx((PBYTE)IconResDir, Icon, width, height, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME)); - h2Resource = FindResourceW(hinst, MAKEINTRESOURCEW(id), + FreeResource(hResource); + + hResInfo = FindResourceW(hinst, MAKEINTRESOURCEW(id), Icon ? (LPCWSTR) RT_ICON : (LPCWSTR) RT_CURSOR); - if (h2Resource == NULL) + if (hResInfo == NULL) + { return NULL; + } - hResource = LoadResource(hinst, h2Resource); + /* Now we have found the icon we want to load. + * Let's see if we already loaded it */ + if (fuLoad & LR_SHARED) + { + hIcon = NtUserFindExistingCursorIcon(hinst, hResInfo, 0, 0); + if (hIcon) + { + return hIcon; + } + } + + hResource = LoadResource(hinst, hResInfo); if (hResource == NULL) + { return NULL; + } ResIcon = LockResource(hResource); if (ResIcon == NULL) + { + FreeResource(hResource); return NULL; + } hIcon = CreateIconFromResourceEx((PBYTE)ResIcon, - SizeofResource(hinst, h2Resource), + SizeofResource(hinst, hResInfo), Icon, 0x00030000, width, height, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME)); + FreeResource(hResource); if (hIcon && 0 != (fuLoad & LR_SHARED)) { - NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes, + NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, hResInfo, (HRSRC)NULL); } @@ -650,7 +666,7 @@ CopyImage( { /* Look if the colors of the DIB are black and white */ - monochrome = + monochrome = (bi->bmiColors[0].rgbRed == 0xff && bi->bmiColors[0].rgbGreen == 0xff && bi->bmiColors[0].rgbBlue == 0xff