- Separate system-defined from user-defined window properties. The values stored by win32k/user32 must not interfere with those stored by applications. Fixes various applications (e.g. PeaZip) randomly getting their window properties overwritten by the system
CORE-3897 #resolve
svn path=/trunk/; revision=69494
ASSERT_IRQL_LESS_OR_EQUAL(PASSIVE_LEVEL);
- Clip = UserGetProp(Window, AtomWndObj);
+ Clip = UserGetProp(Window, AtomWndObj, TRUE);
if (!Clip)
{
return;
Clip->PixelFormat = iPixelFormat;
/* associate object with window */
- UserSetProp(Window, AtomWndObj, Clip);
+ UserSetProp(Window, AtomWndObj, Clip, TRUE);
++gcountPWO;
TRACE("EngCreateWnd: SUCCESS: %p!\n", WndObjUser);
else
{
/* Remove object from window */
- UserRemoveProp(Window, AtomWndObj);
+ UserRemoveProp(Window, AtomWndObj, TRUE);
}
--gcountPWO;
HANDLE Data;
} PROPLISTITEM, *PPROPLISTITEM;
+#define PROPERTY_FLAG_SYSTEM 1
+
typedef struct _PROPERTY
{
LIST_ENTRY PropListEntry;
if (pMsg->message == WM_DDE_TERMINATE)
{
- pddeProp = (PDDE_PROP)UserGetProp(pWnd, AtomDDETrack);
+ pddeProp = (PDDE_PROP)UserGetProp(pWnd, AtomDDETrack, TRUE);
if (pddeProp)
{
pWndClient = UserGetWindowObject((HWND)pMsg->wParam);
ERR("DDE Get Client WM_DDE_TERMINATE\n");
}
- UserRemoveProp(pWnd, AtomDDETrack);
+ UserRemoveProp(pWnd, AtomDDETrack, TRUE);
ExFreePoolWithTag(pddeProp, USERTAG_DDE1);
}
return TRUE;
pddeProp->spwnd = pWndServer;
pddeProp->spwndPartner = pWnd;
- UserSetProp(pWndServer, AtomDDETrack, (HANDLE)pddeProp);
+ UserSetProp(pWndServer, AtomDDETrack, (HANDLE)pddeProp, TRUE);
}
return TRUE;
}
EngSetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
- hIconSmall = UserGetProp(pWnd, gpsi->atomIconSmProp);
- hIcon = UserGetProp(pWnd, gpsi->atomIconProp);
+ hIconSmall = UserGetProp(pWnd, gpsi->atomIconSmProp, TRUE);
+ hIcon = UserGetProp(pWnd, gpsi->atomIconProp, TRUE);
hIconOld = wParam == ICON_BIG ? hIcon : hIconSmall;
break;
}
- UserSetProp(pWnd, gpsi->atomIconProp, hIcon);
- UserSetProp(pWnd, gpsi->atomIconSmProp, hIconSmall);
+ UserSetProp(pWnd, gpsi->atomIconProp, hIcon, TRUE);
+ UserSetProp(pWnd, gpsi->atomIconSmProp, hIconSmall, TRUE);
if ((pWnd->style & WS_CAPTION ) == WS_CAPTION)
UserPaintCaption(pWnd, DC_ICON);
switch(wParam)
{
case ICON_BIG:
- hIconRet = UserGetProp(pWnd, gpsi->atomIconProp);
+ hIconRet = UserGetProp(pWnd, gpsi->atomIconProp, TRUE);
break;
case ICON_SMALL:
case ICON_SMALL2:
- hIconRet = UserGetProp(pWnd, gpsi->atomIconSmProp);
+ hIconRet = UserGetProp(pWnd, gpsi->atomIconSmProp, TRUE);
break;
default:
break;
BOOL FASTCALL
GetLayeredStatus(PWND pWnd)
{
- PLRD_PROP pLrdProp = UserGetProp(pWnd, AtomLayer);
+ PLRD_PROP pLrdProp = UserGetProp(pWnd, AtomLayer, TRUE);
if (pLrdProp)
{
return pLrdProp->is_Layered;
BOOL FASTCALL
SetLayeredStatus(PWND pWnd, BYTE set)
{
- PLRD_PROP pLrdProp = UserGetProp(pWnd, AtomLayer);
+ PLRD_PROP pLrdProp = UserGetProp(pWnd, AtomLayer, TRUE);
if (pLrdProp)
{
pLrdProp->is_Layered = set;
return FALSE;
}
- pLrdProp = UserGetProp(pWnd, AtomLayer);
+ pLrdProp = UserGetProp(pWnd, AtomLayer, TRUE);
if (!pLrdProp)
{
return FALSE;
}
RtlZeroMemory(pLrdProp, sizeof(LRD_PROP));
- UserSetProp(pWnd, AtomLayer, (HANDLE)pLrdProp);
+ UserSetProp(pWnd, AtomLayer, (HANDLE)pLrdProp, TRUE);
}
if (pLrdProp)
goto Exit;
}
- pLrdProp = UserGetProp(pWnd, AtomLayer);
+ pLrdProp = UserGetProp(pWnd, AtomLayer, TRUE);
if (!pLrdProp)
{
//FIXME: This is bad and we should feel bad.
//FIXME: Stop whining over wine code.
- hIcon = UserGetProp(pWnd, gpsi->atomIconSmProp);
- if (!hIcon) hIcon = UserGetProp(pWnd, gpsi->atomIconProp);
+ hIcon = UserGetProp(pWnd, gpsi->atomIconSmProp, TRUE);
+ if (!hIcon) hIcon = UserGetProp(pWnd, gpsi->atomIconProp, TRUE);
if (!hIcon && pWnd->pcls->spicnSm)
return pWnd->pcls->spicnSm;
ASSERT(pfwi);
- FlashState = (DWORD)UserGetProp(pWnd, AtomFlashWndState);
+ FlashState = (DWORD)UserGetProp(pWnd, AtomFlashWndState, TRUE);
if (FlashState == FLASHW_FINISHED)
{
IntKillTimer(pWnd, ID_EVENT_SYSTIMER_FLASHWIN, TRUE);
}
- UserRemoveProp(pWnd, AtomFlashWndState);
+ UserRemoveProp(pWnd, AtomFlashWndState, TRUE);
}
else
{ // Have a count and started, set timer.
FlashState ^= (FlashState ^ pfwi->dwFlags) & (FLASHW_MASK & ~FLASHW_TIMER);
}
FlashState = MAKELONG(LOWORD(FlashState),uCount);
- UserSetProp(pWnd, AtomFlashWndState, (HANDLE) FlashState);
+ UserSetProp(pWnd, AtomFlashWndState, (HANDLE)FlashState, TRUE);
}
return Ret;
}
FASTCALL
IntGetProp(
_In_ PWND Window,
- _In_ ATOM Atom)
+ _In_ ATOM Atom,
+ _In_ BOOLEAN SystemProp)
{
PLIST_ENTRY ListEntry;
PPROPERTY Property;
UINT i;
+ WORD SystemFlag = SystemProp ? PROPERTY_FLAG_SYSTEM : 0;
NT_ASSERT(UserIsEntered());
ListEntry = Window->PropListHead.Flink;
for (i = 0; i < Window->PropListItems; i++)
{
Property = CONTAINING_RECORD(ListEntry, PROPERTY, PropListEntry);
+ ListEntry = ListEntry->Flink;
- if (ListEntry == NULL)
- {
- ERR("Corrupted (or uninitialized?) property list for window %p. Prop count %u. Atom %u.\n",
- Window, Window->PropListItems, Atom);
- return NULL;
- }
-
- if (Property->Atom == Atom)
+ if (Property->Atom == Atom &&
+ (Property->fs & PROPERTY_FLAG_SYSTEM) == SystemFlag)
{
- return(Property);
+ return Property;
}
- ListEntry = ListEntry->Flink;
}
- return(NULL);
+ NT_ASSERT(ListEntry == &Window->PropListHead);
+ return NULL;
}
HANDLE
FASTCALL
UserGetProp(
_In_ PWND Window,
- _In_ ATOM Atom)
+ _In_ ATOM Atom,
+ _In_ BOOLEAN SystemProp)
{
PPROPERTY Prop;
NT_ASSERT(UserIsEntered());
- Prop = IntGetProp(Window, Atom);
+ Prop = IntGetProp(Window, Atom, SystemProp);
return Prop ? Prop->Data : NULL;
}
FASTCALL
UserRemoveProp(
_In_ PWND Window,
- _In_ ATOM Atom)
+ _In_ ATOM Atom,
+ _In_ BOOLEAN SystemProp)
{
PPROPERTY Prop;
HANDLE Data;
NT_ASSERT(UserIsEnteredExclusive());
- Prop = IntGetProp(Window, Atom);
+ Prop = IntGetProp(Window, Atom, SystemProp);
if (Prop == NULL)
{
return NULL;
UserSetProp(
_In_ PWND Window,
_In_ ATOM Atom,
- _In_ HANDLE Data)
+ _In_ HANDLE Data,
+ _In_ BOOLEAN SystemProp)
{
PPROPERTY Prop;
NT_ASSERT(UserIsEnteredExclusive());
- Prop = IntGetProp(Window, Atom);
+ Prop = IntGetProp(Window, Atom, SystemProp);
if (Prop == NULL)
{
Prop = UserHeapAlloc(sizeof(PROPERTY));
return FALSE;
}
Prop->Atom = Atom;
+ Prop->fs = SystemProp ? PROPERTY_FLAG_SYSTEM : 0;
InsertTailList(&Window->PropListHead, &Prop->PropListEntry);
Window->PropListItems++;
}
(ListEntry != &Window->PropListHead))
{
Property = CONTAINING_RECORD(ListEntry, PROPERTY, PropListEntry);
- listitem.Atom = Property->Atom;
- listitem.Data = Property->Data;
-
- Status = MmCopyToCaller(li, &listitem, sizeof(PROPLISTITEM));
- if (!NT_SUCCESS(Status))
+ ListEntry = ListEntry->Flink;
+ if (!(Property->fs & PROPERTY_FLAG_SYSTEM))
{
- goto Exit;
+ listitem.Atom = Property->Atom;
+ listitem.Data = Property->Data;
+
+ Status = MmCopyToCaller(li, &listitem, sizeof(PROPLISTITEM));
+ if (!NT_SUCCESS(Status))
+ {
+ goto Exit;
+ }
+
+ BufferSize -= sizeof(PROPLISTITEM);
+ Cnt++;
+ li++;
}
-
- BufferSize -= sizeof(PROPLISTITEM);
- Cnt++;
- li++;
- ListEntry = ListEntry->Flink;
}
}
else
{
+ /* FIXME: This counts user and system props */
Cnt = Window->PropListItems * sizeof(PROPLISTITEM);
}
goto Exit;
}
- Data = UserRemoveProp(Window, Atom);
+ Data = UserRemoveProp(Window, Atom, FALSE);
Exit:
TRACE("Leave NtUserRemoveProp, ret=%p\n", Data);
goto Exit;
}
- Ret = UserSetProp(Window, Atom, Data);
+ Ret = UserSetProp(Window, Atom, Data, FALSE);
Exit:
TRACE("Leave NtUserSetProp, ret=%i\n", Ret);
FASTCALL
UserGetProp(
_In_ PWND Window,
- _In_ ATOM Atom);
+ _In_ ATOM Atom,
+ _In_ BOOLEAN SystemProp);
HANDLE
FASTCALL
UserRemoveProp(
_In_ PWND Window,
- _In_ ATOM Atom);
+ _In_ ATOM Atom,
+ _In_ BOOLEAN SystemProp);
_Success_(return)
BOOL
UserSetProp(
_In_ PWND Window,
_In_ ATOM Atom,
- _In_ HANDLE Data);
+ _In_ HANDLE Data,
+ _In_ BOOLEAN SystemProp);
VOID
FASTCALL
return 0;
}
- HelpId = (DWORD)(DWORD_PTR)UserGetProp(Window, gpsi->atomContextHelpIdProp);
+ HelpId = (DWORD)(DWORD_PTR)UserGetProp(Window, gpsi->atomContextHelpIdProp, TRUE);
UserLeave();
return HelpId;
}
if ( Param )
- UserSetProp(Window, gpsi->atomContextHelpIdProp, (HANDLE)Param);
+ UserSetProp(Window, gpsi->atomContextHelpIdProp, (HANDLE)Param, TRUE);
else
- UserRemoveProp(Window, gpsi->atomContextHelpIdProp);
+ UserRemoveProp(Window, gpsi->atomContextHelpIdProp, TRUE);
UserLeave();
return TRUE;
if (hWnd && (Wnd = UserGetWindowObject(hWnd)))
{
- Clip = (XCLIPOBJ*)UserGetProp(Wnd, AtomWndObj);
+ Clip = (XCLIPOBJ*)UserGetProp(Wnd, AtomWndObj, TRUE);
if ( Clip && Clip->Hwnd == hWnd )
{
do
{
- HelpId = (DWORD)(DWORD_PTR)UserGetProp(pWnd, gpsi->atomContextHelpIdProp);
+ HelpId = (DWORD)(DWORD_PTR)UserGetProp(pWnd, gpsi->atomContextHelpIdProp, TRUE);
if (!HelpId) break;
pWnd = IntGetParent(pWnd);
}
HWND* WIN_ListChildren (HWND hWndparent);
VOID DeleteFrameBrushes(VOID);
BOOL WINAPI GdiValidateHandle(HGDIOBJ);
-HANDLE FASTCALL UserGetProp(HWND hWnd, ATOM Atom);
+HANDLE FASTCALL UserGetProp(HWND hWnd, ATOM Atom, BOOLEAN SystemProp);
BOOL WINAPI InitializeImmEntryTable(VOID);
/* EOF */
switch(wParam)
{
case ICON_BIG:
- hIconRet = UserGetProp(UserHMGetHandle(pWnd), gpsi->atomIconProp);
+ hIconRet = UserGetProp(UserHMGetHandle(pWnd), gpsi->atomIconProp, TRUE);
break;
case ICON_SMALL:
case ICON_SMALL2:
- hIconRet = UserGetProp(UserHMGetHandle(pWnd), gpsi->atomIconSmProp);
+ hIconRet = UserGetProp(UserHMGetHandle(pWnd), gpsi->atomIconSmProp, TRUE);
break;
default:
break;
HANDLE
FASTCALL
-IntGetProp(HWND hWnd, ATOM Atom)
+IntGetProp(HWND hWnd, ATOM Atom, BOOLEAN SystemProp)
{
PLIST_ENTRY ListEntry, temp;
PPROPERTY Property;
PWND pWnd;
int i;
+ WORD SystemFlag = SystemProp ? PROPERTY_FLAG_SYSTEM : 0;
pWnd = ValidateHwnd(hWnd);
if (!pWnd) return NULL;
for (i = 0; i < pWnd->PropListItems; i++ )
{
Property = CONTAINING_RECORD(ListEntry, PROPERTY, PropListEntry);
- if (Property->Atom == Atom)
+ if (Property->Atom == Atom &&
+ (Property->fs & PROPERTY_FLAG_SYSTEM) == SystemFlag)
{
return(Property);
}
HANDLE
FASTCALL
-UserGetProp(HWND hWnd, ATOM Atom)
+UserGetProp(HWND hWnd, ATOM Atom, BOOLEAN SystemProp)
{
PPROPERTY Prop;
- Prop = IntGetProp(hWnd, Atom);
+ Prop = IntGetProp(hWnd, Atom, SystemProp);
return Prop ? Prop->Data : NULL;
}
{
Atom = LOWORD((DWORD_PTR)lpString);
}
- Prop = IntGetProp(hWnd, Atom);
+ Prop = IntGetProp(hWnd, Atom, FALSE);
if (Prop != NULL) Data = Prop->Data;
return Data;
}