https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b68104a8a08a79a95a7426e3966f1d20769cc741

commit b68104a8a08a79a95a7426e3966f1d20769cc741
Author:     Katayama Hirofumi MZ <[email protected]>
AuthorDate: Fri Jan 17 13:36:20 2025 +0900
Commit:     GitHub <[email protected]>
CommitDate: Fri Jan 17 13:36:20 2025 +0900

    [SHELL32][SHELL32_APITEST][SDK] Implement SHShouldShowWizards (#7614)
    
    Implementing missing features...
    JIRA issue: CORE-19278
    - Move function definition from
      stubs.cpp into utils.cpp.
    - Add prototype to <undocshell.h>.
---
 dll/win32/shell32/stubs.cpp                        |  11 --
 dll/win32/shell32/utils.cpp                        |  30 +++++
 modules/rostests/apitests/shell32/CMakeLists.txt   |   1 +
 .../apitests/shell32/SHShouldShowWizards.cpp       | 123 +++++++++++++++++++++
 modules/rostests/apitests/shell32/testlist.c       |   2 +
 sdk/include/reactos/undocshell.h                   |   2 +
 6 files changed, 158 insertions(+), 11 deletions(-)

diff --git a/dll/win32/shell32/stubs.cpp b/dll/win32/shell32/stubs.cpp
index fa022eb6c07..d54e80c14af 100644
--- a/dll/win32/shell32/stubs.cpp
+++ b/dll/win32/shell32/stubs.cpp
@@ -896,17 +896,6 @@ SHSetUserPicturePathW(LPCWSTR lpPath, int csidl, LPVOID 
lpUnknown)
     return E_FAIL;
 }
 
-/*
- * Unimplemented
- */
-EXTERN_C BOOL
-WINAPI
-SHShouldShowWizards(LPVOID lpUnknown)
-{
-    FIXME("SHShouldShowWizards() stub\n");
-    return FALSE;
-}
-
 /*
  * Unimplemented
  */
diff --git a/dll/win32/shell32/utils.cpp b/dll/win32/shell32/utils.cpp
index 21e97461c52..c1761021e18 100644
--- a/dll/win32/shell32/utils.cpp
+++ b/dll/win32/shell32/utils.cpp
@@ -122,6 +122,36 @@ HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ 
LPITEMIDLIST *ppidl)
     return hr;
 }
 
