From 2290d0e7855660a35bfddb7bffa93b4f7d892066 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Tue, 26 May 2026 10:55:59 +0900 Subject: [PATCH] [SDK][SYSDM] Enhance for associations (#9064) Preparation for new ShellExecute. JIRA issue: CORE-20467 - Move ASSOCQUERY and IAssociationElementOld in into . - Add IQuerySourceOld, IQuerySource, IObjectWithQuerySource, and IAssociationArrayInitialize interfaces into . - Add some GUIDs into . - Do #include in sysdm performance.c to fix build. --- dll/cpl/sysdm/performance.c | 1 + sdk/include/reactos/shlguid_undoc.h | 2 + sdk/include/reactos/shlobj_undoc.h | 193 +++++++++++++++++++++++++++- sdk/include/reactos/shlwapi_undoc.h | 53 -------- 4 files changed, 191 insertions(+), 58 deletions(-) diff --git a/dll/cpl/sysdm/performance.c b/dll/cpl/sysdm/performance.c index ac39515fcf6..127a08f39a4 100644 --- a/dll/cpl/sysdm/performance.c +++ b/dll/cpl/sysdm/performance.c @@ -10,6 +10,7 @@ #include "precomp.h" #include // CLSID_CRegTreeOptions #include // IRegTreeOptions +#include // SHSendMessageBroadcastW static VOID RegTreeOpt_OnDestroy(IRegTreeOptions *pRTO) diff --git a/sdk/include/reactos/shlguid_undoc.h b/sdk/include/reactos/shlguid_undoc.h index 79d90d60b81..50b5b1d2156 100644 --- a/sdk/include/reactos/shlguid_undoc.h +++ b/sdk/include/reactos/shlguid_undoc.h @@ -147,6 +147,8 @@ DEFINE_GUID(CLSID_MruPidlList, 0x42AEDC87, 0x2188, 0x41FD, 0xB9, 0xA DEFINE_GUID(IID_IMruPidlList, 0x47851649, 0xA2EF, 0x4E67, 0xBA, 0xEC, 0xC6, 0xA1, 0x53, 0xAC, 0x72, 0xEC); DEFINE_GUID(CLSID_MruLongList, 0x53BD6B4E, 0x3780, 0x4693, 0xAF, 0xC3, 0x71, 0x61, 0xC2, 0xF3, 0xEE, 0x9C); DEFINE_GUID(IID_IMruDataList, 0xFE787BCB, 0x0EE8, 0x44FB, 0x8C, 0x89, 0x12, 0xF5, 0x08, 0x91, 0x3C, 0x40); +DEFINE_GUID(IID_IQuerySourceOld, 0xC7478486, 0x7583, 0x49E7, 0xA6, 0xC2, 0xFA, 0xF8, 0xF0, 0x2B, 0xC3, 0x0E); +DEFINE_GUID(IID_IQuerySource, 0x7BC28AC2, 0x0D9C, 0x4941, 0xBB, 0x9A, 0x72, 0xBE, 0xCB, 0x18, 0x4F, 0xAC); /* The following list of interfaces was taken from here: http://www.geoffchappell.com/studies/windows/shell/shell32/interfaces/index.htm */ DEFINE_GUID(IID_IAggregateFilterCondition, 0x86228AA3, 0xA736, 0x4733, 0xBD, 0x8A, 0x10, 0xA8, 0x3C, 0x69, 0xBF, 0x84); diff --git a/sdk/include/reactos/shlobj_undoc.h b/sdk/include/reactos/shlobj_undoc.h index 8c7cf212f69..7c8498b55d8 100644 --- a/sdk/include/reactos/shlobj_undoc.h +++ b/sdk/include/reactos/shlobj_undoc.h @@ -4,13 +4,11 @@ * PURPOSE: Undocumented shell interface * COPYRIGHT: Copyright 2009 Andrew Hill * Copyright 2013 Dominik Hornung - * Copyright 2025 Katayama Hirofumi MZ + * Copyright 2026 Katayama Hirofumi MZ */ #pragma once -#include // For ASSOCQUERY - #ifdef __cplusplus extern "C" { #endif @@ -24,6 +22,26 @@ typedef struct tagSLOTITEMDATA typedef INT (CALLBACK *SLOTCOMPARE)(LPCVOID pvData1, LPCVOID pvData2, UINT cbData); +/***************************************************************************** + * ASSOCQUERY --- The type flags of association query + * + * @see IAssociationElementOld, IAssociationElement, IAssociationArrayOld, IAssociationArray + * @see https://www.geoffchappell.com/studies/windows/shell/shell32/api/assocelem/query.htm + */ +typedef DWORD ASSOCQUERY; +#define ASSOCQUERY_LOWORD_MASK 0x0000FFFF // The low-order word of flags +#define ASSOCQUERY_STRING 0x00010000 // Responds to QueryString method +#define ASSOCQUERY_EXISTS 0x00020000 // Responds to QueryExists method +#define ASSOCQUERY_DIRECT 0x00040000 // Responds to QueryDirect method +#define ASSOCQUERY_DWORD 0x00080000 // Responds to QueryDword method +#define ASSOCQUERY_INDIRECT 0x00100000 // Obtains resource string from QueryString +#define ASSOCQUERY_OBJECT 0x00200000 // Responds to QueryObject method +#define ASSOCQUERY_GUID 0x00400000 // Responds to QueryGuid method +#define ASSOCQUERY_EXTRA_NON_VERB 0x01000000 // Expects pszExtra for path or value +#define ASSOCQUERY_EXTRA_VERB 0x02000000 // Expects pszExtra for verb +#define ASSOCQUERY_SIGNIFICANCE 0x04000000 // Significance unknown +#define ASSOCQUERY_FALLBACK 0x80000000 // Fallback to secondary query source + /***************************************************************************** * New shellstate structure */ @@ -848,7 +866,144 @@ DECLARE_INTERFACE_(ITrayPriv, IUnknown) #endif /***************************************************************************** - * IAssociationElement interface + * IQuerySourceOld interface + * + * @see IQuerySource + * @see https://www.geoffchappell.com/studies/windows/shell/shlwapi/interfaces/iquerysource.htm + */ +#define INTERFACE IQuerySourceOld +DECLARE_INTERFACE_(IQuerySourceOld, IUnknown) // {C7478486-7583-49E7-A6C2-FAF8F02BC30E} +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IQuerySourceOld ***/ + STDMETHOD(EnumValues)(THIS_ IEnumString **ppEnum); + STDMETHOD(EnumSources)(THIS_ IEnumString **ppEnum); + STDMETHOD(QueryValueString)(THIS_ PCWSTR keyName, PCWSTR valueName, PWSTR *ppszValue); + STDMETHOD(QueryValueDword)(THIS_ PCWSTR keyName, PCWSTR valueName, DWORD *pdwValue); + STDMETHOD(QueryValueExists)(THIS_ PCWSTR keyName, PCWSTR valueName); + STDMETHOD(QueryValueDirect)(THIS_ PCWSTR keyName, PCWSTR valueName, FLAGGED_BYTE_BLOB **ppBlob); + STDMETHOD(OpenSource)(THIS_ PCWSTR keyName, BOOL, IQuerySourceOld **ppSource); + STDMETHOD(SetValueDirect)(THIS_ PCWSTR keyName, PCWSTR valueName, DWORD, DWORD, PBYTE); +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IQuerySourceOld_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IQuerySourceOld_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IQuerySourceOld_Release(T) (T)->lpVtbl->Release(T) +#define IQuerySourceOld_EnumValues(T,a) (T)->lpVtbl->EnumValues(T,a) +#define IQuerySourceOld_EnumSources(T,a) (T)->lpVtbl->EnumSources(T,a) +#define IQuerySourceOld_QueryValueString(T,a,b,c) (T)->lpVtbl->QueryValueString(T,a,b,c) +#define IQuerySourceOld_QueryValueDword(T,a,b,c) (T)->lpVtbl->QueryValueDword(T,a,b,c) +#define IQuerySourceOld_QueryValueExists(T,a,b) (T)->lpVtbl->QueryValueExists(T,a,b) +#define IQuerySourceOld_QueryValueDirect(T,a,b,c) (T)->lpVtbl->QueryValueDirect(T,a,b,c) +#define IQuerySourceOld_OpenSource(T,a,b,c) (T)->lpVtbl->OpenSource(T,a,b,c) +#define IQuerySourceOld_SetValueDirect(T,a,b,c,d,e) (T)->lpVtbl->SetValueDirect(T,a,b,c,d,e) +#endif + +/***************************************************************************** + * IQuerySource interface (new version) + * + * @see IQuerySourceOld + * @see https://www.geoffchappell.com/studies/windows/shell/shlwapi/interfaces/iquerysource.htm + */ +#define INTERFACE IQuerySource +DECLARE_INTERFACE_(IQuerySource, IUnknown) // {7BC28AC2-0D9C-4941-BB9A-72BECB184FAC} +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IQuerySource ***/ + STDMETHOD(EnumValues)(THIS_ IEnumString **ppEnum); + STDMETHOD(QueryValueString)(THIS_ PCWSTR keyName, PCWSTR valueName, PWSTR *ppszValue); + STDMETHOD(QueryValueDword)(THIS_ PCWSTR keyName, PCWSTR valueName, DWORD *pdwValue); + STDMETHOD(QueryValueGuid)(THIS_ PCWSTR keyName, PCWSTR valueName, GUID *guid); + STDMETHOD(QueryValueExists)(THIS_ PCWSTR keyName, PCWSTR valueName); + STDMETHOD(QueryValueDirect)(THIS_ PCWSTR keyName, PCWSTR valueName, FLAGGED_BYTE_BLOB **ppBlob); + STDMETHOD(EnumSources)(THIS_ IEnumString **ppEnum); + STDMETHOD(OpenSource)(THIS_ PCWSTR keyName, IQuerySource **ppSource); +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IQuerySource_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IQuerySource_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IQuerySource_Release(T) (T)->lpVtbl->Release(T) +#define IQuerySource_EnumValues(T,a) (T)->lpVtbl->EnumValues(T,a) +#define IQuerySource_QueryValueString(T,a,b,c) (T)->lpVtbl->QueryValueString(T,a,b,c) +#define IQuerySource_QueryValueDword(T,a,b,c) (T)->lpVtbl->QueryValueDword(T,a,b,c) +#define IQuerySource_QueryValueGuid(T,a,b,c) (T)->lpVtbl->QueryValueGuid(T,a,b,c) +#define IQuerySource_QueryValueExists(T,a,b) (T)->lpVtbl->QueryValueExists(T,a,b) +#define IQuerySource_QueryValueDirect(T,a,b,c) (T)->lpVtbl->QueryValueDirect(T,a,b,c) +#define IQuerySource_EnumSources(T,a) (T)->lpVtbl->EnumSources(T,a) +#define IQuerySource_OpenSource(T,a,b) (T)->lpVtbl->OpenSource(T,a,b) +#endif + +/***************************************************************************** + * IObjectWithQuerySource interface + * + * @see https://www.geoffchappell.com/studies/windows/shell/shell32/interfaces/iobjectwithquerysource.htm + */ +#define INTERFACE IObjectWithQuerySource +DECLARE_INTERFACE_(IObjectWithQuerySource, IUnknown) // {B3DCB623-4280-4EB1-84B3-8D07E84F299A} +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IObjectWithQuerySource ***/ + STDMETHOD(SetSource)(THIS_ IQuerySource *pSource); + STDMETHOD(GetSource)(THIS_ REFIID riid, PVOID *ppSource); +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IObjectWithQuerySource_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IObjectWithQuerySource_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IObjectWithQuerySource_Release(T) (T)->lpVtbl->Release(T) +#define IObjectWithQuerySource_SetSource(T,a) (T)->lpVtbl->SetSource(T,a) +#define IObjectWithQuerySource_GetSource(T,a,b) (T)->lpVtbl->GetSource(T,a,b) +#endif + +/***************************************************************************** + * IAssociationElementOld interface + * + * @see IAssociationElement + * @see https://www.geoffchappell.com/studies/windows/shell/shlwapi/interfaces/iassociationelement.htm + */ +#define INTERFACE IAssociationElementOld +DECLARE_INTERFACE_(IAssociationElementOld, IUnknown) // {E58B1ABF-9596-4DBA-8997-89DCDEF46992} +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IAssociationElementOld ***/ + STDMETHOD(QueryString)(THIS_ ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) PURE; + STDMETHOD(QueryDword)(THIS_ ASSOCQUERY query, PCWSTR key, DWORD *pdwValue) PURE; + STDMETHOD(QueryExists)(THIS_ ASSOCQUERY query, PCWSTR key) PURE; + STDMETHOD(QueryDirect)(THIS_ ASSOCQUERY query, PCWSTR key, FLAGGED_BYTE_BLOB **ppBlob) PURE; + STDMETHOD(QueryObject)(THIS_ ASSOCQUERY query, PCWSTR key, REFIID riid, PVOID *ppvObj) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IAssociationElementOld_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IAssociationElementOld_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IAssociationElementOld_Release(T) (T)->lpVtbl->Release(T) +#define IAssociationElementOld_QueryString(T,a,b,c) (T)->lpVtbl->QueryString(T,a,b,c) +#define IAssociationElementOld_QueryDword(T,a,b,c) (T)->lpVtbl->QueryDword(T,a,b,c) +#define IAssociationElementOld_QueryExists(T,a,b) (T)->lpVtbl->QueryExists(T,a,b) +#define IAssociationElementOld_QueryDirect(T,a,b,c) (T)->lpVtbl->QueryDirect(T,a,b,c) +#define IAssociationElementOld_QueryObject(T,a,b,c,d) (T)->lpVtbl->QueryObject(T,a,b,c,d) +#endif + +/***************************************************************************** + * IAssociationElement interface (new version) * * @see IAssociationElementOld * @see https://www.geoffchappell.com/studies/windows/shell/shlwapi/interfaces/iassociationelement.htm @@ -926,7 +1081,7 @@ DECLARE_INTERFACE_(IAssociationArrayOld, IUnknown) // {3B877E3C-67DE-4F9A-B29B-1 STDMETHOD_(ULONG,AddRef)(THIS) PURE; STDMETHOD_(ULONG,Release)(THIS) PURE; /*** IAssociationArrayOld ***/ - STDMETHOD(EnumElements)(THIS_ ULONG flags, IEnumAssociationElements **ppElement) PURE; + STDMETHOD(EnumElements)(THIS_ ULONG flags, IEnumAssociationElements **ppEnum) PURE; STDMETHOD(QueryString)(THIS_ ULONG flags, ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) PURE; STDMETHOD(QueryDword)(THIS_ ULONG flags, ASSOCQUERY query, PCWSTR key, DWORD *pdwValue) PURE; STDMETHOD(QueryExists)(THIS_ ULONG flags, ASSOCQUERY query, PCWSTR key) PURE; @@ -982,6 +1137,34 @@ DECLARE_INTERFACE_(IAssociationArray, IUnknown) // {19ADBAFD-1C5F-4FC7-94EE-8467 #define IAssociationArray_QueryObject(T,a,b,c,d) (T)->lpVtbl->QueryObject(T,a,b,c,d) #endif +/***************************************************************************** + * IAssociationArrayInitialize interface + * + * @see https://www.geoffchappell.com/studies/windows/shell/shell32/interfaces/iassociationarrayinitialize.htm + */ +#define INTERFACE IAssociationArrayInitialize +DECLARE_INTERFACE_(IAssociationArrayInitialize, IUnknown) // {EE9165BF-A4D9-474B-8236-6735CB7E28B6} +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IAssociationArrayInitialize ***/ + STDMETHOD(InitClassElements)(ULONG flags, PCWSTR pszClass); + STDMETHOD(InsertElements)(ULONG flags, IEnumAssociationElements *pEnum); + STDMETHOD(FilterElements)(ULONG filter); +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IAssociationArrayInitialize_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IAssociationArrayInitialize_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IAssociationArrayInitialize_Release(T) (T)->lpVtbl->Release(T) +#define IAssociationArrayInitialize_InitClassElements(T,a,b) (T)->lpVtbl->InitClassElements(T,a,b) +#define IAssociationArrayInitialize_InsertElements(T,a,b) (T)->lpVtbl->InsertElements(T,a,b) +#define IAssociationArrayInitialize_FilterElements(T,a) (T)->lpVtbl->FilterElements(T,a) +#endif + HANDLE WINAPI SHCreateDesktop(IShellDesktopTray*); BOOL WINAPI SHDesktopMessageLoop(HANDLE); HRESULT WINAPI SHCreateFileDataObject(PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IDataObject* pDataInner, IDataObject** ppDataObj); diff --git a/sdk/include/reactos/shlwapi_undoc.h b/sdk/include/reactos/shlwapi_undoc.h index 30f752a6a8d..84653a17b27 100644 --- a/sdk/include/reactos/shlwapi_undoc.h +++ b/sdk/include/reactos/shlwapi_undoc.h @@ -14,26 +14,6 @@ extern "C" { #endif -/***************************************************************************** - * ASSOCQUERY --- The type flags of association query - * - * @see IAssociationElementOld, IAssociationElement, IAssociationArrayOld, IAssociationArray - * @see https://www.geoffchappell.com/studies/windows/shell/shell32/api/assocelem/query.htm - */ -typedef DWORD ASSOCQUERY; -#define ASSOCQUERY_LOWORD_MASK 0x0000FFFF // The low-order word of flags -#define ASSOCQUERY_STRING 0x00010000 // Responds to QueryString method -#define ASSOCQUERY_EXISTS 0x00020000 // Responds to QueryExists method -#define ASSOCQUERY_DIRECT 0x00040000 // Responds to QueryDirect method -#define ASSOCQUERY_DWORD 0x00080000 // Responds to QueryDword method -#define ASSOCQUERY_INDIRECT 0x00100000 // Obtains resource string from QueryString -#define ASSOCQUERY_OBJECT 0x00200000 // Responds to QueryObject method -#define ASSOCQUERY_GUID 0x00400000 // Responds to QueryGuid method -#define ASSOCQUERY_EXTRA_NON_VERB 0x01000000 // Expects pszExtra for path or value -#define ASSOCQUERY_EXTRA_VERB 0x02000000 // Expects pszExtra for verb -#define ASSOCQUERY_SIGNIFICANCE 0x04000000 // Significance unknown -#define ASSOCQUERY_FALLBACK 0x80000000 // Fallback to secondary query source - #define SHELL_NO_POLICY ((DWORD)-1) typedef struct tagPOLICYDATA @@ -505,39 +485,6 @@ SHWindowsPolicyGetValue( #define E_DATATYPE_MISMATCH HRESULT_FROM_WIN32(ERROR_DATATYPE_MISMATCH) -/***************************************************************************** - * IAssociationElementOld interface - * - * @see IAssociationElement - * @see https://www.geoffchappell.com/studies/windows/shell/shlwapi/interfaces/iassociationelement.htm - */ -#define INTERFACE IAssociationElementOld -DECLARE_INTERFACE_(IAssociationElementOld, IUnknown) // {E58B1ABF-9596-4DBA-8997-89DCDEF46992} -{ - /*** IUnknown ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IAssociationElementOld ***/ - STDMETHOD(QueryString)(THIS_ ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) PURE; - STDMETHOD(QueryDword)(THIS_ ASSOCQUERY query, PCWSTR key, DWORD *pdwValue) PURE; - STDMETHOD(QueryExists)(THIS_ ASSOCQUERY query, PCWSTR key) PURE; - STDMETHOD(QueryDirect)(THIS_ ASSOCQUERY query, PCWSTR key, FLAGGED_BYTE_BLOB **ppBlob) PURE; - STDMETHOD(QueryObject)(THIS_ ASSOCQUERY query, PCWSTR key, REFIID riid, PVOID *ppvObj) PURE; -}; -#undef INTERFACE - -#ifdef COBJMACROS -#define IAssociationElementOld_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) -#define IAssociationElementOld_AddRef(T) (T)->lpVtbl->AddRef(T) -#define IAssociationElementOld_Release(T) (T)->lpVtbl->Release(T) -#define IAssociationElementOld_QueryString(T,a,b,c) (T)->lpVtbl->QueryString(T,a,b,c) -#define IAssociationElementOld_QueryDword(T,a,b,c) (T)->lpVtbl->QueryDword(T,a,b,c) -#define IAssociationElementOld_QueryExists(T,a,b) (T)->lpVtbl->QueryExists(T,a,b) -#define IAssociationElementOld_QueryDirect(T,a,b,c) (T)->lpVtbl->QueryDirect(T,a,b,c) -#define IAssociationElementOld_QueryObject(T,a,b,c,d) (T)->lpVtbl->QueryObject(T,a,b,c,d) -#endif - /***************************************************************************** * ZoneCheck* */