Fixed is_valid_winproc to avoid being optimized out by recent gcc
versions.

diff --git a/windows/winproc.c b/windows/winproc.c
index ca14525..1897707 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -138,10 +138,10 @@
 
 static BOOL is_valid_winproc( WINDOWPROC *proc )
 {
+    /* check alignment */
+    if (((BYTE *)proc - (BYTE *)winproc_array) % sizeof(*proc)) return FALSE;
     /* check array limits */
     if (proc < winproc_array || proc >= winproc_array + winproc_used) return FALSE;
-    /* check alignment */
-    if (proc != winproc_array + (proc - winproc_array)) return FALSE;
     return (proc->type != WIN_PROC_INVALID);
 }
 
@@ -514,20 +514,22 @@
 
     ptr = (BYTE *)handle;
     /* First check if it is the jmp address */
-    proc = (WINDOWPROC *)(ptr - (int)&((WINDOWPROC *)0)->jmp);
+    proc = (WINDOWPROC *)(ptr - FIELD_OFFSET(WINDOWPROC,jmp));
     if (is_valid_winproc(proc)) return proc;
 
     /* Now it must be the thunk address */
-    proc = (WINDOWPROC *)(ptr - (int)&((WINDOWPROC *)0)->thunk);
+    proc = (WINDOWPROC *)(ptr - FIELD_OFFSET(WINDOWPROC,thunk));
     if (is_valid_winproc(proc)) return proc;
 
     /* Check for a segmented pointer */
 
-    ptr = MapSL( (SEGPTR)handle );
-    /* It must be the thunk address */
-    proc = (WINDOWPROC *)(ptr - (int)&((WINDOWPROC *)0)->thunk);
-    if (is_valid_winproc(proc)) return proc;
-
+    if (HIWORD(handle) == get_winproc_selector())
+    {
+        ptr = (BYTE *)winproc_array + LOWORD(handle);
+        /* It must be the thunk address */
+        proc = (WINDOWPROC *)(ptr - FIELD_OFFSET(WINDOWPROC,thunk));
+        if (is_valid_winproc(proc)) return proc;
+    }
     return NULL;
 }