1 2 3 /* SDK/DDK/NDK Headers. */ 4 #define WIN32_NO_STATUS 5 #include <windef.h> 6 #include <winbase.h> 7 #include <wingdi.h> 8 #include <winddi.h> 9 #include <prntfont.h> 10 11 #define NTOS_MODE_USER 12 #include <ndk/ntndk.h> 13 14 /* Public Win32K Headers */ 15 #include <ntgdityp.h> 16 #include <ntgdi.h> 17 #include <ntgdihdl.h> 18 19 PENTRY 20 GdiQueryTable( 21 VOID) 22 { 23 PTEB pTeb = NtCurrentTeb(); 24 PPEB pPeb = pTeb->ProcessEnvironmentBlock; 25 return pPeb->GdiSharedHandleTable; 26 } 27 28 BOOL 29 GdiIsHandleValid( 30 _In_ HGDIOBJ hobj) 31 { 32 PENTRY pentHmgr = GdiQueryTable(); 33 USHORT Index = (ULONG_PTR)hobj & 0xFFFF; 34 PENTRY pentry = &pentHmgr[Index]; 35 36 if ((pentry->einfo.pobj == NULL) || 37 ((LONG_PTR)pentry->einfo.pobj > 0) || 38 (pentry->FullUnique != (USHORT)((ULONG_PTR)hobj >> 16))) 39 { 40 return FALSE; 41 } 42 43 return TRUE; 44 } 45 46 BOOL 47 GdiIsHandleValidEx( 48 _In_ HGDIOBJ hobj, 49 _In_ GDILOOBJTYPE ObjectType) 50 { 51 PENTRY pentHmgr = GdiQueryTable(); 52 USHORT Index = (ULONG_PTR)hobj & 0xFFFF; 53 PENTRY pentry = &pentHmgr[Index]; 54 55 if ((pentry->einfo.pobj == NULL) || 56 ((LONG_PTR)pentry->einfo.pobj > 0) || 57 (pentry->FullUnique != (USHORT)((ULONG_PTR)hobj >> 16)) || 58 (pentry->Objt != (UCHAR)(ObjectType >> 16)) || 59 (pentry->Flags != (UCHAR)(ObjectType >> 24))) 60 { 61 return FALSE; 62 } 63 64 return TRUE; 65 } 66 67 PVOID 68 GdiGetHandleUserData( 69 _In_ HGDIOBJ hobj) 70 { 71 PENTRY pentHmgr = GdiQueryTable(); 72 USHORT Index = (ULONG_PTR)hobj; 73 PENTRY pentry = &pentHmgr[Index]; 74 75 if (!GdiIsHandleValid(hobj)) 76 { 77 return NULL; 78 } 79 80 return pentry->pUser; 81 } 82 83