[Win32ss]
[reactos.git] / reactos / win32ss / user / ntuser / hook.c
index bd66450..13a322c 100644 (file)
@@ -31,11 +31,11 @@ BOOL
 IntLoadHookModule(int iHookID, HHOOK hHook, BOOL Unload)
 {
    PPROCESSINFO ppi;
-   HMODULE hmod;
+   BOOL bResult;
 
    ppi = PsGetCurrentProcessWin32Process();
 
-   ERR("IntLoadHookModule. Client PID: %d\n", PsGetProcessId(ppi->peProcess));
+   ERR("IntLoadHookModule. Client PID: %p\n", PsGetProcessId(ppi->peProcess));
 
     /* Check if this is the api hook */
     if(iHookID == WH_APIHOOK)
@@ -49,26 +49,24 @@ IntLoadHookModule(int iHookID, HHOOK hHook, BOOL Unload)
             ppi->W32PF_flags |= W32PF_APIHOOKLOADED;
 
             /* Call ClientLoadLibrary in user32 */
-            hmod = co_IntClientLoadLibrary(&strUahModule, &strUahInitFunc, Unload, TRUE);
-            TRACE("co_IntClientLoadLibrary returned %d\n", hmod );
-            if(hmod == 0)
+            bResult = co_IntClientLoadLibrary(&strUahModule, &strUahInitFunc, Unload, TRUE);
+            TRACE("co_IntClientLoadLibrary returned %d\n", bResult );
+            if (!bResult)
             {
                 /* Remove the flag we set before */
                 ppi->W32PF_flags &= ~W32PF_APIHOOKLOADED;
-                return FALSE;
             }
-            return TRUE;
+            return bResult;
         }
         else if(Unload && (ppi->W32PF_flags & W32PF_APIHOOKLOADED))
         {
             /* Call ClientLoadLibrary in user32 */
-            hmod = co_IntClientLoadLibrary(NULL, NULL, Unload, TRUE);
-            if(hmod != 0)
+            bResult = co_IntClientLoadLibrary(NULL, NULL, Unload, TRUE);
+            if (bResult)
             {
                 ppi->W32PF_flags &= ~W32PF_APIHOOKLOADED;
-                return TRUE;
             }
-            return FALSE;
+            return bResult;
         }
 
         return TRUE;
@@ -96,7 +94,7 @@ IntHookModuleUnloaded(PDESKTOP pdesk, int iHookID, HHOOK hHook)
 
     ERR("IntHookModuleUnloaded: iHookID=%d\n", iHookID);
 
-    ppiCsr = PsGetProcessWin32Process(CsrProcess);
+    ppiCsr = PsGetProcessWin32Process(gpepCSRSS);
 
     ListEntry = pdesk->PtiList.Flink;
     while(ListEntry != &pdesk->PtiList)
