Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygencallproc.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS kernel 00004 * PURPOSE: Callproc support 00005 * FILE: subsystems/win32/win32k/ntuser/callproc.c 00006 * PROGRAMER: Thomas Weidenmueller <w3seek@reactos.com> 00007 */ 00008 00009 #include <win32k.h> 00010 00011 /* CALLPROC ******************************************************************/ 00012 00013 WNDPROC 00014 GetCallProcHandle(IN PCALLPROCDATA CallProc) 00015 { 00016 /* FIXME: Check for 64 bit architectures... */ 00017 return (WNDPROC)((ULONG_PTR)UserHMGetHandle(CallProc) | 0xFFFF0000); 00018 } 00019 00020 VOID 00021 DestroyCallProc(IN PDESKTOPINFO Desktop, 00022 IN OUT PCALLPROCDATA CallProc) 00023 { 00024 UserDeleteObject(UserHMGetHandle(CallProc), otCallProc); 00025 } 00026 00027 PCALLPROCDATA 00028 CreateCallProc(IN PDESKTOP Desktop, 00029 IN WNDPROC WndProc, 00030 IN BOOL Unicode, 00031 IN PPROCESSINFO pi) 00032 { 00033 PCALLPROCDATA NewCallProc; 00034 HANDLE Handle; 00035 00036 NewCallProc = (PCALLPROCDATA)UserCreateObject(gHandleTable, 00037 Desktop, 00038 &Handle, 00039 otCallProc, 00040 sizeof(CALLPROCDATA)); 00041 if (NewCallProc != NULL) 00042 { 00043 NewCallProc->pfnClientPrevious = WndProc; 00044 NewCallProc->wType |= Unicode ? UserGetCPDA2U : UserGetCPDU2A ; 00045 NewCallProc->spcpdNext = NULL; 00046 } 00047 00048 return NewCallProc; 00049 } 00050 00051 BOOL 00052 UserGetCallProcInfo(IN HANDLE hCallProc, 00053 OUT PWNDPROC_INFO wpInfo) 00054 { 00055 PCALLPROCDATA CallProc; 00056 00057 CallProc = UserGetObject(gHandleTable, 00058 hCallProc, 00059 otCallProc); 00060 if (CallProc == NULL) 00061 { 00062 return FALSE; 00063 } 00064 00065 /* Use Handle pEntry->ppi! 00066 if (CallProc->pi != GetW32ProcessInfo()) 00067 { 00068 return FALSE; 00069 }*/ 00070 00071 wpInfo->WindowProc = CallProc->pfnClientPrevious; 00072 wpInfo->IsUnicode = !!(CallProc->wType & UserGetCPDA2U); 00073 00074 return TRUE; 00075 } 00076 00077 /* 00078 Based on UserFindCallProc. 00079 */ 00080 PCALLPROCDATA 00081 FASTCALL 00082 UserSearchForCallProc( 00083 PCALLPROCDATA pcpd, 00084 WNDPROC WndProc, 00085 GETCPD Type) 00086 { 00087 while ( pcpd && (pcpd->pfnClientPrevious != WndProc || pcpd->wType != Type) ) 00088 { 00089 pcpd = pcpd->spcpdNext; 00090 } 00091 return pcpd; 00092 } 00093 00094 /* 00095 Get Call Proc Data handle for the window proc being requested or create a 00096 new Call Proc Data handle to be return for the requested window proc. 00097 */ 00098 ULONG_PTR 00099 FASTCALL 00100 UserGetCPD( 00101 PVOID pvClsWnd, 00102 GETCPD Flags, 00103 ULONG_PTR ProcIn) 00104 { 00105 PCLS pCls; 00106 PWND pWnd; 00107 PCALLPROCDATA CallProc = NULL; 00108 PTHREADINFO pti; 00109 00110 pti = PsGetCurrentThreadWin32Thread(); 00111 00112 if ( Flags & (UserGetCPDWindow|UserGetCPDDialog) || 00113 Flags & UserGetCPDWndtoCls) 00114 { 00115 pWnd = pvClsWnd; 00116 pCls = pWnd->pcls; 00117 } 00118 else 00119 pCls = pvClsWnd; 00120 00121 // Search Class call proc data list. 00122 if (pCls->spcpdFirst) 00123 CallProc = UserSearchForCallProc( pCls->spcpdFirst, (WNDPROC)ProcIn, Flags); 00124 00125 // No luck, create a new one for the requested proc. 00126 if (!CallProc) 00127 { 00128 CallProc = CreateCallProc( NULL, 00129 (WNDPROC)ProcIn, 00130 !!(Flags & UserGetCPDA2U), 00131 pti->ppi); 00132 if (CallProc) 00133 { 00134 CallProc->spcpdNext = pCls->spcpdFirst; 00135 (void)InterlockedExchangePointer((PVOID*)&pCls->spcpdFirst, 00136 CallProc); 00137 CallProc->wType = Flags; 00138 } 00139 } 00140 return (ULONG_PTR)(CallProc ? GetCallProcHandle(CallProc) : NULL); 00141 } 00142 00143 /* SYSCALLS *****************************************************************/ 00144 00145 /* 00146 Retrieve the WinProcA/W or CallProcData handle for Class, Dialog or Window. 00147 This Function called from user space uses Window handle for class, window 00148 and dialog procs only. 00149 00150 Note: 00151 ProcIn is the default proc from pCls/pDlg/pWnd->lpfnXxyz, caller is 00152 looking for another type of proc if the original lpfnXxyz proc is preset 00153 to Ansi or Unicode. 00154 00155 Example: 00156 If pWnd is created from Ansi and lpfnXxyz is assumed to be Ansi, caller 00157 will ask for Unicode Proc return Proc or CallProcData handle. 00158 */ 00159 ULONG_PTR 00160 APIENTRY 00161 NtUserGetCPD( 00162 HWND hWnd, 00163 GETCPD Flags, 00164 ULONG_PTR ProcIn) 00165 { 00166 PWND Wnd; 00167 ULONG_PTR Result = 0; 00168 00169 UserEnterExclusive(); 00170 if (!(Wnd = UserGetWindowObject(hWnd))) 00171 { 00172 goto Cleanup; 00173 } 00174 00175 // Processing Window only from User space. 00176 if ((Flags & ~(UserGetCPDU2A|UserGetCPDA2U)) != UserGetCPDClass) 00177 Result = UserGetCPD(Wnd, Flags, ProcIn); 00178 00179 Cleanup: 00180 UserLeave(); 00181 return Result; 00182 } 00183 Generated on Sat May 26 2012 04:37:17 for ReactOS by
1.7.6.1
|