mirror of
https://github.com/reactos/reactos.git
synced 2025-06-06 01:40:36 +00:00
[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:
parent
e302bacd7e
commit
a58bf95914
6 changed files with 85 additions and 11 deletions
|
@ -566,17 +566,6 @@ DDECreatePostNotify(LPVOID lpUnknown)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Unimplemented
|
|
||||||
*/
|
|
||||||
EXTERN_C BOOL
|
|
||||||
WINAPI
|
|
||||||
SHIsBadInterfacePtr(LPVOID pv, UINT ucb)
|
|
||||||
{
|
|
||||||
FIXME("SHIsBadInterfacePtr() stub\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unimplemented
|
* Unimplemented
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1809,6 +1809,30 @@ SHELL_CreateShell32DefaultExtractIcon(int IconIndex, REFIID riid, LPVOID *ppvOut
|
||||||
return initIcon->QueryInterface(riid, 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]
|
* SHGetUserDisplayName [SHELL32.241]
|
||||||
*
|
*
|
||||||
|
|
|
@ -32,6 +32,7 @@ list(APPEND SOURCE
|
||||||
SHCreateFileDataObject.cpp
|
SHCreateFileDataObject.cpp
|
||||||
SHCreateFileExtractIconW.cpp
|
SHCreateFileExtractIconW.cpp
|
||||||
SHGetUnreadMailCountW.cpp
|
SHGetUnreadMailCountW.cpp
|
||||||
|
SHIsBadInterfacePtr.cpp
|
||||||
SHParseDisplayName.cpp
|
SHParseDisplayName.cpp
|
||||||
SHRestricted.cpp
|
SHRestricted.cpp
|
||||||
SHShouldShowWizards.cpp
|
SHShouldShowWizards.cpp
|
||||||
|
|
53
modules/rostests/apitests/shell32/SHIsBadInterfacePtr.cpp
Normal file
53
modules/rostests/apitests/shell32/SHIsBadInterfacePtr.cpp
Normal 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);
|
||||||
|
}
|
|
@ -46,6 +46,7 @@ extern void func_SHGetAttributesFromDataObject(void);
|
||||||
extern void func_SHGetFileInfo(void);
|
extern void func_SHGetFileInfo(void);
|
||||||
extern void func_SHGetUnreadMailCountW(void);
|
extern void func_SHGetUnreadMailCountW(void);
|
||||||
extern void func_SHGetUserDisplayName(void);
|
extern void func_SHGetUserDisplayName(void);
|
||||||
|
extern void func_SHIsBadInterfacePtr(void);
|
||||||
extern void func_SHLimitInputEdit(void);
|
extern void func_SHLimitInputEdit(void);
|
||||||
extern void func_SHParseDisplayName(void);
|
extern void func_SHParseDisplayName(void);
|
||||||
extern void func_SHShouldShowWizards(void);
|
extern void func_SHShouldShowWizards(void);
|
||||||
|
@ -99,6 +100,7 @@ const struct test winetest_testlist[] =
|
||||||
{ "SHGetFileInfo", func_SHGetFileInfo },
|
{ "SHGetFileInfo", func_SHGetFileInfo },
|
||||||
{ "SHGetUnreadMailCountW", func_SHGetUnreadMailCountW },
|
{ "SHGetUnreadMailCountW", func_SHGetUnreadMailCountW },
|
||||||
{ "SHGetUserDisplayName", func_SHGetUserDisplayName },
|
{ "SHGetUserDisplayName", func_SHGetUserDisplayName },
|
||||||
|
{ "SHIsBadInterfacePtr", func_SHIsBadInterfacePtr },
|
||||||
{ "SHLimitInputEdit", func_SHLimitInputEdit },
|
{ "SHLimitInputEdit", func_SHLimitInputEdit },
|
||||||
{ "SHParseDisplayName", func_SHParseDisplayName },
|
{ "SHParseDisplayName", func_SHParseDisplayName },
|
||||||
{ "SHShouldShowWizards", func_SHShouldShowWizards },
|
{ "SHShouldShowWizards", func_SHShouldShowWizards },
|
||||||
|
|
|
@ -954,6 +954,11 @@ LONG WINAPI SHRegQueryValueExW(
|
||||||
#define SHRegQueryValueEx SHRegQueryValueExA
|
#define SHRegQueryValueEx SHRegQueryValueExA
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
BOOL WINAPI
|
||||||
|
SHIsBadInterfacePtr(
|
||||||
|
_In_ LPCVOID pv,
|
||||||
|
_In_ UINT_PTR ucb);
|
||||||
|
|
||||||
HRESULT WINAPI
|
HRESULT WINAPI
|
||||||
CopyStreamUI(
|
CopyStreamUI(
|
||||||
_In_ IStream *pSrc,
|
_In_ IStream *pSrc,
|
||||||
|
|
Loading…
Reference in a new issue