ReactOS 0.4.17-dev-116-ga4b6fe9
object.c File Reference
#include <win32k.h>
Include dependency graph for object.c:

Go to the source code of this file.

Functions

 DBG_DEFAULT_CHANNEL (UserObj)
 
 _Success_ (return!=NULL)
 
static void FreeThreadObject (_In_ PVOID Object)
 
static void FreeDeskThreadObject (_In_ PVOID Object)
 
static void FreeDeskProcObject (_In_ PVOID Object)
 
void FreeProcMarkObject (_In_ PVOID Object)
 
static void FreeSysObject (_In_ PVOID Object)
 
static void FreeSysObjectCB (_In_ PVOID Object)
 
PUSER_HANDLE_ENTRY handle_to_entry (PUSER_HANDLE_TABLE ht, HANDLE handle)
 
static __inline HANDLE entry_to_handle (PUSER_HANDLE_TABLE ht, PUSER_HANDLE_ENTRY ptr)
 
static __inline PUSER_HANDLE_ENTRY alloc_user_entry (PUSER_HANDLE_TABLE ht)
 
VOID UserInitHandleTable (PUSER_HANDLE_TABLE ht, PVOID mem, ULONG bytes)
 
static __inline voidfree_user_entry (PUSER_HANDLE_TABLE ht, PUSER_HANDLE_ENTRY entry)
 
HANDLE UserAllocHandle (_Inout_ PUSER_HANDLE_TABLE ht, _In_ PVOID object, _In_ HANDLE_TYPE type, _In_ PVOID HandleOwner)
 