+/*************************************************************************
+ *  SHShouldShowWizards [SHELL32.237]
+ *
+ * Used by printer and network features.
+ * @see https://undoc.airesoft.co.uk/shell32.dll/SHShouldShowWizards.php
+ */
+EXTERN_C
+HRESULT WINAPI
+SHShouldShowWizards(_In_ IUnknown *pUnknown)
+{
+    HRESULT hr;
+    IShellBrowser *pBrowser;
+
+    hr = IUnknown_QueryService(pUnknown, SID_STopWindow, 
IID_PPV_ARG(IShellBrowser, &pBrowser));
+    if (FAILED(hr))
+        return hr;
+
+    SHELLSTATE state;
+    SHGetSetSettings(&state, SSF_WEBVIEW, FALSE);
+    if (state.fWebView &&
+        
!SHRegGetBoolUSValueW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
+                              L"ShowWizardsTEST", FALSE, FALSE))
+    {
+        hr = S_FALSE;
+    }
+
+    pBrowser->Release();
+    return hr;
+}
+
 static BOOL
 OpenEffectiveToken(
     _In_ DWORD DesiredAccess,
diff --git a/modules/rostests/apitests/shell32/CMakeLists.txt 
b/modules/rostests/apitests/shell32/CMakeLists.txt
index cad67b40a19..10ef4004e7c 100644
--- a/modules/rostests/apitests/shell32/CMakeLists.txt
+++ b/modules/rostests/apitests/shell32/CMakeLists.txt
@@ -33,6 +33,7 @@ list(APPEND SOURCE
     SHCreateFileExtractIconW.cpp
     SHParseDisplayName.cpp
     SHRestricted.cpp
+    SHShouldShowWizards.cpp
     She.cpp
     ShellExecCmdLine.cpp
     ShellExecuteEx.cpp
diff --git a/modules/rostests/apitests/shell32/SHShouldShowWizards.cpp 
b/modules/rostests/apitests/shell32/SHShouldShowWizards.cpp
new file mode 100644
index 00000000000..07b2f5846e3
--- /dev/null
+++ b/modules/rostests/apitests/shell32/SHShouldShowWizards.cpp
@@ -0,0 +1,123 @@
+/*
+ * PROJECT:     ReactOS API tests
+ * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE:     Test for SHShouldShowWizards
+ * COPYRIGHT:   Copyright 2025 Katayama Hirofumi MZ 
([email protected])
+ */
+
+#include "shelltest.h"
+#include <undocshell.h>
+#include <versionhelpers.h>
+
+class CDummyClass
+    : public IServiceProvider
+    , public IShellBrowser
+{
+public:
+    CDummyClass() { }
+
+    IUnknown *GetUnknown()
+    {
+        return static_cast<IServiceProvider *>(this);
+    }
+
+    // *** IUnknown methods ***
+    STDMETHODIMP QueryInterface(REFIID riid, VOID **ppvObj) override
+    {
+        if (riid == IID_IUnknown || riid == IID_IServiceProvider)
+        {
+            AddRef();
+            *ppvObj = static_cast<IServiceProvider *>(this);
+            return S_OK;
+        }
+        return E_NOINTERFACE;
+    }
+    STDMETHODIMP_(ULONG) AddRef() override
+    {
+        return 1;
+    }
+    STDMETHODIMP_(ULONG) Release() override
+    {
+        return 1;
+    }
+
+    // *** IOleWindow methods ***
+    STDMETHODIMP GetWindow(HWND *phwnd) override { return E_NOTIMPL; }
+    STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override { return 
E_NOTIMPL; }
+
+    // *** IShellBrowser methods ***
+    STDMETHODIMP InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS 
lpMenuWidths) override { return E_NOTIMPL; }
+    STDMETHODIMP SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND 
hwndActiveObject) override { return E_NOTIMPL; }
+    STDMETHODIMP RemoveMenusSB(HMENU hmenuShared) override { return E_NOTIMPL; 
}
+    STDMETHODIMP SetStatusTextSB(LPCOLESTR pszStatusText) override { return 
E_NOTIMPL; }
+    STDMETHODIMP EnableModelessSB(BOOL fEnable) override { return E_NOTIMPL; }
+    STDMETHODIMP TranslateAcceleratorSB(MSG *pmsg, WORD wID) override { return 
E_NOTIMPL; }
+    STDMETHODIMP BrowseObject(LPCITEMIDLIST pidl, UINT wFlags) override { 
return E_NOTIMPL; }
+    STDMETHODIMP GetViewStateStream(DWORD grfMode, IStream **ppStrm) override 
{ return E_NOTIMPL; }
+    STDMETHODIMP GetControlWindow(UINT id, HWND *lphwnd) override { return 
E_NOTIMPL; }
+    STDMETHODIMP SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM 
lParam, LRESULT *pret) override { return E_NOTIMPL; }
+    STDMETHODIMP QueryActiveShellView(struct IShellView **ppshv) override { 
return E_NOTIMPL; }
+    STDMETHODIMP OnViewWindowActive(struct IShellView *ppshv) override { 
return E_NOTIMPL; }
+    STDMETHODIMP SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT 
uFlags) override { return E_NOTIMPL; }
+
+    // *** IServiceProvider methods ***
+    STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void 
**ppvObject) override
+    {
+        if (riid == IID_IShellBrowser)
+        {
+            AddRef();
+            *ppvObject = static_cast<IShellBrowser *>(this);
+            return S_OK;
+        }
+        return E_FAIL;
+    }
+};
+
+static VOID SetShowWizardsTEST(BOOL bValue)
+{
+    DWORD dwValue = bValue;
+    
SHRegSetUSValueW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
+                     L"ShowWizardsTEST", REG_DWORD, &dwValue, sizeof(dwValue), 
SHREGSET_FORCE_HKCU);
+}
+
+START_TEST(SHShouldShowWizards)
+{
+    // Save old values
+    SHELLSTATE state;
+    SHGetSetSettings(&state, SSF_WEBVIEW, FALSE);
+    BOOL bOldWebView = state.fWebView;
+    BOOL bOldTestValue = SHRegGetBoolUSValueW(
+        L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
+        L"ShowWizardsTEST",
+        FALSE,
+        FALSE);
+
+    CDummyClass dummy;
+    HRESULT hr;
+    const BOOL bVistaPlus = IsWindowsVistaOrGreater();
+
+    state.fWebView = FALSE;
+    SHGetSetSettings(&state, SSF_WEBVIEW, TRUE);
+    SetShowWizardsTEST(FALSE);
+    hr = SHShouldShowWizards(dummy.GetUnknown());
+    ok_hex(hr, bVistaPlus ? S_FALSE : S_OK);
+
+    SetShowWizardsTEST(TRUE);
+    hr = SHShouldShowWizards(dummy.GetUnknown());
+    ok_hex(hr, bVistaPlus ? S_FALSE : S_OK);
+
+    state.fWebView = TRUE;
+    SHGetSetSettings(&state, SSF_WEBVIEW, TRUE);
+    SetShowWizardsTEST(FALSE);
+    hr = SHShouldShowWizards(dummy.GetUnknown());
+    ok_hex(hr, S_FALSE);
+
+    SetShowWizardsTEST(TRUE);
+    hr = SHShouldShowWizards(dummy.GetUnknown());
+    ok_hex(hr, bVistaPlus ? S_FALSE : S_OK);
+
+    // Restore old values
+    state.fWebView = bOldWebView;
+    SHGetSetSettings(&state, SSF_WEBVIEW, TRUE);
+    SetShowWizardsTEST(bOldTestValue);
+}
diff --git a/modules/rostests/apitests/shell32/testlist.c 
b/modules/rostests/apitests/shell32/testlist.c
index 87f924f9f23..0da5972b358 100644
--- a/modules/rostests/apitests/shell32/testlist.c
+++ b/modules/rostests/apitests/shell32/testlist.c
@@ -45,6 +45,7 @@ extern void func_SHGetFileInfo(void);
 extern void func_SHGetUserDisplayName(void);
 extern void func_SHLimitInputEdit(void);
 extern void func_SHParseDisplayName(void);
