ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

callproc.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.