diff --git a/reactos/subsystems/win32/win32k/include/object.h b/reactos/subsystems/win32/win32k/include/object.h index 1d1ef29d20d..615ae97d895 100644 --- a/reactos/subsystems/win32/win32k/include/object.h +++ b/reactos/subsystems/win32/win32k/include/object.h @@ -20,6 +20,7 @@ typedef struct _USER_HANDLE_ENTRY { void *ptr; /* pointer to object */ + PW32THREADINFO pti; // pointer to Win32ThreadInfo unsigned short type; /* object type (0 if free) */ unsigned short generation; /* generation counter */ } USER_HANDLE_ENTRY, * PUSER_HANDLE_ENTRY; @@ -41,11 +42,11 @@ typedef enum _USER_OBJECT_TYPE otFree = 0, otWindow, otMenu, - otAccel, otCursorIcon, - otHook, - otMonitor, - otCallProc + otHook = 5, + otCallProc = 7, + otAccel, + otMonitor = 12 } USER_OBJECT_TYPE; diff --git a/reactos/subsystems/win32/win32k/ntuser/object.c b/reactos/subsystems/win32/win32k/ntuser/object.c index 6175049923a..f2e3fbb2f55 100644 --- a/reactos/subsystems/win32/win32k/ntuser/object.c +++ b/reactos/subsystems/win32/win32k/ntuser/object.c @@ -108,6 +108,7 @@ __inline static void *free_user_entry(PUSER_HANDLE_TABLE ht, PUSER_HANDLE_ENTRY ret = entry->ptr; entry->ptr = ht->freelist; entry->type = 0; + entry->pti = 0; ht->freelist = entry; usedHandles--; @@ -123,6 +124,8 @@ HANDLE UserAllocHandle(PUSER_HANDLE_TABLE ht, PVOID object, USER_OBJECT_TYPE typ return 0; entry->ptr = object; entry->type = type; + entry->pti = GetW32ThreadInfo(); + if (entry->pti->pi->UserHandleTable == NULL) GetW32ProcessInfo(); if (++entry->generation >= 0xffff) entry->generation = 1; return entry_to_handle(ht, entry );