diff --git a/reactos/dll/win32/gdi32/gdi32.rbuild b/reactos/dll/win32/gdi32/gdi32.rbuild
index c99914e6153..185315093ad 100644
--- a/reactos/dll/win32/gdi32/gdi32.rbuild
+++ b/reactos/dll/win32/gdi32/gdi32.rbuild
@@ -9,6 +9,7 @@
kernel32
advapi32
win32ksys
+ pseh
precomp.h
diff --git a/reactos/dll/win32/gdi32/misc/misc.c b/reactos/dll/win32/gdi32/misc/misc.c
index 588f063172b..072c7acdb2a 100644
--- a/reactos/dll/win32/gdi32/misc/misc.c
+++ b/reactos/dll/win32/gdi32/misc/misc.c
@@ -124,8 +124,25 @@ BOOL GdiGetHandleUserData(HGDIOBJ hGdiObj, PVOID *UserData)
HANDLE pid = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1);
if(pid == NULL || pid == CurrentProcessId)
{
- *UserData = Entry->UserData;
- return TRUE;
+ //
+ // Need to test if we have Read & Write access to the VM address space.
+ //
+ BOOL Result = TRUE;
+ if(Entry->UserData)
+ {
+ volatile CHAR *Current = (volatile CHAR*)Entry->UserData;
+ _SEH_TRY
+ {
+ *Current = *Current;
+ }
+ _SEH_HANDLE
+ {
+ Result = FALSE;
+ }
+ _SEH_END
+ }
+ if (Result) *UserData = Entry->UserData;
+ return Result;
}
}
SetLastError(ERROR_INVALID_PARAMETER);