- Fixed event code. Remove junk too.

svn path=/trunk/; revision=42230
This commit is contained in:
James Tabor 2009-07-26 12:27:15 +00:00
parent 1632e8b1db
commit b163f7f34a
3 changed files with 48 additions and 77 deletions

View file

@ -185,6 +185,21 @@ typedef struct _CLSMENUNAME
PUNICODE_STRING pusMenuName; PUNICODE_STRING pusMenuName;
} CLSMENUNAME, *PCLSMENUNAME; } CLSMENUNAME, *PCLSMENUNAME;
typedef struct tagSBDATA
{
INT posMin;
INT posMax;
INT page;
INT pos;
} SBDATA, *PSBDATA;
typedef struct tagSBINFO
{
INT WSBflags;
SBDATA Horz;
SBDATA Vert;
} SBINFO, *PSBINFO;
typedef enum _GETCPD typedef enum _GETCPD
{ {
UserGetCPDU2A = 0x01, UserGetCPDU2A = 0x01,
@ -221,7 +236,7 @@ typedef struct _CLS
struct _CLS *pclsNext; struct _CLS *pclsNext;
RTL_ATOM atomClassName; RTL_ATOM atomClassName;
ATOM atomNVClassName; ATOM atomNVClassName;
DWORD fnid; // New ClassId DWORD fnid;
struct _DESKTOP *rpdeskParent; struct _DESKTOP *rpdeskParent;
PVOID pdce; PVOID pdce;
DWORD CSF_flags; DWORD CSF_flags;
@ -242,14 +257,17 @@ typedef struct _CLS
INT cbwndExtra; INT cbwndExtra;
HINSTANCE hModule; HINSTANCE hModule;
HANDLE hIcon; /* FIXME - Use pointer! */ HANDLE hIcon; /* FIXME - Use pointer! */
//PCURSOR spicn;
HANDLE hCursor; /* FIXME - Use pointer! */ HANDLE hCursor; /* FIXME - Use pointer! */
//PCURSOR spcur;
HBRUSH hbrBackground; HBRUSH hbrBackground;
PWSTR lpszMenuName; // kernel use PWSTR lpszMenuName; // kernel use
PSTR lpszAnsiClassName; // " PSTR lpszAnsiClassName; // "
HANDLE hIconSm; /* FIXME - Use pointer! */ HANDLE hIconSm; /* FIXME - Use pointer! */
//PCURSOR spicnSm;
UINT Destroying : 1; // CSF_WOWDEFERDESTROY UINT Destroying : 1; // CSF_WOWDEFERDESTROY
UINT Unicode : 1; UINT Unicode : 1; // !CSF_ANSIPROC
UINT System : 1; // CSF_SYSTEMCLASS UINT System : 1; // CSF_SYSTEMCLASS
UINT Global : 1; // CS_GLOBALCLASS UINT Global : 1; // CS_GLOBALCLASS
UINT MenuNameIsString : 1; UINT MenuNameIsString : 1;
@ -382,11 +400,16 @@ typedef struct _WND
/* Property list head.*/ /* Property list head.*/
LIST_ENTRY PropListHead; LIST_ENTRY PropListHead;
ULONG PropListItems; ULONG PropListItems;
/* Scrollbar info */
PSBINFO pSBInfo;
/* system menu handle. */
HMENU SystemMenu;
//PMENU spmenuSys;
/* Window menu handle or window id */ /* Window menu handle or window id */
UINT IDMenu; // Use spmenu UINT IDMenu; // Use spmenu
//PMENU spmenuSys;
//PMENU spmenu; //PMENU spmenu;
HRGN hrgnClip; HRGN hrgnClip;
HRGN hrgnNewFrame;
/* Window name. */ /* Window name. */
UNICODE_STRING strName; UNICODE_STRING strName;
/* Size of the extra data associated with the window. */ /* Size of the extra data associated with the window. */

View file

@ -15,6 +15,7 @@ typedef struct tagHOOKTABLE
typedef struct tagEVENTHOOK typedef struct tagEVENTHOOK
{ {
THRDESKHEAD head;
LIST_ENTRY Chain; /* Event chain entry */ LIST_ENTRY Chain; /* Event chain entry */
PETHREAD Thread; /* Thread owning the event */ PETHREAD Thread; /* Thread owning the event */
UINT eventMin; UINT eventMin;
@ -25,8 +26,6 @@ typedef struct tagEVENTHOOK
ULONG Flags; /* Some internal flags */ ULONG Flags; /* Some internal flags */
ULONG_PTR offPfn; ULONG_PTR offPfn;
INT ihmod; INT ihmod;
THRDESKHEAD head; // FIXME When on top it creates problems
UNICODE_STRING ModuleName; /* Module name for global events */
} EVENTHOOK, *PEVENTHOOK; } EVENTHOOK, *PEVENTHOOK;
typedef struct tagEVENTTABLE typedef struct tagEVENTTABLE

View file

@ -4,9 +4,6 @@
#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
#define WINEVENT_INIT 0x40000000
#define WINEVENT_DESTROYED 0x80000000
typedef struct _EVENTPACK typedef struct _EVENTPACK
{ {
PEVENTHOOK pEH; PEVENTHOOK pEH;
@ -176,6 +173,7 @@ IntNotifyWinEvent(
LONG idChild) LONG idChild)
{ {
PEVENTHOOK pEH; PEVENTHOOK pEH;
PLIST_ENTRY pLE;
LRESULT Result; LRESULT Result;
DPRINT("IntNotifyWinEvent GlobalEvents = 0x%x pWnd 0x%x\n",GlobalEvents, pWnd); DPRINT("IntNotifyWinEvent GlobalEvents = 0x%x pWnd 0x%x\n",GlobalEvents, pWnd);
@ -186,17 +184,10 @@ IntNotifyWinEvent(
if (!GlobalEvents || !GlobalEvents->Counts) return; if (!GlobalEvents || !GlobalEvents->Counts) return;
if (!UserIsEntered()) return; pLE = GlobalEvents->Events.Flink;
pEH = CONTAINING_RECORD(pLE, EVENTHOOK, Chain);
pEH = (PEVENTHOOK)GlobalEvents->Events.Flink;
DPRINT("IntNotifyWinEvent pEH 0x%x\n",pEH);
do do
{ {
if (pEH->Flags & WINEVENT_INIT)
{
DPRINT("IntNotifyWinEvent is still in INIT MODE!! pEH 0x%x\n",pEH);
}
UserReferenceObject(pEH); UserReferenceObject(pEH);
// Must be inside the event window. // Must be inside the event window.
if ( (pEH->eventMin <= Event) && (pEH->eventMax >= Event)) if ( (pEH->eventMin <= Event) && (pEH->eventMax >= Event))
@ -206,7 +197,11 @@ IntNotifyWinEvent(
if (!(pEH->idProcess) || !(pEH->idThread) || if (!(pEH->idProcess) || !(pEH->idThread) ||
(NtCurrentTeb()->ClientId.UniqueProcess == (PVOID)pEH->idProcess)) (NtCurrentTeb()->ClientId.UniqueProcess == (PVOID)pEH->idProcess))
{ {
Result = IntCallLowLevelEvent(pEH, Event, UserHMGetHandle(pWnd), idObject, idChild); Result = IntCallLowLevelEvent( pEH,
Event,
UserHMGetHandle(pWnd),
idObject,
idChild);
} }
}// if ^skip own thread && ((Pid && CPid == Pid && ^skip own process) || all process) }// if ^skip own thread && ((Pid && CPid == Pid && ^skip own process) || all process)
else if ( !(pEH->Flags & WINEVENT_SKIPOWNTHREAD) && else if ( !(pEH->Flags & WINEVENT_SKIPOWNTHREAD) &&
@ -215,22 +210,20 @@ IntNotifyWinEvent(
!(pEH->Flags & WINEVENT_SKIPOWNPROCESS)) || !(pEH->Flags & WINEVENT_SKIPOWNPROCESS)) ||
!pEH->idProcess ) ) !pEH->idProcess ) )
{ {
Result = co_IntCallEventProc( UserHMGetHandle(pEH),
Result = co_IntCallEventProc( pEH->head.h, Event,
Event, UserHMGetHandle(pWnd),
UserHMGetHandle(pWnd), idObject,
idObject, idChild,
idChild,
PtrToUint(NtCurrentTeb()->ClientId.UniqueThread), PtrToUint(NtCurrentTeb()->ClientId.UniqueThread),
(DWORD)EngGetTickCount(), (DWORD)EngGetTickCount(),
pEH->Proc); pEH->Proc);
} }
} }
UserDereferenceObject(pEH); UserDereferenceObject(pEH);
pLE = pEH->Chain.Flink;
pEH = (PEVENTHOOK)pEH->Chain.Flink; pEH = CONTAINING_RECORD(pLE, EVENTHOOK, Chain);
} while (pEH != (PEVENTHOOK)&GlobalEvents->Events.Flink); } while (pLE != &GlobalEvents->Events);
} }
VOID VOID
@ -275,7 +268,6 @@ NtUserSetWinEventHook(
{ {
PEVENTHOOK pEH; PEVENTHOOK pEH;
HWINEVENTHOOK Ret = NULL; HWINEVENTHOOK Ret = NULL;
UNICODE_STRING ModuleName;
NTSTATUS Status; NTSTATUS Status;
HANDLE Handle; HANDLE Handle;
PETHREAD Thread = NULL; PETHREAD Thread = NULL;
@ -330,8 +322,7 @@ NtUserSetWinEventHook(
InsertTailList(&GlobalEvents->Events, &pEH->Chain); InsertTailList(&GlobalEvents->Events, &pEH->Chain);
GlobalEvents->Counts++; GlobalEvents->Counts++;
pEH->Flags = dwflags|WINEVENT_INIT; UserHMGetHandle(pEH) = Handle;
pEH->head.h = Handle;
// pEH->head.pti =? // pEH->head.pti =?
// pEH->head.rpdesk // pEH->head.rpdesk
if (Thread) if (Thread)
@ -342,50 +333,10 @@ NtUserSetWinEventHook(
pEH->eventMax = eventMax; pEH->eventMax = eventMax;
pEH->idProcess = idProcess; pEH->idProcess = idProcess;
pEH->idThread = idThread; pEH->idThread = idThread;
pEH->Flags = dwflags;
if (NULL != hmodWinEventProc) if (NULL != hmodWinEventProc)
{ {
Status = MmCopyFromCaller(&ModuleName,
puString,
sizeof(UNICODE_STRING));
if (! NT_SUCCESS(Status))
{
UserDereferenceObject(pEH);
IntRemoveEvent(pEH);
SetLastNtError(Status);
goto SetEventExit;
}
pEH->ModuleName.Buffer = ExAllocatePoolWithTag(PagedPool,
ModuleName.MaximumLength,
TAG_HOOK);
if (NULL == pEH->ModuleName.Buffer)
{
UserDereferenceObject(pEH);
IntRemoveEvent(pEH);
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
goto SetEventExit;
}
pEH->ModuleName.MaximumLength = ModuleName.MaximumLength;
Status = MmCopyFromCaller(pEH->ModuleName.Buffer,
ModuleName.Buffer,
ModuleName.MaximumLength);
if (! NT_SUCCESS(Status))
{
ExFreePoolWithTag(pEH->ModuleName.Buffer, TAG_HOOK);
UserDereferenceObject(pEH);
IntRemoveEvent(pEH);
SetLastNtError(Status);
goto SetEventExit;
}
pEH->ModuleName.Length = ModuleName.Length;
pEH->offPfn = (ULONG_PTR)((char *)lpfnWinEventProc - (char *)hmodWinEventProc); pEH->offPfn = (ULONG_PTR)((char *)lpfnWinEventProc - (char *)hmodWinEventProc);
pEH->ihmod = (INT)hmodWinEventProc; pEH->ihmod = (INT)hmodWinEventProc;
pEH->Proc = lpfnWinEventProc; pEH->Proc = lpfnWinEventProc;
@ -393,8 +344,6 @@ NtUserSetWinEventHook(
else else
pEH->Proc = lpfnWinEventProc; pEH->Proc = lpfnWinEventProc;
pEH->Flags &= ~WINEVENT_INIT;
UserDereferenceObject(pEH); UserDereferenceObject(pEH);
Ret = Handle; Ret = Handle;