@@ -111,7 +109,7 @@ IntHookModuleUnloaded(PDESKTOP pdesk, int iHookID, HHOOK hHook)
         {
             if(ptiCurrent->ppi->W32PF_flags & W32PF_APIHOOKLOADED)
             {
-                TRACE("IntHookModuleUnloaded: sending message to PID %d, ppi=0x%x\n", PsGetProcessId(ptiCurrent->ppi->peProcess), ptiCurrent->ppi);
+                TRACE("IntHookModuleUnloaded: sending message to PID %p, ppi=%p\n", PsGetProcessId(ptiCurrent->ppi->peProcess), ptiCurrent->ppi);
                 co_MsqSendMessageAsync( ptiCurrent,
                                         0,
                                         iHookID,
@@ -131,7 +129,7 @@ IntHookModuleUnloaded(PDESKTOP pdesk, int iHookID, HHOOK hHook)
 
 BOOL
 FASTCALL
-UserLoadApiHook()
+UserLoadApiHook(VOID)
 {
     return IntLoadHookModule(WH_APIHOOK, 0, FALSE);
 }
@@ -149,7 +147,7 @@ UserRegisterUserApiHook(
     PPROCESSINFO ppiCsr;
 
     pti = PsGetCurrentThreadWin32Thread();
-    ppiCsr = PsGetProcessWin32Process(CsrProcess);
+    ppiCsr = PsGetProcessWin32Process(gpepCSRSS);
 
     /* Fail if the api hook is already registered */
     if(gpsi->dwSRVIFlags & SRVINFO_APIHOOK)
@@ -157,7 +155,7 @@ UserRegisterUserApiHook(
         return FALSE;
     }
 
-    ERR("UserRegisterUserApiHook. Server PID: %d\n", PsGetProcessId(pti->ppi->peProcess));
+    ERR("UserRegisterUserApiHook. Server PID: %p\n", PsGetProcessId(pti->ppi->peProcess));
 
     /* Register the api hook */
     gpsi->dwSRVIFlags |= SRVINFO_APIHOOK;
@@ -206,7 +204,7 @@ UserRegisterUserApiHook(
 
 BOOL
 FASTCALL
-UserUnregisterUserApiHook()
+UserUnregisterUserApiHook(VOID)
 {
     PTHREADINFO pti;
 
@@ -224,7 +222,7 @@ UserUnregisterUserApiHook()
         return FALSE;
     }
 
-    ERR("UserUnregisterUserApiHook. Server PID: %d\n", PsGetProcessId(pti->ppi->peProcess));
+    ERR("UserUnregisterUserApiHook. Server PID: %p\n", PsGetProcessId(pti->ppi->peProcess));
 
     /* Unregister the api hook */
     gpsi->dwSRVIFlags &= ~SRVINFO_APIHOOK;
@@ -252,8 +250,8 @@ co_IntCallLowLevelHook(PHOOK Hook,
     BOOL Block = FALSE;
     ULONG_PTR uResult = 0;
 
-    if (Hook->Thread)
-       pti = Hook->Thread->Tcb.Win32Thread;
+    if (Hook->ptiHooked)
+       pti = Hook->ptiHooked;
     else
        pti = Hook->head.pti;
 
@@ -297,7 +295,7 @@ co_IntCallLowLevelHook(PHOOK Hook,
 
     /* FIXME: Should get timeout from
      * HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */
-    Status = co_MsqSendMessage( pti->MessageQueue,
+    Status = co_MsqSendMessage( pti,
                                 IntToPtr(Code), // hWnd
                                 Hook->HookId,   // Msg
                                 wParam,
@@ -351,6 +349,8 @@ co_CallHook( INT HookId,
                                  wParam,
                                  lParam,
                                  phk->Proc,
+                                 phk->ihmod,
+                                 phk->offPfn,
                                  phk->Ansi,
                                 &phk->ModuleName);
 
@@ -375,6 +375,8 @@ co_HOOK_CallHookNext( PHOOK Hook,
                                wParam,
                                lParam,
                                Hook->Proc,
+                               Hook->ihmod,
+                               Hook->offPfn,
                                Hook->Ansi,
                               &Hook->ModuleName);
 }
@@ -500,7 +502,7 @@ co_IntCallDebugHook(PHOOK Hook,
         if (BadChk)
         {
             ERR("HOOK WH_DEBUG read from Debug.lParam ERROR!\n");
-            ExFreePool(HooklParam);
+            ExFreePoolWithTag(HooklParam, TAG_HOOK);
             return lResult;
         }
     }
@@ -939,7 +941,7 @@ IntGetHookObject(HHOOK hHook)
        return NULL;
     }
 
-    Hook = (PHOOK)UserGetObject(gHandleTable, hHook, otHook);
+    Hook = (PHOOK)UserGetObject(gHandleTable, hHook, TYPE_HOOK);
     if (!Hook)
     {
        EngSetLastError(ERROR_INVALID_HOOK_HANDLE);
@@ -992,9 +994,9 @@ IntGetNextHook(PHOOK Hook)
     PLIST_ENTRY pLastHead, pElem;
     PTHREADINFO pti;
 
-    if (Hook->Thread)
+    if (Hook->ptiHooked)
     {
-       pti = ((PTHREADINFO)Hook->Thread->Tcb.Win32Thread);
+       pti = Hook->ptiHooked;
        pLastHead = &pti->aphkStart[HOOKID_TO_INDEX(HookId)];
     }
     else
@@ -1022,7 +1024,7 @@ IntFreeHook(PHOOK Hook)
        Hook->ModuleName.Buffer = NULL;
     }
     /* Close handle */
-    UserDeleteObject(UserHMGetHandle(Hook), otHook);
+    UserDeleteObject(UserHMGetHandle(Hook), TYPE_HOOK);
 }
 
 /* Remove a hook, freeing it from the chain */
@@ -1037,9 +1039,9 @@ IntRemoveHook(PHOOK Hook)
 
     HookId = Hook->HookId;
 
-    if (Hook->Thread) // Local
+    if (Hook->ptiHooked) // Local
     {
-       pti = ((PTHREADINFO)Hook->Thread->Tcb.Win32Thread);
+       pti = Hook->ptiHooked;
 
        IntFreeHook( Hook);
 
@@ -1048,10 +1050,12 @@ IntRemoveHook(PHOOK Hook)
           pti->fsHooks &= ~HOOKID_TO_FLAG(HookId);
           _SEH2_TRY
           {
-             GetWin32ClientInfo()->fsHooks = pti->fsHooks;
+             pti->pClientInfo->fsHooks = pti->fsHooks;
           }
           _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
           {
+              /* Do nothing */
+              (void)0;
           }
           _SEH2_END;
        }
@@ -1086,7 +1090,7 @@ HOOK_DestroyThreadHooks(PETHREAD Thread)
 
    if (!pti || !pdo)
    {
-      ERR("Kill Thread Hooks pti 0x%x pdo 0x%x\n",pti,pdo);
+      ERR("Kill Thread Hooks pti %p pdo %p\n", pti, pdo);
       return;
    }
 
@@ -1106,6 +1110,7 @@ HOOK_DestroyThreadHooks(PETHREAD Thread)
          }
       }
       pti->fsHooks = 0;
+      pti->pClientInfo->fsHooks = 0;
    }
 // Global search based on Thread and cleanup.
    if (pdo->pDeskInfo->fsHooks)
@@ -1232,6 +1237,8 @@ co_HOOK_CallHooks( INT HookId,
                                     wParam,
                                     lParam,
                                     Hook->Proc,
+                                    Hook->ihmod, 
+                                    Hook->offPfn,
                                     Hook->Ansi,
                                    &Hook->ModuleName);
        if (ClientInfo)
@@ -1242,6 +1249,8 @@ co_HOOK_CallHooks( INT HookId,
           }
           _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
           {
+              /* Do nothing */
+              (void)0;
           }
           _SEH2_END;
        }
@@ -1267,7 +1276,7 @@ co_HOOK_CallHooks( INT HookId,
        */
        for(i = 0; pHookHandles[i]; ++i)
        {
-          Hook = (PHOOK)UserGetObject(gHandleTable, pHookHandles[i], otHook);
+          Hook = (PHOOK)UserGetObject(gHandleTable, pHookHandles[i], TYPE_HOOK);
           if(!Hook)
           {
               ERR("Invalid hook!\n");
@@ -1280,7 +1289,7 @@ co_HOOK_CallHooks( INT HookId,
 
           if ( (pti->TIF_flags & TIF_DISABLEHOOKS) || (ptiHook->TIF_flags & TIF_INCLEANUP))
           {
-             TRACE("Next Hook 0x%x, 0x%x\n",ptiHook->rpdesk,pdo);
+             TRACE("Next Hook %p, %p\n", ptiHook->rpdesk, pdo);
              continue;
           }
 
@@ -1306,6 +1315,8 @@ co_HOOK_CallHooks( INT HookId,
                                           wParam,
                                           lParam,
                                           Hook->Proc,
+                                          Hook->ihmod, 
+                                          Hook->offPfn,
                                           Hook->Ansi,
                                          &Hook->ModuleName);
           }
@@ -1453,7 +1464,6 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
     UNICODE_STRING ModuleName;
     NTSTATUS Status;
     HHOOK Handle;
-    PETHREAD Thread = NULL;
     PTHREADINFO pti, ptiHook = NULL;
     DECLARE_RETURN(HHOOK);
 
@@ -1488,17 +1498,13 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
            RETURN( NULL);
        }
 
-       if (!NT_SUCCESS(PsLookupThreadByThreadId((HANDLE)(DWORD_PTR) ThreadId, &Thread)))
+       if ( !(ptiHook = IntTID2PTI( (HANDLE)ThreadId )))
        {
           ERR("Invalid thread id 0x%x\n", ThreadId);
           EngSetLastError(ERROR_INVALID_PARAMETER);
           RETURN( NULL);
        }
 
-       ptiHook = Thread->Tcb.Win32Thread;
-
-       ObDereferenceObject(Thread);
-
        if ( ptiHook->rpdesk != pti->rpdesk) // gptiCurrent->rpdesk)
        {
           ERR("Local hook wrong desktop HookId: %d\n",HookId);
@@ -1506,7 +1512,7 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
           RETURN( NULL);
        }
 
-       if (Thread->ThreadsProcess != PsGetCurrentProcess())
+       if (ptiHook->ppi != pti->ppi)
        {
           if ( !Mod &&
               (HookId == WH_GETMESSAGE ||
@@ -1570,7 +1576,7 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
     }
     ObDereferenceObject(WinStaObj);
 
-    Hook = UserCreateObject(gHandleTable, NULL, (PHANDLE)&Handle, otHook, sizeof(HOOK));
+    Hook = UserCreateObject(gHandleTable, NULL, NULL, (PHANDLE)&Handle, TYPE_HOOK, sizeof(HOOK));
 
     if (!Hook)
     {
@@ -1578,14 +1584,13 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
     }
 
     Hook->ihmod   = (INT)Mod; // Module Index from atom table, Do this for now.
-    Hook->Thread  = Thread; /* Set Thread, Null is Global. */
     Hook->HookId  = HookId;
     Hook->rpdesk  = ptiHook->rpdesk;
     Hook->phkNext = NULL; /* Dont use as a chain! Use link lists for chaining. */
     Hook->Proc    = HookProc;
     Hook->Ansi    = Ansi;
 
-    TRACE("Set Hook Desk 0x%x DeskInfo 0x%x Handle Desk 0x%x\n",pti->rpdesk, pti->pDeskInfo,Hook->head.rpdesk);
+    TRACE("Set Hook Desk %p DeskInfo %p Handle Desk %p\n", pti->rpdesk, pti->pDeskInfo, Hook->head.rpdesk);
 
     if (ThreadId)  /* Thread-local hook */
     {
@@ -1674,6 +1679,9 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
        }
 
        Hook->ModuleName.Length = ModuleName.Length;
+       //// FIXME: Need to load from user32 to verify hMod before calling hook with hMod set!!!!
+       //// Mod + offPfn == new HookProc Justin Case module is from another process.
+       FIXME("NtUserSetWindowsHookEx Setting process hMod instance addressing.\n");
        /* Make proc relative to the module base */
        Hook->offPfn = (ULONG_PTR)((char *)HookProc - (char *)Mod);
     }
@@ -1684,7 +1692,7 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
     RETURN( Handle);
 
 CLEANUP:
-    TRACE("Leave NtUserSetWindowsHookEx, ret=%i\n",_ret_);
+    TRACE("Leave NtUserSetWindowsHookEx, ret=%p\n", _ret_);
     UserLeave();
     END_CLEANUP;
 }