- Setting up for the User32 part of the win32k rewrite.
authorJames Tabor <james.tabor@reactos.org>
Fri, 14 Sep 2007 15:34:41 +0000 (15:34 +0000)
committerJames Tabor <james.tabor@reactos.org>
Fri, 14 Sep 2007 15:34:41 +0000 (15:34 +0000)
- Pass window handle and pointer to the current teb callback. This will allow easy and fast read access for user space programs.
- Next will be ValidateHwnd and the rest.
- https://www.microsoft.com/msj/0397/hood/hood0397.aspx
- http://www.winterdom.com/dev/ui/wnd.html
- http://www.mvps.org/user32/modal.html
- http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.kernel/2006-05/msg00522.html

svn path=/trunk/; revision=29035

reactos/subsystems/win32/win32k/ntuser/callback.c

index 8a33f39..c0e86dc 100644 (file)
@@ -106,6 +106,34 @@ IntCleanupThreadCallbacks(PW32THREAD W32Thread)
    }
 }
 
+
+//
+// Pass the Current Window handle and pointer to the Client Callback.
+// This will help user space programs speed up read access with the window object.
+//
+static VOID
+IntSetTebWndCallback (HWND * hWnd, PVOID * pWnd)
+{
+  HWND hWndS = *hWnd;
+  PWINDOW_OBJECT Window = UserGetWindowObject(*hWnd);
+  PTEB Teb = NtCurrentTeb();
+
+  *hWnd = Teb->Win32ClientInfo.hWND;
+  *pWnd = Teb->Win32ClientInfo.pvWND;
+
+  Teb->Win32ClientInfo.hWND  = hWndS;
+  Teb->Win32ClientInfo.pvWND = (PVOID) Window;
+}
+
+static VOID
+IntRestoreTebWndCallback (HWND hWnd, PVOID pWnd)
+{
+  PTEB Teb = NtCurrentTeb();
+
+  Teb->Win32ClientInfo.hWND  = hWnd;
+  Teb->Win32ClientInfo.pvWND = pWnd;
+}
+
 /* FUNCTIONS *****************************************************************/
 
 VOID STDCALL
@@ -116,7 +144,7 @@ co_IntCallSentMessageCallback(SENDASYNCPROC CompletionCallback,
                               LRESULT Result)
 {
    SENDASYNCPROC_CALLBACK_ARGUMENTS Arguments;
-   PVOID ResultPointer;
+   PVOID ResultPointer, pWnd;
    ULONG ResultLength;
    NTSTATUS Status;
 
@@ -126,6 +154,8 @@ co_IntCallSentMessageCallback(SENDASYNCPROC CompletionCallback,
    Arguments.Context = CompletionCallbackContext;
    Arguments.Result = Result;
 
+   IntSetTebWndCallback (&hWnd, &pWnd);
+
    UserLeaveCo();
 
    Status = KeUserModeCallback(USER32_CALLBACK_SENDASYNCPROC,
@@ -136,6 +166,8 @@ co_IntCallSentMessageCallback(SENDASYNCPROC CompletionCallback,
 
    UserEnterCo();
 
+   IntRestoreTebWndCallback (hWnd, pWnd);
+
    if (!NT_SUCCESS(Status))
    {
       return;
@@ -155,7 +187,7 @@ co_IntCallWindowProc(WNDPROC Proc,
    WINDOWPROC_CALLBACK_ARGUMENTS StackArguments;
    PWINDOWPROC_CALLBACK_ARGUMENTS Arguments;
    NTSTATUS Status;
-   PVOID ResultPointer;
+   PVOID ResultPointer, pWnd;
    ULONG ResultLength;
    ULONG ArgumentLength;
    LRESULT Result;
@@ -187,6 +219,8 @@ co_IntCallWindowProc(WNDPROC Proc,
    ResultPointer = NULL;
    ResultLength = ArgumentLength;
 
+   IntSetTebWndCallback (&Wnd, &pWnd);
+
    UserLeaveCo();
 
    Status = KeUserModeCallback(USER32_CALLBACK_WINDOWPROC,
@@ -208,6 +242,8 @@ co_IntCallWindowProc(WNDPROC Proc,
 
    UserEnterCo();
 
+   IntRestoreTebWndCallback (Wnd, pWnd);
+
    if (!NT_SUCCESS(Status))
    {
       if (0 < lParamBufferSize)