+ if(!Window)
+ {
+ SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
+ return 0;
+ }
+
+ switch(fnBar)
+ {
+ case SB_HORZ:
+ Info = Window->pHScroll;
+ if(Info)
+ break;
+ /* fall through */
+ case SB_VERT:
+ Info = Window->pVScroll;
+ if(Info)
+ break;
+ /* fall through */
+ case SB_CTL:
+ Info = Window->wExtra;
+ if(Info)
+ break;
+ /* fall through */
+ default:
+ IntReleaseWindowObject(Window);
+ return 0;
+ }
+
+ psi = (LPSCROLLINFO)((PSCROLLBARINFO)(Info + 1));
+
+ if(lpsi->fMask == SIF_ALL)
+ Mask = SIF_DISABLENOSCROLL | SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
+ else
+ Mask = lpsi->fMask;
+
+ if(Mask & SIF_DISABLENOSCROLL)
+ {
+ /* FIXME */
+ }
+
+ if((Mask & SIF_RANGE) && ((psi->nMin != lpsi->nMin) || (psi->nMax != lpsi->nMax)))
+ {
+ /* Invalid range -> range is set to (0,0) */
+ if((lpsi->nMin > lpsi->nMax) ||
+ ((UINT)(lpsi->nMax - lpsi->nMin) >= 0x80000000))
+ {
+ psi->nMin = 0;
+ psi->nMax = 0;
+ Chg = TRUE;
+ }
+ else
+ {
+ if(psi->nMin != lpsi->nMin ||
+ psi->nMax != lpsi->nMax )
+ {
+ //*action |= SA_SSI_REFRESH;
+ psi->nMin = lpsi->nMin;
+ psi->nMax = lpsi->nMax;
+ Chg = TRUE;
+ }
+ }
+ }
+
+ if((Mask & SIF_PAGE) && (psi->nPage != lpsi->nPage))
+ {
+ psi->nPage = lpsi->nPage;
+ Chg = TRUE;
+ if(psi->nPage < 0) psi->nPage = 0;
+ else if(psi->nPage > psi->nMax - psi->nMin + 1)
+ psi->nPage = psi->nMax - psi->nMin + 1;
+ }
+
+ if((Mask & SIF_POS) && (psi->nPos != lpsi->nPos))
+ {
+ psi->nPos = lpsi->nPos;
+ Chg = TRUE;
+ if(psi->nPos < psi->nMin)
+ psi->nPos = psi->nMin;
+ else if(psi->nPos > psi->nMax - max(psi->nPage - 1, 0))
+ psi->nPos = psi->nMax - max(psi->nPage - 1, 0);
+ }
+
+ /* FIXME check assigned values */
+
+ if(fRedraw && Chg && (Window->Style & WS_VISIBLE))
+ {
+ /* FIXME - Redraw */
+ }
+
+ Ret = psi->nPos;
+
+ IntReleaseWindowObject(Window);
+ return Ret;