[NTUSER][USER32_APITEST] TrackPopupMenuEx: Check flags (#8094)

Validate flags.
JIRA issue: CORE-3247
- In NtUserTrackPopupMenuEx function, validate the flags.
- If validation failed, then set last error and return FALSE.
- Add SAL annotations to NtUserTrackPopupMenuEx.
- Keep reference to menu in the function.
- Add TrackPopupMenuEx testcase to user32_apitest.
This commit is contained in:
Katayama Hirofumi MZ 2025-06-10 21:25:14 +09:00 committed by GitHub
parent 4cf350a716
commit 3c35117f97
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 395 additions and 27 deletions

View file

@ -1425,12 +1425,12 @@ NtUserThunkedMenuItemInfo(
BOOL
NTAPI
NtUserTrackPopupMenuEx(
HMENU hmenu,
UINT fuFlags,
int x,
int y,
HWND hwnd,
LPTPMPARAMS lptpm);
_In_ HMENU hMenu,
_In_ UINT fuFlags,
_In_ INT x,
_In_ INT y,
_In_ HWND hwnd,
_In_opt_ LPTPMPARAMS lptpm);
HKL
NTAPI

View file

@ -4571,11 +4571,14 @@ track_menu:
MENU_ExitTracking( pwnd, FALSE, wFlags);
}
/**********************************************************************
* TrackPopupMenuEx (USER32.@)
*/
BOOL WINAPI IntTrackPopupMenuEx( PMENU menu, UINT wFlags, int x, int y,
PWND pWnd, LPTPMPARAMS lpTpm)
BOOL FASTCALL
IntTrackPopupMenuEx(
_Inout_ PMENU menu,
_In_ UINT wFlags,
_In_ INT x,
_In_ INT y,
_In_ PWND pWnd,
_In_opt_ const TPMPARAMS *lpTpm)
{
BOOL ret = FALSE;
PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
@ -6624,27 +6627,39 @@ Cleanup:
return Ret;
}
/*
* @implemented
*/
BOOL APIENTRY
#define VALID_TPM_FLAGS ( \
TPM_LAYOUTRTL | TPM_NOANIMATION | TPM_VERNEGANIMATION | TPM_VERPOSANIMATION | \
TPM_HORNEGANIMATION | TPM_HORPOSANIMATION | TPM_RETURNCMD | \
TPM_NONOTIFY | TPM_VERTICAL | TPM_BOTTOMALIGN | TPM_VCENTERALIGN | \
TPM_RIGHTALIGN | TPM_CENTERALIGN | TPM_RIGHTBUTTON | TPM_RECURSE \
)
/* @implemented */
BOOL NTAPI
NtUserTrackPopupMenuEx(
HMENU hMenu,
UINT fuFlags,
int x,
int y,
HWND hWnd,
LPTPMPARAMS lptpm)
_In_ HMENU hMenu,
_In_ UINT fuFlags,
_In_ INT x,
_In_ INT y,
_In_ HWND hWnd,
_In_opt_ LPTPMPARAMS lptpm)
{
PMENU menu;
PWND pWnd;
TPMPARAMS tpm;
BOOL Ret = FALSE;
USER_REFERENCE_ENTRY Ref;
USER_REFERENCE_ENTRY WndRef, MenuRef;
TRACE("Enter NtUserTrackPopupMenuEx\n");
UserEnterExclusive();
if (fuFlags & ~VALID_TPM_FLAGS)
{
ERR("TPME : Invalid flags 0x%X (valid flags are 0x%X)\n", fuFlags, VALID_TPM_FLAGS);
EngSetLastError(ERROR_INVALID_FLAGS);
goto Exit;
}
/* Parameter check */
if (!(menu = UserGetMenuObject( hMenu )))
{
@ -6673,8 +6688,10 @@ NtUserTrackPopupMenuEx(
_SEH2_END
}
UserRefObjectCo(pWnd, &Ref);
Ret = IntTrackPopupMenuEx(menu, fuFlags, x, y, pWnd, lptpm ? &tpm : NULL);
UserRefObjectCo(pWnd, &WndRef);
UserRefObjectCo(menu, &MenuRef);
Ret = IntTrackPopupMenuEx(menu, fuFlags, x, y, pWnd, (lptpm ? &tpm : NULL));
UserDerefObjectCo(menu);
UserDerefObjectCo(pWnd);
Exit:
@ -6682,5 +6699,3 @@ Exit:
UserLeave();
return Ret;
}
/* EOF */

View file

@ -169,4 +169,12 @@ PWND MENU_IsMenuActive(VOID);
void MENU_EndMenu( PWND pwnd );
void FASTCALL MENU_InitSysMenuPopup(PMENU menu, DWORD style, DWORD clsStyle, LONG HitTest );
INT FASTCALL IntMenuItemFromPoint(PWND pWnd, HMENU hMenu, POINT ptScreen);
BOOL WINAPI IntTrackPopupMenuEx( PMENU menu, UINT wFlags, int x, int y, PWND pWnd, LPTPMPARAMS lpTpm);
BOOL FASTCALL
IntTrackPopupMenuEx(
_Inout_ PMENU menu,
_In_ UINT wFlags,
_In_ INT x,
_In_ INT y,
_In_ PWND pWnd,
_In_opt_ const TPMPARAMS *lpTpm);