Index: hook.c =================================================================== --- hook.c (revision 47123) +++ hook.c (working copy) @@ -74,7 +74,7 @@ /* create a new hook and add it to the specified table */ static PHOOK -IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global, PWINSTATION_OBJECT WinStaObj) +IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global) { PTHREADINFO W32Thread; PHOOK Hook; @@ -209,7 +209,7 @@ static VOID FASTCALL -IntFreeHook(PHOOKTABLE Table, PHOOK Hook, PWINSTATION_OBJECT WinStaObj) +IntFreeHook(PHOOKTABLE Table, PHOOK Hook) { RemoveEntryList(&Hook->Chain); RtlFreeUnicodeString(&Hook->ModuleName); @@ -227,7 +227,7 @@ /* remove a hook, freeing it if the chain is not in use */ static VOID -IntRemoveHook(PHOOK Hook, PWINSTATION_OBJECT WinStaObj, BOOL TableAlreadyLocked) +IntRemoveHook(PHOOK Hook, BOOL TableAlreadyLocked) { PTHREADINFO W32Thread; PHOOKTABLE Table = IntGetTable(Hook); @@ -249,7 +249,7 @@ } else { - IntFreeHook(Table, Hook, WinStaObj); + IntFreeHook(Table, Hook); } } @@ -257,7 +257,7 @@ static VOID FASTCALL -IntReleaseHookChain(PHOOKTABLE Table, int HookId, PWINSTATION_OBJECT WinStaObj) +IntReleaseHookChain(PHOOKTABLE Table, int HookId) { PLIST_ENTRY Elem; PHOOK HookObj; @@ -286,7 +286,7 @@ if (NULL == HookObj->Proc) { - IntFreeHook(Table, HookObj, WinStaObj); + IntFreeHook(Table, HookObj); } } } @@ -327,8 +327,6 @@ PCLIENTINFO ClientInfo; PHOOKTABLE Table; LRESULT Result; - PWINSTATION_OBJECT WinStaObj; - NTSTATUS Status; ASSERT(WH_MINHOOK <= HookId && HookId <= WH_MAXHOOK); @@ -379,22 +377,9 @@ ClientInfo->phkCurrent = SaveHook; - Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, - KernelMode, - 0, - &WinStaObj); + IntReleaseHookChain(MsqGetHooks(pti->MessageQueue), HookId); + IntReleaseHookChain(GlobalHooks, HookId); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Invalid window station????\n"); - } - else - { - IntReleaseHookChain(MsqGetHooks(pti->MessageQueue), HookId, WinStaObj); - IntReleaseHookChain(GlobalHooks, HookId, WinStaObj); - ObDereferenceObject(WinStaObj); - } - return Result; } @@ -405,22 +390,9 @@ int HookId; PLIST_ENTRY Elem; PHOOK HookObj; - PWINSTATION_OBJECT WinStaObj; - NTSTATUS Status; if (NULL != GlobalHooks) { - Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, - KernelMode, - 0, - &WinStaObj); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("Invalid window station????\n"); - return; - } - for (HookId = WH_MINHOOK; HookId <= WH_MAXHOOK; HookId++) { /* only low-level keyboard/mouse global hooks can be owned by a thread */ @@ -437,7 +409,7 @@ if (HookObj->Thread == Thread) { - IntRemoveHook(HookObj, WinStaObj, TRUE); + IntRemoveHook(HookObj, TRUE); } } break; @@ -1103,7 +1075,6 @@ HOOKPROC HookProc, BOOL Ansi) { - PWINSTATION_OBJECT WinStaObj; PCLIENTINFO ClientInfo; BOOLEAN Global; PETHREAD Thread; @@ -1214,25 +1185,12 @@ RETURN( NULL); } - Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, - KernelMode, - 0, - &WinStaObj); + Hook = IntAddHook(Thread, HookId, Global); - if (!NT_SUCCESS(Status)) - { - /* Dereference thread if needed */ - if (ThreadReferenced) ObDereferenceObject(Thread); - SetLastNtError(Status); - RETURN( (HANDLE) NULL); - } - - Hook = IntAddHook(Thread, HookId, Global, WinStaObj); if (NULL == Hook) { /* Dereference thread if needed */ if (ThreadReferenced) ObDereferenceObject(Thread); - ObDereferenceObject(WinStaObj); RETURN( NULL); } @@ -1248,8 +1206,7 @@ if (!NT_SUCCESS(Status)) { UserDereferenceObject(Hook); - IntRemoveHook(Hook, WinStaObj, FALSE); - ObDereferenceObject(WinStaObj); + IntRemoveHook(Hook, FALSE); SetLastNtError(Status); RETURN( NULL); } @@ -1260,8 +1217,7 @@ if (NULL == Hook->ModuleName.Buffer) { UserDereferenceObject(Hook); - IntRemoveHook(Hook, WinStaObj, FALSE); - ObDereferenceObject(WinStaObj); + IntRemoveHook(Hook, FALSE); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); RETURN( NULL); } @@ -1274,8 +1230,7 @@ { ExFreePoolWithTag(Hook->ModuleName.Buffer, TAG_HOOK); UserDereferenceObject(Hook); - IntRemoveHook(Hook, WinStaObj, FALSE); - ObDereferenceObject(WinStaObj); + IntRemoveHook(Hook, FALSE); SetLastNtError(Status); RETURN( NULL); } @@ -1295,8 +1250,6 @@ UserDereferenceObject(Hook); - ObDereferenceObject(WinStaObj); - RETURN( Handle); CLEANUP: @@ -1310,41 +1263,26 @@ APIENTRY NtUserUnhookWindowsHookEx(HHOOK Hook) { - PWINSTATION_OBJECT WinStaObj; PHOOK HookObj; - NTSTATUS Status; DECLARE_RETURN(BOOL); DPRINT("Enter NtUserUnhookWindowsHookEx\n"); UserEnterExclusive(); - Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, - KernelMode, - 0, - &WinStaObj); - - if (!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - RETURN( FALSE); - } - /* Status = UserReferenceObjectByHandle(gHandleTable, Hook, otHookProc, (PVOID *) &HookObj); */ if (!(HookObj = IntGetHookObject(Hook))) { DPRINT1("Invalid handle passed to NtUserUnhookWindowsHookEx\n"); - ObDereferenceObject(WinStaObj); /* SetLastNtError(Status); */ RETURN( FALSE); } ASSERT(Hook == UserHMGetHandle(HookObj)); - IntRemoveHook(HookObj, WinStaObj, FALSE); + IntRemoveHook(HookObj, FALSE); UserDereferenceObject(HookObj); - ObDereferenceObject(WinStaObj); RETURN( TRUE);