diff --git a/windows/win.c b/windows/win.c
index 38e9b13366148931deb0c8e2856e7f62e3ad8843..354514567e16b76f1c1cb4d93c77266de310b933 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -2788,7 +2788,8 @@ BOOL WINAPI ShowOwnedPopups( HWND owner, BOOL fShow )
     while (--count >= 0)
     {
         if (GetWindow( win_array[count], GW_OWNER ) != owner) continue;
-        if (!(pWnd = WIN_FindWndPtr( win_array[count] ))) continue;
+        if (!(pWnd = WIN_GetPtr( win_array[count] ))) continue;
+        if (pWnd == WND_OTHER_PROCESS) continue;
 
         if (pWnd->dwStyle & WS_POPUP)
         {
@@ -2796,28 +2797,32 @@ BOOL WINAPI ShowOwnedPopups( HWND owner, BOOL fShow )
             {
                 if (pWnd->flags & WIN_NEEDS_SHOW_OWNEDPOPUP)
                 {
+                    pWnd->flags &= ~WIN_NEEDS_SHOW_OWNEDPOPUP;
+                    WIN_ReleasePtr( pWnd );
                     /* In Windows, ShowOwnedPopups(TRUE) generates
                      * WM_SHOWWINDOW messages with SW_PARENTOPENING,
                      * regardless of the state of the owner
                      */
-                    SendMessageA(pWnd->hwndSelf, WM_SHOWWINDOW, SW_SHOW, SW_PARENTOPENING);
-                    pWnd->flags &= ~WIN_NEEDS_SHOW_OWNEDPOPUP;
+                    SendMessageW(win_array[count], WM_SHOWWINDOW, SW_SHOW, SW_PARENTOPENING);
+                    continue;
                 }
             }
             else
             {
-                if (IsWindowVisible(pWnd->hwndSelf))
+                if (pWnd->dwStyle & WS_VISIBLE)
                 {
+                    pWnd->flags |= WIN_NEEDS_SHOW_OWNEDPOPUP;
+                    WIN_ReleasePtr( pWnd );
                     /* In Windows, ShowOwnedPopups(FALSE) generates
                      * WM_SHOWWINDOW messages with SW_PARENTCLOSING,
                      * regardless of the state of the owner
                      */
-                    SendMessageA(pWnd->hwndSelf, WM_SHOWWINDOW, SW_HIDE, SW_PARENTCLOSING);
-                    pWnd->flags |= WIN_NEEDS_SHOW_OWNEDPOPUP;
+                    SendMessageW(win_array[count], WM_SHOWWINDOW, SW_HIDE, SW_PARENTCLOSING);
+                    continue;
                 }
             }
         }
-        WIN_ReleaseWndPtr( pWnd );
+        WIN_ReleasePtr( pWnd );
     }
     HeapFree( GetProcessHeap(), 0, win_array );
     return TRUE;
