2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Window classes
5 * FILE: subsystems/win32/win32k/ntuser/class.c
6 * PROGRAMER: Thomas Weidenmueller <w3seek@reactos.com>
8 * 06-06-2001 CSH Created
10 /* INCLUDES ******************************************************************/
17 /* CALLPROC ******************************************************************/
20 GetCallProcHandle(IN PCALLPROCDATA CallProc
)
22 /* FIXME - check for 64 bit architectures... */
23 return (WNDPROC
)((ULONG_PTR
)UserHMGetHandle(CallProc
) | 0xFFFF0000);
27 DestroyCallProc(IN PDESKTOPINFO Desktop
,
28 IN OUT PCALLPROCDATA CallProc
)
30 UserDeleteObject(UserHMGetHandle(CallProc
), otCallProc
);
34 CloneCallProc(IN PDESKTOP Desktop
,
35 IN PCALLPROCDATA CallProc
)
37 PCALLPROCDATA NewCallProc
;
40 NewCallProc
= (PCALLPROCDATA
)UserCreateObject(gHandleTable
,
44 sizeof(CALLPROCDATA
));
45 if (NewCallProc
!= NULL
)
47 NewCallProc
->pfnClientPrevious
= CallProc
->pfnClientPrevious
;
48 NewCallProc
->wType
= CallProc
->wType
;
49 NewCallProc
->spcpdNext
= NULL
;
56 CreateCallProc(IN PDESKTOP Desktop
,
61 PCALLPROCDATA NewCallProc
;
64 NewCallProc
= (PCALLPROCDATA
)UserCreateObject(gHandleTable
,
68 sizeof(CALLPROCDATA
));
69 if (NewCallProc
!= NULL
)
71 NewCallProc
->pfnClientPrevious
= WndProc
;
72 NewCallProc
->wType
|= Unicode
? UserGetCPDA2U
: UserGetCPDU2A
;
73 NewCallProc
->spcpdNext
= NULL
;
80 UserGetCallProcInfo(IN HANDLE hCallProc
,
81 OUT PWNDPROC_INFO wpInfo
)
83 PCALLPROCDATA CallProc
;
85 /* NOTE: Accessing the WNDPROC_INFO structure may raise an exception! */
87 CallProc
= UserGetObject(gHandleTable
,
95 /* Use Handle pEntry->ppi!
96 if (CallProc->pi != GetW32ProcessInfo())
101 wpInfo
->WindowProc
= CallProc
->pfnClientPrevious
;
102 wpInfo
->IsUnicode
= !!(CallProc
->wType
& UserGetCPDA2U
);
108 Based on UserFindCallProc.
112 UserSearchForCallProc(
117 while ( pcpd
&& (pcpd
->pfnClientPrevious
!= WndProc
|| pcpd
->wType
!= Type
) )
119 pcpd
= pcpd
->spcpdNext
;
125 Get Call Proc Data handle for the window proc being requested or create a
126 new Call Proc Data handle to be return for the requested window proc.
137 PCALLPROCDATA CallProc
= NULL
;
140 pti
= PsGetCurrentThreadWin32Thread();
142 if ( Flags
& (UserGetCPDWindow
|UserGetCPDDialog
) ||
143 Flags
& UserGetCPDWndtoCls
)
151 // Search Class call proc data list.
152 if (pCls
->spcpdFirst
)
153 CallProc
= UserSearchForCallProc( pCls
->spcpdFirst
, (WNDPROC
)ProcIn
, Flags
);
155 // No luck, create a new one for the requested proc.
158 CallProc
= CreateCallProc( NULL
,
160 !!(Flags
& UserGetCPDA2U
),
164 CallProc
->spcpdNext
= pCls
->spcpdFirst
;
165 (void)InterlockedExchangePointer((PVOID
*)&pCls
->spcpdFirst
,
167 CallProc
->wType
= Flags
;
170 return (ULONG_PTR
)(CallProc
? GetCallProcHandle(CallProc
) : NULL
);
173 /* SYSCALLS *****************************************************************/
176 Retrieve the WinProcA/W or CallProcData handle for Class, Dialog or Window.
177 This Function called from user space uses Window handle for class, window
178 and dialog procs only.
181 ProcIn is the default proc from pCls/pDlg/pWnd->lpfnXxyz, caller is
182 looking for another type of proc if the original lpfnXxyz proc is preset
186 If pWnd is created from Ansi and lpfnXxyz is assumed to be Ansi, caller
187 will ask for Unicode Proc return Proc or CallProcData handle.
196 PWINDOW_OBJECT Window
;
198 ULONG_PTR Result
= 0;
200 UserEnterExclusive();
201 if (!(Window
= UserGetWindowObject(hWnd
)) || !Window
->Wnd
)
207 // Processing Window only from User space.
208 if ((Flags
& ~(UserGetCPDU2A
|UserGetCPDA2U
)) != UserGetCPDClass
)
209 Result
= UserGetCPD(Wnd
, Flags
, ProcIn
);