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