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
), otCallProc
);
28 CreateCallProc(IN PDESKTOP Desktop
,
33 PCALLPROCDATA NewCallProc
;
36 NewCallProc
= (PCALLPROCDATA
)UserCreateObject(gHandleTable
,
40 sizeof(CALLPROCDATA
));
41 if (NewCallProc
!= NULL
)
43 NewCallProc
->pfnClientPrevious
= WndProc
;
44 NewCallProc
->wType
|= Unicode
? UserGetCPDA2U
: UserGetCPDU2A
;
45 NewCallProc
->spcpdNext
= NULL
;
52 UserGetCallProcInfo(IN HANDLE hCallProc
,
53 OUT PWNDPROC_INFO wpInfo
)
55 PCALLPROCDATA CallProc
;
57 CallProc
= UserGetObject(gHandleTable
,
65 /* Use Handle pEntry->ppi!
66 if (CallProc->pi != GetW32ProcessInfo())
71 wpInfo
->WindowProc
= CallProc
->pfnClientPrevious
;
72 wpInfo
->IsUnicode
= !!(CallProc
->wType
& UserGetCPDA2U
);
78 Based on UserFindCallProc.
82 UserSearchForCallProc(
87 while ( pcpd
&& (pcpd
->pfnClientPrevious
!= WndProc
|| pcpd
->wType
!= Type
) )
89 pcpd
= pcpd
->spcpdNext
;
95 Get Call Proc Data handle for the window proc being requested or create a
96 new Call Proc Data handle to be return for the requested window proc.
107 PCALLPROCDATA CallProc
= NULL
;
110 pti
= PsGetCurrentThreadWin32Thread();
112 if ( Flags
& (UserGetCPDWindow
|UserGetCPDDialog
) ||
113 Flags
& UserGetCPDWndtoCls
)
121 // Search Class call proc data list.
122 if (pCls
->spcpdFirst
)
123 CallProc
= UserSearchForCallProc( pCls
->spcpdFirst
, (WNDPROC
)ProcIn
, Flags
);
125 // No luck, create a new one for the requested proc.
128 CallProc
= CreateCallProc( NULL
,
130 !!(Flags
& UserGetCPDA2U
),
134 CallProc
->spcpdNext
= pCls
->spcpdFirst
;
135 (void)InterlockedExchangePointer((PVOID
*)&pCls
->spcpdFirst
,
137 CallProc
->wType
= Flags
;
140 return (ULONG_PTR
)(CallProc
? GetCallProcHandle(CallProc
) : NULL
);
143 /* SYSCALLS *****************************************************************/
146 Retrieve the WinProcA/W or CallProcData handle for Class, Dialog or Window.
147 This Function called from user space uses Window handle for class, window
148 and dialog procs only.
151 ProcIn is the default proc from pCls/pDlg/pWnd->lpfnXxyz, caller is
152 looking for another type of proc if the original lpfnXxyz proc is preset
156 If pWnd is created from Ansi and lpfnXxyz is assumed to be Ansi, caller
157 will ask for Unicode Proc return Proc or CallProcData handle.
167 ULONG_PTR Result
= 0;
169 UserEnterExclusive();
170 if (!(Wnd
= UserGetWindowObject(hWnd
)))
175 // Processing Window only from User space.
176 if ((Flags
& ~(UserGetCPDU2A
|UserGetCPDA2U
)) != UserGetCPDClass
)
177 Result
= UserGetCPD(Wnd
, Flags
, ProcIn
);