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
);
24 if (Property
->Atom
== Atom
)
28 ListEntry
= ListEntry
->Flink
;
34 IntRemoveProp(PWND Window
, ATOM Atom
)
37 Prop
= IntGetProp(Window
, Atom
);
43 RemoveEntryList(&Prop
->PropListEntry
);
45 Window
->PropListItems
--;
50 IntSetProp(PWND pWnd
, ATOM Atom
, HANDLE Data
)
54 Prop
= IntGetProp(pWnd
, Atom
);
58 Prop
= UserHeapAlloc(sizeof(PROPERTY
));
64 InsertTailList(&pWnd
->PropListHead
, &Prop
->PropListEntry
);
65 pWnd
->PropListItems
++;
72 /* FUNCTIONS *****************************************************************/
75 NtUserBuildPropList(HWND hWnd
,
82 PLIST_ENTRY ListEntry
;
83 PROPLISTITEM listitem
, *li
;
86 DECLARE_RETURN(NTSTATUS
);
88 TRACE("Enter NtUserBuildPropList\n");
91 if (!(Window
= UserGetWindowObject(hWnd
)))
93 RETURN( STATUS_INVALID_HANDLE
);
98 if(!BufferSize
|| (BufferSize
% sizeof(PROPLISTITEM
) != 0))
100 RETURN( STATUS_INVALID_PARAMETER
);
104 li
= (PROPLISTITEM
*)Buffer
;
105 ListEntry
= Window
->PropListHead
.Flink
;
106 while((BufferSize
>= sizeof(PROPLISTITEM
)) && (ListEntry
!= &Window
->PropListHead
))
108 Property
= CONTAINING_RECORD(ListEntry
, PROPERTY
, PropListEntry
);
109 listitem
.Atom
= Property
->Atom
;
110 listitem
.Data
= Property
->Data
;
112 Status
= MmCopyToCaller(li
, &listitem
, sizeof(PROPLISTITEM
));
113 if(!NT_SUCCESS(Status
))
118 BufferSize
-= sizeof(PROPLISTITEM
);
121 ListEntry
= ListEntry
->Flink
;
127 Cnt
= Window
->PropListItems
* sizeof(PROPLISTITEM
);
132 Status
= MmCopyToCaller(Count
, &Cnt
, sizeof(DWORD
));
133 if(!NT_SUCCESS(Status
))
139 RETURN( STATUS_SUCCESS
);
142 TRACE("Leave NtUserBuildPropList, ret=%i\n",_ret_
);
148 NtUserRemoveProp(HWND hWnd
, ATOM Atom
)
153 DECLARE_RETURN(HANDLE
);
155 TRACE("Enter NtUserRemoveProp\n");
156 UserEnterExclusive();
158 if (!(Window
= UserGetWindowObject(hWnd
)))
163 Prop
= IntGetProp(Window
, Atom
);
170 RemoveEntryList(&Prop
->PropListEntry
);
172 Window
->PropListItems
--;
177 TRACE("Leave NtUserRemoveProp, ret=%i\n",_ret_
);
183 NtUserSetProp(HWND hWnd
, ATOM Atom
, HANDLE Data
)
186 DECLARE_RETURN(BOOL
);
188 TRACE("Enter NtUserSetProp\n");
189 UserEnterExclusive();
191 if (!(Window
= UserGetWindowObject(hWnd
)))
196 RETURN( IntSetProp(Window
, Atom
, Data
));
199 TRACE("Leave NtUserSetProp, ret=%i\n",_ret_
);