WNDPROC handlers now check whether HWND argument is valid.

This commit is contained in:
Jukka Heinonen 2001-07-24 01:16:16 +00:00 committed by Alexandre Julliard
parent c0ccd263a7
commit 186a79cb92
7 changed files with 203 additions and 173 deletions

View File

@ -407,12 +407,14 @@ static inline LRESULT WINAPI ButtonWndProc_locked(WND* wndPtr, UINT uMsg,
*/ */
static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{ {
LRESULT res; LRESULT res = 0;
WND *wndPtr = WIN_FindWndPtr(hWnd); WND *wndPtr = WIN_FindWndPtr(hWnd);
res = ButtonWndProc_locked(wndPtr,uMsg,wParam,lParam,TRUE); if (wndPtr)
{
WIN_ReleaseWndPtr(wndPtr); res = ButtonWndProc_locked(wndPtr,uMsg,wParam,lParam,TRUE);
WIN_ReleaseWndPtr(wndPtr);
}
return res; return res;
} }
@ -422,12 +424,14 @@ static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
*/ */
static LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) static LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{ {
LRESULT res; LRESULT res = 0;
WND *wndPtr = WIN_FindWndPtr(hWnd); WND *wndPtr = WIN_FindWndPtr(hWnd);
res = ButtonWndProc_locked(wndPtr,uMsg,wParam,lParam,FALSE); if (wndPtr)
{
WIN_ReleaseWndPtr(wndPtr); res = ButtonWndProc_locked(wndPtr,uMsg,wParam,lParam,FALSE);
WIN_ReleaseWndPtr(wndPtr);
}
return res; return res;
} }

View File

@ -1863,7 +1863,6 @@ static void COMBO_MouseMove( LPHEADCOMBO lphc, WPARAM wParam, LPARAM lParam )
static LRESULT ComboWndProc_locked( WND* pWnd, UINT message, static LRESULT ComboWndProc_locked( WND* pWnd, UINT message,
WPARAM wParam, LPARAM lParam, BOOL unicode ) WPARAM wParam, LPARAM lParam, BOOL unicode )
{ {
if( pWnd ) {
LPHEADCOMBO lphc = CB_GETPTR(pWnd); LPHEADCOMBO lphc = CB_GETPTR(pWnd);
HWND hwnd = pWnd->hwndSelf; HWND hwnd = pWnd->hwndSelf;
@ -2252,11 +2251,9 @@ static LRESULT ComboWndProc_locked( WND* pWnd, UINT message,
WARN("unknown msg WM_USER+%04x wp=%04x lp=%08lx\n", WARN("unknown msg WM_USER+%04x wp=%04x lp=%08lx\n",
message - WM_USER, wParam, lParam ); message - WM_USER, wParam, lParam );
break; break;
} }
return unicode ? DefWindowProcW(hwnd, message, wParam, lParam) : return unicode ? DefWindowProcW(hwnd, message, wParam, lParam) :
DefWindowProcA(hwnd, message, wParam, lParam); DefWindowProcA(hwnd, message, wParam, lParam);
}
return CB_ERR;
} }
/*********************************************************************** /***********************************************************************
@ -2267,10 +2264,14 @@ static LRESULT ComboWndProc_locked( WND* pWnd, UINT message,
*/ */
static LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) static LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{ {
WND* pWnd = WIN_FindWndPtr(hwnd); LRESULT retvalue = 0;
LRESULT retvalue = ComboWndProc_locked(pWnd, message, wParam, lParam, FALSE); WND* pWnd = WIN_FindWndPtr(hwnd);
WIN_ReleaseWndPtr(pWnd); if (pWnd)
{
retvalue = ComboWndProc_locked(pWnd, message, wParam, lParam, FALSE);
WIN_ReleaseWndPtr(pWnd);
}
return retvalue; return retvalue;
} }
@ -2279,9 +2280,13 @@ static LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPA
*/ */
static LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) static LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{ {
WND* pWnd = WIN_FindWndPtr(hwnd); LRESULT retvalue = 0;
LRESULT retvalue = ComboWndProc_locked(pWnd, message, wParam, lParam, TRUE); WND* pWnd = WIN_FindWndPtr(hwnd);
WIN_ReleaseWndPtr(pWnd); if (pWnd)
{
retvalue = ComboWndProc_locked(pWnd, message, wParam, lParam, TRUE);
WIN_ReleaseWndPtr(pWnd);
}
return retvalue; return retvalue;
} }

