mirror of
https://github.com/reactos/reactos.git
synced 2024-07-16 17:36:12 +00:00
- Implemented NotifyWinEvent, SetWinEventHook and UnhookWinEvent.
- I only enables test_winevents(), test_set_hook() and all related with wine Msg tests. The test takes a while to run due to the IsWinEventHookInstalled check. I optimized our mask set to take this into account. The results are, the test is slow and our code is fast. - We pass all Event and Local Hook tests. Will research the problem with global hooks and finish it up. svn path=/trunk/; revision=35022
This commit is contained in:
parent
4509402aa9
commit
6d4ff1a0c0
|
@ -167,6 +167,8 @@ IntShowOwnedPopups( PWINDOW_OBJECT owner, BOOL fShow );
|
||||||
LRESULT FASTCALL
|
LRESULT FASTCALL
|
||||||
IntDefWindowProc( PWINDOW_OBJECT Window, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Ansi);
|
IntDefWindowProc( PWINDOW_OBJECT Window, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Ansi);
|
||||||
|
|
||||||
|
VOID FASTCALL IntNotifyWinEvent(DWORD, PWINDOW_OBJECT, LONG, LONG);
|
||||||
|
|
||||||
#endif /* _WIN32K_WINDOW_H */
|
#endif /* _WIN32K_WINDOW_H */
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -4,9 +4,14 @@
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
typedef struct _EVENTPACK
|
||||||
|
{
|
||||||
|
PEVENTHOOK pEH;
|
||||||
|
LONG idObject;
|
||||||
|
LONG idChild;
|
||||||
|
} EVENTPACK, *PEVENTPACK;
|
||||||
|
|
||||||
static PEVENTTABLE GlobalEvents = NULL;
|
static PEVENTTABLE GlobalEvents = NULL;
|
||||||
static ULONG EventSys[EVENT_SYSTEM_MINIMIZEEND+1] = {0};
|
|
||||||
static ULONG EventObj[( EVENT_OBJECT_ACCELERATORCHANGE - EVENT_OBJECT_CREATE) +1] = {0};
|
|
||||||
|
|
||||||
/* PRIVATE FUNCTIONS *********************************************************/
|
/* PRIVATE FUNCTIONS *********************************************************/
|
||||||
|
|
||||||
|
@ -47,92 +52,38 @@ GetMaskFromEvent(DWORD Event)
|
||||||
static
|
static
|
||||||
VOID
|
VOID
|
||||||
FASTCALL
|
FASTCALL
|
||||||
IntEventUpCount(ULONG eventMin, ULONG eventMax)
|
IntSetSrvEventMask( UINT EventMin, UINT EventMax)
|
||||||
{
|
{
|
||||||
INT i, Min, Max;
|
UINT event;
|
||||||
|
DPRINT("SetSrvEventMask 1\n");
|
||||||
if ( eventMin >= EVENT_SYSTEM_SOUND && eventMax <= EVENT_SYSTEM_MINIMIZEEND)
|
for ( event = EventMin; event <= EventMax; event++)
|
||||||
{
|
{
|
||||||
for (i = eventMin; i < eventMax; i++)
|
if ((event >= EVENT_SYSTEM_SOUND && event <= EVENT_SYSTEM_MINIMIZEEND) ||
|
||||||
|
(event >= EVENT_CONSOLE_CARET && event <= EVENT_CONSOLE_END_APPLICATION) ||
|
||||||
|
(event >= EVENT_OBJECT_CREATE && event <= EVENT_OBJECT_ACCELERATORCHANGE))
|
||||||
{
|
{
|
||||||
gpsi->SrvEventActivity |= GetMaskFromEvent(i);
|
gpsi->SrvEventActivity |= GetMaskFromEvent(event);
|
||||||
EventSys[i]++;
|
}
|
||||||
|
if (event > EVENT_SYSTEM_MINIMIZEEND && event < EVENT_CONSOLE_CARET)
|
||||||
|
{
|
||||||
|
event = EVENT_CONSOLE_CARET-1;
|
||||||
|
gpsi->SrvEventActivity |= GetMaskFromEvent(event);
|
||||||
|
}
|
||||||
|
if (event > EVENT_CONSOLE_END_APPLICATION && event < EVENT_OBJECT_CREATE )
|
||||||
|
{
|
||||||
|
event = EVENT_OBJECT_CREATE-1;
|
||||||
|
gpsi->SrvEventActivity |= GetMaskFromEvent(event);
|
||||||
|
}
|
||||||
|
if (event > EVENT_OBJECT_ACCELERATORCHANGE && event < EVENT_MAX)
|
||||||
|
{
|
||||||
|
event = EVENT_MAX-1;
|
||||||
|
gpsi->SrvEventActivity |= GetMaskFromEvent(event);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( eventMin >= EVENT_OBJECT_CREATE && eventMax <= EVENT_OBJECT_ACCELERATORCHANGE)
|
if (!gpsi->SrvEventActivity)
|
||||||
{
|
gpsi->SrvEventActivity |= SRV_EVENT_RUNNING; // Set something.
|
||||||
for (i = eventMin; i < eventMax; i++)
|
DPRINT("SetSrvEventMask 2 : %x\n", gpsi->SrvEventActivity);
|
||||||
{
|
|
||||||
gpsi->SrvEventActivity |= GetMaskFromEvent(i);
|
|
||||||
EventObj[i - EVENT_OBJECT_CREATE]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( eventMin >= EVENT_SYSTEM_SOUND && eventMax <= EVENT_OBJECT_ACCELERATORCHANGE)
|
|
||||||
{
|
|
||||||
Max = EVENT_SYSTEM_MINIMIZEEND;
|
|
||||||
for (i = eventMin; i < Max; i++)
|
|
||||||
{
|
|
||||||
gpsi->SrvEventActivity |= GetMaskFromEvent(i);
|
|
||||||
EventSys[i]++;
|
|
||||||
}
|
|
||||||
Min = EVENT_OBJECT_CREATE;
|
|
||||||
for (i = Min; i < eventMax; i++)
|
|
||||||
{
|
|
||||||
gpsi->SrvEventActivity |= GetMaskFromEvent(i);
|
|
||||||
EventObj[i - EVENT_OBJECT_CREATE]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static
|
|
||||||
VOID
|
|
||||||
FASTCALL
|
|
||||||
IntEventDownCount(ULONG eventMin, ULONG eventMax)
|
|
||||||
{
|
|
||||||
INT i, Min, Max;
|
|
||||||
|
|
||||||
if ( eventMin >= EVENT_SYSTEM_SOUND && eventMax <= EVENT_SYSTEM_MINIMIZEEND)
|
|
||||||
{
|
|
||||||
for (i = eventMin; i < eventMax; i++)
|
|
||||||
{
|
|
||||||
EventSys[i]--;
|
|
||||||
if (!EventSys[i]) gpsi->SrvEventActivity &= ~GetMaskFromEvent(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( eventMin >= EVENT_OBJECT_CREATE && eventMax <= EVENT_OBJECT_ACCELERATORCHANGE)
|
|
||||||
{
|
|
||||||
for (i = eventMin; i < eventMax; i++)
|
|
||||||
{
|
|
||||||
EventObj[i - EVENT_OBJECT_CREATE]--;
|
|
||||||
if (!EventObj[i - EVENT_OBJECT_CREATE])
|
|
||||||
gpsi->SrvEventActivity &= ~GetMaskFromEvent(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( eventMin >= EVENT_SYSTEM_SOUND && eventMax <= EVENT_OBJECT_ACCELERATORCHANGE)
|
|
||||||
{
|
|
||||||
Max = EVENT_SYSTEM_MINIMIZEEND;
|
|
||||||
for (i = eventMin; i < Max; i++)
|
|
||||||
{
|
|
||||||
EventSys[i]--;
|
|
||||||
if (!EventSys[i]) gpsi->SrvEventActivity &= ~GetMaskFromEvent(i);
|
|
||||||
}
|
|
||||||
Min = EVENT_OBJECT_CREATE;
|
|
||||||
for (i = Min; i < eventMax; i++)
|
|
||||||
{
|
|
||||||
EventObj[i - EVENT_OBJECT_CREATE]--;
|
|
||||||
if (!EventObj[i - EVENT_OBJECT_CREATE])
|
|
||||||
gpsi->SrvEventActivity &= ~GetMaskFromEvent(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static
|
|
||||||
DWORD
|
|
||||||
FASTCALL
|
|
||||||
TimeStamp(VOID)
|
|
||||||
{
|
|
||||||
return (DWORD)((ULONGLONG)SharedUserData->TickCountLowDeprecated * SharedUserData->TickCountMultiplier / 16777216);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
|
@ -146,14 +97,19 @@ IntCallLowLevelEvent( PEVENTHOOK pEH,
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
ULONG_PTR uResult;
|
ULONG_PTR uResult;
|
||||||
|
EVENTPACK EP;
|
||||||
|
|
||||||
|
EP.pEH = pEH;
|
||||||
|
EP.idObject = idObject;
|
||||||
|
EP.idChild = idChild;
|
||||||
|
|
||||||
/* FIXME should get timeout from
|
/* FIXME should get timeout from
|
||||||
* HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */
|
* HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */
|
||||||
Status = co_MsqSendMessage(((PW32THREAD)pEH->Thread->Tcb.Win32Thread)->MessageQueue,
|
Status = co_MsqSendMessage(((PW32THREAD)pEH->Thread->Tcb.Win32Thread)->MessageQueue,
|
||||||
hwnd,
|
hwnd,
|
||||||
event,
|
event,
|
||||||
idObject,
|
0,
|
||||||
idChild,
|
(LPARAM)&EP,
|
||||||
5000,
|
5000,
|
||||||
TRUE,
|
TRUE,
|
||||||
MSQ_ISEVENT,
|
MSQ_ISEVENT,
|
||||||
|
@ -162,6 +118,7 @@ IntCallLowLevelEvent( PEVENTHOOK pEH,
|
||||||
return NT_SUCCESS(Status) ? uResult : 0;
|
return NT_SUCCESS(Status) ? uResult : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
BOOL
|
BOOL
|
||||||
FASTCALL
|
FASTCALL
|
||||||
|
@ -171,6 +128,7 @@ IntRemoveEvent(PEVENTHOOK pEH)
|
||||||
{
|
{
|
||||||
RemoveEntryList(&pEH->Chain);
|
RemoveEntryList(&pEH->Chain);
|
||||||
GlobalEvents->Counts--;
|
GlobalEvents->Counts--;
|
||||||
|
if (!GlobalEvents->Counts) gpsi->SrvEventActivity = 0;
|
||||||
UserDeleteObject(pEH->Self, otEvent);
|
UserDeleteObject(pEH->Self, otEvent);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -186,30 +144,73 @@ co_EVENT_CallEvents( DWORD event,
|
||||||
LONG idObject,
|
LONG idObject,
|
||||||
LONG idChild)
|
LONG idChild)
|
||||||
{
|
{
|
||||||
|
PEVENTHOOK pEH;
|
||||||
|
LRESULT Result;
|
||||||
|
PEVENTPACK pEP = (PEVENTPACK)idChild;
|
||||||
|
|
||||||
PEVENTHOOK pEH = UserHeapAlloc(sizeof(EVENTHOOK));
|
pEH = pEP->pEH;
|
||||||
|
|
||||||
if ((gpsi->SrvEventActivity & GetMaskFromEvent(event))) return 0; // No events to run.
|
Result = co_IntCallEventProc( pEH->Self,
|
||||||
|
|
||||||
|
|
||||||
if ((pEH->Thread != PsGetCurrentThread()) && (pEH->Thread != NULL))
|
|
||||||
{
|
|
||||||
// Post it in message queue.
|
|
||||||
return IntCallLowLevelEvent(pEH, event, hwnd, idObject, idChild);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LRESULT Result = co_IntCallEventProc(pEH->Self,
|
|
||||||
event,
|
event,
|
||||||
hwnd,
|
hwnd,
|
||||||
idObject,
|
pEP->idObject,
|
||||||
idChild,
|
pEP->idChild,
|
||||||
(DWORD)(NtCurrentTeb()->Cid).UniqueThread,
|
(DWORD)(NtCurrentTeb()->Cid).UniqueThread,
|
||||||
TimeStamp(),
|
(DWORD)EngGetTickCount(),
|
||||||
pEH->Proc);
|
pEH->Proc);
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
FASTCALL
|
||||||
|
IntNotifyWinEvent(
|
||||||
|
DWORD Event,
|
||||||
|
PWINDOW_OBJECT Window,
|
||||||
|
LONG idObject,
|
||||||
|
LONG idChild)
|
||||||
|
{
|
||||||
|
PEVENTHOOK pEH;
|
||||||
|
LRESULT Result;
|
||||||
|
|
||||||
|
if (!GlobalEvents->Counts) return;
|
||||||
|
|
||||||
|
pEH = (PEVENTHOOK)GlobalEvents->Events.Flink;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
UserReferenceObject(pEH);
|
||||||
|
// Must be inside the event window.
|
||||||
|
if ( (pEH->eventMin <= Event) && (pEH->eventMax >= Event))
|
||||||
|
{
|
||||||
|
if ((pEH->Thread != PsGetCurrentThread()) && (pEH->Thread != NULL))
|
||||||
|
{ // if all process || all thread || other thread same process
|
||||||
|
if (!(pEH->idProcess) || !(pEH->idThread) ||
|
||||||
|
((DWORD)(NtCurrentTeb()->Cid).UniqueProcess == pEH->idProcess))
|
||||||
|
{
|
||||||
|
Result = IntCallLowLevelEvent(pEH, Event, Window->hSelf, idObject, idChild);
|
||||||
|
}
|
||||||
|
}// if ^skip own thread && ((Pid && CPid == Pid && ^skip own process) || all process)
|
||||||
|
else if ( !(pEH->Flags & WINEVENT_SKIPOWNTHREAD) &&
|
||||||
|
( ((pEH->idProcess &&
|
||||||
|
(DWORD)(NtCurrentTeb()->Cid).UniqueProcess == pEH->idProcess) &&
|
||||||
|
!(pEH->Flags & WINEVENT_SKIPOWNPROCESS)) ||
|
||||||
|
!pEH->idProcess ) )
|
||||||
|
{
|
||||||
|
Result = co_IntCallEventProc( pEH->Self,
|
||||||
|
Event,
|
||||||
|
Window->hSelf,
|
||||||
|
idObject,
|
||||||
|
idChild,
|
||||||
|
(DWORD)(NtCurrentTeb()->Cid).UniqueThread,
|
||||||
|
(DWORD)EngGetTickCount(),
|
||||||
|
pEH->Proc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UserDereferenceObject(pEH);
|
||||||
|
|
||||||
|
pEH = (PEVENTHOOK)pEH->Chain.Flink;
|
||||||
|
} while (pEH != (PEVENTHOOK)&GlobalEvents->Events.Flink);
|
||||||
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
|
@ -219,8 +220,22 @@ NtUserNotifyWinEvent(
|
||||||
LONG idObject,
|
LONG idObject,
|
||||||
LONG idChild)
|
LONG idChild)
|
||||||
{
|
{
|
||||||
|
PWINDOW_OBJECT Window = NULL;
|
||||||
|
USER_REFERENCE_ENTRY Ref;
|
||||||
UserEnterExclusive();
|
UserEnterExclusive();
|
||||||
UNIMPLEMENTED
|
|
||||||
|
/* Validate input */
|
||||||
|
if (hWnd && (hWnd != INVALID_HANDLE_VALUE) && !(Window = UserGetWindowObject(hWnd)))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gpsi->SrvEventActivity & GetMaskFromEvent(Event))
|
||||||
|
{
|
||||||
|
UserRefObjectCo(Window, &Ref);
|
||||||
|
IntNotifyWinEvent( Event, Window, idObject, idChild);
|
||||||
|
UserDerefObjectCo(Window);
|
||||||
|
}
|
||||||
UserLeave();
|
UserLeave();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,11 +256,10 @@ NtUserSetWinEventHook(
|
||||||
UNICODE_STRING ModuleName;
|
UNICODE_STRING ModuleName;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
HANDLE Handle;
|
HANDLE Handle;
|
||||||
|
PETHREAD Thread = NULL;
|
||||||
|
|
||||||
UserEnterExclusive();
|
UserEnterExclusive();
|
||||||
|
|
||||||
DPRINT1("WARNING! Use at your own risk! Function is UNIMPLEMENTED!\n");
|
|
||||||
|
|
||||||
if ( !GlobalEvents )
|
if ( !GlobalEvents )
|
||||||
{
|
{
|
||||||
GlobalEvents = ExAllocatePoolWithTag(PagedPool, sizeof(EVENTTABLE), TAG_HOOK);
|
GlobalEvents = ExAllocatePoolWithTag(PagedPool, sizeof(EVENTTABLE), TAG_HOOK);
|
||||||
|
@ -253,6 +267,34 @@ NtUserSetWinEventHook(
|
||||||
InitializeListHead(&GlobalEvents->Events);
|
InitializeListHead(&GlobalEvents->Events);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (eventMin > eventMax)
|
||||||
|
{
|
||||||
|
SetLastWin32Error(ERROR_INVALID_HOOK_FILTER);
|
||||||
|
goto SetEventExit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!lpfnWinEventProc)
|
||||||
|
{
|
||||||
|
SetLastWin32Error(ERROR_INVALID_FILTER_PROC);
|
||||||
|
goto SetEventExit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((dwflags & WINEVENT_INCONTEXT) && !hmodWinEventProc)
|
||||||
|
{
|
||||||
|
SetLastWin32Error(ERROR_HOOK_NEEDS_HMOD);
|
||||||
|
goto SetEventExit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idThread)
|
||||||
|
{
|
||||||
|
Status = PsLookupThreadByThreadId((HANDLE)(DWORD_PTR)idThread, &Thread);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastWin32Error(ERROR_INVALID_THREAD_ID);
|
||||||
|
goto SetEventExit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pEH = UserCreateObject(gHandleTable, &Handle, otEvent, sizeof(EVENTHOOK));
|
pEH = UserCreateObject(gHandleTable, &Handle, otEvent, sizeof(EVENTHOOK));
|
||||||
if (pEH)
|
if (pEH)
|
||||||
{
|
{
|
||||||
|
@ -260,6 +302,9 @@ NtUserSetWinEventHook(
|
||||||
GlobalEvents->Counts++;
|
GlobalEvents->Counts++;
|
||||||
|
|
||||||
pEH->Self = Handle;
|
pEH->Self = Handle;
|
||||||
|
if (Thread)
|
||||||
|
pEH->Thread = Thread;
|
||||||
|
else
|
||||||
pEH->Thread = PsGetCurrentThread();
|
pEH->Thread = PsGetCurrentThread();
|
||||||
pEH->eventMin = eventMin;
|
pEH->eventMin = eventMin;
|
||||||
pEH->eventMax = eventMax;
|
pEH->eventMax = eventMax;
|
||||||
|
@ -268,21 +313,13 @@ NtUserSetWinEventHook(
|
||||||
pEH->Ansi = FALSE;
|
pEH->Ansi = FALSE;
|
||||||
pEH->Flags = dwflags;
|
pEH->Flags = dwflags;
|
||||||
|
|
||||||
if ((dwflags & WINEVENT_INCONTEXT) && !hmodWinEventProc)
|
|
||||||
{
|
|
||||||
SetLastWin32Error(ERROR_HOOK_NEEDS_HMOD);
|
|
||||||
goto SetEventExit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (eventMin > eventMax)
|
|
||||||
{
|
|
||||||
SetLastWin32Error(ERROR_INVALID_HOOK_FILTER);
|
|
||||||
goto SetEventExit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NULL != hmodWinEventProc)
|
if (NULL != hmodWinEventProc)
|
||||||
{
|
{
|
||||||
Status = MmCopyFromCaller(&ModuleName, puString, sizeof(UNICODE_STRING));
|
Status = MmCopyFromCaller(&ModuleName,
|
||||||
|
puString,
|
||||||
|
sizeof(UNICODE_STRING));
|
||||||
|
|
||||||
if (! NT_SUCCESS(Status))
|
if (! NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
UserDereferenceObject(pEH);
|
UserDereferenceObject(pEH);
|
||||||
|
@ -290,9 +327,11 @@ NtUserSetWinEventHook(
|
||||||
SetLastNtError(Status);
|
SetLastNtError(Status);
|
||||||
goto SetEventExit;
|
goto SetEventExit;
|
||||||
}
|
}
|
||||||
|
|
||||||
pEH->ModuleName.Buffer = ExAllocatePoolWithTag(PagedPool,
|
pEH->ModuleName.Buffer = ExAllocatePoolWithTag(PagedPool,
|
||||||
ModuleName.MaximumLength,
|
ModuleName.MaximumLength,
|
||||||
TAG_HOOK);
|
TAG_HOOK);
|
||||||
|
|
||||||
if (NULL == pEH->ModuleName.Buffer)
|
if (NULL == pEH->ModuleName.Buffer)
|
||||||
{
|
{
|
||||||
UserDereferenceObject(pEH);
|
UserDereferenceObject(pEH);
|
||||||
|
@ -300,10 +339,13 @@ NtUserSetWinEventHook(
|
||||||
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
|
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
goto SetEventExit;
|
goto SetEventExit;
|
||||||
}
|
}
|
||||||
|
|
||||||
pEH->ModuleName.MaximumLength = ModuleName.MaximumLength;
|
pEH->ModuleName.MaximumLength = ModuleName.MaximumLength;
|
||||||
|
|
||||||
Status = MmCopyFromCaller(pEH->ModuleName.Buffer,
|
Status = MmCopyFromCaller(pEH->ModuleName.Buffer,
|
||||||
ModuleName.Buffer,
|
ModuleName.Buffer,
|
||||||
ModuleName.MaximumLength);
|
ModuleName.MaximumLength);
|
||||||
|
|
||||||
if (! NT_SUCCESS(Status))
|
if (! NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
ExFreePool(pEH->ModuleName.Buffer);
|
ExFreePool(pEH->ModuleName.Buffer);
|
||||||
|
@ -312,25 +354,24 @@ NtUserSetWinEventHook(
|
||||||
SetLastNtError(Status);
|
SetLastNtError(Status);
|
||||||
goto SetEventExit;
|
goto SetEventExit;
|
||||||
}
|
}
|
||||||
|
|
||||||
pEH->ModuleName.Length = ModuleName.Length;
|
pEH->ModuleName.Length = ModuleName.Length;
|
||||||
|
|
||||||
pEH->Proc = (void *)((char *)lpfnWinEventProc - (char *)hmodWinEventProc);
|
pEH->Proc = (void *)((char *)lpfnWinEventProc - (char *)hmodWinEventProc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
pEH->Proc = lpfnWinEventProc;
|
pEH->Proc = lpfnWinEventProc;
|
||||||
|
|
||||||
Ret = Handle;
|
Ret = Handle;
|
||||||
/*
|
IntSetSrvEventMask( eventMin, eventMax);
|
||||||
Now we are good, set the Events and counts.
|
|
||||||
*/
|
|
||||||
IntEventUpCount(eventMin, eventMax);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SetEventExit:
|
SetEventExit:
|
||||||
|
if (Thread) ObDereferenceObject(Thread);
|
||||||
UserLeave();
|
UserLeave();
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
NtUserUnhookWinEvent(
|
NtUserUnhookWinEvent(
|
||||||
|
@ -341,12 +382,9 @@ NtUserUnhookWinEvent(
|
||||||
|
|
||||||
UserEnterExclusive();
|
UserEnterExclusive();
|
||||||
|
|
||||||
DPRINT1("WARNING! Use at your own risk! Function is UNIMPLEMENTED!\n");
|
|
||||||
|
|
||||||
pEH = (PEVENTHOOK)UserGetObject(gHandleTable, hWinEventHook, otEvent);
|
pEH = (PEVENTHOOK)UserGetObject(gHandleTable, hWinEventHook, otEvent);
|
||||||
if (pEH)
|
if (pEH)
|
||||||
{
|
{
|
||||||
IntEventDownCount(pEH->eventMin, pEH->eventMax);
|
|
||||||
Ret = IntRemoveEvent(pEH);
|
Ret = IntRemoveEvent(pEH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -974,12 +974,18 @@ NtUserSetWindowsHookEx(
|
||||||
DPRINT("Enter NtUserSetWindowsHookEx\n");
|
DPRINT("Enter NtUserSetWindowsHookEx\n");
|
||||||
UserEnterExclusive();
|
UserEnterExclusive();
|
||||||
|
|
||||||
if (HookId < WH_MINHOOK || WH_MAXHOOK < HookId || NULL == HookProc)
|
if (HookId < WH_MINHOOK || WH_MAXHOOK < HookId )
|
||||||
{
|
{
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||||
RETURN( NULL);
|
RETURN( NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!HookProc)
|
||||||
|
{
|
||||||
|
SetLastWin32Error(ERROR_INVALID_FILTER_PROC);
|
||||||
|
RETURN( NULL);
|
||||||
|
}
|
||||||
|
|
||||||
ClientInfo = GetWin32ClientInfo();
|
ClientInfo = GetWin32ClientInfo();
|
||||||
|
|
||||||
if (ThreadId) /* thread-local hook */
|
if (ThreadId) /* thread-local hook */
|
||||||
|
@ -1029,7 +1035,7 @@ NtUserSetWindowsHookEx(
|
||||||
}
|
}
|
||||||
else if (NULL == Mod)
|
else if (NULL == Mod)
|
||||||
{
|
{
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
SetLastWin32Error(ERROR_HOOK_NEEDS_HMOD);
|
||||||
RETURN( NULL);
|
RETURN( NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1039,10 +1045,7 @@ NtUserSetWindowsHookEx(
|
||||||
Global = TRUE;
|
Global = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We only (partially) support local WH_CBT hooks and
|
if ( Global ||
|
||||||
* WH_KEYBOARD_LL, WH_MOUSE_LL and WH_GETMESSAGE hooks for now
|
|
||||||
*/
|
|
||||||
if (Global ||
|
|
||||||
WH_DEBUG == HookId ||
|
WH_DEBUG == HookId ||
|
||||||
WH_JOURNALPLAYBACK == HookId ||
|
WH_JOURNALPLAYBACK == HookId ||
|
||||||
WH_JOURNALRECORD == HookId)
|
WH_JOURNALRECORD == HookId)
|
||||||
|
|
|
@ -2059,7 +2059,7 @@ AllocErr:
|
||||||
RETURN((HWND)0);
|
RETURN((HWND)0);
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
Result = co_EVENT_CallEvents(EVENT_OBJECT_CREATE, Window->hSelf, OBJID_WINDOW, 0);
|
Result = IntNotifyWinEvent(EVENT_OBJECT_CREATE, Window, OBJID_WINDOW, 0);
|
||||||
|
|
||||||
if (Result == (LRESULT)-1)
|
if (Result == (LRESULT)-1)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue