scrollbar: simplify refcounting fix a bug in NtUserGetSystemMenu, accessing nullpointer use pointers internally, not handles Modified: trunk/reactos/subsys/win32k/include/userfuncs.h Modified: trunk/reactos/subsys/win32k/ntuser/scrollbar.c Modified: trunk/reactos/subsys/win32k/ntuser/window.c _____
Modified: trunk/reactos/subsys/win32k/include/userfuncs.h --- trunk/reactos/subsys/win32k/include/userfuncs.h 2005-09-06 23:29:54 UTC (rev 17711) +++ trunk/reactos/subsys/win32k/include/userfuncs.h 2005-09-07 00:02:39 UTC (rev 17712) @@ -125,7 +125,7 @@
/*************** SCROLLBAR.C ***************/
DWORD FASTCALL -co_UserShowScrollBar(HWND hWnd, int wBar, DWORD bShow); +co_UserShowScrollBar(PWINDOW_OBJECT Window, int wBar, DWORD bShow);
#endif /* _WIN32K_USERFUNCS_H */ _____
Modified: trunk/reactos/subsys/win32k/ntuser/scrollbar.c --- trunk/reactos/subsys/win32k/ntuser/scrollbar.c 2005-09-06 23:29:54 UTC (rev 17711) +++ trunk/reactos/subsys/win32k/ntuser/scrollbar.c 2005-09-07 00:02:39 UTC (rev 17712) @@ -95,7 +95,6 @@
break;
default: - IntReleaseWindowObject(Window); return FALSE; }
@@ -199,6 +198,8 @@ UINT Mask; LPSCROLLINFO psi;
+ ASSERT_REFS(Window); + if(!SBID_IS_VALID(nBar)) { SetLastWin32Error(ERROR_INVALID_PARAMETER); @@ -259,6 +260,8 @@ /* UINT new_flags;*/ BOOL bChangeParams = FALSE; /* don't show/hide scrollbar if params don't change */
+ ASSERT_REFS(Window); + if(!SBID_IS_VALID(nBar)) { SetLastWin32Error(ERROR_INVALID_PARAMETER); @@ -365,7 +368,7 @@ } else if ((nBar != SB_CTL) && bChangeParams) { - co_UserShowScrollBar(Window->hSelf, nBar, FALSE); + co_UserShowScrollBar(Window, nBar, FALSE); return Info->nPos; } } @@ -374,7 +377,7 @@ /* new_flags = 0;*/ if ((nBar != SB_CTL) && bChangeParams) { - co_UserShowScrollBar(Window->hSelf, nBar, TRUE); + co_UserShowScrollBar(Window, nBar, TRUE); } }
@@ -408,6 +411,8 @@ PSCROLLBARINFO sbi; LPSCROLLINFO psi;
+ ASSERT_REFS(Window); + Bar = SBOBJ_TO_SBID(idObject);
if(!SBID_IS_VALID(Bar)) @@ -442,6 +447,8 @@ ULONG Size, s; INT i;
+ ASSERT_REFS(Window); + if(Window->Scroll) { /* no need to create it anymore */ @@ -548,18 +555,17 @@ if(!NT_SUCCESS(Status) || (sbi.cbSize != sizeof(SCROLLBARINFO))) { SetLastNtError(Status); - RETURN( FALSE); + RETURN(FALSE); }
- Window = IntGetWindowObject(hWnd); - - if(!Window) + if(!(Window = UserGetWindowObject(hWnd))) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - RETURN( FALSE); + RETURN(FALSE); }
+ UserReferenceWindowObjectCo(Window); Ret = co_IntGetScrollBarInfo(Window, idObject, &sbi); + UserDereferenceWindowObjectCo(Window);
Status = MmCopyToCaller(psbi, &sbi, sizeof(SCROLLBARINFO)); if(!NT_SUCCESS(Status)) @@ -567,7 +573,7 @@ SetLastNtError(Status); Ret = FALSE; } - IntReleaseWindowObject(Window); + RETURN( Ret);
CLEANUP: @@ -580,7 +586,7 @@
BOOL STDCALL -NtUserGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi) +NtUserGetScrollInfo(HWND hWnd, int fnBar, LPSCROLLINFO lpsi) { NTSTATUS Status; PWINDOW_OBJECT Window; @@ -597,28 +603,25 @@ !((psi.cbSize == sizeof(SCROLLINFO)) || (psi.cbSize == sizeof(SCROLLINFO) - sizeof(psi.nTrackPos)))) { SetLastNtError(Status); - RETURN( FALSE); + RETURN(FALSE); } sz = psi.cbSize; Status = MmCopyFromCaller(&psi, lpsi, sz); if (!NT_SUCCESS(Status)) { SetLastNtError(Status); - RETURN( FALSE); + RETURN(FALSE); }
- Window = IntGetWindowObject(hwnd); - - if(!Window) + if(!(Window = UserGetWindowObject(hWnd))) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - RETURN( FALSE); + RETURN(FALSE); }
+ UserReferenceWindowObjectCo(Window); Ret = co_IntGetScrollInfo(Window, fnBar, &psi); + UserDereferenceWindowObjectCo(Window);
- IntReleaseWindowObject(Window); - Status = MmCopyToCaller(lpsi, &psi, sz); if(!NT_SUCCESS(Status)) { @@ -642,7 +645,7 @@ UINT wSBflags, UINT wArrows) { - PWINDOW_OBJECT Window; + PWINDOW_OBJECT Window = NULL; PSCROLLBARINFO InfoV = NULL, InfoH = NULL; BOOL Chg = FALSE; DECLARE_RETURN(BOOL); @@ -650,13 +653,11 @@ DPRINT("Enter NtUserEnableScrollBar\n"); UserEnterExclusive();
- Window = IntGetWindowObject(hWnd); - - if(!Window) + if(!(Window = UserGetWindowObject(hWnd))) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - RETURN( FALSE); + RETURN(FALSE); } + UserReferenceWindowObjectCo(Window);
if(wSBflags == SB_CTL) { @@ -665,21 +666,19 @@ InfoV = IntGetScrollbarInfoFromWindow(Window, SB_CTL); Chg = IntEnableScrollBar(FALSE, InfoV ,wArrows); /* Chg? Scrollbar is Refresh in user32/controls/scrollbar.c. */ - IntReleaseWindowObject(Window); - RETURN( TRUE); + + RETURN(TRUE); }
if(wSBflags != SB_BOTH && !SBID_IS_VALID(wSBflags)) { - IntReleaseWindowObject(Window); SetLastWin32Error(ERROR_INVALID_PARAMETER); DPRINT1("Trying to set scrollinfo for unknown scrollbar type %d", wSBflags); - RETURN( FALSE); + RETURN(FALSE); }
if(!co_IntCreateScrollBars(Window)) { - IntReleaseWindowObject(Window); RETURN( FALSE); }
@@ -695,8 +694,7 @@ InfoV = IntGetScrollbarInfoFromWindow(Window, SB_VERT); break; default: - IntReleaseWindowObject(Window); - RETURN( FALSE); + RETURN(FALSE); }
if(InfoV) @@ -708,11 +706,11 @@ //if(Chg && (Window->Style & WS_VISIBLE)) /* FIXME - repaint scrollbars */
- IntReleaseWindowObject(Window); RETURN( TRUE);
- CLEANUP: + if (Window) UserDereferenceWindowObjectCo(Window); + DPRINT("Leave NtUserEnableScrollBar, ret=%i\n",_ret_); UserLeave(); END_CLEANUP; @@ -721,11 +719,11 @@ BOOL STDCALL NtUserSetScrollBarInfo( - HWND hwnd, + HWND hWnd, LONG idObject, SETSCROLLBARINFO *info) { - PWINDOW_OBJECT Window; + PWINDOW_OBJECT Window = NULL; SETSCROLLBARINFO Safeinfo; PSCROLLBARINFO sbi; LPSCROLLINFO psi; @@ -736,18 +734,15 @@ DPRINT("Enter NtUserSetScrollBarInfo\n"); UserEnterExclusive();
- Window = IntGetWindowObject(hwnd); - - if(!Window) + if(!(Window = UserGetWindowObject(hWnd))) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); RETURN( FALSE); } + UserReferenceWindowObjectCo(Window);
Obj = SBOBJ_TO_SBID(idObject); if(!SBID_IS_VALID(Obj)) { - IntReleaseWindowObject(Window); SetLastWin32Error(ERROR_INVALID_PARAMETER); DPRINT1("Trying to set scrollinfo for unknown scrollbar type %d", Obj); RETURN( FALSE); @@ -755,14 +750,12 @@
if(!co_IntCreateScrollBars(Window)) { - IntReleaseWindowObject(Window); RETURN(FALSE); }
Status = MmCopyFromCaller(&Safeinfo, info, sizeof(SETSCROLLBARINFO)); if(!NT_SUCCESS(Status)) { - IntReleaseWindowObject(Window); SetLastNtError(Status); RETURN(FALSE); } @@ -774,10 +767,11 @@ sbi->reserved = Safeinfo.reserved; RtlCopyMemory(&sbi->rgstate, &Safeinfo.rgstate, sizeof(Safeinfo.rgstate));
- IntReleaseWindowObject(Window); RETURN(TRUE);
CLEANUP: + if (Window) UserDereferenceWindowObjectCo(Window); + DPRINT("Leave NtUserSetScrollBarInfo, ret=%i\n",_ret_); UserLeave(); END_CLEANUP; @@ -786,42 +780,37 @@ DWORD STDCALL NtUserSetScrollInfo( - HWND hwnd, + HWND hWnd, int fnBar, LPCSCROLLINFO lpsi, BOOL bRedraw) { - PWINDOW_OBJECT Window; + PWINDOW_OBJECT Window = NULL; NTSTATUS Status; SCROLLINFO ScrollInfo; - DWORD Ret; DECLARE_RETURN(DWORD);
DPRINT("Enter NtUserSetScrollInfo\n"); UserEnterExclusive();
- Window = IntGetWindowObject(hwnd); - - if(!Window) + if(!(Window = UserGetWindowObject(hWnd))) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); RETURN( 0); } + UserReferenceWindowObjectCo(Window);
Status = MmCopyFromCaller(&ScrollInfo, lpsi, sizeof(SCROLLINFO) - sizeof(ScrollInfo.nTrackPos)); if(!NT_SUCCESS(Status)) { - IntReleaseWindowObject(Window); SetLastNtError(Status); RETURN( 0); }
- Ret = co_IntSetScrollInfo(Window, fnBar, &ScrollInfo, bRedraw); - IntReleaseWindowObject(Window); + RETURN(co_IntSetScrollInfo(Window, fnBar, &ScrollInfo, bRedraw));
- RETURN( Ret); - CLEANUP: + if (Window) UserDereferenceWindowObjectCo(Window); + DPRINT("Leave NtUserSetScrollInfo, ret=%i\n",_ret_); UserLeave(); END_CLEANUP; @@ -830,16 +819,11 @@
/* Ported from WINE20020904 (SCROLL_ShowScrollBar) */ DWORD FASTCALL -co_UserShowScrollBar(HWND hWnd, int wBar, DWORD bShow) +co_UserShowScrollBar(PWINDOW_OBJECT Window, int wBar, DWORD bShow) { DWORD Style, OldStyle; - PWINDOW_OBJECT Window = IntGetWindowObject(hWnd);
- if (!Window) - { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - return( FALSE); - } + ASSERT_REFS(Window);
switch(wBar) { @@ -856,14 +840,12 @@ Style = 0; break; default: - IntReleaseWindowObject(Window); SetLastWin32Error(ERROR_INVALID_PARAMETER); return( FALSE); }
if(!co_IntCreateScrollBars(Window)) { - IntReleaseWindowObject(Window); return( FALSE); }
@@ -871,8 +853,7 @@ { IntUpdateSBInfo(Window, SB_CTL);
- co_WinPosShowWindow(hWnd, bShow ? SW_SHOW : SW_HIDE); - IntReleaseWindowObject(Window); + co_WinPosShowWindow(Window->hSelf, bShow ? SW_SHOW : SW_HIDE); return( TRUE); }
@@ -892,12 +873,11 @@ if(Window->Style & WS_VISIBLE) { /* Frame has been changed, let the window redraw itself */ - co_WinPosSetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | + co_WinPosSetWindowPos(Window->hSelf, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOSENDCHANGING); } }
- IntReleaseWindowObject(Window); return( TRUE); }
@@ -905,13 +885,24 @@ DWORD STDCALL NtUserShowScrollBar(HWND hWnd, int wBar, DWORD bShow) { + PWINDOW_OBJECT Window; DECLARE_RETURN(DWORD); + DWORD ret;
DPRINT("Enter NtUserShowScrollBar\n"); UserEnterExclusive();
- RETURN(co_UserShowScrollBar(hWnd, wBar, bShow)); + if (!(Window = UserGetWindowObject(hWnd))) + { + RETURN(0); + }
+ UserReferenceWindowObjectCo(Window); + ret = co_UserShowScrollBar(Window, wBar, bShow); + UserDereferenceWindowObjectCo(Window); + + RETURN(ret); + CLEANUP: DPRINT("Leave NtUserShowScrollBar, ret%i\n",_ret_); UserLeave(); _____
Modified: trunk/reactos/subsys/win32k/ntuser/window.c --- trunk/reactos/subsys/win32k/ntuser/window.c 2005-09-06 23:29:54 UTC (rev 17711) +++ trunk/reactos/subsys/win32k/ntuser/window.c 2005-09-07 00:02:39 UTC (rev 17712) @@ -1973,15 +1973,18 @@
IntReleaseWindowObject(ParentWindow); }
+ //faxme:temp hack + UserReferenceWindowObjectCo(Window); /* Initialize and show the window's scrollbars */ if (Window->Style & WS_VSCROLL) { - co_UserShowScrollBar(Window->hSelf, SB_VERT, TRUE); + co_UserShowScrollBar(Window, SB_VERT, TRUE); } if (Window->Style & WS_HSCROLL) { - co_UserShowScrollBar(Window->hSelf, SB_HORZ, TRUE); + co_UserShowScrollBar(Window, SB_HORZ, TRUE); } + UserDereferenceWindowObjectCo(Window);
if (dwStyle & WS_VISIBLE) { @@ -3109,7 +3112,6 @@ HMENU STDCALL NtUserGetSystemMenu(HWND hWnd, BOOL bRevert) { - HMENU Result = 0; PWINDOW_OBJECT Window; PMENU_OBJECT Menu; DECLARE_RETURN(HMENU); @@ -3117,20 +3119,17 @@ DPRINT("Enter NtUserGetSystemMenu\n"); UserEnterShared();
- if (!(Window = IntGetWindowObject(hWnd))) + if (!(Window = UserGetWindowObject(hWnd))) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - RETURN( 0); + RETURN(NULL); }
if (!(Menu = IntGetSystemMenu(Window, bRevert, FALSE))) { - Result = Menu->MenuInfo.Self; - IntReleaseMenuObject(Menu); + RETURN(NULL); }
- IntReleaseWindowObject(Window); - RETURN( Result); + RETURN(Menu->MenuInfo.Self);
CLEANUP: DPRINT("Leave NtUserGetSystemMenu, ret=%i\n",_ret_);