PVOID UserGetObjectNoErr (PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
 
PVOID UserGetObject (PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
 
HANDLE get_user_full_handle (PUSER_HANDLE_TABLE ht, HANDLE handle)
 
voidget_user_object_handle (PUSER_HANDLE_TABLE ht, HANDLE *handle, HANDLE_TYPE type)
 
BOOL FASTCALL UserCreateHandleTable (VOID)
 
PVOID FASTCALL UserCreateObject (PUSER_HANDLE_TABLE ht, PDESKTOP pDesktop, PTHREADINFO pti, HANDLE *h, HANDLE_TYPE type, ULONG size)
 
BOOL FASTCALL UserMarkObjectDestroy (PVOID Object)
 
BOOL FASTCALL UserDereferenceObject (PVOID Object)
 
BOOL FASTCALL UserFreeHandle (PUSER_HANDLE_TABLE ht, HANDLE handle)
 
BOOL FASTCALL UserObjectInDestroy (HANDLE h)
 
BOOL FASTCALL UserDeleteObject (HANDLE h, HANDLE_TYPE type)
 
VOID FASTCALL UserReferenceObject (PVOID obj)
 
PVOID FASTCALL UserReferenceObjectByHandle (HANDLE handle, HANDLE_TYPE type)
 
BOOLEAN UserDestroyObjectsForOwner (PUSER_HANDLE_TABLE Table, PVOID Owner)
 
BOOL APIENTRY NtUserValidateHandleSecure (HANDLE handle)
 
PVOID FASTCALL UserAssignmentLock (PVOID *ppvObj, PVOID pvNew)
 
PVOID FASTCALL UserAssignmentUnlock (PVOID *ppvObj)
 

Variables

PUSER_HANDLE_TABLE gHandleTable = NULL
 
struct {
   PVOID(*   ObjectAlloc )(PDESKTOP, PTHREADINFO,
       SIZE_T, PVOID *)
 
   BOOLEAN(*   ObjectDestroy )(PVOID)
 
   void(*   ObjectFree )(PVOID)
 
ObjectCallbacks [TYPE_CTYPES]
 

Function Documentation

◆ _Success_()

_Success_ ( return!  = NULL)

Definition at line 16 of file object.c.

22{
23 PTHROBJHEAD ObjHead;
24
26
27 ASSERT(Size > sizeof(*ObjHead));
28 ASSERT(pti != NULL);
29
30 ObjHead = UserHeapAlloc(Size);
31 if (!ObjHead)
32 return NULL;
33
34 RtlZeroMemory(ObjHead, Size);
35
36 ObjHead->pti = pti;
38 *HandleOwner = pti;
39 /* It's a thread object, but it still count as one for the process */
40 pti->ppi->UserHandleCount++;
41
42 return ObjHead;
43}
#define NULL
Definition: types.h:112
#define ASSERT(a)
Definition: mode.c:44
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
struct _THREADINFO * pti
Definition: ntuser.h:188
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
static __inline PVOID UserHeapAlloc(SIZE_T Bytes)
Definition: usrheap.h:34
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
#define IntReferenceThreadInfo(pti)
Definition: win32.h:167

◆ alloc_user_entry()

static __inline PUSER_HANDLE_ENTRY alloc_user_entry ( PUSER_HANDLE_TABLE  ht)
static

Definition at line 361 of file object.c.

362{
364 TRACE("handles used %lu\n", gpsi->cHandleEntries);
365
366 if (ht->freelist)
367 {
368 entry = ht->freelist;
369 ht->freelist = entry->ptr;
370
372 return entry;
373 }
374
375 if (ht->nb_handles >= ht->allocated_handles) /* Need to grow the array */
376 {
377 ERR("Out of user handles! Used -> %lu, NM_Handle -> %d\n", gpsi->cHandleEntries, ht->nb_handles);
378
379#if DBG
381#endif
382
383 return NULL;
384#if 0
385 PUSER_HANDLE_ENTRY new_handles;
386 /* Grow array by 50% (but at minimum 32 entries) */
387 int growth = max( 32, ht->allocated_handles / 2 );
388 int new_size = min( ht->allocated_handles + growth, (LAST_USER_HANDLE-FIRST_USER_HANDLE+1) >> 1 );
389 if (new_size <= ht->allocated_handles)
390 return NULL;
391 if (!(new_handles = UserHeapReAlloc( ht->handles, new_size * sizeof(*ht->handles) )))
392 return NULL;
393 ht->handles = new_handles;
394 ht->allocated_handles = new_size;
395#endif
396 }
397
398 entry = &ht->handles[ht->nb_handles++];
399
400 entry->generation = 1;
401
403
404 return entry;
405}
#define ERR(fmt,...)
Definition: precomp.h:57
size_t const new_size
Definition: expand.cpp:66
static const struct newhuff ht[]
Definition: huffman.h:296
PSERVERINFO gpsi
Definition: imm.c:18
#define LAST_USER_HANDLE
Definition: ntuser.h:11
#define FIRST_USER_HANDLE
Definition: ntuser.h:10
uint32_t entry
Definition: isohybrid.c:63
#define min(a, b)
Definition: monoChain.cc:55
void DbgUserDumpHandleTable()
#define TRACE(s)
Definition: solgame.cpp:4
Definition: ntuser.h:17
ULONG_PTR cHandleEntries
Definition: ntuser.h:1052
#define max(a, b)
Definition: svc.c:63
static __inline PVOID UserHeapReAlloc(PVOID lpMem, SIZE_T Bytes)
Definition: usrheap.h:54

Referenced by UserAllocHandle().

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( UserObj  )

◆ entry_to_handle()

static __inline HANDLE entry_to_handle ( PUSER_HANDLE_TABLE  ht,
PUSER_HANDLE_ENTRY  ptr 
)
static

Definition at line 355 of file object.c.

356{
357 int index = ptr - ht->handles;
358 return (HANDLE)((((INT_PTR)index << 1) + FIRST_USER_HANDLE) + (ptr->generation << 16));
359}
GLuint index
Definition: glext.h:6031
static PVOID ptr
Definition: dispmode.c:27
int32_t INT_PTR
Definition: typedefs.h:64

Referenced by get_user_full_handle(), get_user_object_handle(), and UserAllocHandle().

◆ free_user_entry()

static __inline void * free_user_entry ( PUSER_HANDLE_TABLE  ht,
PUSER_HANDLE_ENTRY  entry 
)
static

Definition at line 417 of file object.c.

418{
419 void *ret;
420
421#if DBG
422 {
423 PPROCESSINFO ppi;
424 switch (entry->type)
425 {
426 case TYPE_WINDOW:
427 case TYPE_HOOK:
429 ppi = ((PTHREADINFO)entry->pi)->ppi;
430 break;
431 case TYPE_MENU:
432 case TYPE_CURSOR:
433 case TYPE_CALLPROC:
434 case TYPE_ACCELTABLE:
435 ppi = entry->pi;
436 break;
437 default:
438 ppi = NULL;
439 }
440 if (ppi)
441 ppi->DbgHandleCount[entry->type]--;
442 }
443#endif
444
445 ret = entry->ptr;
446 entry->ptr = ht->freelist;
447 entry->type = 0;
448 entry->flags = 0;
449 entry->pi = NULL;
450 ht->freelist = entry;
451
453
454 return ret;
455}
return ret
Definition: mutex.c:146
@ TYPE_HOOK
Definition: ntuser.h:45
@ TYPE_CALLPROC
Definition: ntuser.h:47
@ TYPE_WINEVENTHOOK
Definition: ntuser.h:55
@ TYPE_CURSOR
Definition: ntuser.h:43
@ TYPE_WINDOW
Definition: ntuser.h:41
@ TYPE_ACCELTABLE
Definition: ntuser.h:48
@ TYPE_MENU
Definition: ntuser.h:42
struct _THREADINFO * PTHREADINFO
Definition: ntwin32.h:6

Referenced by UserDereferenceObject().

◆ FreeDeskProcObject()

static void FreeDeskProcObject ( _In_ PVOID  Object)
static

Definition at line 134 of file object.c.

136{
138 PDESKTOP pDesk = ObjHead->rpdesk;
139 PPROCESSINFO ppi = (PPROCESSINFO)ObjHead->hTaskWow;
140
141 ppi->UserHandleCount--;
143
144 DesktopHeapFree(pDesk, Object);
145}
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
Definition: desktop.h:215
struct _PROCDESKHEAD * PPROCDESKHEAD
struct _PROCESSINFO * PPROCESSINFO
Definition: ntwin32.h:5
struct _DESKTOP * rpdesk
Definition: ntuser.h:219
DWORD_PTR hTaskWow
Definition: ntuser.h:218
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
#define IntDereferenceProcessInfo(ppi)
Definition: win32.h:187

◆ FreeDeskThreadObject()

static void FreeDeskThreadObject ( _In_ PVOID  Object)
static

Definition at line 89 of file object.c.

91{
93 PDESKTOP pDesk = ObjHead->rpdesk;
94 PTHREADINFO pti = ObjHead->pti;
95
96 DesktopHeapFree(pDesk, Object);
97
98 pti->ppi->UserHandleCount--;
100}
struct _THRDESKHEAD * PTHRDESKHEAD
struct _DESKTOP * rpdesk
Definition: ntuser.h:194
PPROCESSINFO ppi
Definition: win32.h:88
#define IntDereferenceThreadInfo(pti)
Definition: win32.h:172

◆ FreeProcMarkObject()

void FreeProcMarkObject ( _In_ PVOID  Object)

Definition at line 175 of file object.c.

177{
178 PPROCESSINFO ppi = ((PPROCMARKHEAD)Object)->ppi;
179
181
182 ppi->UserHandleCount--;
184}
struct _PROCMARKHEAD * PPROCMARKHEAD
static __inline BOOL UserHeapFree(PVOID lpMem)
Definition: usrheap.h:44

Referenced by FreeCurIconObject().

◆ FreeSysObject()

static void FreeSysObject ( _In_ PVOID  Object)
static

Definition at line 237 of file object.c.

239{
241}

◆ FreeSysObjectCB()

static void FreeSysObjectCB ( _In_ PVOID  Object)
static

Definition at line 243 of file object.c.

245{
247}
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define USERTAG_CLIPBOARD
Definition: tags.h:200

◆ FreeThreadObject()

static void FreeThreadObject ( _In_ PVOID  Object)
static

Definition at line 45 of file object.c.

47{
49 PTHREADINFO pti = ObjHead->pti;
50
51 UserHeapFree(ObjHead);
52
53 pti->ppi->UserHandleCount--;
55}
struct _THROBJHEAD * PTHROBJHEAD

◆ get_user_full_handle()

HANDLE get_user_full_handle ( PUSER_HANDLE_TABLE  ht,
HANDLE  handle 
)

Definition at line 511 of file object.c.

512{
514
515 if ((ULONG_PTR)handle >> 16)
516 return handle;
517 if (!(entry = handle_to_entry(ht, handle )))
518 return handle;
519 return entry_to_handle( ht, entry );
520}
uint32_t ULONG_PTR
Definition: typedefs.h:65
static __inline HANDLE entry_to_handle(PUSER_HANDLE_TABLE ht, PUSER_HANDLE_ENTRY ptr)
Definition: object.c:355
PUSER_HANDLE_ENTRY handle_to_entry(PUSER_HANDLE_TABLE ht, HANDLE handle)
Definition: object.c:341

◆ get_user_object_handle()

void * get_user_object_handle ( PUSER_HANDLE_TABLE  ht,
HANDLE handle,
HANDLE_TYPE  type 
)

Definition at line 524 of file object.c.

525{
527
528 if (!(entry = handle_to_entry(ht, *handle )) || entry->type != type)
529 return NULL;
531 return entry->ptr;
532}
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545

◆ handle_to_entry()

PUSER_HANDLE_ENTRY handle_to_entry ( PUSER_HANDLE_TABLE  ht,
HANDLE  handle 
)

Definition at line 341 of file object.c.

342{
343 unsigned short generation;
344 int index = (LOWORD(handle) - FIRST_USER_HANDLE) >> 1;
345 if (index < 0 || index >= ht->nb_handles)
346 return NULL;
347 if (!ht->handles[index].type)
348 return NULL;
350 if (generation == ht->handles[index].generation || !generation || generation == 0xffff)
351 return &ht->handles[index];
352 return NULL;
353}
#define index(s, c)
Definition: various.h:29
_In_ uint64_t _In_ uint64_t _In_ uint64_t generation
Definition: btrfs.c:2996
#define LOWORD(l)
Definition: pedump.c:82
#define HIWORD(l)
Definition: typedefs.h:247

Referenced by get_user_full_handle(), get_user_object_handle(), NtUserValidateHandleSecure(), UserDereferenceObject(), UserFreeHandle(), UserGetObject(), UserGetObjectNoErr(), UserMarkObjectDestroy(), and UserObjectInDestroy().

◆ NtUserValidateHandleSecure()

BOOL APIENTRY NtUserValidateHandleSecure ( HANDLE  handle)

Definition at line 791 of file object.c.

793{
794 UINT uType;
795 PPROCESSINFO ppi;
797 BOOL Ret = FALSE;
798
800
802 {
804 goto Exit; // Return FALSE
805 }
806 uType = entry->type;
807 switch (uType)
808 {
809 case TYPE_WINDOW:
811 ppi = ((PTHREADINFO)entry->pi)->ppi;
812 break;
813 case TYPE_MENU:
814 case TYPE_ACCELTABLE:
815 case TYPE_CURSOR:
816 case TYPE_HOOK:
817 case TYPE_CALLPROC:
819 ppi = entry->pi;
820 break;
821 default:
822 ppi = NULL;
823 break;
824 }
825
826 if (!ppi)
827 goto Exit; // Return FALSE
828
829 // Same process job returns TRUE.
830 if (gptiCurrent->ppi->pW32Job == ppi->pW32Job) Ret = TRUE;
831
832Exit:
833 UserLeave();
834 return Ret;
835}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
unsigned int BOOL
Definition: ntddk_ex.h:94
@ TYPE_SETWINDOWPOS
Definition: ntuser.h:44
@ TYPE_INPUTCONTEXT
Definition: ntuser.h:57
unsigned int UINT
Definition: ndis.h:50
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
static void Exit(void)
Definition: sock.c:1330
PVOID pW32Job
Definition: win32.h:276
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:21

Referenced by ValidateHandleNoErr().

◆ UserAllocHandle()

HANDLE UserAllocHandle ( _Inout_ PUSER_HANDLE_TABLE  ht,
_In_ PVOID  object,
_In_ HANDLE_TYPE  type,
_In_ PVOID  HandleOwner 
)

Definition at line 458 of file object.c.

463{
465 if (!entry)
466 return 0;
467 entry->ptr = object;
468 entry->type = type;
469 entry->flags = 0;
470 entry->pi = HandleOwner;
471 if (++entry->generation >= 0xffff)
472 entry->generation = 1;
473
474 /* We have created a handle, which is a reference! */
475 UserReferenceObject(object);
476
477 return entry_to_handle(ht, entry );
478}
static __inline PUSER_HANDLE_ENTRY alloc_user_entry(PUSER_HANDLE_TABLE ht)
Definition: object.c:361
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:730

Referenced by UserCreateObject().

◆ UserAssignmentLock()

PVOID FASTCALL UserAssignmentLock ( PVOID ppvObj,
PVOID  pvNew 
)

Definition at line 837 of file object.c.

838{
839 PVOID pvOld = *ppvObj;
840 *ppvObj = pvNew;
841
842 if (pvOld && pvOld == pvNew)
843 return pvOld;
844
845 if (pvNew)
846 UserReferenceObject(pvNew);
847
848 if (pvOld)
849 {
850 if (UserDereferenceObject(pvOld))
851 pvOld = NULL;
852 }
853
854 return pvOld;
855}
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:643

Referenced by co_IntSetKeyboardLayoutForProcess(), co_UserActivateKeyboardLayout(), co_UserCreateWindowEx(), InitThreadCallback(), IntImmActivateLayout(), IntTranslateKbdMessage(), NtUserSetThreadLayoutHandles(), and UserCreateInputContext().

◆ UserAssignmentUnlock()

PVOID FASTCALL UserAssignmentUnlock ( PVOID ppvObj)

Definition at line 857 of file object.c.

858{
859 PVOID pvOld = *ppvObj;
860 *ppvObj = NULL;
861
862 if (pvOld)
863 {
864 if (UserDereferenceObject(pvOld))
865 pvOld = NULL;
866 }
867
868 return pvOld;
869}

Referenced by co_UserFreeWindow(), ExitThreadCallback(), and IntWinStaObjectDelete().

◆ UserCreateHandleTable()

BOOL FASTCALL UserCreateHandleTable ( VOID  )

Definition at line 536 of file object.c.

537{
538 PVOID mem;
539 INT HandleCount = 1024 * 4;
540
541 // FIXME: Don't alloc all at once! Must be mapped into umode also...
543 if (!mem)
544 {
545 ERR("Failed creating handle table\n");
546 return FALSE;
547 }
548
550 if (gHandleTable == NULL)
551 {
553 ERR("Failed creating handle table\n");
554 return FALSE;
555 }
556
557 // FIXME: Make auto growable
559
560 return TRUE;
561}
Definition: mem.c:349
int32_t INT
Definition: typedefs.h:58
static ULONG HandleCount
Definition: uefidisk.c:67
VOID UserInitHandleTable(PUSER_HANDLE_TABLE ht, PVOID mem, ULONG bytes)
Definition: object.c:407

Referenced by InitUserImpl().

◆ UserCreateObject()

PVOID FASTCALL UserCreateObject ( PUSER_HANDLE_TABLE  ht,
PDESKTOP  pDesktop,
PTHREADINFO  pti,
HANDLE h,
HANDLE_TYPE  type,
ULONG  size 
)

Definition at line 568 of file object.c.

574{
575 HANDLE hi;
577 PVOID ObjectOwner;
578
579 /* Some sanity checks. Other checks will be made in the allocator */
582 ASSERT(ht != NULL);
583
584 /* Allocate the object */
586 Object = ObjectCallbacks[type].ObjectAlloc(pDesktop, pti, size, &ObjectOwner);
587 if (!Object)
588 {
589 ERR("User object allocation failed. Out of memory!\n");
590 return NULL;
591 }
592
593 hi = UserAllocHandle(ht, Object, type, ObjectOwner);
594 if (hi == NULL)
595 {
596 ERR("Out of user handles!\n");
597 ObjectCallbacks[type].ObjectFree(Object);
598 return NULL;
599 }
600
601#if DBG
602 if (pti)
603 pti->ppi->DbgHandleCount[type]++;
604#endif
605
606 /* Give this object its identity. */
607 ((PHEAD)Object)->h = hi;
608
609 /* The caller will get a locked object.
610 * Note: with the reference from the handle, that makes two */
612
613 if (h)
614 *h = hi;
615 return Object;
616}
GLsizeiptr size
Definition: glext.h:5919
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
struct _HEAD * PHEAD
@ TYPE_CTYPES
Definition: ntuser.h:62
#define TYPE_FREE
Definition: sunlabel.h:176
HANDLE UserAllocHandle(_Inout_ PUSER_HANDLE_TABLE ht, _In_ PVOID object, _In_ HANDLE_TYPE type, _In_ PVOID HandleOwner)
Definition: object.c:458
PVOID(* ObjectAlloc)(PDESKTOP, PTHREADINFO, SIZE_T, PVOID *)
Definition: object.c:251
static const struct @5630 ObjectCallbacks[TYPE_CTYPES]

Referenced by co_UserLoadKbdLayout(), CreateCallProc(), CreateTimer(), IntAddSynthesizedFormats(), IntCloneMenu(), IntCreateCurIconHandle(), IntCreateMenu(), IntCreateMonitorObject(), IntCreateWindow(), IntSynthesizeDib(), NtUserCallOneParam(), NtUserConvertMemHandle(), NtUserCreateAcceleratorTable(), NtUserSetWindowsHookEx(), NtUserSetWinEventHook(), UserCreateInputContext(), and UserLoadKbdFile().

◆ UserDeleteObject()

BOOL FASTCALL UserDeleteObject ( HANDLE  h,
HANDLE_TYPE  type 
)

Definition at line 716 of file object.c.

717{
719
720 if (!body) return FALSE;
721
722 ASSERT( ((PHEAD)body)->cLockObj >= 1);
723 ASSERT( ((PHEAD)body)->cLockObj < 0x10000);
724
726}
static const void * body(MD5_CTX *ctx, const void *data, unsigned long size)
Definition: md5.c:100
Definition: ntuser.h:180
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
Definition: object.c:495
BOOL FASTCALL UserFreeHandle(PUSER_HANDLE_TABLE ht, HANDLE handle)
Definition: object.c:685

Referenced by co_UserFreeWindow(), co_UserLoadKbdLayout(), DestroyCallProc(), IntDestroyCurIconObject(), IntDestroyInputContext(), IntDestroyMenuObject(), IntDestroyMonitorObject(), IntEndDeferWindowPosEx(), IntFreeElementData(), IntFreeHook(), IntRemoveEvent(), NtUserCallOneParam(), NtUserConvertMemHandle(), NtUserCreateAcceleratorTable(), RemoveTimer(), UnloadKbdFile(), UserDestroyAccelTable(), UserDestroyInputContext(), UserLoadKbdFile(), and UserUnloadKbl().

◆ UserDereferenceObject()

BOOL FASTCALL UserDereferenceObject ( PVOID  Object)

Definition at line 643 of file object.c.

644{
645 PHEAD ObjHead = Object;
646
647 ASSERT(ObjHead->cLockObj >= 1);
648 ASSERT(ObjHead->cLockObj < 0x10000);
649
650 if (--ObjHead->cLockObj == 0)
651 {
654
655 entry = handle_to_entry(gHandleTable, ObjHead->h);
656
657 ASSERT(entry != NULL);
658 /* The entry should be marked as in deletion */
660
661 type = entry->type;
664
665 /* We can now get rid of everything */
667
668#if 0
669 /* Call the object destructor */
670 ASSERT(ObjectCallbacks[type].ObjectCleanup != NULL);
671 ObjectCallbacks[type].ObjectCleanup(Object);
672#endif
673
674 /* And free it */
676 ObjectCallbacks[type].ObjectFree(Object);
677
678 return TRUE;
679 }
680 return FALSE;
681}
#define HANDLEENTRY_INDESTROY
Definition: ntuser.h:14
enum _HANDLE_TYPE HANDLE_TYPE
DWORD cLockObj
Definition: ntuser.h:182
HANDLE h
Definition: ntuser.h:181
void(* ObjectFree)(PVOID)
Definition: object.c:253
static __inline void * free_user_entry(PUSER_HANDLE_TABLE ht, PUSER_HANDLE_ENTRY entry)
Definition: object.c:417

Referenced by _Success_(), co_UserCreateWindowEx(), co_UserFreeWindow(), co_UserLoadKbdLayout(), co_UserSetParent(), co_WinPosSearchChildren(), CreateCallProc(), DefWndDoSizeMove(), DesktopWindowProc(), ExitThreadCallback(), FreeCurIconObject(), IntAddSynthesizedFormats(), IntCleanupCurIconCache(), IntCreateCurIconHandle(), IntCreateWindow(), IntDefWindowProc(), IntDestroyClass(), IntDestroyMonitorObject(), IntEndDeferWindowPosEx(), IntRemoveCursorFromList(), IntSetAconData(), IntSetOwner(), IntSynthesizeDib(), IntSystemSetCursor(), MENU_DrawBitmapItem(), MsqCleanupMessageQueue(), NtUserConvertMemHandle(), NtUserCreateAcceleratorTable(), NtUserDestroyCursor(), NtUserDrawIconEx(), NtUserGetCursorFrameInfo(), NtUserGetIconSize(), NtUserSetCursor(), NtUserSetWindowsHookEx(), NtUserSetWinEventHook(), NtUserUnhookWindowsHookEx(), RemoveTimer(), ReplaceWndPtr(), UserAssignmentLock(), UserAssignmentUnlock(), UserAttachThreadInput(), UserCreateInputContext(), UserCreateMenu(), UserDerefObjectCo(), UserDrawCaption(), UserDrawSysMenuButton(), UserFreeHandle(), UserLoadKbdFile(), UserSetClassLongPtr(), and UserSetCursorIconData().

◆ UserDestroyObjectsForOwner()

BOOLEAN UserDestroyObjectsForOwner ( PUSER_HANDLE_TABLE  Table,
PVOID  Owner 
)

Definition at line 753 of file object.c.

754{
755 int i;
757 BOOLEAN Ret = TRUE;
758
759 /* Sweep the whole handle table */
760 for (i = 0; i < Table->allocated_handles; i++)
761 {
762 Entry = &Table->handles[i];
763
764 if (Entry->pi != Owner)
765 continue;
766
767 /* Do not destroy if it's already been done */
768 if (Entry->flags & HANDLEENTRY_INDESTROY)
769 continue;
770
771 /* Call destructor */
772 if (!ObjectCallbacks[Entry->type].ObjectDestroy(Entry->ptr))
773 {
774 ERR("Failed destructing object %p, type %u.\n", Entry->ptr, Entry->type);
775 /* Don't return immediately, we must continue destroying the other objects */
776 Ret = FALSE;
777 }
778 }
779
780 return Ret;
781}
unsigned char BOOLEAN
Definition: actypes.h:127
ASMGENDATA Table[]
Definition: genincdata.c:61
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ SaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ OwnerSize PSID Owner
Definition: rtlfuncs.h:1629
Entry
Definition: section.c:5216

Referenced by ExitThreadCallback(), and UserProcessDestroy().

◆ UserFreeHandle()

BOOL FASTCALL UserFreeHandle ( PUSER_HANDLE_TABLE  ht,
HANDLE  handle 
)

Definition at line 685 of file object.c.

686{
688
689 if (!(entry = handle_to_entry( ht, handle )))
690 {
692 return FALSE;
693 }
694
696
697 return UserDereferenceObject(entry->ptr);
698}
#define STATUS_INVALID_HANDLE
Definition: d3dkmdt.h:40
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:30

Referenced by UserDeleteObject().

◆ UserGetObject()

◆ UserGetObjectNoErr()

PVOID UserGetObjectNoErr ( PUSER_HANDLE_TABLE  ht,
HANDLE  handle,
HANDLE_TYPE  type 
)

Definition at line 481 of file object.c.

482{
484
485 ASSERT(ht);
486
487 if (!(entry = handle_to_entry(ht, handle )) || entry->type != type)
488 {
489 return NULL;
490 }
491 return entry->ptr;
492}

Referenced by IntDestroyInputContext(), NC_IconForWindow(), NtUserAssociateInputContext(), NtUserDestroyInputContext(), NtUserSetCursor(), and ValidateHwndNoErr().

◆ UserInitHandleTable()

VOID UserInitHandleTable ( PUSER_HANDLE_TABLE  ht,
PVOID  mem,
ULONG  bytes 
)

Definition at line 407 of file object.c.

408{
409 ht->freelist = NULL;
410 ht->handles = mem;
411
412 ht->nb_handles = 0;
413 ht->allocated_handles = bytes / sizeof(USER_HANDLE_ENTRY);
414}
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
struct _USER_HANDLE_ENTRY USER_HANDLE_ENTRY

Referenced by UserCreateHandleTable().

◆ UserMarkObjectDestroy()

BOOL FASTCALL UserMarkObjectDestroy ( PVOID  Object)

Definition at line 620 of file object.c.

621{
623 PHEAD ObjHead = Object;
624
625 entry = handle_to_entry(gHandleTable, ObjHead->h);
626
627 ASSERT(entry != NULL);
628
629 entry->flags |= HANDLEENTRY_DESTROY;
630
631 if (ObjHead->cLockObj > 1)
632 {
633 entry->flags &= ~HANDLEENTRY_INDESTROY;
634 TRACE("Count %d\n",ObjHead->cLockObj);
635 return FALSE;
636 }
637
638 return TRUE;
639}
#define HANDLEENTRY_DESTROY
Definition: ntuser.h:13

Referenced by co_IntUnloadKeyboardLayoutEx(), co_UserFreeWindow(), IntDestroyMenuObject(), and UserDestroyInputContext().

◆ UserObjectInDestroy()

BOOL FASTCALL UserObjectInDestroy ( HANDLE  h)

◆ UserReferenceObject()

◆ UserReferenceObjectByHandle()

PVOID FASTCALL UserReferenceObjectByHandle ( HANDLE  handle,
HANDLE_TYPE  type 
)

Definition at line 740 of file object.c.

741{
743
745 if (object)
746 {
747 UserReferenceObject(object);
748 }
749 return object;
750}

Referenced by UserGetCurIconObject().

Variable Documentation

◆ gHandleTable

◆ ObjectAlloc

PVOID(* ObjectAlloc) (PDESKTOP, PTHREADINFO, SIZE_T, PVOID *) ( PDESKTOP  ,
PTHREADINFO  ,
SIZE_T  ,
PVOID  
)

Definition at line 251 of file object.c.

Referenced by UserCreateObject().

◆ 

const struct { ... } ObjectCallbacks[TYPE_CTYPES]
Initial value:
=
{
{ NULL, NULL, NULL },
{ AllocDeskThreadObject, co_UserDestroyWindow, FreeDeskThreadObject },
{ AllocDeskProcObject, UserDestroyMenuObject, FreeDeskProcObject },
{ AllocProcMarkObject, IntDestroyCurIconObject, FreeCurIconObject },
{ AllocSysObject, NULL, FreeSysObject },
{ AllocDeskThreadObject, IntRemoveHook, FreeDeskThreadObject },
{ AllocSysObjectCB, NULL,FreeSysObjectCB },
{ AllocDeskProcObject, DestroyCallProc, FreeDeskProcObject },
{ AllocProcMarkObject, UserDestroyAccelTable, FreeProcMarkObject },
{ NULL, NULL, NULL },
{ NULL, NULL, NULL },
{ NULL, NULL, NULL },
{ AllocSysObject, NULL, FreeSysObject },
{ AllocSysObject, NULL,FreeSysObject },
{ AllocSysObject, NULL, FreeSysObject },
{ AllocThreadObject, IntRemoveEvent, FreeThreadObject },
{ AllocSysObject, NULL, FreeSysObject },
{ NULL, NULL, NULL },
{ NULL, NULL, NULL },
{ NULL, NULL, NULL },
{ NULL, NULL, NULL },
}
BOOLEAN DestroyCallProc(_Inout_ PVOID Object)
Definition: callproc.c:22
BOOLEAN IntRemoveHook(PVOID Object)
Definition: hook.c:1036
PVOID AllocInputContextObject(_In_ PDESKTOP pDesk, _In_ PTHREADINFO pti, _In_ SIZE_T Size, _Out_ PVOID *HandleOwner)
Definition: ime.c:1517
BOOLEAN UserDestroyInputContext(_In_opt_ PVOID Object)
Definition: ime.c:1576
VOID UserFreeInputContext(_In_opt_ PVOID Object)
Definition: ime.c:1548
BOOLEAN co_UserDestroyWindow(PVOID Object)
Definition: window.c:2865
BOOLEAN UserDestroyAccelTable(PVOID Object)
Definition: accelerator.c:324
VOID FreeCurIconObject(_In_ PVOID Object)
Definition: cursoricon.c:336
BOOLEAN IntDestroyCurIconObject(_In_ PVOID Object)
Definition: cursoricon.c:317
BOOLEAN IntRemoveEvent(PVOID Object)
Definition: event.c:126
BOOLEAN UserDestroyMenuObject(PVOID Object)
Definition: menu.c:311
void FreeProcMarkObject(_In_ PVOID Object)
Definition: object.c:175
static void FreeDeskThreadObject(_In_ PVOID Object)
Definition: object.c:89
static void FreeSysObject(_In_ PVOID Object)
Definition: object.c:237
static void FreeSysObjectCB(_In_ PVOID Object)
Definition: object.c:243
static void FreeThreadObject(_In_ PVOID Object)
Definition: object.c:45
static void FreeDeskProcObject(_In_ PVOID Object)
Definition: object.c:134

Referenced by UserCreateObject(), UserDereferenceObject(), and UserDestroyObjectsForOwner().

◆ ObjectDestroy

BOOLEAN(* ObjectDestroy) (PVOID) ( PVOID  )

Definition at line 252 of file object.c.

◆ ObjectFree

void(* ObjectFree) (PVOID) ( PVOID  )

Definition at line 253 of file object.c.

Referenced by UserDereferenceObject().