[WS2_32_APITEST]
[reactos.git] / rostests / apitests / gditools / gditools.c
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