int APIENTRY NtUserTranslateAccelerator( HWND hWnd, HACCEL hAccel, LPMSG pUnsafeMessage) { PWND Window = NULL; PACCELERATOR_TABLE Accel = NULL; ULONG i; MSG Message; USER_REFERENCE_ENTRY AccelRef, WindowRef; DECLARE_RETURN(int); TRACE("NtUserTranslateAccelerator(hWnd %p, hAccel %p, Message %p)\n", hWnd, hAccel, pUnsafeMessage); UserEnterShared(); if (hWnd == NULL) { RETURN( 0); } _SEH2_TRY { ProbeForRead(pUnsafeMessage, sizeof(MSG), 4); RtlCopyMemory(&Message, pUnsafeMessage, sizeof(MSG)); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { SetLastNtError(_SEH2_GetExceptionCode()); _SEH2_YIELD(RETURN( 0)); } _SEH2_END; if ((Message.message != WM_KEYDOWN) && (Message.message != WM_SYSKEYDOWN) && (Message.message != WM_SYSCHAR) && (Message.message != WM_CHAR)) { RETURN( 0); } Accel = UserGetAccelObject(hAccel); if (!Accel) { RETURN( 0); } UserRefObjectCo(Accel, &AccelRef); Window = UserGetWindowObject(hWnd); if (!Window) { RETURN( 0); } UserRefObjectCo(Window, &WindowRef); /* FIXME: Associate AcceleratorTable with the current thread */ for (i = 0; i < Accel->Count; i++) { if (co_IntTranslateAccelerator(Window, &Message, &Accel->Table[i])) { RETURN( 1); } /* Undocumented feature... */ if (Accel->Table[i].fVirt & FVIRT_TBL_END) break; } RETURN( 0); CLEANUP: if (Window) UserDerefObjectCo(Window); if (Accel) UserDerefObjectCo(Accel); TRACE("NtUserTranslateAccelerator returns %d\n", _ret_); UserLeave(); END_CLEANUP; }
BOOL APIENTRY NtUserSBGetParms( HWND hWnd, int fnBar, PSBDATA pSBData, LPSCROLLINFO lpsi) { PWND Window; SCROLLINFO psi; BOOL Ret; SBDATA SBDataSafe; DECLARE_RETURN(BOOL); USER_REFERENCE_ENTRY Ref; TRACE("Enter NtUserGetScrollInfo\n"); UserEnterShared(); _SEH2_TRY { RtlCopyMemory(&psi, lpsi, sizeof(SCROLLINFO)); if (pSBData) { RtlCopyMemory(&SBDataSafe, pSBData, sizeof(SBDATA)); } } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { ERR("NtUserGetScrollInfo Failed size.\n"); SetLastNtError(_SEH2_GetExceptionCode()); _SEH2_YIELD(RETURN(FALSE)); } _SEH2_END if(!(Window = UserGetWindowObject(hWnd))) { ERR("NtUserGetScrollInfo Bad window.\n"); RETURN(FALSE); } UserRefObjectCo(Window, &Ref); Ret = co_IntGetScrollInfo(Window, fnBar, &SBDataSafe, &psi); UserDerefObjectCo(Window); _SEH2_TRY { RtlCopyMemory(lpsi, &psi, sizeof(SCROLLINFO)); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { ERR("NtUserGetScrollInfo Failed copy to user.\n"); SetLastNtError(_SEH2_GetExceptionCode()); _SEH2_YIELD(RETURN(FALSE)); } _SEH2_END RETURN( Ret); CLEANUP: TRACE("Leave NtUserGetScrollInfo, ret=%i\n",_ret_); UserLeave(); END_CLEANUP; }