/* SDK/DDK/NDK Headers. */ #define WIN32_NO_STATUS #include #include #include #include #include #define NTOS_MODE_USER #include /* Public Win32K Headers */ #include #include #include PENTRY GdiQueryTable( VOID) { PTEB pTeb = NtCurrentTeb(); PPEB pPeb = pTeb->ProcessEnvironmentBlock; return pPeb->GdiSharedHandleTable; } BOOL GdiIsHandleValid( _In_ HGDIOBJ hobj) { PENTRY pentHmgr = GdiQueryTable(); USHORT Index = (ULONG_PTR)hobj & 0xFFFF; PENTRY pentry = &pentHmgr[Index]; if ((pentry->einfo.pobj == NULL) || ((LONG_PTR)pentry->einfo.pobj > 0) || (pentry->FullUnique != (USHORT)((ULONG_PTR)hobj >> 16))) { return FALSE; } return TRUE; } BOOL GdiIsHandleValidEx( _In_ HGDIOBJ hobj, _In_ GDILOOBJTYPE ObjectType) { PENTRY pentHmgr = GdiQueryTable(); USHORT Index = (ULONG_PTR)hobj & 0xFFFF; PENTRY pentry = &pentHmgr[Index]; if ((pentry->einfo.pobj == NULL) || ((LONG_PTR)pentry->einfo.pobj > 0) || (pentry->FullUnique != (USHORT)((ULONG_PTR)hobj >> 16)) || (pentry->Objt != (UCHAR)(ObjectType >> 16)) || (pentry->Flags != (UCHAR)(ObjectType >> 24))) { return FALSE; } return TRUE; } PVOID GdiGetHandleUserData( _In_ HGDIOBJ hobj) { PENTRY pentHmgr = GdiQueryTable(); USHORT Index = (ULONG_PTR)hobj; PENTRY pentry = &pentHmgr[Index]; if (!GdiIsHandleValid(hobj)) { return NULL; } return pentry->pUser; }