IntFindExistingCurIconObject(
PUNICODE_STRING pustrModule,
PUNICODE_STRING pustrRsrc,
- LONG cxDesired,
- LONG cyDesired)
+ FINDEXISTINGCURICONPARAM* param)
{
PCURICON_OBJECT CurIcon;
LIST_FOR_EACH(CurIcon, &gCurIconList, CURICON_OBJECT, ListEntry)
{
+ /* See if we are looking for an icon or a cursor */
+ if(CurIcon->bIcon != param->bIcon)
+ continue;
/* See if module names match */
if(RtlCompareUnicodeString(pustrModule, &CurIcon->ustrModule, TRUE) == 0)
{
else if(RtlCompareUnicodeString(pustrRsrc, &CurIcon->ustrRsrc, TRUE) != 0)
continue;
- if ((cxDesired == CurIcon->Size.cx) &&(cyDesired == CurIcon->Size.cy))
+ if ((param->cx == CurIcon->Size.cx) &&(param->cy == CurIcon->Size.cy))
{
if (! ReferenceCurIconByProcess(CurIcon))
{
NtUserFindExistingCursorIcon(
_In_ PUNICODE_STRING pustrModule,
_In_ PUNICODE_STRING pustrRsrc,
- _In_ LONG cxDesired,
- _In_ LONG cyDesired)
+ _In_ FINDEXISTINGCURICONPARAM* param)
{
PCURICON_OBJECT CurIcon;
HICON Ret = NULL;
UNICODE_STRING ustrModuleSafe, ustrRsrcSafe;
+ FINDEXISTINGCURICONPARAM paramSafe;
NTSTATUS Status;
TRACE("Enter NtUserFindExistingCursorIcon\n");
Status = ProbeAndCaptureUnicodeString(&ustrModuleSafe, UserMode, pustrModule);
if(!NT_SUCCESS(Status))
goto done;
+
+ _SEH2_TRY
+ {
+ ProbeForRead(param, sizeof(*param), 1);
+ paramSafe = *param;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END
UserEnterExclusive();
- CurIcon = IntFindExistingCurIconObject(&ustrModuleSafe, &ustrRsrcSafe, cxDesired, cyDesired);
+ CurIcon = IntFindExistingCurIconObject(&ustrModuleSafe, &ustrRsrcSafe, ¶mSafe);
if (CurIcon)
Ret = CurIcon->Self;
UserLeave();
if(fuLoad & LR_SHARED)
{
DWORD size = MAX_PATH;
+ FINDEXISTINGCURICONPARAM param;
TRACE("Checking for an LR_SHARED cursor/icon.\n");
/* Prepare the resource name string */
} while(TRUE);
/* Ask win32k */
- hCurIcon = NtUserFindExistingCursorIcon(&ustrModule, &ustrRsrc, cxDesired, cyDesired);
+ param.bIcon = bIcon;
+ param.cx = cxDesired;
+ param.cy = cyDesired;
+ hCurIcon = NtUserFindExistingCursorIcon(&ustrModule, &ustrRsrc, ¶m);
if(hCurIcon)
{
/* Woohoo, got it! */
}
/* Call the relevant function */
- ret = CURSORICON_LoadImageW(hModule, ustrRsrc.Buffer, cxDesired, cyDesired, bIcon, fuFlags & LR_DEFAULTSIZE);
+ ret = CURSORICON_LoadImageW(hModule, ustrRsrc.Buffer, cxDesired, cyDesired, fuFlags & LR_DEFAULTSIZE, bIcon);
FreeLibrary(hModule);