ReactOS 0.4.17-dev-769-g1500a35
mscfile.c File Reference
#include "precomp.h"
#include <oleauto.h>
#include <oaidl.h>
#include <shlwapi.h>
#include <initguid.h>
#include <msxml2.h>
Include dependency graph for mscfile.c:

Go to the source code of this file.

Macros

#define COBJMACROS
 

Functions

static HRESULT xmldomnode_getattributevalue (IXMLDOMNode *pnode, LPCWSTR name, BSTR *pout)
 
static HRESULT xmldomelem_getelembytag (IXMLDOMElement *pelem, LPCWSTR name, long index, IXMLDOMNode **ppout)
 
static HRESULT xmldomunk_getelembytag (IUnknown *punk, LPCWSTR name, long index, IXMLDOMNode **ppout)
 
static HRESULT LoadXmlFromVariant (VARIANT *pVarUrl, IXMLDOMElement **ppDocElm)
 
static HRESULT GetMscRootNode (PCWSTR pszFilePath, IXMLDOMNode **ppRoot)
 
EXTERN_C BOOL HandleRosMscLaunch (PCWSTR pszCmdLine)
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 8 of file mscfile.c.

Function Documentation

◆ GetMscRootNode()

static HRESULT GetMscRootNode ( PCWSTR  pszFilePath,
IXMLDOMNode **  ppRoot 
)
static

Definition at line 88 of file mscfile.c.

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}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
HRESULT hr
Definition: delayimp.cpp:582
OLECHAR * BSTR
Definition: compat.h:2293
@ 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
#define L(x)
Definition: resources.c:13
unsigned long DWORD
Definition: ntddk_ex.h:95
const GLdouble * v
Definition: gl.h:2040
GLenum GLsizei len
Definition: glext.h:6722
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 LPTR
Definition: minwinbase.h:93
static struct msdos_boot_sector bs
Definition: mkdosfs.c:539
static HRESULT LoadXmlFromVariant(VARIANT *pVarUrl, IXMLDOMElement **ppDocElm)
Definition: mscfile.c:72
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_ UINT _In_ UINT cch
Definition: shellapi.h:432
uint16_t * PWSTR
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

Referenced by HandleRosMscLaunch().

◆ HandleRosMscLaunch()

EXTERN_C BOOL HandleRosMscLaunch ( PCWSTR  pszCmdLine)

Definition at line 124 of file mscfile.c.

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 NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
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
unsigned int BOOL
Definition: ntddk_ex.h:94
GLbitfield flags
Definition: glext.h:7161
GLuint64EXT * result
Definition: glext.h:11304
unsigned int UINT
Definition: sysinfo.c:13
#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
static HRESULT GetMscRootNode(PCWSTR pszFilePath, IXMLDOMNode **ppRoot)
Definition: mscfile.c:88
#define SEE_MASK_DOENVSUBST
Definition: shellapi.h:37
#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
uint16_t * LPWSTR
Definition: typedefs.h:56
#define SW_SHOW
Definition: winuser.h:786

Referenced by _tWinMain().

◆ LoadXmlFromVariant()

static HRESULT LoadXmlFromVariant ( VARIANT pVarUrl,
IXMLDOMElement **  ppDocElm 
)
static

Definition at line 72 of file mscfile.c.

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}
#define E_FAIL
Definition: ddrawi.h:102
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
short VARIANT_BOOL
Definition: compat.h:2290
#define FAILED(hr)
Definition: intsafe.h:51

Referenced by GetMscRootNode().

◆ xmldomelem_getelembytag()

static HRESULT xmldomelem_getelembytag ( IXMLDOMElement pelem,
LPCWSTR  name,
long  index,
IXMLDOMNode **  ppout 
)
static

Definition at line 41 of file mscfile.c.

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}
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
GLuint index
Definition: glext.h:6031
Definition: name.c:39

Referenced by xmldomunk_getelembytag().

◆ xmldomnode_getattributevalue()

static HRESULT xmldomnode_getattributevalue ( IXMLDOMNode pnode,
LPCWSTR  name,
BSTR pout 
)
static

Definition at line 16 of file mscfile.c.

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}
Definition: pmap_prot.h:88
#define ERROR_NOT_FOUND
Definition: winerror.h:1014

Referenced by HandleRosMscLaunch().

◆ xmldomunk_getelembytag()

static HRESULT xmldomunk_getelembytag ( IUnknown punk,
LPCWSTR  name,
long  index,
IXMLDOMNode **  ppout 
)
static

Definition at line 58 of file mscfile.c.

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}
static HRESULT xmldomelem_getelembytag(IXMLDOMElement *pelem, LPCWSTR name, long index, IXMLDOMNode **ppout)
Definition: mscfile.c:41
_In_opt_ IUnknown * punk
Definition: shlwapi.h:158

Referenced by HandleRosMscLaunch().