9b03ba45448c0198f66d5af0dc735c9fafc9b077
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Window properties
5 * FILE: subsys/win32k/ntuser/prop.c
6 * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
10 DBG_DEFAULT_CHANNEL(UserProp
);
12 /* STATIC FUNCTIONS **********************************************************/
15 IntGetProp(PWND Window
, ATOM Atom
)
17 PLIST_ENTRY ListEntry
;
20 ListEntry
= Window
->PropListHead
.Flink
;
21 while (ListEntry
!= &Window
->PropListHead
)
23 Property
= CONTAINING_RECORD(ListEntry
, PROPERTY
, PropListEntry
);
25 if (Property
->Atom
== Atom
)
29 ListEntry
= ListEntry
->Flink
;
36 UserGetProp(PWND pWnd
, ATOM Atom
)
39 Prop
= IntGetProp(pWnd
, Atom
);
40 return Prop
? Prop
->Data
: NULL
;
44 IntRemoveProp(PWND Window
, ATOM Atom
)
47 Prop
= IntGetProp(Window
, Atom
);
53 RemoveEntryList(&Prop
->PropListEntry
);
55 Window
->PropListItems
--;
60 IntSetProp(PWND pWnd
, ATOM Atom
, HANDLE Data
)
64 Prop
= IntGetProp(pWnd
, Atom
);
68 Prop
= UserHeapAlloc(sizeof(PROPERTY
));
74 InsertTailList(&pWnd
->PropListHead
, &Prop
->PropListEntry
);
75 pWnd
->PropListItems
++;
82 /* FUNCTIONS *****************************************************************/
85 NtUserBuildPropList(HWND hWnd
,
92 PLIST_ENTRY ListEntry
;
93 PROPLISTITEM listitem
, *li
;
96 DECLARE_RETURN(NTSTATUS
);
98 TRACE("Enter NtUserBuildPropList\n");
101 if (!(Window
= UserGetWindowObject(hWnd
)))
103 RETURN( STATUS_INVALID_HANDLE
);
108 if(!BufferSize
|| (BufferSize
% sizeof(PROPLISTITEM
) != 0))
110 RETURN( STATUS_INVALID_PARAMETER
);
114 li
= (PROPLISTITEM
*)Buffer
;
115 ListEntry
= Window
->PropListHead
.Flink
;
116 while((BufferSize
>= sizeof(PROPLISTITEM
)) && (ListEntry
!= &Window
->PropListHead
))
118 Property
= CONTAINING_RECORD(ListEntry
, PROPERTY
, PropListEntry
);
119 listitem
.Atom
= Property
->Atom
;
120 listitem
.Data
= Property
->Data
;
122 Status
= MmCopyToCaller(li
, &listitem
, sizeof(PROPLISTITEM
));
123 if(!NT_SUCCESS(Status
))
128 BufferSize
-= sizeof(PROPLISTITEM
);
131 ListEntry
= ListEntry
->Flink
;
137 Cnt
= Window
->PropListItems
* sizeof(PROPLISTITEM
);
142 Status
= MmCopyToCaller(Count
, &Cnt
, sizeof(DWORD
));
143 if(!NT_SUCCESS(Status
))
149 RETURN( STATUS_SUCCESS
);
152 TRACE("Leave NtUserBuildPropList, ret=%i\n",_ret_
);
158 NtUserRemoveProp(HWND hWnd
, ATOM Atom
)
163 DECLARE_RETURN(HANDLE
);
165 TRACE("Enter NtUserRemoveProp\n");
166 UserEnterExclusive();
168 if (!(Window
= UserGetWindowObject(hWnd
)))
173 Prop
= IntGetProp(Window
, Atom
);
180 RemoveEntryList(&Prop
->PropListEntry
);
182 Window
->PropListItems
--;
187 TRACE("Leave NtUserRemoveProp, ret=%p\n", _ret_
);
193 NtUserSetProp(HWND hWnd
, ATOM Atom
, HANDLE Data
)
196 DECLARE_RETURN(BOOL
);
198 TRACE("Enter NtUserSetProp\n");
199 UserEnterExclusive();
201 if (!(Window
= UserGetWindowObject(hWnd
)))
206 RETURN( IntSetProp(Window
, Atom
, Data
));
209 TRACE("Leave NtUserSetProp, ret=%i\n",_ret_
);