[SDK][SYSDM] Enhance <shlobj_undoc.h> for associations (#9064)

Preparation for new ShellExecute.
JIRA issue: CORE-20467
- Move ASSOCQUERY and
  IAssociationElementOld in
  <shlwapi_undoc.h> into
  <shlobj_undoc.h>.
- Add IQuerySourceOld, IQuerySource,
  IObjectWithQuerySource, and
  IAssociationArrayInitialize
  interfaces into <shlobj_undoc.h>.
- Add some GUIDs into
  <shlguid_undoc.h>.
- Do #include <shlwapi_undoc.h>
  in sysdm performance.c to fix build.
This commit is contained in:
Katayama Hirofumi MZ
2026-05-26 10:55:59 +09:00
committed by GitHub
parent dff8ac8270
commit 2290d0e785
4 changed files with 191 additions and 58 deletions
+1
View File
@@ -10,6 +10,7 @@
#include "precomp.h"
#include <shlguid_undoc.h> // CLSID_CRegTreeOptions
#include <shlobj_undoc.h> // IRegTreeOptions
#include <shlwapi_undoc.h> // SHSendMessageBroadcastW
static VOID
RegTreeOpt_OnDestroy(IRegTreeOptions *pRTO)
+2
View File
@@ -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);
+188 -5
View File
@@ -4,13 +4,11 @@
* PURPOSE: Undocumented shell interface
* COPYRIGHT: Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
* Copyright 2013 Dominik Hornung
* Copyright 2025 Katayama Hirofumi MZ <[email protected]>
* Copyright 2026 Katayama Hirofumi MZ <[email protected]>
*/
#pragma once
#include <shlwapi_undoc.h> // 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);
-53
View File
@@ -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*
*/