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
,
41 sizeof(CALLPROCDATA
));
42 if (NewCallProc
!= NULL
)
44 NewCallProc
->pfnClientPrevious
= WndProc
;
45 NewCallProc
->wType
|= Unicode
? UserGetCPDA2U
: UserGetCPDU2A
;
46 NewCallProc
->spcpdNext
= NULL
;
53 UserGetCallProcInfo(IN HANDLE hCallProc
,
54 OUT PWNDPROC_INFO wpInfo
)
56 PCALLPROCDATA CallProc
;
58 CallProc
= UserGetObject(gHandleTable
,
66 /* Use Handle pEntry->ppi!
67 if (CallProc->pi != GetW32ProcessInfo())
72 wpInfo
->WindowProc
= CallProc
->pfnClientPrevious
;
73 wpInfo
->IsUnicode
= !!(CallProc
->wType
& UserGetCPDA2U
);
79 Based on UserFindCallProc.
83 UserSearchForCallProc(
88 while ( pcpd
&& (pcpd
->pfnClientPrevious
!= WndProc
|| pcpd
->wType
!= Type
) )
90 pcpd
= pcpd
->spcpdNext
;
96 Get Call Proc Data handle for the window proc being requested or create a
97 new Call Proc Data handle to be return for the requested window proc.
108 PCALLPROCDATA CallProc
= NULL
;
111 pti
= PsGetCurrentThreadWin32Thread();
113 if ( Flags
& (UserGetCPDWindow
|UserGetCPDDialog
) ||
114 Flags
& UserGetCPDWndtoCls
)
122 // Search Class call proc data list.
123 if (pCls
->spcpdFirst
)
124 CallProc
= UserSearchForCallProc( pCls
->spcpdFirst
, (WNDPROC
)ProcIn
, Flags
);
126 // No luck, create a new one for the requested proc.
129 CallProc
= CreateCallProc( NULL
,
131 !!(Flags
& UserGetCPDA2U
),
135 CallProc
->spcpdNext
= pCls
->spcpdFirst
;
136 (void)InterlockedExchangePointer((PVOID
*)&pCls
->spcpdFirst
,
138 CallProc
->wType
= Flags
;
141 return (ULONG_PTR
)(CallProc
? GetCallProcHandle(CallProc
) : NULL
);
144 /* SYSCALLS *****************************************************************/
147 Retrieve the WinProcA/W or CallProcData handle for Class, Dialog or Window.
148 This Function called from user space uses Window handle for class, window
149 and dialog procs only.
152 ProcIn is the default proc from pCls/pDlg/pWnd->lpfnXxyz, caller is
153 looking for another type of proc if the original lpfnXxyz proc is preset
157 If pWnd is created from Ansi and lpfnXxyz is assumed to be Ansi, caller
158 will ask for Unicode Proc return Proc or CallProcData handle.
168 ULONG_PTR Result
= 0;
170 UserEnterExclusive();
171 if (!(Wnd
= UserGetWindowObject(hWnd
)))
176 // Processing Window only from User space.
177 if ((Flags
& ~(UserGetCPDU2A
|UserGetCPDA2U
)) != UserGetCPDClass
)
178 Result
= UserGetCPD(Wnd
, Flags
, ProcIn
);