View File

@ -395,7 +395,7 @@ static LRESULT WINAPI EditWndProc_locked( WND *wnd, UINT msg,
switch (msg) { switch (msg) {
case WM_DESTROY: case WM_DESTROY:
DPRINTF_EDIT_MSG32("WM_DESTROY"); DPRINTF_EDIT_MSG32("WM_DESTROY");
EDIT_WM_Destroy(wnd, es); if (es) EDIT_WM_Destroy(wnd, es);
result = 0; result = 0;
goto END; goto END;
@ -1121,12 +1121,14 @@ static LRESULT WINAPI EditWndProc_locked( WND *wnd, UINT msg,
*/ */
LRESULT WINAPI EditWndProcW(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) LRESULT WINAPI EditWndProcW(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
LRESULT res; LRESULT res = 0;
WND *wndPtr = WIN_FindWndPtr(hWnd); WND *wndPtr = WIN_FindWndPtr(hWnd);
res = EditWndProc_locked(wndPtr, uMsg, wParam, lParam, TRUE); if (wndPtr)
{
WIN_ReleaseWndPtr(wndPtr); res = EditWndProc_locked(wndPtr, uMsg, wParam, lParam, TRUE);
WIN_ReleaseWndPtr(wndPtr);
}
return res; return res;
} }
@ -1136,12 +1138,14 @@ LRESULT WINAPI EditWndProcW(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
*/ */
LRESULT WINAPI EditWndProcA(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) LRESULT WINAPI EditWndProcA(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
LRESULT res; LRESULT res = 0;
WND *wndPtr = WIN_FindWndPtr(hWnd); WND *wndPtr = WIN_FindWndPtr(hWnd);
res = EditWndProc_locked(wndPtr, uMsg, wParam, lParam, FALSE); if (wndPtr)
{
WIN_ReleaseWndPtr(wndPtr); res = EditWndProc_locked(wndPtr, uMsg, wParam, lParam, FALSE);
WIN_ReleaseWndPtr(wndPtr);
}
return res; return res;
} }

View File

@ -200,6 +200,9 @@ LRESULT WINAPI IconTitleWndProc( HWND hWnd, UINT msg,
LRESULT retvalue; LRESULT retvalue;
WND *wnd = WIN_FindWndPtr( hWnd ); WND *wnd = WIN_FindWndPtr( hWnd );
if( !wnd )
return 0;
switch( msg ) switch( msg )
{ {
case WM_CREATE: case WM_CREATE:

View File

@ -2466,7 +2466,6 @@ static LRESULT WINAPI ListBoxWndProc_locked( WND* wnd, UINT msg,
LB_DESCR *descr; LB_DESCR *descr;
HWND hwnd = wnd->hwndSelf; HWND hwnd = wnd->hwndSelf;
if (!wnd) return 0;
if (!(descr = *(LB_DESCR **)wnd->wExtra)) if (!(descr = *(LB_DESCR **)wnd->wExtra))
{ {
if (msg == WM_CREATE) if (msg == WM_CREATE)
@ -3022,10 +3021,14 @@ static LRESULT WINAPI ListBoxWndProc_locked( WND* wnd, UINT msg,
*/ */
static LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) static LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{ {
WND* wndPtr = WIN_FindWndPtr( hwnd ); LRESULT res = 0;
LRESULT res = ListBoxWndProc_locked(wndPtr, msg, wParam, lParam, FALSE); WND* wndPtr = WIN_FindWndPtr( hwnd );
WIN_ReleaseWndPtr(wndPtr); if (wndPtr)
{
res = ListBoxWndProc_locked(wndPtr, msg, wParam, lParam, FALSE);
WIN_ReleaseWndPtr(wndPtr);
}
return res; return res;
} }
@ -3034,10 +3037,14 @@ static LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARA
*/ */
static LRESULT WINAPI ListBoxWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) static LRESULT WINAPI ListBoxWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{ {
WND* wndPtr = WIN_FindWndPtr( hwnd ); LRESULT res = 0;
LRESULT res = ListBoxWndProc_locked(wndPtr, msg, wParam, lParam, TRUE); WND* wndPtr = WIN_FindWndPtr( hwnd );
WIN_ReleaseWndPtr(wndPtr); if (wndPtr)
{
res = ListBoxWndProc_locked(wndPtr, msg, wParam, lParam, TRUE);
WIN_ReleaseWndPtr(wndPtr);
}
return res; return res;
} }
@ -3051,151 +3058,144 @@ static LRESULT WINAPI ComboLBWndProc_locked( WND* wnd, UINT msg,
{ {
LRESULT lRet = 0; LRESULT lRet = 0;
HWND hwnd; HWND hwnd;
LB_DESCR *descr = *(LB_DESCR **)wnd->wExtra;
if (wnd) TRACE_(combo)("[%04x]: msg %s wp %08x lp %08lx\n",
wnd->hwndSelf, SPY_GetMsgName(msg), wParam, lParam );
hwnd = wnd->hwndSelf;
if( descr || msg == WM_CREATE )
{ {
LB_DESCR *descr = *(LB_DESCR **)wnd->wExtra; LPHEADCOMBO lphc = (descr) ? descr->lphc : NULL;
TRACE_(combo)("[%04x]: msg %s wp %08x lp %08lx\n", switch( msg )
wnd->hwndSelf, SPY_GetMsgName(msg), wParam, lParam );
hwnd = wnd->hwndSelf;
if( descr || msg == WM_CREATE )
{ {
LPHEADCOMBO lphc = (descr) ? descr->lphc : NULL; case WM_CREATE:
{
CREATESTRUCTA *lpcs = (CREATESTRUCTA *)lParam;
TRACE_(combo)("\tpassed parent handle = %p\n",lpcs->lpCreateParams);
lphc = (LPHEADCOMBO)(lpcs->lpCreateParams);
return LISTBOX_Create( wnd, lphc );
}
case WM_MOUSEMOVE:
if ( (TWEAK_WineLook > WIN31_LOOK) &&
(CB_GETTYPE(lphc) != CBS_SIMPLE) )
{
POINT mousePos;
BOOL captured;
RECT clientRect;
switch( msg ) mousePos.x = (INT16)LOWORD(lParam);
{ mousePos.y = (INT16)HIWORD(lParam);
case WM_CREATE:
#define lpcs ((LPCREATESTRUCTA)lParam)
TRACE_(combo)("\tpassed parent handle = 0x%08x\n",
(UINT)lpcs->lpCreateParams);
lphc = (LPHEADCOMBO)(lpcs->lpCreateParams); /*
#undef lpcs * If we are in a dropdown combobox, we simulate that
return LISTBOX_Create( wnd, lphc ); * the mouse is captured to show the tracking of the item.
case WM_MOUSEMOVE: */
if ( (TWEAK_WineLook > WIN31_LOOK) && GetClientRect(hwnd, &clientRect);
(CB_GETTYPE(lphc) != CBS_SIMPLE) )
{
POINT mousePos;
BOOL captured;
RECT clientRect;
mousePos.x = (INT16)LOWORD(lParam); if (PtInRect( &clientRect, mousePos ))
mousePos.y = (INT16)HIWORD(lParam); {
captured = descr->captured;
descr->captured = TRUE;
/* LISTBOX_HandleMouseMove( wnd, descr,
* If we are in a dropdown combobox, we simulate that mousePos.x, mousePos.y);
* the mouse is captured to show the tracking of the item.
*/
GetClientRect(hwnd, &clientRect);
if (PtInRect( &clientRect, mousePos )) descr->captured = captured;
{
captured = descr->captured;
descr->captured = TRUE;
LISTBOX_HandleMouseMove( wnd, descr,
mousePos.x, mousePos.y);
descr->captured = captured; }
else
{
LISTBOX_HandleMouseMove( wnd, descr,
mousePos.x, mousePos.y);
}
} return 0;
else
{
LISTBOX_HandleMouseMove( wnd, descr,
mousePos.x, mousePos.y);
}
return 0; }
else
{
/*
* If we are in Win3.1 look, go with the default behavior.
*/
return unicode ? ListBoxWndProcW( hwnd, msg, wParam, lParam ) :
ListBoxWndProcA( hwnd, msg, wParam, lParam );
}
case WM_LBUTTONUP:
if (TWEAK_WineLook > WIN31_LOOK)
{
POINT mousePos;
RECT clientRect;
} /*
else * If the mouse button "up" is not in the listbox,
{ * we make sure there is no selection by re-selecting the
/* * item that was selected when the listbox was made visible.
* If we are in Win3.1 look, go with the default behavior. */
*/ mousePos.x = (INT16)LOWORD(lParam);
return unicode ? ListBoxWndProcW( hwnd, msg, wParam, lParam ) : mousePos.y = (INT16)HIWORD(lParam);
ListBoxWndProcA( hwnd, msg, wParam, lParam );
}
case WM_LBUTTONUP:
if (TWEAK_WineLook > WIN31_LOOK)
{
POINT mousePos;
RECT clientRect;
/* GetClientRect(hwnd, &clientRect);
* If the mouse button "up" is not in the listbox,
* we make sure there is no selection by re-selecting the
* item that was selected when the listbox was made visible.
*/
mousePos.x = (INT16)LOWORD(lParam);
mousePos.y = (INT16)HIWORD(lParam);
GetClientRect(hwnd, &clientRect); /*
* When the user clicks outside the combobox and the focus
* is lost, the owning combobox will send a fake buttonup with
* 0xFFFFFFF as the mouse location, we must also revert the
* selection to the original selection.
*/
if ( (lParam == (LPARAM)-1) ||
(!PtInRect( &clientRect, mousePos )) )
{
LISTBOX_MoveCaret( wnd, descr, lphc->droppedIndex, FALSE );
}
}
return LISTBOX_HandleLButtonUp( wnd, descr );
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
return LISTBOX_HandleLButtonDownCombo(wnd, descr, msg, wParam,
(INT16)LOWORD(lParam),
(INT16)HIWORD(lParam) );
case WM_NCACTIVATE:
return FALSE;
case WM_KEYDOWN:
if( CB_GETTYPE(lphc) != CBS_SIMPLE )
{
/* for some reason(?) Windows makes it possible to
* show/hide ComboLBox by sending it WM_KEYDOWNs */
/* if( (!(lphc->wState & CBF_EUI) && wParam == VK_F4) ||
* When the user clicks outside the combobox and the focus ( (lphc->wState & CBF_EUI) && !(lphc->wState & CBF_DROPPED)
* is lost, the owning combobox will send a fake buttonup with && (wParam == VK_DOWN || wParam == VK_UP)) )
* 0xFFFFFFF as the mouse location, we must also revert the {
* selection to the original selection. COMBO_FlipListbox( lphc, FALSE, FALSE );
*/ return 0;
if ( (lParam == (LPARAM)-1) || }
(!PtInRect( &clientRect, mousePos )) ) }
{ return LISTBOX_HandleKeyDown( wnd, descr, wParam );
LISTBOX_MoveCaret( wnd,
descr,
lphc->droppedIndex,
FALSE );
}
}
return LISTBOX_HandleLButtonUp( wnd, descr );
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
return LISTBOX_HandleLButtonDownCombo(wnd, descr, msg, wParam,
(INT16)LOWORD(lParam),
(INT16)HIWORD(lParam) );
case WM_NCACTIVATE:
return FALSE;
case WM_KEYDOWN:
if( CB_GETTYPE(lphc) != CBS_SIMPLE )
{
/* for some reason(?) Windows makes it possible to
* show/hide ComboLBox by sending it WM_KEYDOWNs */
if( (!(lphc->wState & CBF_EUI) && wParam == VK_F4) || case LB_SETCURSEL16:
( (lphc->wState & CBF_EUI) && !(lphc->wState & CBF_DROPPED) case LB_SETCURSEL:
&& (wParam == VK_DOWN || wParam == VK_UP)) ) lRet = unicode ? ListBoxWndProcW( hwnd, msg, wParam, lParam ) :
{ ListBoxWndProcA( hwnd, msg, wParam, lParam );
COMBO_FlipListbox( lphc, FALSE, FALSE ); lRet =(lRet == LB_ERR) ? lRet : descr->selected_item;
return 0; return lRet;
} case WM_NCDESTROY:
} if( CB_GETTYPE(lphc) != CBS_SIMPLE )
return LISTBOX_HandleKeyDown( wnd, descr, wParam ); lphc->hWndLBox = 0;
/* fall through */
case LB_SETCURSEL16: default:
case LB_SETCURSEL: return unicode ? ListBoxWndProcW( hwnd, msg, wParam, lParam ) :
lRet = unicode ? ListBoxWndProcW( hwnd, msg, wParam, lParam ) : ListBoxWndProcA( hwnd, msg, wParam, lParam );
ListBoxWndProcA( hwnd, msg, wParam, lParam );
lRet =(lRet == LB_ERR) ? lRet : descr->selected_item;
return lRet;
case WM_NCDESTROY:
if( CB_GETTYPE(lphc) != CBS_SIMPLE )
lphc->hWndLBox = 0;
/* fall through */
default:
return unicode ? ListBoxWndProcW( hwnd, msg, wParam, lParam ) :
ListBoxWndProcA( hwnd, msg, wParam, lParam );
}
} }
lRet = unicode ? DefWindowProcW( hwnd, msg, wParam, lParam ) :
DefWindowProcA( hwnd, msg, wParam, lParam );
TRACE_(combo)("\t default on msg [%04x]\n", (UINT16)msg );
} }
lRet = unicode ? DefWindowProcW( hwnd, msg, wParam, lParam ) :
DefWindowProcA( hwnd, msg, wParam, lParam );
TRACE_(combo)("\t default on msg [%04x]\n", (UINT16)msg );
return lRet; return lRet;
} }
@ -3211,10 +3211,14 @@ static LRESULT WINAPI ComboLBWndProc_locked( WND* wnd, UINT msg,
LRESULT WINAPI ComboLBWndProcA( HWND hwnd, UINT msg, LRESULT WINAPI ComboLBWndProcA( HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam ) WPARAM wParam, LPARAM lParam )
{ {
LRESULT res = 0;
WND *wnd = WIN_FindWndPtr( hwnd ); WND *wnd = WIN_FindWndPtr( hwnd );
LRESULT res = ComboLBWndProc_locked(wnd, msg, wParam, lParam, FALSE);
WIN_ReleaseWndPtr(wnd); if (wnd)
{
res = ComboLBWndProc_locked(wnd, msg, wParam, lParam, FALSE);
WIN_ReleaseWndPtr(wnd);
}
return res; return res;
} }
@ -3223,9 +3227,13 @@ LRESULT WINAPI ComboLBWndProcA( HWND hwnd, UINT msg,
*/ */
LRESULT WINAPI ComboLBWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) LRESULT WINAPI ComboLBWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{ {
LRESULT res = 0;
WND *wnd = WIN_FindWndPtr( hwnd ); WND *wnd = WIN_FindWndPtr( hwnd );
LRESULT res = ComboLBWndProc_locked(wnd, msg, wParam, lParam, TRUE);
WIN_ReleaseWndPtr(wnd); if (wnd)
{
res = ComboLBWndProc_locked(wnd, msg, wParam, lParam, TRUE);
WIN_ReleaseWndPtr(wnd);
}
return res; return res;
} }

View File

@ -1125,6 +1125,8 @@ void SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
*/ */
static LRESULT WINAPI ScrollBarWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) static LRESULT WINAPI ScrollBarWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{ {
if (!IsWindow( hwnd )) return 0;
switch(message) switch(message)
{ {
case WM_CREATE: case WM_CREATE:

View File

@ -356,12 +356,14 @@ END:
*/ */
static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{ {
LRESULT lResult; LRESULT lResult = 0;
WND *wndPtr = WIN_FindWndPtr(hWnd); WND *wndPtr = WIN_FindWndPtr(hWnd);
lResult = StaticWndProc_locked(wndPtr, uMsg, wParam, lParam, FALSE); if (wndPtr)
{
WIN_ReleaseWndPtr(wndPtr); lResult = StaticWndProc_locked(wndPtr, uMsg, wParam, lParam, FALSE);
WIN_ReleaseWndPtr(wndPtr);
}
return lResult; return lResult;
} }
@ -370,12 +372,14 @@ static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
*/ */
static LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) static LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{ {
LRESULT lResult; LRESULT lResult = 0;
WND *wndPtr = WIN_FindWndPtr(hWnd); WND *wndPtr = WIN_FindWndPtr(hWnd);
lResult = StaticWndProc_locked(wndPtr, uMsg, wParam, lParam, TRUE); if (wndPtr)
{
WIN_ReleaseWndPtr(wndPtr); lResult = StaticWndProc_locked(wndPtr, uMsg, wParam, lParam, TRUE);
WIN_ReleaseWndPtr(wndPtr);
}
return lResult; return lResult;
} }