sync with trunk head (34904)
[reactos.git] / reactos / subsystems / win32 / win32k / ntuser / callback.c
index b57fffd..4cce750 100644 (file)
@@ -339,7 +339,7 @@ co_IntCallHookProc(INT HookId,
 {
    ULONG ArgumentLength;
    PVOID Argument;
-   LRESULT Result;
+   LRESULT Result = 0;
    NTSTATUS Status;
    PVOID ResultPointer;
    ULONG ResultLength;
@@ -379,13 +379,23 @@ co_IntCallHookProc(INT HookId,
       case WH_MOUSE_LL:
          ArgumentLength += sizeof(MSLLHOOKSTRUCT);
          break;
+      case WH_MOUSE:
+         ArgumentLength += sizeof(MOUSEHOOKSTRUCT);
+         break;
+     case WH_CALLWNDPROC:
+         ArgumentLength += sizeof(CWPSTRUCT);
+         break;
+      case WH_CALLWNDPROCRET:
+         ArgumentLength += sizeof(CWPRETSTRUCT);
+         break;
       case WH_MSGFILTER:
       case WH_SYSMSGFILTER:
       case WH_GETMESSAGE:
          ArgumentLength += sizeof(MSG);
          break;
+      case WH_KEYBOARD:
 //      case WH_SHELL:
-//         break;
+         break;
       default:
          DPRINT1("Trying to call unsupported window hook %d\n", HookId);
          return 0;
@@ -429,7 +439,7 @@ co_IntCallHookProc(INT HookId,
                {
                   RtlCopyMemory(Extra, ClassName->Buffer, ClassName->Length);
                   CbtCreatewndExtra->Cs.lpszClass =
-                     (LPCWSTR) MAKELONG(Extra - (PCHAR) CbtCreatewndExtra, 1);
+                     (LPCWSTR)(ULONG_PTR) MAKELONG(Extra - (PCHAR) CbtCreatewndExtra, 1);
                   Extra += ClassName->Length;
                   *((WCHAR *) Extra) = L'\0';
                }
@@ -444,16 +454,30 @@ co_IntCallHookProc(INT HookId,
          RtlCopyMemory(Extra, (PVOID) lParam, sizeof(MSLLHOOKSTRUCT));
          Common->lParam = (LPARAM) (Extra - (PCHAR) Common);
          break;
+      case WH_MOUSE:
+         RtlCopyMemory(Extra, (PVOID) lParam, sizeof(MOUSEHOOKSTRUCT));
+         Common->lParam = (LPARAM) (Extra - (PCHAR) Common);
+         break;         
+      case WH_CALLWNDPROC:
+         RtlCopyMemory(Extra, (PVOID) lParam, sizeof(CWPSTRUCT));
+         Common->lParam = (LPARAM) (Extra - (PCHAR) Common);
+         break;         
+      case WH_CALLWNDPROCRET:
+         RtlCopyMemory(Extra, (PVOID) lParam, sizeof(CWPRETSTRUCT));
+         Common->lParam = (LPARAM) (Extra - (PCHAR) Common);
+         break;         
       case WH_MSGFILTER:
       case WH_SYSMSGFILTER:
       case WH_GETMESSAGE:
          RtlCopyMemory(Extra, (PVOID) lParam, sizeof(MSG));
          Common->lParam = (LPARAM) (Extra - (PCHAR) Common);
-         DPRINT1("KHOOK Memory: %x\n",Common);
+//         DPRINT1("KHOOK Memory: %x\n",Common);
+         break;
+      case WH_KEYBOARD:
          break;
 //      case WH_SHELL:
 //         Extra = lParam;
-//        break;         
+         break;         
    }
 
    ResultPointer = NULL;
@@ -467,11 +491,22 @@ co_IntCallHookProc(INT HookId,
                                &ResultPointer,
                                &ResultLength);
 
-   /* Simulate old behaviour: copy into our local buffer */
-   Result = *(LRESULT*)ResultPointer;
-
    UserEnterCo();
 
+   _SEH_TRY
+   {
+      ProbeForRead((PVOID)*(LRESULT*)ResultPointer,
+                                   sizeof(LRESULT),
+                                                 1);
+      /* Simulate old behaviour: copy into our local buffer */
+      Result = *(LRESULT*)ResultPointer;
+   }
+   _SEH_HANDLE
+   {
+      Result = 0;
+   }
+   _SEH_END;
+
    IntCbFreeMemory(Argument);
 
    if (!NT_SUCCESS(Status))
@@ -538,7 +573,7 @@ co_IntCallEventProc(HWINEVENTHOOK hook,
    IntRestoreTebWndCallback (hWnd, pWnd);
 
    IntCbFreeMemory(Argument);
-  
+
    if (!NT_SUCCESS(Status))
    {
       return 0;