@@ -3053,16 +3058,16 @@ BOOL WINAPI AnyPopup(void)
  */
 BOOL WINAPI FlashWindow( HWND hWnd, BOOL bInvert )
 {
-    WND *wndPtr = WIN_FindWndPtr(hWnd);
+    WND *wndPtr;
 
     TRACE("%p\n", hWnd);
 
-    if (!wndPtr) return FALSE;
-    hWnd = wndPtr->hwndSelf;  /* make it a full handle */
-
-    if (wndPtr->dwStyle & WS_MINIMIZE)
+    if (IsIconic( hWnd ))
     {
         RedrawWindow( hWnd, 0, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_FRAME );
+
+        wndPtr = WIN_GetPtr(hWnd);
+        if (!wndPtr || wndPtr == WND_OTHER_PROCESS) return FALSE;
         if (bInvert && !(wndPtr->flags & WIN_NCACTIVATED))
         {
             wndPtr->flags |= WIN_NCACTIVATED;
@@ -3071,16 +3076,21 @@ BOOL WINAPI FlashWindow( HWND hWnd, BOOL bInvert )
         {
             wndPtr->flags &= ~WIN_NCACTIVATED;
         }
-        WIN_ReleaseWndPtr(wndPtr);
+        WIN_ReleasePtr( wndPtr );
         return TRUE;
     }
     else
     {
-        WPARAM16 wparam;
+        WPARAM wparam;
+
+        wndPtr = WIN_GetPtr(hWnd);
+        if (!wndPtr || wndPtr == WND_OTHER_PROCESS) return FALSE;
+        hWnd = wndPtr->hwndSelf;  /* make it a full handle */
+
         if (bInvert) wparam = !(wndPtr->flags & WIN_NCACTIVATED);
         else wparam = (hWnd == GetForegroundWindow());
 
-        WIN_ReleaseWndPtr(wndPtr);
+        WIN_ReleasePtr( wndPtr );
         SendMessageW( hWnd, WM_NCACTIVATE, wparam, (LPARAM)0 );
         return wparam;
     }
diff --git a/windows/winpos.c b/windows/winpos.c
index 80042c8d453180ab9ff0eb419a4edb0607cfc3ab..7c2ec6ad2dfb486b54d7a5bf78b4f38bd9fa2bd0 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -928,59 +928,71 @@ BOOL WINAPI GetWindowPlacement( HWND hwnd, WINDOWPLACEMENT *wndpl )
  */
 static BOOL WINPOS_SetPlacement( HWND hwnd, const WINDOWPLACEMENT *wndpl, UINT flags )
 {
-    WND *pWnd = WIN_FindWndPtr( hwnd );
-    if( pWnd )
+    LPINTERNALPOS lpPos;
+    DWORD style;
+    WND *pWnd = WIN_GetPtr( hwnd );
+
+    if (!pWnd || pWnd == WND_OTHER_PROCESS) return FALSE;
+    lpPos = WINPOS_InitInternalPos( pWnd );
+
+    if( flags & PLACE_MIN )
+    {
+        lpPos->ptIconPos.x = wndpl->ptMinPosition.x;
+        lpPos->ptIconPos.y = wndpl->ptMinPosition.y;
+    }
+    if( flags & PLACE_MAX )
+    {
+        lpPos->ptMaxPos.x = wndpl->ptMaxPosition.x;
+        lpPos->ptMaxPos.y = wndpl->ptMaxPosition.y;
+    }
+    if( flags & PLACE_RECT)
     {
-	LPINTERNALPOS lpPos = WINPOS_InitInternalPos( pWnd );
+        lpPos->rectNormal.left   = wndpl->rcNormalPosition.left;
+        lpPos->rectNormal.top    = wndpl->rcNormalPosition.top;
+        lpPos->rectNormal.right  = wndpl->rcNormalPosition.right;
+        lpPos->rectNormal.bottom = wndpl->rcNormalPosition.bottom;
+    }
 
-        if( flags & PLACE_MIN )
-        {
-            lpPos->ptIconPos.x = wndpl->ptMinPosition.x;
-            lpPos->ptIconPos.y = wndpl->ptMinPosition.y;
-        }
-        if( flags & PLACE_MAX )
-        {
-            lpPos->ptMaxPos.x = wndpl->ptMaxPosition.x;
-            lpPos->ptMaxPos.y = wndpl->ptMaxPosition.y;
-        }
-        if( flags & PLACE_RECT)
+    style = pWnd->dwStyle;
+    WIN_ReleasePtr( pWnd );
+
+    if( style & WS_MINIMIZE )
+    {
+        WINPOS_ShowIconTitle( hwnd, FALSE );
+        if( wndpl->flags & WPF_SETMINPOSITION && !EMPTYPOINT(lpPos->ptIconPos))
+            SetWindowPos( hwnd, 0, lpPos->ptIconPos.x, lpPos->ptIconPos.y,
+                          0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );
+    }
+    else if( style & WS_MAXIMIZE )
+    {
+        if( !EMPTYPOINT(lpPos->ptMaxPos) )
+            SetWindowPos( hwnd, 0, lpPos->ptMaxPos.x, lpPos->ptMaxPos.y,
+                          0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );
+    }
+    else if( flags & PLACE_RECT )
+        SetWindowPos( hwnd, 0, lpPos->rectNormal.left, lpPos->rectNormal.top,
+                      lpPos->rectNormal.right - lpPos->rectNormal.left,
+                      lpPos->rectNormal.bottom - lpPos->rectNormal.top,
+                      SWP_NOZORDER | SWP_NOACTIVATE );
+
+    ShowWindow( hwnd, wndpl->showCmd );
+
+    if (IsIconic( hwnd ))
+    {
+        if (GetWindowLongW( hwnd, GWL_STYLE ) & WS_VISIBLE) WINPOS_ShowIconTitle( hwnd, TRUE );
+
+        /* SDK: ...valid only the next time... */
+        if( wndpl->flags & WPF_RESTORETOMAXIMIZED )
         {
-            lpPos->rectNormal.left   = wndpl->rcNormalPosition.left;
-            lpPos->rectNormal.top    = wndpl->rcNormalPosition.top;
-            lpPos->rectNormal.right  = wndpl->rcNormalPosition.right;
-            lpPos->rectNormal.bottom = wndpl->rcNormalPosition.bottom;
+            pWnd = WIN_GetPtr( hwnd );
+            if (pWnd && pWnd != WND_OTHER_PROCESS)
+            {
+                pWnd->flags |= WIN_RESTORE_MAX;
+                WIN_ReleasePtr( pWnd );
+            }
         }
-	if( pWnd->dwStyle & WS_MINIMIZE )
-	{
-	    WINPOS_ShowIconTitle( pWnd->hwndSelf, FALSE );
-	    if( wndpl->flags & WPF_SETMINPOSITION && !EMPTYPOINT(lpPos->ptIconPos))
-		SetWindowPos( hwnd, 0, lpPos->ptIconPos.x, lpPos->ptIconPos.y,
-				0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );
-	}
-	else if( pWnd->dwStyle & WS_MAXIMIZE )
-	{
-	    if( !EMPTYPOINT(lpPos->ptMaxPos) )
-		SetWindowPos( hwnd, 0, lpPos->ptMaxPos.x, lpPos->ptMaxPos.y,
-				0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );
-	}
-	else if( flags & PLACE_RECT )
-		SetWindowPos( hwnd, 0, lpPos->rectNormal.left, lpPos->rectNormal.top,
-				lpPos->rectNormal.right - lpPos->rectNormal.left,
-				lpPos->rectNormal.bottom - lpPos->rectNormal.top,
-				SWP_NOZORDER | SWP_NOACTIVATE );
-
-	ShowWindow( hwnd, wndpl->showCmd );
-	if( IsWindow(hwnd) && pWnd->dwStyle & WS_MINIMIZE )
-	{
-	    if( pWnd->dwStyle & WS_VISIBLE ) WINPOS_ShowIconTitle( pWnd->hwndSelf, TRUE );
-
-	    /* SDK: ...valid only the next time... */
-	    if( wndpl->flags & WPF_RESTORETOMAXIMIZED ) pWnd->flags |= WIN_RESTORE_MAX;
-	}
-        WIN_ReleaseWndPtr(pWnd);
-	return TRUE;
     }
-    return FALSE;
+    return TRUE;
 }