From db93cb17096abbd5d0ba6e3288f66021c0a51131 Mon Sep 17 00:00:00 2001 From: Whindmar Saksit Date: Wed, 1 May 2024 14:17:08 +0200 Subject: [PATCH] [SHELL32][VFDLIB] Handle size check of CMINVOKECOMMANDINFOEX correctly (#6767) Older NT versions (< IE4) had a smaller CMINVOKECOMMANDINFOEX struct. Places where 3rd-party code passes in the struct needs to accept the small size. --- dll/win32/shell32/CShellLink.cpp | 5 +++-- modules/rosapps/lib/vfdlib/vfdshmenu.cpp | 6 +++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/dll/win32/shell32/CShellLink.cpp b/dll/win32/shell32/CShellLink.cpp index f83c6a9654e..3175b21f34b 100644 --- a/dll/win32/shell32/CShellLink.cpp +++ b/dll/win32/shell32/CShellLink.cpp @@ -2595,9 +2595,10 @@ HRESULT CShellLink::DoOpen(LPCMINVOKECOMMANDINFO lpici) HRESULT hr; LPWSTR args = NULL; LPWSTR path = strdupW(m_sPath); + BOOL unicode = lpici->cbSize >= FIELD_OFFSET(CMINVOKECOMMANDINFOEX, ptInvoke) && + (lpici->fMask & CMIC_MASK_UNICODE); - if ( lpici->cbSize == sizeof(CMINVOKECOMMANDINFOEX) && - (lpici->fMask & CMIC_MASK_UNICODE) ) + if (unicode) { LPCMINVOKECOMMANDINFOEX iciex = (LPCMINVOKECOMMANDINFOEX)lpici; SIZE_T len = 2; diff --git a/modules/rosapps/lib/vfdlib/vfdshmenu.cpp b/modules/rosapps/lib/vfdlib/vfdshmenu.cpp index 005a6e352d7..35a67142659 100644 --- a/modules/rosapps/lib/vfdlib/vfdshmenu.cpp +++ b/modules/rosapps/lib/vfdlib/vfdshmenu.cpp @@ -339,12 +339,16 @@ STDMETHODIMP CVfdShExt::InvokeCommand( DWORD ret; CMINVOKECOMMANDINFOEX *excmi = (CMINVOKECOMMANDINFOEX *)lpcmi; +#ifdef __REACTOS__ + unicode = lpcmi->cbSize >= FIELD_OFFSET(CMINVOKECOMMANDINFOEX, ptInvoke) && + (lpcmi->fMask & CMIC_MASK_UNICODE); +#else if (lpcmi->cbSize >= sizeof(CMINVOKECOMMANDINFOEX) && (lpcmi->fMask & CMIC_MASK_UNICODE)) { unicode = TRUE; } - +#endif if (!unicode && HIWORD(lpcmi->lpVerb)) {