ReactOS 0.4.17-dev-769-g1500a35
mscfile.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS MMC
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: .msc file parser
5 * COPYRIGHT: Copyright 2026 Whindmar Saksit <whindsaks@proton.me>
6 */
7
8#define COBJMACROS
9#include "precomp.h"
10#include <oleauto.h>
11#include <oaidl.h>
12#include <shlwapi.h>
13#include <initguid.h> /* For CLSID_DOMDocument30 */
14#include <msxml2.h>
15
17{
20 BSTR bsname = SysAllocString(name);
21 *pout = NULL;
22 if (bsname && SUCCEEDED(hr = IXMLDOMNode_get_attributes(pnode, &pmap)))
23 {
24 if (SUCCEEDED(hr = IXMLDOMNamedNodeMap_getNamedItem(pmap, bsname, &pnode)))
25 {
27 if (pnode)
28 {
29 hr = IXMLDOMNode_get_text(pnode, pout);
30 if (SUCCEEDED(hr) && !*pout)
32 IXMLDOMNode_Release(pnode);
33 }
34 }
35 IXMLDOMNamedNodeMap_Release(pmap);
36 }
37 SysFreeString(bsname);
38 return hr;
39}
40
42{
44 IXMLDOMNodeList *pnl;
45 BSTR bsname = SysAllocString(name);
46 *ppout = NULL;
47 if (bsname && SUCCEEDED(hr = IXMLDOMElement_getElementsByTagName(pelem, bsname, &pnl)))
48 {
49 hr = IXMLDOMNodeList_get_item(pnl, index, ppout);
50 if (SUCCEEDED(hr) && !*ppout)
52 IUnknown_Release(pnl);
53 }
54 SysFreeString(bsname);
55 return hr;
56}
57
59{
60 IXMLDOMElement *pelem;
61 HRESULT hr = IUnknown_QueryInterface(punk, &IID_IXMLDOMElement, (void**)&pelem);
62 if (FAILED(hr))
63 {
64 *ppout = NULL;
65 return hr;
66 }
67 hr = xmldomelem_getelembytag(pelem, name, index, ppout);
68 IUnknown_Release(pelem);
69 return hr;
70}
71
73{
74 VARIANT_BOOL succ = VARIANT_FALSE;
75 IXMLDOMDocument *pDoc;
76 HRESULT hr = CoCreateInstance(&CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER,
77 &IID_IXMLDOMDocument, (void**)&pDoc);
78 if (FAILED(hr))
79 return hr;
80 else if (SUCCEEDED(hr = IXMLDOMDocument_load(pDoc, *pVarUrl, &succ)) && succ)
81 hr = IXMLDOMDocument_get_documentElement(pDoc, ppDocElm);
82 else if (SUCCEEDED(hr))
83 hr = E_FAIL;
84 IUnknown_Release(pDoc);
85 return hr;
86}
87
88static HRESULT GetMscRootNode(PCWSTR pszFilePath, IXMLDOMNode **ppRoot)
89{
90 HRESULT hr;
91 DWORD len = lstrlenW(pszFilePath);
92 DWORD cch = sizeof("file:///") + (len * 2); /* Doubling the length is overkill but we don't know how many escaped characters there are */
93 PWSTR pszUrl = LocalAlloc(LPTR, cch * sizeof(*pszUrl));
94 if (!pszUrl)
95 return E_OUTOFMEMORY;
96 hr = UrlCreateFromPathW(pszFilePath, pszUrl, &cch, 0);
97 if (SUCCEEDED(hr))
98 {
99 IXMLDOMElement *pDocElm;
100 BSTR bsurl = SysAllocString(pszUrl);
101 VARIANT v;
102 V_VT(&v) = VT_BSTR;
103 V_BSTR(&v) = bsurl;
104 hr = bsurl ? LoadXmlFromVariant(&v, &pDocElm) : E_OUTOFMEMORY;
105 VariantClear(&v);
106 LocalFree(pszUrl);
107 if (SUCCEEDED(hr))
108 {
109 BSTR bs = 0;
110 hr = IXMLDOMElement_get_nodeName(pDocElm, &bs);
111 if (SUCCEEDED(hr))
112 {
113 hr = lstrcmpiW(bs, L"MMC_ConsoleFile") ? HRESULT_FROM_WIN32(ERROR_BAD_FORMAT) : S_OK;
115 if (SUCCEEDED(hr))
116 hr = IUnknown_QueryInterface(pDocElm, &IID_IXMLDOMNode, (void**)ppRoot);
117 }
118 IUnknown_Release(pDocElm);
119 }
120 }
121 return hr;
122}
123
125{
126 BOOL result = FALSE;
127 IXMLDOMNode *pRoot;
128 HRESULT hrCom = CoInitialize(NULL);
129
130 int argc;
131 LPWSTR *argv = CommandLineToArgvW(pszCmdLine, &argc);
132 if (argv && argc > 0)
133 {
134 if (SUCCEEDED(GetMscRootNode(argv[0], &pRoot)))
135 {
136 IXMLDOMNode *pNode;
137 HRESULT hr = xmldomunk_getelembytag((IUnknown*)pRoot, L"RosLaunch", 0, &pNode);
138 IUnknown_Release(pRoot);
139 if (SUCCEEDED(hr))
140 {
142 SHELLEXECUTEINFOW sei = { sizeof(sei), flags, NULL, NULL, NULL, NULL, NULL, SW_SHOW };
143 if (SUCCEEDED(xmldomnode_getattributevalue(pNode, L"File", (BSTR*)&sei.lpFile)))
144 {
145 xmldomnode_getattributevalue(pNode, L"Parameters", (BSTR*)&sei.lpParameters);
146 result = sei.lpFile && *sei.lpFile && ShellExecuteExW(&sei);
149 }
150 IUnknown_Release(pNode);
151 }
152 }
154 }
155
156 if (SUCCEEDED(hrCom))
158 return result;
159}
#define EXTERN_C
Definition: basetyps.h:12
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
OLECHAR * BSTR
Definition: compat.h:2293
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
short VARIANT_BOOL
Definition: compat.h:2290
@ VT_BSTR
Definition: compat.h:2303
#define lstrlenW
Definition: compat.h:750
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4171
HRESULT WINAPI UrlCreateFromPathW(const WCHAR *path, WCHAR *url, DWORD *url_len, DWORD reserved)
Definition: path.c:4892
MonoAssembly int argc
Definition: metahost.c:107
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:531
WCHAR **WINAPI CommandLineToArgvW(const WCHAR *cmdline, int *numargs)
Definition: main.c:294
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
const GLdouble * v
Definition: gl.h:2040
GLuint index
Definition: glext.h:6031
GLbitfield flags
Definition: glext.h:7161
GLuint64EXT * result
Definition: glext.h:11304
GLenum GLsizei len
Definition: glext.h:6722
unsigned int UINT
Definition: sysinfo.c:13
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define LPTR
Definition: minwinbase.h:93
static struct msdos_boot_sector bs
Definition: mkdosfs.c:539
#define argv
Definition: mplay32.c:18
static HRESULT xmldomunk_getelembytag(IUnknown *punk, LPCWSTR name, long index, IXMLDOMNode **ppout)
Definition: mscfile.c:58
static HRESULT xmldomnode_getattributevalue(IXMLDOMNode *pnode, LPCWSTR name, BSTR *pout)
Definition: mscfile.c:16
EXTERN_C BOOL HandleRosMscLaunch(PCWSTR pszCmdLine)
Definition: mscfile.c:124
static HRESULT GetMscRootNode(PCWSTR pszFilePath, IXMLDOMNode **ppRoot)
Definition: mscfile.c:88
static HRESULT LoadXmlFromVariant(VARIANT *pVarUrl, IXMLDOMElement **ppDocElm)
Definition: mscfile.c:72
static HRESULT xmldomelem_getelembytag(IXMLDOMElement *pelem, LPCWSTR name, long index, IXMLDOMNode **ppout)
Definition: mscfile.c:41
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
_In_opt_ IUnknown * punk
Definition: shlwapi.h:158
#define SEE_MASK_DOENVSUBST
Definition: shellapi.h:37
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
#define SEE_MASK_FLAG_DDEWAIT
Definition: shellapi.h:36
#define SEE_MASK_FLAG_NO_UI
Definition: shellapi.h:38
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2732
LPCWSTR lpParameters
Definition: shellapi.h:339
Definition: name.c:39
Definition: pmap_prot.h:88
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:626
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define ERROR_BAD_FORMAT
Definition: winerror.h:236
#define ERROR_NOT_FOUND
Definition: winerror.h:1014
#define SW_SHOW
Definition: winuser.h:786