2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Callproc support
5 * FILE: subsystems/win32/win32k/ntuser/callproc.c
6 * PROGRAMER: Thomas Weidenmueller <w3seek@reactos.com>
11 /* CALLPROC ******************************************************************/
14 GetCallProcHandle(IN PCALLPROCDATA CallProc
)
16 /* FIXME: Check for 64 bit architectures... */
17 return (WNDPROC
)((ULONG_PTR
)UserHMGetHandle(CallProc
) | 0xFFFF0000);
21 DestroyCallProc(IN PDESKTOPINFO Desktop
,
22 IN OUT PCALLPROCDATA CallProc
)
24 UserDeleteObject(UserHMGetHandle(CallProc
), TYPE_CALLPROC
);
28 CreateCallProc(IN PDESKTOP Desktop
,
33 PCALLPROCDATA NewCallProc
;
36 NewCallProc
= (PCALLPROCDATA
)UserCreateObject(gHandleTable
,
41 sizeof(CALLPROCDATA
));
42 if (NewCallProc
!= NULL
)
44 NewCallProc
->pfnClientPrevious
= WndProc
;
45 NewCallProc
->wType
|= Unicode
? UserGetCPDA2U
: UserGetCPDU2A
;
46 NewCallProc
->spcpdNext
= NULL
;
49 /* Release the extra reference (UserCreateObject added 2 references) */
50 UserDereferenceObject(NewCallProc
);
56 UserGetCallProcInfo(IN HANDLE hCallProc
,
57 OUT PWNDPROC_INFO wpInfo
)
59 PCALLPROCDATA CallProc
;
61 CallProc
= UserGetObject(gHandleTable
,
69 /* Use Handle pEntry->ppi!
70 if (CallProc->pi != GetW32ProcessInfo())
75 wpInfo
->WindowProc
= CallProc
->pfnClientPrevious
;
76 wpInfo
->IsUnicode
= !!(CallProc
->wType
& UserGetCPDA2U
);
82 Based on UserFindCallProc.
86 UserSearchForCallProc(
91 while ( pcpd
&& (pcpd
->pfnClientPrevious
!= WndProc
|| pcpd
->wType
!= Type
) )
93 pcpd
= pcpd
->spcpdNext
;
99 Get Call Proc Data handle for the window proc being requested or create a
100 new Call Proc Data handle to be return for the requested window proc.
111 PCALLPROCDATA CallProc
= NULL
;
114 pti
= PsGetCurrentThreadWin32Thread();
116 if ( Flags
& (UserGetCPDWindow
|UserGetCPDDialog
) ||
117 Flags
& UserGetCPDWndtoCls
)
125 // Search Class call proc data list.
126 if (pCls
->spcpdFirst
)
127 CallProc
= UserSearchForCallProc( pCls
->spcpdFirst
, (WNDPROC
)ProcIn
, Flags
);
129 // No luck, create a new one for the requested proc.
132 CallProc
= CreateCallProc( NULL
,
134 !!(Flags
& UserGetCPDA2U
),
138 CallProc
->spcpdNext
= pCls
->spcpdFirst
;
139 (void)InterlockedExchangePointer((PVOID
*)&pCls
->spcpdFirst
,
141 CallProc
->wType
= Flags
;
144 return (ULONG_PTR
)(CallProc
? GetCallProcHandle(CallProc
) : NULL
);
147 /* SYSCALLS *****************************************************************/
150 Retrieve the WinProcA/W or CallProcData handle for Class, Dialog or Window.
151 This Function called from user space uses Window handle for class, window
152 and dialog procs only.
155 ProcIn is the default proc from pCls/pDlg/pWnd->lpfnXxyz, caller is
156 looking for another type of proc if the original lpfnXxyz proc is preset
160 If pWnd is created from Ansi and lpfnXxyz is assumed to be Ansi, caller
161 will ask for Unicode Proc return Proc or CallProcData handle.
171 ULONG_PTR Result
= 0;
173 UserEnterExclusive();
174 if (!(Wnd
= UserGetWindowObject(hWnd
)))
179 // Processing Window only from User space.
180 if ((Flags
& ~(UserGetCPDU2A
|UserGetCPDA2U
)) != UserGetCPDClass
)
181 Result
= UserGetCPD(Wnd
, Flags
, ProcIn
);