+extern void func_SHShouldShowWizards(void);
 extern void func_SHSimpleIDListFromPath(void);
 extern void func_SHRestricted(void);
 
@@ -92,6 +93,7 @@ const struct test winetest_testlist[] =
     { "SHGetUserDisplayName", func_SHGetUserDisplayName },
     { "SHLimitInputEdit", func_SHLimitInputEdit },
     { "SHParseDisplayName", func_SHParseDisplayName },
+    { "SHShouldShowWizards", func_SHShouldShowWizards },
     { "SHSimpleIDListFromPath", func_SHSimpleIDListFromPath },
     { "SHRestricted", func_SHRestricted },
 
diff --git a/sdk/include/reactos/undocshell.h b/sdk/include/reactos/undocshell.h
index 76e78372dd1..3e685e08046 100644
--- a/sdk/include/reactos/undocshell.h
+++ b/sdk/include/reactos/undocshell.h
@@ -204,6 +204,8 @@ int  WINAPI SHOutOfMemoryMessageBox(
     LPCSTR lpCaption,
     UINT uType);
 
+HRESULT WINAPI SHShouldShowWizards(_In_ IUnknown *pUnknown);
+
 DWORD WINAPI SHNetConnectionDialog(
     HWND hwndOwner,
     LPCWSTR lpstrRemoteName,

Reply via email to