[SHELL32][SHELL32_APITEST][SDK] SHIsBadInterfacePtr (#7664)

Implementing missing features...
JIRA issue: CORE-19278
- Move function definition from
  stubs.cpp to utils.cpp.
- Implement SHIsBadInterfacePtr
  function in utils.cpp.
- Add prototype to <undocshell.h>.
This commit is contained in:
Katayama Hirofumi MZ 2025-01-26 19:24:24 +09:00 committed by GitHub
parent e302bacd7e
commit a58bf95914
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 85 additions and 11 deletions

View file

@ -566,17 +566,6 @@ DDECreatePostNotify(LPVOID lpUnknown)
return NULL;
}
/*
* Unimplemented
*/
EXTERN_C BOOL
WINAPI
SHIsBadInterfacePtr(LPVOID pv, UINT ucb)
{
FIXME("SHIsBadInterfacePtr() stub\n");
return FALSE;
}
/*
* Unimplemented
*/

View file

@ -1809,6 +1809,30 @@ SHELL_CreateShell32DefaultExtractIcon(int IconIndex, REFIID riid, LPVOID *ppvOut
return initIcon->QueryInterface(riid, ppvOut);
}
/*************************************************************************
* SHIsBadInterfacePtr [SHELL32.84]
*
* Retired in 6.0 from Windows Vista and higher.
*/
EXTERN_C
BOOL WINAPI
SHIsBadInterfacePtr(
_In_ LPCVOID pv,
_In_ UINT_PTR ucb)
{
struct CUnknownVtbl
{
HRESULT (STDMETHODCALLTYPE *QueryInterface)(REFIID riid, LPVOID *ppvObj);
ULONG (STDMETHODCALLTYPE *AddRef)();
ULONG (STDMETHODCALLTYPE *Release)();
};
struct CUnknown { CUnknownVtbl *lpVtbl; };
const CUnknown *punk = reinterpret_cast<const CUnknown *>(pv);
return !punk || IsBadReadPtr(punk, sizeof(punk->lpVtbl)) ||
IsBadReadPtr(punk->lpVtbl, ucb) ||
IsBadCodePtr((FARPROC)punk->lpVtbl->Release);
}
/*************************************************************************
* SHGetUserDisplayName [SHELL32.241]
*

View file

@ -32,6 +32,7 @@ list(APPEND SOURCE
SHCreateFileDataObject.cpp
SHCreateFileExtractIconW.cpp
SHGetUnreadMailCountW.cpp
SHIsBadInterfacePtr.cpp
SHParseDisplayName.cpp
SHRestricted.cpp
SHShouldShowWizards.cpp

View file

@ -0,0 +1,53 @@
/*
* PROJECT: ReactOS API tests
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
* PURPOSE: Test for SHIsBadInterfacePtr
* COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#include "shelltest.h"
#include <undocshell.h>
typedef BOOL (WINAPI *FN_SHIsBadInterfacePtr)(LPCVOID, UINT_PTR);
static HRESULT STDMETHODCALLTYPE dummy_QueryInterface(REFIID riid, LPVOID *ppvObj) { return S_OK; }
static ULONG STDMETHODCALLTYPE dummy_AddRef() { return S_OK; }
static ULONG STDMETHODCALLTYPE dummy_Release() { return S_OK; }
START_TEST(SHIsBadInterfacePtr)
{
struct CUnknownVtbl
{
HRESULT (STDMETHODCALLTYPE *QueryInterface)(REFIID riid, LPVOID *ppvObj);
ULONG (STDMETHODCALLTYPE *AddRef)();
ULONG (STDMETHODCALLTYPE *Release)();
};
struct CUnknown { CUnknownVtbl *lpVtbl; };
BOOL ret;
FN_SHIsBadInterfacePtr SHIsBadInterfacePtr =
(FN_SHIsBadInterfacePtr)GetProcAddress(GetModuleHandleW(L"shell32"), MAKEINTRESOURCEA(84));
if (!SHIsBadInterfacePtr)
{
skip("There is no SHIsBadInterfacePtr\n");
return;
}
ret = SHIsBadInterfacePtr(NULL, 1);
ok_int(ret, TRUE);
CUnknown unk1 = { NULL };
ret = SHIsBadInterfacePtr(&unk1, 1);
ok_int(ret, TRUE);
CUnknownVtbl vtbl1 = { dummy_QueryInterface, dummy_AddRef, NULL };
CUnknown unk2 = { &vtbl1 };
ret = SHIsBadInterfacePtr(&unk2, 1);
ok_int(ret, TRUE);
CUnknownVtbl vtbl2 = { dummy_QueryInterface, dummy_AddRef, dummy_Release };
CUnknown unk3 = { &vtbl2 };
ret = SHIsBadInterfacePtr(&unk3, 1);
ok_int(ret, FALSE);
}

View file

@ -46,6 +46,7 @@ extern void func_SHGetAttributesFromDataObject(void);
extern void func_SHGetFileInfo(void);
extern void func_SHGetUnreadMailCountW(void);
extern void func_SHGetUserDisplayName(void);
extern void func_SHIsBadInterfacePtr(void);
extern void func_SHLimitInputEdit(void);
extern void func_SHParseDisplayName(void);
extern void func_SHShouldShowWizards(void);
@ -99,6 +100,7 @@ const struct test winetest_testlist[] =
{ "SHGetFileInfo", func_SHGetFileInfo },
{ "SHGetUnreadMailCountW", func_SHGetUnreadMailCountW },
{ "SHGetUserDisplayName", func_SHGetUserDisplayName },
{ "SHIsBadInterfacePtr", func_SHIsBadInterfacePtr },
{ "SHLimitInputEdit", func_SHLimitInputEdit },
{ "SHParseDisplayName", func_SHParseDisplayName },
{ "SHShouldShowWizards", func_SHShouldShowWizards },

View file

@ -954,6 +954,11 @@ LONG WINAPI SHRegQueryValueExW(
#define SHRegQueryValueEx SHRegQueryValueExA
#endif
BOOL WINAPI
SHIsBadInterfacePtr(
_In_ LPCVOID pv,
_In_ UINT_PTR ucb);
HRESULT WINAPI
CopyStreamUI(
_In_ IStream *pSrc,