[GDITOOLS]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Mon, 28 Dec 2015 20:24:57 +0000 (20:24 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Mon, 28 Dec 2015 20:24:57 +0000 (20:24 +0000)
Add a library with some helper routines for GDI tests

svn path=/trunk/; revision=70457

rostests/apitests/gditools/CMakeLists.txt [new file with mode: 0644]
rostests/apitests/gditools/gditools.c [new file with mode: 0644]
rostests/apitests/gditools/gditools.h [new file with mode: 0644]

diff --git a/rostests/apitests/gditools/CMakeLists.txt b/rostests/apitests/gditools/CMakeLists.txt
new file mode 100644 (file)
index 0000000..8acb452
--- /dev/null
@@ -0,0 +1,5 @@
+
+include_directories(${REACTOS_SOURCE_DIR}/win32ss/include)
+
+add_library(gditools
+    gditools.c)
diff --git a/rostests/apitests/gditools/gditools.c b/rostests/apitests/gditools/gditools.c
new file mode 100644 (file)
index 0000000..8fb953f
--- /dev/null
@@ -0,0 +1,82 @@
+
+
+/* SDK/DDK/NDK Headers. */
+#define WIN32_NO_STATUS
+#include <windef.h>
+#include <winbase.h>
+#include <wingdi.h>
+#include <winddi.h>
+#include <prntfont.h>
+
+#define NTOS_MODE_USER
+#include <ndk/ntndk.h>
+
+/* Public Win32K Headers */
+#include <ntgdityp.h>
+#include <ntgdi.h>
+#include <ntgdihdl.h>
+
+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;
+}
+
diff --git a/rostests/apitests/gditools/gditools.h b/rostests/apitests/gditools/gditools.h
new file mode 100644 (file)
index 0000000..7d7dffd
--- /dev/null
@@ -0,0 +1,20 @@
+
+#pragma once
+
+PENTRY
+GdiQueryTable(
+    VOID);
+
+BOOL
+GdiIsHandleValid(
+    _In_ HGDIOBJ hobj);
+
+BOOL
+GdiIsHandleValidEx(
+    _In_ HGDIOBJ hobj,
+    _In_ GDILOOBJTYPE ObjectType);
+
+PVOID
+GdiGetHandleUserData(
+    _In_ HGDIOBJ hobj);
+