ReactOS 0.4.17-dev-966-gf06eace
CSnapin.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Management Console
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Retrieve / store information about a snapin
5 * COPYRIGHT: Copyright 2017-2019 Mark Jansen (mark.jansen@reactos.org)
6 * Copyright 2026 Eric Kohl (eric.kohl@reactos.org)
7 */
8
9#include "precomp.h"
10
11// https://web.archive.org/web/20010614160959/msdn.microsoft.com/library/psdk/mmc/mmc12apx02_8jc5.htm
12// https://msdn.microsoft.com/en-us/library/aa814846(v=vs.85).aspx
13
14
15// https://msdn.microsoft.com/en-us/library/aa815510(v=vs.85).aspx
16// MMC initializes a snap-in by calling the Initialize method of the IComponentData object.
17// During initialization, IComponentData should query the console for its IConsoleNamespace and IConsole interfaces using
18// the console's IUnknown interface pointer that is passed into the call to Initialize.
19// The snap-in should then cache the returned pointers and use them for calling IConsoleNamespace and IConsole interface methods.
20
21
23 :m_CacheEntry(CacheEntry)
24{
25 if (displayName)
27 else
29}
30
32{
34}
35
36const CAtlString& CSnapin::Name() const { return m_CacheEntry->Name(); }
39const CAtlString& CSnapin::Version() const { return m_CacheEntry->Version(); }
41
43{
44 m_DisplayName = pszName;
45}
46
48{
49 return m_CacheEntry;
50}
51
52void
54{
55 CSnapin *SubNode;
56 POSITION pos = m_SubNodes.GetHeadPosition();
57 while (pos != NULL)
58 {
59 SubNode = (CSnapin*)m_SubNodes.GetNext(pos);
60 if (SubNode)
61 delete SubNode;
62 }
63 m_SubNodes.RemoveAll();
64}
65
66void
68{
69#if 0
70 CComPtr<IComponentData> spComponentData;
71 HRESULT hr = CoCreateInstance(m_Guid, NULL, CLSCTX_INPROC, IID_PPV_ARG(IComponentData, &spComponentData));
72
73 if (SUCCEEDED(hr))
74 {
75 //CComPtr<IExtendPropertySheet> spPropertySheet;
76 }
77#endif
78}
79
80void
82{
83#if 0
84 CComPtr<IComponentData> spComponentData;
85 HRESULT hr = CoCreateInstance(m_Guid, NULL, CLSCTX_INPROC, IID_PPV_ARG(IComponentData, &spComponentData));
86
87 if (SUCCEEDED(hr))
88 {
89 hr = spComponentData->Initialize(console);
90 // CComponentData::CreatePropertyPages(
91 if (SUCCEEDED(hr))
92 {
93 SCOPEDATAITEM item = { 0 };
94 item.mask = SDI_STR | SDI_IMAGE | SDI_OPENIMAGE;
95
96 hr = spComponentData->GetDisplayInfo(&item);
97
98 printf("%S\n", item.displayname);
99
100
101 CComPtr<IDataObject> spDataObject;
102
103 hr = spComponentData->QueryDataObject(NULL, CCT_SCOPE, &spDataObject);
104
105 if (SUCCEEDED(hr))
106 {
107 //spDataObject->
108 }
109 }
110 }
111#endif
112}
113
114VOID
116{
117 IXMLDOMElement *pNodeElement = NULL;
118 IXMLDOMElement *pNodesElement = NULL;
119 IXMLDOMElement *pStringElement = NULL;
120 IXMLDOMElement *pBitmapsElement = NULL;
121 IXMLDOMElement *pComponentDatasElement = NULL;
122 IXMLDOMElement *pComponentDataElement = NULL;
123 IXMLDOMElement *pComponentsElement = NULL;
125 CSnapin *SubNode;
126 HRESULT hr = S_OK;
127
128 /* <Node ID="3" ImageIdx="0" CLSID="{C96401CC-0E17-11D3-885B-00C04F72C717}" Preload="true"> */
129 CHK_HR(mscFile->CreateAndAddElementNode(L"Node", pParentNode, &pNodeElement));
130 CHK_HR(mscFile->CreateAndAddAttributeNode(L"ID", L"0", pNodeElement)); /* FIXME */
131 CHK_HR(mscFile->CreateAndAddAttributeNode(L"ImageIdx", L"0", pNodeElement)); /* FIXME */
132 CHK_HR(mscFile->CreateAndAddAttributeNode(L"CLSID", CacheEntry()->GuidString().GetString(), pNodeElement));
133 CHK_HR(mscFile->CreateAndAddAttributeNode(L"Preload", L"true", pNodeElement)); /* FIXME */
134
135 /* <Nodes> */
136 CHK_HR(mscFile->CreateAndAddElementNode(L"Nodes", pNodeElement, &pNodesElement));
137 pos = m_SubNodes.GetHeadPosition();
138 while (pos != NULL)
139 {
140 SubNode = (CSnapin*)m_SubNodes.GetNext(pos);
141 if (SubNode)
142 SubNode->SaveNode(mscFile, pNodesElement);
143 }
144 SAFE_RELEASE(pNodesElement); /* </Nodes> */
145
146 /* <String Name="Name" ID="2"/> */
147 CHK_HR(mscFile->CreateAndAddElementNode(L"String", pNodeElement, &pStringElement));
148 CHK_HR(mscFile->CreateAndAddAttributeNode(L"Name", m_DisplayName.GetString(), pStringElement)); /* FIXME */
149 SAFE_RELEASE(pStringElement); /* </String> */
150
151 /* <Bitmaps> */
152 CHK_HR(mscFile->CreateAndAddElementNode(L"Bitmaps", pNodeElement, &pBitmapsElement));
153/*
154 <BinaryData Name="Small" BinaryRefIndex="3"/>
155 <BinaryData Name="Large" BinaryRefIndex="4"/>
156*/
157 SAFE_RELEASE(pBitmapsElement); /* </Bitmaps> */
158
159 /* <ComponentDatas> */
160 CHK_HR(mscFile->CreateAndAddElementNode(L"ComponentDatas", pNodeElement, &pComponentDatasElement));
161 /* <ComponentData> */
162 CHK_HR(mscFile->CreateAndAddElementNode(L"ComponentData", pComponentDatasElement, &pComponentDataElement));
163/*
164 <GUID Name="Snapin">{C96401CC-0E17-11D3-885B-00C04F72C717}</GUID>
165 <Stream BinaryRefIndex="5"/>
166*/
167 SAFE_RELEASE(pComponentDataElement); /* </ComponentData> */
168 SAFE_RELEASE(pComponentDatasElement); /* </ComponentDatas> */
169
170 /* <Components /> */
171 CHK_HR(mscFile->CreateAndAddElementNode(L"Components", pNodeElement, &pComponentsElement));
172 SAFE_RELEASE(pComponentsElement); /* </Components> */
173
174CleanUp:
175 SAFE_RELEASE(pNodeElement); /* </Node> */
176}
#define IID_PPV_ARG(Itype, ppType)
static HRESULT GetString(ASSOCSTR Str, UINT Flags, LPCWSTR pszAssoc, LPCWSTR pszExtra, PWSTR Out, HKEY hProgId=NULL)
PXSTR GetString() noexcept
Definition: atlsimpstr.h:367
const CAtlString & Description() const
const CAtlString & Version() const
const CAtlString & Provider() const
const CAtlString & Name() const
void OnAccept(IConsole *console)
Definition: CSnapin.cpp:81
~CSnapin()
Definition: CSnapin.cpp:31
void OnAdd(IConsole *console)
Definition: CSnapin.cpp:67
CAtlString m_DisplayName
Definition: CSnapin.h:27
CSnapinCacheEntry * CacheEntry()
Definition: CSnapin.cpp:47
const CAtlString & Name() const
Definition: CSnapin.cpp:36
const CAtlString & Provider() const
Definition: CSnapin.cpp:37
const CAtlString & DisplayName() const
Definition: CSnapin.cpp:40
CSnapinCacheEntry * m_CacheEntry
Definition: CSnapin.h:26
VOID SaveNode(MscFile *mscFile, IXMLDOMElement *pParentNode)
Definition: CSnapin.cpp:115
void RemoveAllSubnodes()
Definition: CSnapin.cpp:53
const CAtlString & Description() const
Definition: CSnapin.cpp:38
CAtlList< CSnapin * > m_SubNodes
Definition: CSnapin.h:44
CSnapin(CSnapinCacheEntry *CacheEntry, PWSTR displayName=NULL)
Definition: CSnapin.cpp:22
const CAtlString & Version() const
Definition: CSnapin.cpp:39
void SetDisplayName(LPWSTR pszName)
Definition: CSnapin.cpp:42
HRESULT CreateAndAddAttributeNode(PCWSTR wszName, PCWSTR wszValue, IXMLDOMElement *pParent)
Definition: mscfile.cpp:135
HRESULT CreateAndAddElementNode(PCWSTR wszName, IXMLDOMNode *pParent, IXMLDOMElement **ppElement=NULL)
Definition: mscfile.cpp:199
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
#define L(x)
Definition: resources.c:13
#define printf
Definition: freeldr.h:103
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
@ CCT_SCOPE
Definition: mmc.idl:88
static PWSTR GuidString
Definition: apphelp.c:93
#define SAFE_RELEASE(p)
Definition: mscfile.h:15
#define CHK_HR(stmt)
Definition: mscfile.h:9
char displayName[]
Definition: tftpd.cpp:35
uint16_t * PWSTR
Definition: typedefs.h:56
uint16_t * LPWSTR
Definition: typedefs.h:56