17 static PVOID AllocThreadObject(
40 pti->ppi->UserHandleCount++;
53 pti->
ppi->UserHandleCount--;
58 static PVOID AllocDeskThreadObject(
78 ObjHead->
pSelf = ObjHead;
84 pti->ppi->UserHandleCount++;
98 pti->
ppi->UserHandleCount--;
103 static PVOID AllocDeskProcObject(
124 ObjHead->
pSelf = ObjHead;
127 ppi->UserHandleCount++;
141 ppi->UserHandleCount--;
148 static PVOID AllocProcMarkObject(
170 ppi->UserHandleCount++;
182 ppi->UserHandleCount--;
187 static PVOID AllocSysObject(
254 PWCHAR TypeNames[] = {
L"Free",
L"Window",
L"Menu",
L"CursorIcon",
L"SMWP",
L"Hook",
L"ClipBoardData",
L"CallProc",
255 L"Accel",
L"DDEaccess",
L"DDEconv",
L"DDExact",
L"Monitor",
L"KBDlayout",
L"KBDfile",
256 L"Event",
L"Timer",
L"InputContext",
L"HidData",
L"DeviceInfo",
L"TouchInput",
L"GestureInfo"};
260 memset(HandleCounts, 0,
sizeof(HandleCounts));
266 ERR(
"Process %s (%p) handles count: %d\n\t", ppiList->peProcess->ImageFileName, ppiList->peProcess->UniqueProcessId, ppiList->UserHandleCount);
270 HandleCounts[
i] += ppiList->DbgHandleCount[
i];
272 DbgPrint(
"%S: %lu, ", TypeNames[
i], ppiList->DbgHandleCount[
i]);
282 ERR(
"Total handles of the running processes: \n\t");
285 DbgPrint(
"%S: %d, ", TypeNames[
i], HandleCounts[
i]);
292 memset(HandleCounts, 0,
sizeof(HandleCounts));
296 ERR(
"Total handles count allocated: \n\t");
299 DbgPrint(
"%S: %d, ", TypeNames[
i], HandleCounts[
i]);
342 if (
ht->nb_handles >=
ht->allocated_handles)
354 int growth =
max( 32,
ht->allocated_handles / 2 );
356 if (new_size <= ht->allocated_handles)
360 ht->handles = new_handles;
361 ht->allocated_handles = new_size;
367 entry->generation = 1;
408 ppi->DbgHandleCount[
entry->type]--;
437 entry->pi = HandleOwner;
438 if (++
entry->generation >= 0xffff)
439 entry->generation = 1;
506 INT HandleCount = 1024 * 4;
512 ERR(
"Failed creating handle table\n");
520 ERR(
"Failed creating handle table\n");
556 ERR(
"User object allocation failed. Out of memory!\n");
563 ERR(
"Out of user handles!\n");
570 pti->
ppi->DbgHandleCount[
type]++;
727 for (
i = 0;
i <
Table->allocated_handles;
i++)
741 ERR(
"Failed destructing object %p, type %u.\n",
Entry->ptr,
Entry->type);
BOOLEAN IntRemoveHook(PVOID Object)
PVOID FASTCALL UserReferenceObjectByHandle(HANDLE handle, HANDLE_TYPE type)
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
PUSER_HANDLE_ENTRY handle_to_entry(PUSER_HANDLE_TABLE ht, HANDLE handle)
coclass MSXML2::XSLTemplate40 object
PVOID UserGetObjectNoErr(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
#define UNREFERENCED_PARAMETER(P)
static __inline void * free_user_entry(PUSER_HANDLE_TABLE ht, PUSER_HANDLE_ENTRY entry)
#define ERROR_INVALID_HANDLE
struct _DESKTOP * PDESKTOP
void * get_user_object_handle(PUSER_HANDLE_TABLE ht, HANDLE *handle, HANDLE_TYPE type)
struct _PROCESSINFO * PPROCESSINFO
static __inline BOOL UserHeapFree(PVOID lpMem)
IN PVOID IN PVOID IN USHORT IN USHORT Size
BOOL FASTCALL UserDereferenceObject(PVOID Object)
#define FIRST_USER_HANDLE
static __inline PVOID UserHeapAlloc(SIZE_T Bytes)
struct _PROCDESKHEAD * PPROCDESKHEAD
#define STATUS_INVALID_HANDLE
BOOLEAN UserDestroyAccelTable(PVOID Object)
PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, PDESKTOP pDesktop, PTHREADINFO pti, HANDLE *h, HANDLE_TYPE type, ULONG size)
GLfloat GLfloat GLfloat GLfloat h
GLsizei GLsizei GLuint * obj
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE HANDLE * handle
static unsigned char bytes[4]
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
struct _THRDESKHEAD * PTHRDESKHEAD
BOOLEAN co_UserDestroyWindow(PVOID Object)
void(* ObjectFree)(PVOID)
BOOLEAN DestroyCallProc(_Inout_ PVOID Object)
static __inline PUSER_HANDLE_ENTRY alloc_user_entry(PUSER_HANDLE_TABLE ht)
#define IntReferenceProcessInfo(ppi)
BOOL FASTCALL UserObjectInDestroy(HANDLE h)
#define IntReferenceThreadInfo(pti)
void FreeProcMarkObject(_In_ PVOID Object)
VOID FASTCALL UserEnterExclusive(VOID)
static __inline PVOID UserHeapReAlloc(PVOID lpMem, SIZE_T Bytes)
static void FreeDeskProcObject(_In_ PVOID Object)
BOOLEAN IntRemoveEvent(PVOID Object)
struct _THREADINFO * PTHREADINFO
static void FreeDeskThreadObject(_In_ PVOID Object)
struct _USER_HANDLE_ENTRY USER_HANDLE_ENTRY
static __inline HANDLE entry_to_handle(PUSER_HANDLE_TABLE ht, PUSER_HANDLE_ENTRY ptr)
#define DECLARE_RETURN(type)
struct _THROBJHEAD * PTHROBJHEAD
static void FreeSysObject(_In_ PVOID Object)
struct _PROCESSINFO * ppi
static const struct @4918 ObjectCallbacks[TYPE_CTYPES]
VOID FASTCALL SetLastNtError(NTSTATUS Status)
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
enum _HANDLE_TYPE HANDLE_TYPE
VOID FASTCALL UserLeave(VOID)
PVOID(* ObjectAlloc)(PDESKTOP, PTHREADINFO, SIZE_T, PVOID *)
HANDLE get_user_full_handle(PUSER_HANDLE_TABLE ht, HANDLE handle)
VOID FreeCurIconObject(_In_ PVOID Object)
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
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
BOOL FASTCALL UserCreateHandleTable(VOID)
#define HANDLEENTRY_DESTROY
BOOLEAN(* ObjectDestroy)(PVOID)
PUSER_HANDLE_ENTRY handles
_In_ uint64_t _In_ uint64_t _In_ uint64_t generation
BOOLEAN IntDestroyCurIconObject(_In_ PVOID Object)
static void FreeThreadObject(_In_ PVOID Object)
static const struct newhuff ht[]
static const void * body(MD5_CTX *ctx, const void *data, unsigned long size)
_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
VOID UserInitHandleTable(PUSER_HANDLE_TABLE ht, PVOID mem, ULONG bytes)
BOOLEAN UserDestroyObjectsForOwner(PUSER_HANDLE_TABLE Table, PVOID Owner)
void DbgUserDumpHandleTable()
#define RtlZeroMemory(Destination, Length)
BOOL APIENTRY NtUserValidateHandleSecure(HANDLE handle)
#define HANDLEENTRY_INDESTROY
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
GLuint GLuint GLsizei GLenum type
BOOL FASTCALL UserFreeHandle(PUSER_HANDLE_TABLE ht, HANDLE handle)
PUSER_HANDLE_TABLE gHandleTable
#define IntDereferenceProcessInfo(ppi)
HANDLE UserAllocHandle(_Inout_ PUSER_HANDLE_TABLE ht, _In_ PVOID object, _In_ HANDLE_TYPE type, _In_ PVOID HandleOwner)
#define IntDereferenceThreadInfo(pti)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
base of all file and directory entries
struct _PROCMARKHEAD * PPROCMARKHEAD
VOID FASTCALL UserReferenceObject(PVOID obj)
DBG_DEFAULT_CHANNEL(UserObj)
BOOL FASTCALL UserMarkObjectDestroy(PVOID Object)