Author: akhaldi
Date: Sat Nov  8 10:22:22 2014
New Revision: 65315

URL: http://svn.reactos.org/svn/reactos?rev=65315&view=rev
Log:
[WSHOM.OCX]
* Import from Wine 1.7.27.
CORE-8768 #resolve #comment Imported in r65315.
CORE-8540

Added:
    trunk/reactos/dll/win32/wshom.ocx/   (with props)
    trunk/reactos/dll/win32/wshom.ocx/CMakeLists.txt   (with props)
    trunk/reactos/dll/win32/wshom.ocx/guid.c   (with props)
    trunk/reactos/dll/win32/wshom.ocx/shell.c   (with props)
    trunk/reactos/dll/win32/wshom.ocx/wshom.idl   (with props)
    trunk/reactos/dll/win32/wshom.ocx/wshom.ocx.spec   (with props)
    trunk/reactos/dll/win32/wshom.ocx/wshom.rc   (with props)
    trunk/reactos/dll/win32/wshom.ocx/wshom.rgs   (with props)
    trunk/reactos/dll/win32/wshom.ocx/wshom.tlb.rgs   (with props)
    trunk/reactos/dll/win32/wshom.ocx/wshom_main.c   (with props)
    trunk/reactos/dll/win32/wshom.ocx/wshom_private.h   (with props)
Modified:
    trunk/reactos/dll/win32/CMakeLists.txt
    trunk/reactos/media/doc/README.WINE
    trunk/reactos/media/inf/syssetup.inf

Modified: trunk/reactos/dll/win32/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/CMakeLists.txt?rev=65315&r1=65314&r2=65315&view=diff
==============================================================================
--- trunk/reactos/dll/win32/CMakeLists.txt      [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/CMakeLists.txt      [iso-8859-1] Sat Nov  8 
10:22:22 2014
@@ -243,6 +243,7 @@
 add_subdirectory(ws2_32_new)
 add_subdirectory(ws2help)
 add_subdirectory(wshirda)
+add_subdirectory(wshom.ocx)
 add_subdirectory(wshtcpip)
 add_subdirectory(wsock32)
 add_subdirectory(wtsapi32)

Propchange: trunk/reactos/dll/win32/wshom.ocx/
------------------------------------------------------------------------------
--- bugtraq:logregex    (added)
+++ bugtraq:logregex    Sat Nov  8 10:22:22 2014
@@ -0,0 +1,2 @@
+([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))?
+(\d+)

Propchange: trunk/reactos/dll/win32/wshom.ocx/
------------------------------------------------------------------------------
    bugtraq:message = See issue #%BUGID% for more details.

Propchange: trunk/reactos/dll/win32/wshom.ocx/
------------------------------------------------------------------------------
    bugtraq:url = http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%

Propchange: trunk/reactos/dll/win32/wshom.ocx/
------------------------------------------------------------------------------
    tsvn:logminsize = 10

Added: trunk/reactos/dll/win32/wshom.ocx/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wshom.ocx/CMakeLists.txt?rev=65315
==============================================================================
--- trunk/reactos/dll/win32/wshom.ocx/CMakeLists.txt    (added)
+++ trunk/reactos/dll/win32/wshom.ocx/CMakeLists.txt    [iso-8859-1] Sat Nov  8 
10:22:22 2014
@@ -0,0 +1,30 @@
+
+add_definitions(-D__WINESRC__)
+include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine)
+spec2def(wshom.ocx wshom.ocx.spec)
+add_idl_headers(wshom_idlheader wshom.idl)
+add_typelib(wshom.idl)
+
+list(APPEND SOURCE
+    shell.c
+    wshom_main.c
+    wshom_private.h)
+
+add_library(wshom SHARED
+    ${SOURCE}
+    guid.c
+    wshom.rc
+    ${CMAKE_CURRENT_BINARY_DIR}/wshom.def)
+
+list(APPEND wshom_rc_deps
+    ${CMAKE_CURRENT_SOURCE_DIR}/wshom.rgs
+    ${CMAKE_CURRENT_SOURCE_DIR}/wshom.tlb.rgs
+    ${CMAKE_CURRENT_BINARY_DIR}/wshom.tlb)
+
+set_source_files_properties(wshom.rc PROPERTIES OBJECT_DEPENDS 
"${wshom_rc_deps}")
+set_module_type(wshom win32ocx)
+target_link_libraries(wshom uuid wine)
+add_importlibs(wshom oleaut32 ole32 shell32 msvcrt kernel32 ntdll)
+add_dependencies(wshom stdole2 wshom_idlheader)
+add_pch(wshom wshom_private.h SOURCE)
+add_cd_file(TARGET wshom DESTINATION reactos/system32 FOR all)

Propchange: trunk/reactos/dll/win32/wshom.ocx/CMakeLists.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/wshom.ocx/guid.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wshom.ocx/guid.c?rev=65315
==============================================================================
--- trunk/reactos/dll/win32/wshom.ocx/guid.c    (added)
+++ trunk/reactos/dll/win32/wshom.ocx/guid.c    [iso-8859-1] Sat Nov  8 
10:22:22 2014
@@ -0,0 +1,15 @@
+/* DO NOT USE THE PRECOMPILED HEADER FOR THIS FILE! */
+
+#include <stdarg.h>
+
+#define WIN32_NO_STATUS
+#define _INC_WINDOWS
+#define COM_NO_WINDOWS_H
+
+#include <windef.h>
+#include <winbase.h>
+#include <objbase.h>
+#include <initguid.h>
+#include <wshom.h>
+
+/* NO CODE HERE, THIS IS JUST REQUIRED FOR THE GUID DEFINITIONS */

Propchange: trunk/reactos/dll/win32/wshom.ocx/guid.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/wshom.ocx/shell.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wshom.ocx/shell.c?rev=65315
==============================================================================
--- trunk/reactos/dll/win32/wshom.ocx/shell.c   (added)
+++ trunk/reactos/dll/win32/wshom.ocx/shell.c   [iso-8859-1] Sat Nov  8 
10:22:22 2014
@@ -0,0 +1,1069 @@
+/*
+ * Copyright 2011 Jacek Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "wshom_private.h"
+
+#include <shellapi.h>
+#include <shlobj.h>
+#include <dispex.h>
+
+#include <wine/unicode.h>
+
+static IWshShell3 WshShell3;
+
+typedef struct
+{
+    IWshCollection IWshCollection_iface;
+    LONG ref;
+} WshCollection;
+
+typedef struct
+{
+    IWshShortcut IWshShortcut_iface;
+    LONG ref;
+
+    IShellLinkW *link;
+    BSTR path_link;
+} WshShortcut;
+
+typedef struct
+{
+    IWshEnvironment IWshEnvironment_iface;
+    LONG ref;
+} WshEnvironment;
+
+static inline WshCollection *impl_from_IWshCollection( IWshCollection *iface )
+{
+    return CONTAINING_RECORD(iface, WshCollection, IWshCollection_iface);
+}
+
+static inline WshShortcut *impl_from_IWshShortcut( IWshShortcut *iface )
+{
+    return CONTAINING_RECORD(iface, WshShortcut, IWshShortcut_iface);
+}
+
+static inline WshEnvironment *impl_from_IWshEnvironment( IWshEnvironment 
*iface )
+{
+    return CONTAINING_RECORD(iface, WshEnvironment, IWshEnvironment_iface);
+}
+
+static HRESULT WINAPI WshEnvironment_QueryInterface(IWshEnvironment *iface, 
REFIID riid, void **obj)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+
+    TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), obj);
+
+    if (IsEqualGUID(riid, &IID_IUnknown)  ||
+        IsEqualGUID(riid, &IID_IDispatch) ||
+        IsEqualGUID(riid, &IID_IWshEnvironment))
+    {
+        *obj = iface;
+    }else {
+        FIXME("Unknown iface %s\n", debugstr_guid(riid));
+        *obj = NULL;
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown*)*obj);
+    return S_OK;
+}
+
+static ULONG WINAPI WshEnvironment_AddRef(IWshEnvironment *iface)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+    TRACE("(%p) ref = %d\n", This, ref);
+    return ref;
+}
+
+static ULONG WINAPI WshEnvironment_Release(IWshEnvironment *iface)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+    TRACE("(%p) ref = %d\n", This, ref);
+
+    if (!ref)
+        HeapFree(GetProcessHeap(), 0, This);
+
+    return ref;
+}
+
+static HRESULT WINAPI WshEnvironment_GetTypeInfoCount(IWshEnvironment *iface, 
UINT *pctinfo)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+    TRACE("(%p)->(%p)\n", This, pctinfo);
+    *pctinfo = 1;
+    return S_OK;
+}
+
+static HRESULT WINAPI WshEnvironment_GetTypeInfo(IWshEnvironment *iface, UINT 
iTInfo, LCID lcid, ITypeInfo **ppTInfo)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+    TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
+    return get_typeinfo(IWshEnvironment_tid, ppTInfo);
+}
+
+static HRESULT WINAPI WshEnvironment_GetIDsOfNames(IWshEnvironment *iface, 
REFIID riid, LPOLESTR *rgszNames,
+        UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, 
cNames, lcid, rgDispId);
+
+    hr = get_typeinfo(IWshEnvironment_tid, &typeinfo);
+    if(SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
+        ITypeInfo_Release(typeinfo);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI WshEnvironment_Invoke(IWshEnvironment *iface, DISPID 
dispIdMember, REFIID riid, LCID lcid,
+        WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO 
*pExcepInfo, UINT *puArgErr)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, 
debugstr_guid(riid),
+          lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+
+    hr = get_typeinfo(IWshEnvironment_tid, &typeinfo);
+    if(SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_Invoke(typeinfo, &This->IWshEnvironment_iface, 
dispIdMember, wFlags,
+                pDispParams, pVarResult, pExcepInfo, puArgErr);
+        ITypeInfo_Release(typeinfo);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI WshEnvironment_get_Item(IWshEnvironment *iface, BSTR 
name, BSTR *value)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+    DWORD len;
+
+    TRACE("(%p)->(%s %p)\n", This, debugstr_w(name), value);
+
+    if (!value)
+        return E_POINTER;
+
+    len = GetEnvironmentVariableW(name, NULL, 0);
+    *value = SysAllocStringLen(NULL, len);
+    if (!*value)
+        return E_OUTOFMEMORY;
+
+    if (len)
+        GetEnvironmentVariableW(name, *value, len+1);
+
+    return S_OK;
+}
+
+static HRESULT WINAPI WshEnvironment_put_Item(IWshEnvironment *iface, BSTR 
name, BSTR value)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+    FIXME("(%p)->(%s %s): stub\n", This, debugstr_w(name), debugstr_w(value));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshEnvironment_Count(IWshEnvironment *iface, LONG *count)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+    FIXME("(%p)->(%p): stub\n", This, count);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshEnvironment_get_length(IWshEnvironment *iface, LONG 
*len)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+    FIXME("(%p)->(%p): stub\n", This, len);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshEnvironment__NewEnum(IWshEnvironment *iface, IUnknown 
**penum)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+    FIXME("(%p)->(%p): stub\n", This, penum);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshEnvironment_Remove(IWshEnvironment *iface, BSTR name)
+{
+    WshEnvironment *This = impl_from_IWshEnvironment(iface);
+    FIXME("(%p)->(%s): stub\n", This, debugstr_w(name));
+    return E_NOTIMPL;
+}
+
+static const IWshEnvironmentVtbl WshEnvironmentVtbl = {
+    WshEnvironment_QueryInterface,
+    WshEnvironment_AddRef,
+    WshEnvironment_Release,
+    WshEnvironment_GetTypeInfoCount,
+    WshEnvironment_GetTypeInfo,
+    WshEnvironment_GetIDsOfNames,
+    WshEnvironment_Invoke,
+    WshEnvironment_get_Item,
+    WshEnvironment_put_Item,
+    WshEnvironment_Count,
+    WshEnvironment_get_length,
+    WshEnvironment__NewEnum,
+    WshEnvironment_Remove
+};
+
+static HRESULT WshEnvironment_Create(IWshEnvironment **env)
+{
+    WshEnvironment *This;
+
+    This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
+    if (!This) return E_OUTOFMEMORY;
+
+    This->IWshEnvironment_iface.lpVtbl = &WshEnvironmentVtbl;
+    This->ref = 1;
+
+    *env = &This->IWshEnvironment_iface;
+
+    return S_OK;
+}
+
+static HRESULT WINAPI WshCollection_QueryInterface(IWshCollection *iface, 
REFIID riid, void **ppv)
+{
+    WshCollection *This = impl_from_IWshCollection(iface);
+
+    TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv);
+
+    if (IsEqualGUID(riid, &IID_IUnknown)  ||
+        IsEqualGUID(riid, &IID_IDispatch) ||
+        IsEqualGUID(riid, &IID_IWshCollection))
+    {
+        *ppv = iface;
+    }else {
+        FIXME("Unknown iface %s\n", debugstr_guid(riid));
+        *ppv = NULL;
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown*)*ppv);
+    return S_OK;
+}
+
+static ULONG WINAPI WshCollection_AddRef(IWshCollection *iface)
+{
+    WshCollection *This = impl_from_IWshCollection(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+    TRACE("(%p) ref = %d\n", This, ref);
+    return ref;
+}
+
+static ULONG WINAPI WshCollection_Release(IWshCollection *iface)
+{
+    WshCollection *This = impl_from_IWshCollection(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+    TRACE("(%p) ref = %d\n", This, ref);
+
+    if (!ref)
+        HeapFree(GetProcessHeap(), 0, This);
+
+    return ref;
+}
+
+static HRESULT WINAPI WshCollection_GetTypeInfoCount(IWshCollection *iface, 
UINT *pctinfo)
+{
+    WshCollection *This = impl_from_IWshCollection(iface);
+    TRACE("(%p)->(%p)\n", This, pctinfo);
+    *pctinfo = 1;
+    return S_OK;
+}
+
+static HRESULT WINAPI WshCollection_GetTypeInfo(IWshCollection *iface, UINT 
iTInfo, LCID lcid, ITypeInfo **ppTInfo)
+{
+    WshCollection *This = impl_from_IWshCollection(iface);
+    TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
+    return get_typeinfo(IWshCollection_tid, ppTInfo);
+}
+
+static HRESULT WINAPI WshCollection_GetIDsOfNames(IWshCollection *iface, 
REFIID riid, LPOLESTR *rgszNames,
+        UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    WshCollection *This = impl_from_IWshCollection(iface);
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, 
cNames, lcid, rgDispId);
+
+    hr = get_typeinfo(IWshCollection_tid, &typeinfo);
+    if(SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
+        ITypeInfo_Release(typeinfo);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI WshCollection_Invoke(IWshCollection *iface, DISPID 
dispIdMember, REFIID riid, LCID lcid,
+        WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO 
*pExcepInfo, UINT *puArgErr)
+{
+    WshCollection *This = impl_from_IWshCollection(iface);
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, 
debugstr_guid(riid),
+          lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+
+    hr = get_typeinfo(IWshCollection_tid, &typeinfo);
+    if(SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_Invoke(typeinfo, &This->IWshCollection_iface, 
dispIdMember, wFlags,
+                pDispParams, pVarResult, pExcepInfo, puArgErr);
+        ITypeInfo_Release(typeinfo);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI WshCollection_Item(IWshCollection *iface, VARIANT 
*index, VARIANT *value)
+{
+    WshCollection *This = impl_from_IWshCollection(iface);
+    static const WCHAR allusersdesktopW[] = 
{'A','l','l','U','s','e','r','s','D','e','s','k','t','o','p',0};
+    static const WCHAR allusersprogramsW[] = 
{'A','l','l','U','s','e','r','s','P','r','o','g','r','a','m','s',0};
+    static const WCHAR desktopW[] = {'D','e','s','k','t','o','p',0};
+    PIDLIST_ABSOLUTE pidl;
+    WCHAR pathW[MAX_PATH];
+    int kind = 0;
+    BSTR folder;
+    HRESULT hr;
+
+    TRACE("(%p)->(%s %p)\n", This, debugstr_variant(index), value);
+
+    if (V_VT(index) != VT_BSTR)
+    {
+        FIXME("only BSTR index supported, got %d\n", V_VT(index));
+        return E_NOTIMPL;
+    }
+
+    folder = V_BSTR(index);
+    if (!strcmpiW(folder, desktopW))
+        kind = CSIDL_DESKTOP;
+    else if (!strcmpiW(folder, allusersdesktopW))
+        kind = CSIDL_COMMON_DESKTOPDIRECTORY;
+    else if (!strcmpiW(folder, allusersprogramsW))
+        kind = CSIDL_COMMON_PROGRAMS;
+    else
+    {
+        FIXME("folder kind %s not supported\n", debugstr_w(folder));
+        return E_NOTIMPL;
+    }
+
+    hr = SHGetSpecialFolderLocation(NULL, kind, &pidl);
+    if (hr != S_OK) return hr;
+
+    if (SHGetPathFromIDListW(pidl, pathW))
+    {
+        V_VT(value) = VT_BSTR;
+        V_BSTR(value) = SysAllocString(pathW);
+        hr = V_BSTR(value) ? S_OK : E_OUTOFMEMORY;
+    }
+    else
+        hr = E_FAIL;
+
+    CoTaskMemFree(pidl);
+
+    return hr;
+}
+
+static HRESULT WINAPI WshCollection_Count(IWshCollection *iface, LONG *count)
+{
+    WshCollection *This = impl_from_IWshCollection(iface);
+    FIXME("(%p)->(%p): stub\n", This, count);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshCollection_get_length(IWshCollection *iface, LONG 
*count)
+{
+    WshCollection *This = impl_from_IWshCollection(iface);
+    FIXME("(%p)->(%p): stub\n", This, count);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshCollection__NewEnum(IWshCollection *iface, IUnknown 
*Enum)
+{
+    WshCollection *This = impl_from_IWshCollection(iface);
+    FIXME("(%p)->(%p): stub\n", This, Enum);
+    return E_NOTIMPL;
+}
+
+static const IWshCollectionVtbl WshCollectionVtbl = {
+    WshCollection_QueryInterface,
+    WshCollection_AddRef,
+    WshCollection_Release,
+    WshCollection_GetTypeInfoCount,
+    WshCollection_GetTypeInfo,
+    WshCollection_GetIDsOfNames,
+    WshCollection_Invoke,
+    WshCollection_Item,
+    WshCollection_Count,
+    WshCollection_get_length,
+    WshCollection__NewEnum
+};
+
+static HRESULT WshCollection_Create(IWshCollection **collection)
+{
+    WshCollection *This;
+
+    This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
+    if (!This) return E_OUTOFMEMORY;
+
+    This->IWshCollection_iface.lpVtbl = &WshCollectionVtbl;
+    This->ref = 1;
+
+    *collection = &This->IWshCollection_iface;
+
+    return S_OK;
+}
+
+/* IWshShortcut */
+static HRESULT WINAPI WshShortcut_QueryInterface(IWshShortcut *iface, REFIID 
riid, void **ppv)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+
+    TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv);
+
+    if (IsEqualGUID(riid, &IID_IUnknown)  ||
+        IsEqualGUID(riid, &IID_IDispatch) ||
+        IsEqualGUID(riid, &IID_IWshShortcut))
+    {
+        *ppv = iface;
+    }else {
+        FIXME("Unknown iface %s\n", debugstr_guid(riid));
+        *ppv = NULL;
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown*)*ppv);
+    return S_OK;
+}
+
+static ULONG WINAPI WshShortcut_AddRef(IWshShortcut *iface)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+    TRACE("(%p) ref = %d\n", This, ref);
+    return ref;
+}
+
+static ULONG WINAPI WshShortcut_Release(IWshShortcut *iface)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+    TRACE("(%p) ref = %d\n", This, ref);
+
+    if (!ref)
+    {
+        SysFreeString(This->path_link);
+        IShellLinkW_Release(This->link);
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+
+    return ref;
+}
+
+static HRESULT WINAPI WshShortcut_GetTypeInfoCount(IWshShortcut *iface, UINT 
*pctinfo)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    TRACE("(%p)->(%p)\n", This, pctinfo);
+    *pctinfo = 1;
+    return S_OK;
+}
+
+static HRESULT WINAPI WshShortcut_GetTypeInfo(IWshShortcut *iface, UINT 
iTInfo, LCID lcid, ITypeInfo **ppTInfo)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
+    return get_typeinfo(IWshShortcut_tid, ppTInfo);
+}
+
+static HRESULT WINAPI WshShortcut_GetIDsOfNames(IWshShortcut *iface, REFIID 
riid, LPOLESTR *rgszNames,
+        UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, 
cNames, lcid, rgDispId);
+
+    hr = get_typeinfo(IWshShortcut_tid, &typeinfo);
+    if(SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
+        ITypeInfo_Release(typeinfo);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI WshShortcut_Invoke(IWshShortcut *iface, DISPID 
dispIdMember, REFIID riid, LCID lcid,
+        WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO 
*pExcepInfo, UINT *puArgErr)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, 
debugstr_guid(riid),
+          lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+
+    hr = get_typeinfo(IWshShortcut_tid, &typeinfo);
+    if(SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_Invoke(typeinfo, &This->IWshShortcut_iface, 
dispIdMember, wFlags,
+                pDispParams, pVarResult, pExcepInfo, puArgErr);
+        ITypeInfo_Release(typeinfo);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI WshShortcut_get_FullName(IWshShortcut *iface, BSTR *name)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    FIXME("(%p)->(%p): stub\n", This, name);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShortcut_get_Arguments(IWshShortcut *iface, BSTR 
*Arguments)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    WCHAR buffW[INFOTIPSIZE];
+    HRESULT hr;
+
+    TRACE("(%p)->(%p)\n", This, Arguments);
+
+    if (!Arguments)
+        return E_POINTER;
+
+    *Arguments = NULL;
+
+    hr = IShellLinkW_GetArguments(This->link, buffW, 
sizeof(buffW)/sizeof(WCHAR));
+    if (FAILED(hr))
+        return hr;
+
+    *Arguments = SysAllocString(buffW);
+    return *Arguments ? S_OK : E_OUTOFMEMORY;
+}
+
+static HRESULT WINAPI WshShortcut_put_Arguments(IWshShortcut *iface, BSTR 
Arguments)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+
+    TRACE("(%p)->(%s)\n", This, debugstr_w(Arguments));
+
+    return IShellLinkW_SetArguments(This->link, Arguments);
+}
+
+static HRESULT WINAPI WshShortcut_get_Description(IWshShortcut *iface, BSTR 
*Description)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    FIXME("(%p)->(%p): stub\n", This, Description);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShortcut_put_Description(IWshShortcut *iface, BSTR 
Description)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    TRACE("(%p)->(%s)\n", This, debugstr_w(Description));
+    return IShellLinkW_SetDescription(This->link, Description);
+}
+
+static HRESULT WINAPI WshShortcut_get_Hotkey(IWshShortcut *iface, BSTR *Hotkey)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    FIXME("(%p)->(%p): stub\n", This, Hotkey);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShortcut_put_Hotkey(IWshShortcut *iface, BSTR Hotkey)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    FIXME("(%p)->(%s): stub\n", This, debugstr_w(Hotkey));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShortcut_get_IconLocation(IWshShortcut *iface, BSTR 
*IconPath)
+{
+    static const WCHAR fmtW[] = {'%','s',',',' ','%','d',0};
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    WCHAR buffW[MAX_PATH], pathW[MAX_PATH];
+    INT icon = 0;
+    HRESULT hr;
+
+    TRACE("(%p)->(%p)\n", This, IconPath);
+
+    if (!IconPath)
+        return E_POINTER;
+
+    hr = IShellLinkW_GetIconLocation(This->link, buffW, 
sizeof(buffW)/sizeof(WCHAR), &icon);
+    if (FAILED(hr)) return hr;
+
+    sprintfW(pathW, fmtW, buffW, icon);
+    *IconPath = SysAllocString(pathW);
+    if (!*IconPath) return E_OUTOFMEMORY;
+
+    return S_OK;
+}
+
+static HRESULT WINAPI WshShortcut_put_IconLocation(IWshShortcut *iface, BSTR 
IconPath)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    HRESULT hr;
+    WCHAR *ptr;
+    BSTR path;
+    INT icon;
+
+    TRACE("(%p)->(%s)\n", This, debugstr_w(IconPath));
+
+    /* scan for icon id */
+    ptr = strrchrW(IconPath, ',');
+    if (!ptr)
+    {
+        WARN("icon index not found\n");
+        return E_FAIL;
+    }
+
+    path = SysAllocStringLen(IconPath, ptr-IconPath);
+
+    /* skip spaces if any */
+    while (isspaceW(*++ptr))
+        ;
+
+    icon = atoiW(ptr);
+
+    hr = IShellLinkW_SetIconLocation(This->link, path, icon);
+    SysFreeString(path);
+
+    return hr;
+}
+
+static HRESULT WINAPI WshShortcut_put_RelativePath(IWshShortcut *iface, BSTR 
rhs)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    FIXME("(%p)->(%s): stub\n", This, debugstr_w(rhs));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShortcut_get_TargetPath(IWshShortcut *iface, BSTR 
*Path)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    FIXME("(%p)->(%p): stub\n", This, Path);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShortcut_put_TargetPath(IWshShortcut *iface, BSTR 
Path)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    TRACE("(%p)->(%s)\n", This, debugstr_w(Path));
+    return IShellLinkW_SetPath(This->link, Path);
+}
+
+static HRESULT WINAPI WshShortcut_get_WindowStyle(IWshShortcut *iface, int 
*ShowCmd)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    TRACE("(%p)->(%p)\n", This, ShowCmd);
+    return IShellLinkW_GetShowCmd(This->link, ShowCmd);
+}
+
+static HRESULT WINAPI WshShortcut_put_WindowStyle(IWshShortcut *iface, int 
ShowCmd)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    TRACE("(%p)->(%d)\n", This, ShowCmd);
+    return IShellLinkW_SetShowCmd(This->link, ShowCmd);
+}
+
+static HRESULT WINAPI WshShortcut_get_WorkingDirectory(IWshShortcut *iface, 
BSTR *WorkingDirectory)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    WCHAR buffW[MAX_PATH];
+    HRESULT hr;
+
+    TRACE("(%p)->(%p)\n", This, WorkingDirectory);
+
+    if (!WorkingDirectory)
+        return E_POINTER;
+
+    *WorkingDirectory = NULL;
+    hr = IShellLinkW_GetWorkingDirectory(This->link, buffW, 
sizeof(buffW)/sizeof(WCHAR));
+    if (FAILED(hr)) return hr;
+
+    *WorkingDirectory = SysAllocString(buffW);
+    return *WorkingDirectory ? S_OK : E_OUTOFMEMORY;
+}
+
+static HRESULT WINAPI WshShortcut_put_WorkingDirectory(IWshShortcut *iface, 
BSTR WorkingDirectory)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    TRACE("(%p)->(%s)\n", This, debugstr_w(WorkingDirectory));
+    return IShellLinkW_SetWorkingDirectory(This->link, WorkingDirectory);
+}
+
+static HRESULT WINAPI WshShortcut_Load(IWshShortcut *iface, BSTR PathLink)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    FIXME("(%p)->(%s): stub\n", This, debugstr_w(PathLink));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShortcut_Save(IWshShortcut *iface)
+{
+    WshShortcut *This = impl_from_IWshShortcut(iface);
+    IPersistFile *file;
+    HRESULT hr;
+
+    TRACE("(%p)\n", This);
+
+    IShellLinkW_QueryInterface(This->link, &IID_IPersistFile, (void**)&file);
+    hr = IPersistFile_Save(file, This->path_link, TRUE);
+    IPersistFile_Release(file);
+
+    return hr;
+}
+
+static const IWshShortcutVtbl WshShortcutVtbl = {
+    WshShortcut_QueryInterface,
+    WshShortcut_AddRef,
+    WshShortcut_Release,
+    WshShortcut_GetTypeInfoCount,
+    WshShortcut_GetTypeInfo,
+    WshShortcut_GetIDsOfNames,
+    WshShortcut_Invoke,
+    WshShortcut_get_FullName,
+    WshShortcut_get_Arguments,
+    WshShortcut_put_Arguments,
+    WshShortcut_get_Description,
+    WshShortcut_put_Description,
+    WshShortcut_get_Hotkey,
+    WshShortcut_put_Hotkey,
+    WshShortcut_get_IconLocation,
+    WshShortcut_put_IconLocation,
+    WshShortcut_put_RelativePath,
+    WshShortcut_get_TargetPath,
+    WshShortcut_put_TargetPath,
+    WshShortcut_get_WindowStyle,
+    WshShortcut_put_WindowStyle,
+    WshShortcut_get_WorkingDirectory,
+    WshShortcut_put_WorkingDirectory,
+    WshShortcut_Load,
+    WshShortcut_Save
+};
+
+static HRESULT WshShortcut_Create(const WCHAR *path, IDispatch **shortcut)
+{
+    WshShortcut *This;
+    HRESULT hr;
+
+    *shortcut = NULL;
+
+    This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
+    if (!This) return E_OUTOFMEMORY;
+
+    This->IWshShortcut_iface.lpVtbl = &WshShortcutVtbl;
+    This->ref = 1;
+
+    hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
+            &IID_IShellLinkW, (void**)&This->link);
+    if (FAILED(hr))
+    {
+        HeapFree(GetProcessHeap(), 0, This);
+        return hr;
+    }
+
+    This->path_link = SysAllocString(path);
+    if (!This->path_link)
+    {
+        IShellLinkW_Release(This->link);
+        HeapFree(GetProcessHeap(), 0, This);
+        return E_OUTOFMEMORY;
+    }
+
+    *shortcut = (IDispatch*)&This->IWshShortcut_iface;
+
+    return S_OK;
+}
+
+static HRESULT WINAPI WshShell3_QueryInterface(IWshShell3 *iface, REFIID riid, 
void **ppv)
+{
+    TRACE("(%s, %p)\n", debugstr_guid(riid), ppv);
+
+    *ppv = NULL;
+
+    if(IsEqualGUID(riid, &IID_IUnknown)  ||
+       IsEqualGUID(riid, &IID_IDispatch) ||
+       IsEqualGUID(riid, &IID_IWshShell3))
+    {
+        *ppv = iface;
+    }
+    else if (IsEqualGUID(riid, &IID_IDispatchEx))
+    {
+        return E_NOINTERFACE;
+    }
+    else
+    {
+        FIXME("Unknown iface %s\n", debugstr_guid(riid));
+        return E_NOINTERFACE;
+    }
+
+    IWshShell3_AddRef(iface);
+    return S_OK;
+}
+
+static ULONG WINAPI WshShell3_AddRef(IWshShell3 *iface)
+{
+    TRACE("()\n");
+    return 2;
+}
+
+static ULONG WINAPI WshShell3_Release(IWshShell3 *iface)
+{
+    TRACE("()\n");
+    return 2;
+}
+
+static HRESULT WINAPI WshShell3_GetTypeInfoCount(IWshShell3 *iface, UINT 
*pctinfo)
+{
+    TRACE("(%p)\n", pctinfo);
+    *pctinfo = 1;
+    return S_OK;
+}
+
+static HRESULT WINAPI WshShell3_GetTypeInfo(IWshShell3 *iface, UINT iTInfo, 
LCID lcid, ITypeInfo **ppTInfo)
+{
+    TRACE("(%u %u %p)\n", iTInfo, lcid, ppTInfo);
+    return get_typeinfo(IWshShell3_tid, ppTInfo);
+}
+
+static HRESULT WINAPI WshShell3_GetIDsOfNames(IWshShell3 *iface, REFIID riid, 
LPOLESTR *rgszNames,
+        UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("(%s %p %u %u %p)\n", debugstr_guid(riid), rgszNames, cNames, lcid, 
rgDispId);
+
+    hr = get_typeinfo(IWshShell3_tid, &typeinfo);
+    if(SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
+        ITypeInfo_Release(typeinfo);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI WshShell3_Invoke(IWshShell3 *iface, DISPID dispIdMember, 
REFIID riid, LCID lcid,
+        WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO 
*pExcepInfo, UINT *puArgErr)
+{
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("(%d %s %d %d %p %p %p %p)\n", dispIdMember, debugstr_guid(riid),
+          lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+
+    hr = get_typeinfo(IWshShell3_tid, &typeinfo);
+    if(SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_Invoke(typeinfo, &WshShell3, dispIdMember, wFlags,
+                pDispParams, pVarResult, pExcepInfo, puArgErr);
+        ITypeInfo_Release(typeinfo);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI WshShell3_get_SpecialFolders(IWshShell3 *iface, 
IWshCollection **folders)
+{
+    TRACE("(%p)\n", folders);
+    return WshCollection_Create(folders);
+}
+
+static HRESULT WINAPI WshShell3_get_Environment(IWshShell3 *iface, VARIANT 
*type, IWshEnvironment **env)
+{
+    FIXME("(%s %p): semi-stub\n", debugstr_variant(type), env);
+    return WshEnvironment_Create(env);
+}
+
+static HRESULT WINAPI WshShell3_Run(IWshShell3 *iface, BSTR cmd, VARIANT 
*style, VARIANT *WaitOnReturn, int *exit_code)
+{
+    SHELLEXECUTEINFOW info;
+    int waitforprocess;
+    VARIANT s, w;
+    HRESULT hr;
+
+    TRACE("(%s %s %s %p)\n", debugstr_w(cmd), debugstr_variant(style), 
debugstr_variant(WaitOnReturn), exit_code);
+
+    VariantInit(&s);
+    hr = VariantChangeType(&s, style, 0, VT_I4);
+    if (FAILED(hr))
+    {
+        ERR("failed to convert style argument, 0x%08x\n", hr);
+        return hr;
+    }
+
+    VariantInit(&w);
+    hr = VariantChangeType(&w, WaitOnReturn, 0, VT_I4);
+    if (FAILED(hr))
+    {
+        ERR("failed to convert wait argument, 0x%08x\n", hr);
+        return hr;
+    }
+
+    memset(&info, 0, sizeof(info));
+    info.cbSize = sizeof(info);
+
+    waitforprocess = V_I4(&w);
+
+    info.fMask = waitforprocess ? SEE_MASK_NOASYNC | SEE_MASK_NOCLOSEPROCESS : 
SEE_MASK_DEFAULT;
+    info.lpFile = cmd;
+    info.nShow = V_I4(&s);
+
+    if (!ShellExecuteExW(&info))
+    {
+        TRACE("ShellExecute failed, %d\n", GetLastError());
+        return HRESULT_FROM_WIN32(GetLastError());
+    }
+    else
+    {
+        if (waitforprocess)
+        {
+            if (exit_code)
+            {
+                DWORD code;
+                GetExitCodeProcess(info.hProcess, &code);
+                *exit_code = code;
+            }
+            CloseHandle(info.hProcess);
+        }
+        else
+            if (exit_code) *exit_code = 0;
+
+        return S_OK;
+    }
+}
+
+static HRESULT WINAPI WshShell3_Popup(IWshShell3 *iface, BSTR Text, VARIANT* 
SecondsToWait, VARIANT *Title, VARIANT *Type, int *button)
+{
+    FIXME("(%s %s %s %s %p): stub\n", debugstr_w(Text), 
debugstr_variant(SecondsToWait),
+        debugstr_variant(Title), debugstr_variant(Type), button);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShell3_CreateShortcut(IWshShell3 *iface, BSTR 
PathLink, IDispatch** Shortcut)
+{
+    TRACE("(%s %p)\n", debugstr_w(PathLink), Shortcut);
+    return WshShortcut_Create(PathLink, Shortcut);
+}
+
+static HRESULT WINAPI WshShell3_ExpandEnvironmentStrings(IWshShell3 *iface, 
BSTR Src, BSTR* Dst)
+{
+    DWORD ret;
+
+    TRACE("(%s %p)\n", debugstr_w(Src), Dst);
+
+    if (!Src || !Dst) return E_POINTER;
+
+    ret = ExpandEnvironmentStringsW(Src, NULL, 0);
+    *Dst = SysAllocStringLen(NULL, ret);
+    if (!*Dst) return E_OUTOFMEMORY;
+
+    if (ExpandEnvironmentStringsW(Src, *Dst, ret))
+        return S_OK;
+    else
+    {
+        SysFreeString(*Dst);
+        *Dst = NULL;
+        return HRESULT_FROM_WIN32(GetLastError());
+    }
+}
+
+static HRESULT WINAPI WshShell3_RegRead(IWshShell3 *iface, BSTR Name, VARIANT* 
out_Value)
+{
+    FIXME("(%s %p): stub\n", debugstr_w(Name), out_Value);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShell3_RegWrite(IWshShell3 *iface, BSTR Name, VARIANT 
*Value, VARIANT *Type)
+{
+    FIXME("(%s %s %s): stub\n", debugstr_w(Name), debugstr_variant(Value), 
debugstr_variant(Type));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShell3_RegDelete(IWshShell3 *iface, BSTR Name)
+{
+    FIXME("(%s): stub\n", debugstr_w(Name));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShell3_LogEvent(IWshShell3 *iface, VARIANT *Type, 
BSTR Message, BSTR Target, VARIANT_BOOL *out_Success)
+{
+    FIXME("(%s %s %s %p): stub\n", debugstr_variant(Type), 
debugstr_w(Message), debugstr_w(Target), out_Success);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShell3_AppActivate(IWshShell3 *iface, VARIANT *App, 
VARIANT *Wait, VARIANT_BOOL *out_Success)
+{
+    FIXME("(%s %s %p): stub\n", debugstr_variant(App), debugstr_variant(Wait), 
out_Success);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WshShell3_SendKeys(IWshShell3 *iface, BSTR Keys, VARIANT 
*Wait)
+{
+    FIXME("(%s %p): stub\n", debugstr_w(Keys), Wait);
+    return E_NOTIMPL;
+}
+
+static const IWshShell3Vtbl WshShell3Vtbl = {
+    WshShell3_QueryInterface,
+    WshShell3_AddRef,
+    WshShell3_Release,
+    WshShell3_GetTypeInfoCount,
+    WshShell3_GetTypeInfo,
+    WshShell3_GetIDsOfNames,
+    WshShell3_Invoke,
+    WshShell3_get_SpecialFolders,
+    WshShell3_get_Environment,
+    WshShell3_Run,
+    WshShell3_Popup,
+    WshShell3_CreateShortcut,
+    WshShell3_ExpandEnvironmentStrings,
+    WshShell3_RegRead,
+    WshShell3_RegWrite,
+    WshShell3_RegDelete,
+    WshShell3_LogEvent,
+    WshShell3_AppActivate,
+    WshShell3_SendKeys
+};
+
+static IWshShell3 WshShell3 = { &WshShell3Vtbl };
+
+HRESULT WINAPI WshShellFactory_CreateInstance(IClassFactory *iface, IUnknown 
*outer, REFIID riid, void **ppv)
+{
+    TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv);
+
+    return IWshShell3_QueryInterface(&WshShell3, riid, ppv);
+}

Propchange: trunk/reactos/dll/win32/wshom.ocx/shell.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/wshom.ocx/wshom.idl
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wshom.ocx/wshom.idl?rev=65315
==============================================================================
--- trunk/reactos/dll/win32/wshom.ocx/wshom.idl (added)
+++ trunk/reactos/dll/win32/wshom.ocx/wshom.idl [iso-8859-1] Sat Nov  8 
10:22:22 2014
@@ -0,0 +1,666 @@
+/*
+ * Copyright 2011 Jacek Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#pragma makedep regtypelib
+
+import "oaidl.idl";
+cpp_quote("#undef ExpandEnvironmentStrings")
+
+[
+    helpstring("Windows Script Host Object Model"),
+    uuid(f935dc20-1cf0-11d0-adb9-00c04fd58a0b),
+    version(1.0)
+]
+library IWshRuntimeLibrary
+{
+    importlib("stdole2.tlb");
+
+    typedef enum {
+        WshRunning  = 0,
+        WshFinished,
+        WshFailed
+    } WshExecStatus;
+
+    typedef enum {
+        UnknownType = 0,
+        Removable,
+        Fixed,
+        Remote,
+        CDRom,
+        RamDisk
+    } DriveTypeConst;
+
+    typedef enum {
+        Normal     = 0x000,
+        ReadOnly   = 0x001,
+        Hidden     = 0x002,
+        System     = 0x004,
+        Volume     = 0x008,
+        Directory  = 0x010,
+        Archive    = 0x020,
+        Alias      = 0x400,
+        Compressed = 0x800
+    } FileAttribute;
+
+    typedef enum {
+        ForReading   = 0x1,
+        ForWriting   = 0x2,
+        ForAppending = 0x8
+    } IOMode;
+
+    typedef enum {
+        TristateTrue       = -1,
+        TristateFalse      =  0,
+        TristateUseDefault = -2,
+        TristateMixed      = -2
+    } Tristate;
+
+    interface IFolder;
+    interface IFolderCollection;
+
+    [
+        uuid(53bad8c1-e718-11cf-893d-00a0c9054228),
+        odl,
+        hidden,
+        dual,
+        nonextensible,
+        oleautomation
+    ]
+    interface ITextStream : IDispatch {
+        [id(0x2710), propget]
+        HRESULT Line([out, retval] long* Line);
+
+        [id(0xfffffdef), propget]
+        HRESULT Column([out, retval] long* Column);
+
+        [id(0x2712), propget]
+        HRESULT AtEndOfStream([out, retval] VARIANT_BOOL* EOS);
+
+        [id(0x2713), propget]
+        HRESULT AtEndOfLine([out, retval] VARIANT_BOOL* EOL);
+
+        [id(0x2714)]
+        HRESULT Read([in] long Characters, [out, retval] BSTR* Text);
+
+        [id(0x2715)]
+        HRESULT ReadLine([out, retval] BSTR* Text);
+
+        [id(0x2716)]
+        HRESULT ReadAll([out, retval] BSTR* Text);
+
+        [id(0x2717)]
+        HRESULT Write([in] BSTR Text);
+
+        [id(0x2718)]
+        HRESULT WriteLine([in, defaultvalue("")] BSTR Text);
+
+        [id(0x2719)]
+        HRESULT WriteBlankLines([in] long Lines);
+
+        [id(0x271a)]
+        HRESULT Skip([in] long Characters);
+
+        [id(0x271b)]
+        HRESULT SkipLine();
+
+        [id(0x271c)]
+        HRESULT Close();
+    };
+
+    [
+        uuid(c7c3f5a0-88a3-11d0-abcb-00a0c90fffc0),
+        odl,
+        hidden,
+        dual,
+        nonextensible,
+        oleautomation
+    ]
+    interface IDrive : IDispatch {
+        [id(DISPID_VALUE), propget]
+        HRESULT Path([out, retval] BSTR* path);
+
+        [id(0x2710), propget]
+        HRESULT DriveLetter([out, retval] BSTR* letter);
+
+        [id(0x2711), propget]
+        HRESULT ShareName([out, retval] BSTR* ShareName);
+
+        [id(0x2712), propget]
+        HRESULT DriveType([out, retval] DriveTypeConst* type);
+
+        [id(0x2713), propget]
+        HRESULT RootFolder([out, retval] IFolder** folder);
+
+        [id(0x2715), propget]
+        HRESULT AvailableSpace([out, retval] VARIANT* Avail);
+
+        [id(0x2714), propget]
+        HRESULT FreeSpace([out, retval] VARIANT* pFree);
+
+        [id(0x2716), propget]
+        HRESULT TotalSize([out, retval] VARIANT* Total);
+
+        [id(0x2717), propget]
+        HRESULT VolumeName([out, retval] BSTR* Name);
+
+        [id(0x2717), propput]
+        HRESULT VolumeName([in] BSTR Name);
+
+        [id(0x2718), propget]
+        HRESULT FileSystem([out, retval] BSTR* pFileSystem);
+
+        [id(0x2719), propget]
+        HRESULT SerialNumber([out, retval] long* SerialNumber);
+
+        [id(0x271a), propget]
+        HRESULT IsReady([out, retval] VARIANT_BOOL* pfReady);
+    };
+
+    [
+        uuid(c7c3f5a4-88a3-11d0-abcb-00a0c90fffc0),
+        odl,
+        hidden,
+        dual,
+        nonextensible,
+        oleautomation
+    ]
+    interface IFile : IDispatch {
+        [id(DISPID_VALUE), propget]
+        HRESULT Path([out, retval] BSTR* path);
+
+        [id(0x03e8), propget]
+        HRESULT Name([out, retval] BSTR* Name);
+
+        [id(0x03e8), propput]
+        HRESULT Name([in] BSTR Name);
+
+        [id(0x03ea), propget]
+        HRESULT ShortPath([out, retval] BSTR* path);
+
+        [id(0x03e9), propget]
+        HRESULT ShortName([out, retval] BSTR* Name);
+
+        [id(0x03ec), propget]
+        HRESULT Drive([out, retval] IDrive** drive);
+
+        [id(0x03ed), propget]
+        HRESULT ParentFolder([out, retval] IFolder** folder);
+
+        [id(0x03eb), propget]
+        HRESULT Attributes([out, retval] FileAttribute* attr);
+
+        [id(0x03eb), propput]
+        HRESULT Attributes([in] FileAttribute attr);
+
+        [id(0x03ee), propget]
+        HRESULT DateCreated([out, retval] DATE* date);
+
+        [id(0x03ef), propget]
+        HRESULT DateLastModified([out, retval] DATE* date);
+
+        [id(0x03f0), propget]
+        HRESULT DateLastAccessed([out, retval] DATE* date);
+
+        [id(0x03f1), propget]
+        HRESULT Size([out, retval] VARIANT* Size);
+
+        [id(0x03f2), propget]
+        HRESULT Type([out, retval] BSTR* Type);
+
+        [id(0x04b0)]
+        HRESULT Delete([in, defaultvalue(0)] VARIANT_BOOL Force);
+
+        [id(0x04b2)]
+        HRESULT Copy(
+                    [in] BSTR Destination,
+                    [in, defaultvalue(-1)] VARIANT_BOOL OverWriteFiles);
+
+        [id(0x04b4)]
+        HRESULT Move([in] BSTR Destination);
+
+        [id(0x044c)]
+        HRESULT OpenAsTextStream(
+                    [in, defaultvalue(1)] IOMode IOMode,
+                    [in, defaultvalue(0)] Tristate Format,
+                    [out, retval] ITextStream** ppts);
+    };
+
+    [
+        uuid(c7c3f5a5-88a3-11d0-abcb-00a0c90fffc0),
+        odl,
+        hidden,
+        dual,
+        nonextensible,
+        oleautomation
+    ]
+    interface IFileCollection : IDispatch {
+        [id(DISPID_VALUE), propget]
+        HRESULT Item(
+                    [in] VARIANT Key,
+                    [out, retval] IFile** ppfile);
+        [id(DISPID_NEWENUM), propget, restricted, hidden]
+        HRESULT _NewEnum([out, retval] IUnknown** ppenum);
+        [id(1), propget]
+        HRESULT Count([out, retval] long* count);
+    };
+
+    [
+        uuid(c7c3f5a2-88a3-11d0-abcb-00a0c90fffc0),
+        odl,
+        hidden,
+        dual,
+        nonextensible,
+        oleautomation
+    ]
+    interface IFolder : IDispatch {
+        [id(DISPID_VALUE), propget]
+        HRESULT Path([out, retval] BSTR* path);
+
+        [id(0x03e8), propget]
+        HRESULT Name([out, retval] BSTR* name);
+
+        [id(0x03e8), propput]
+        HRESULT Name([in] BSTR name);
+
+        [id(0x03ea), propget]
+        HRESULT ShortPath([out, retval] BSTR* path);
+
+        [id(0x03e9), propget]
+        HRESULT ShortName([out, retval] BSTR* name);
+
+        [id(0x03ec), propget]
+        HRESULT Drive([out, retval] IDrive** drive);
+
+        [id(0x03ed), propget]
+        HRESULT ParentFolder([out, retval] IFolder** folder);
+
+        [id(0x03eb), propget]
+        HRESULT Attributes([out, retval] FileAttribute* attr);
+
+        [id(0x03eb), propput]
+        HRESULT Attributes([in] FileAttribute attr);
+
+        [id(0x03ee), propget]
+        HRESULT DateCreated([out, retval] DATE* date);
+
+        [id(0x03ef), propget]
+        HRESULT DateLastModified([out, retval] DATE* date);
+
+        [id(0x03f0), propget]
+        HRESULT DateLastAccessed([out, retval] DATE* date);
+
+        [id(0x03f2), propget]
+        HRESULT Type([out, retval] BSTR* type);
+
+        [id(0x04b1)]
+        HRESULT Delete([in, defaultvalue(0)] VARIANT_BOOL force);
+
+        [id(0x04b3)]
+        HRESULT Copy(
+                    [in] BSTR Destination,
+                    [in, defaultvalue(-1)] VARIANT_BOOL OverWriteFiles);
+
+        [id(0x04b5)]
+        HRESULT Move([in] BSTR Destination);
+
+        [id(0x2710), propget]
+        HRESULT IsRootFolder([out, retval] VARIANT_BOOL* root);
+
+        [id(0x03f1), propget]
+        HRESULT Size([out, retval] VARIANT* size);
+
+        [id(0x2711), propget]
+        HRESULT SubFolders([out, retval] IFolderCollection** folders);
+
+        [id(0x2712), propget]
+        HRESULT Files([out, retval] IFileCollection** files);
+
+        [id(0x044d)]
+        HRESULT CreateTextFile(
+                    [in] BSTR FileName,
+                    [in, defaultvalue(-1)] VARIANT_BOOL Overwrite,
+                    [in, defaultvalue(0)] VARIANT_BOOL Unicode,
+                    [out, retval] ITextStream** ppts);
+    };
+
+    [
+        uuid(c7c3f5a3-88a3-11d0-abcb-00a0c90fffc0),
+        odl,
+        hidden,
+        dual,
+        nonextensible,
+        oleautomation
+    ]
+    interface IFolderCollection : IDispatch {
+        [id(2)]
+        HRESULT Add(
+                    [in] BSTR Name,
+                    [out, retval] IFolder** folder);
+
+        [id(DISPID_VALUE), propget]
+        HRESULT Item(
+                    [in] VARIANT Key,
+                    [out, retval] IFolder** folder);
+
+        [id(DISPID_NEWENUM), propget, restricted, hidden]
+        HRESULT _NewEnum([out, retval] IUnknown** ppenum);
+
+        [id(1), propget]
+        HRESULT Count([out, retval] long* count);
+    };
+
+    [
+        uuid(f935dc27-1cf0-11d0-adb9-00c04fd58a0b),
+        odl,
+        dual,
+        oleautomation
+    ]
+    interface IWshCollection : IDispatch {
+        [id(DISPID_VALUE)]
+        HRESULT Item(
+                [in] VARIANT *Index,
+                [out, retval] VARIANT *out_Value);
+
+        [id(1)]
+        HRESULT Count([out, retval] long *out_Count);
+
+        [id(2), propget]
+        HRESULT length([out, retval] long *out_Count);
+
+        [id(DISPID_NEWENUM)]
+        HRESULT _NewEnum([out, retval] IUnknown *out_Enum);
+    }
+
+    [
+        uuid(f935dc29-1cf0-11d0-adb9-00c04fd58a0b),
+        odl,
+        dual,
+        oleautomation
+    ]
+    interface IWshEnvironment : IDispatch {
+        [id(DISPID_VALUE), propget]
+        HRESULT Item(
+                [in] BSTR Name,
+                [out, retval] BSTR *out_Value);
+
+        [id(DISPID_VALUE), propput]
+        HRESULT Item(
+                [in] BSTR Name,
+                [in] BSTR Value);
+
+        [id(1)]
+        HRESULT Count([out, retval] long *out_Count);
+
+        [id(2), propget]
+        HRESULT length([out, retval] long *out_Count);
+
+        [id(DISPID_NEWENUM)]
+        HRESULT _NewEnum([out, retval] IUnknown **out_Enum);
+
+        [id(0x03e9)]
+        HRESULT Remove([in] BSTR Name);
+    }
+
+    [
+        uuid(08fed190-be19-11d3-a28b-00104bd35090),
+        odl,
+        dual,
+        oleautomation
+    ]
+    interface IWshExec : IDispatch {
+        [id(0x0001), propget]
+        HRESULT Status([out, retval] WshExecStatus* Status);
+
+        [id(0x0003), propget]
+        HRESULT StdIn([out, retval] ITextStream** stream);
+
+        [id(0x0004), propget]
+        HRESULT StdOut([out, retval] ITextStream** stream);
+
+        [id(0x0005), propget]
+        HRESULT StdErr([out, retval] ITextStream** stream);
+
+        [id(0x0006), propget]
+        HRESULT ProcessID([out, retval] long* pid);
+
+        [id(0x0007), propget]
+        HRESULT ExitCode([out, retval] long* ExitCode);
+
+        [id(0x0008)]
+        HRESULT Terminate();
+    };
+
+    [
+        uuid(f935dc23-1cf0-11d0-adb9-00c04fd58a0b),
+        odl,
+        dual,
+        oleautomation
+    ]
+    interface IWshShortcut : IDispatch {
+        [id(DISPID_VALUE), propget]
+        HRESULT FullName([out, retval] BSTR* name);
+
+        [id(0x03e8), propget]
+        HRESULT Arguments([out, retval] BSTR* Arguments);
+
+        [id(0x03e8), propput]
+        HRESULT Arguments([in] BSTR Arguments);
+
+        [id(0x03e9), propget]
+        HRESULT Description([out, retval] BSTR* Description);
+
+        [id(0x03e9), propput]
+        HRESULT Description([in] BSTR Description);
+
+        [id(0x03ea), propget]
+        HRESULT Hotkey([out, retval] BSTR* HotKey);
+
+        [id(0x03ea), propput]
+        HRESULT Hotkey([in] BSTR HotKey);
+
+        [id(0x03eb), propget]
+        HRESULT IconLocation([out, retval] BSTR* IconPath);
+
+        [id(0x03eb), propput]
+        HRESULT IconLocation([in] BSTR IconPath);
+
+        [id(0x03ec), propput]
+        HRESULT RelativePath([in] BSTR rhs);
+
+        [id(0x03ed), propget]
+        HRESULT TargetPath([out, retval] BSTR* Path);
+
+        [id(0x03ed), propput]
+        HRESULT TargetPath([in] BSTR Path);
+
+        [id(0x03ee), propget]
+        HRESULT WindowStyle([out, retval] int* ShowCmd);
+
+        [id(0x03ee), propput]
+        HRESULT WindowStyle([in] int ShowCmd);
+
+        [id(0x03ef), propget]
+        HRESULT WorkingDirectory([out, retval] BSTR* WorkingDirectory);
+
+        [id(0x03ef), propput]
+        HRESULT WorkingDirectory([in] BSTR WorkingDirectory);
+
+        [id(0x07d0), hidden]
+        HRESULT Load([in] BSTR PathLink);
+
+        [id(0x07d1)]
+        HRESULT Save();
+    };
+
+    [
+        uuid(f935dc21-1cf0-11d0-adb9-00c04fd58a0b),
+        odl,
+        dual,
+        oleautomation,
+        hidden
+    ]
+    interface IWshShell : IDispatch {
+        [id(0x0064), propget]
+        HRESULT SpecialFolders([out, retval] IWshCollection** out_Folders);
+
+        [id(0x00c8), propget]
+        HRESULT Environment(
+            [in, optional] VARIANT* Type,
+            [out, retval] IWshEnvironment** out_Env);
+
+        [id(0x03e8)]
+        HRESULT Run(
+            [in] BSTR Command,
+            [in, optional] VARIANT* WindowStyle,
+            [in, optional] VARIANT* WaitOnReturn,
+            [out, retval] int* out_ExitCode);
+
+        [id(0x03e9)]
+        HRESULT Popup(
+            [in] BSTR Text,
+            [in, optional] VARIANT* SecondsToWait,
+            [in, optional] VARIANT* Title,
+            [in, optional] VARIANT* Type,
+            [out, retval] int* out_Button);
+
+        [id(0x03ea)]
+        HRESULT CreateShortcut(
+            [in] BSTR PathLink,
+            [out, retval] IDispatch** out_Shortcut);
+
+        [id(0x03ee)]
+        HRESULT ExpandEnvironmentStrings(
+            [in] BSTR Src,
+            [out, retval] BSTR* out_Dst);
+
+        [id(0x07d0)]
+        HRESULT RegRead(
+            [in] BSTR Name,
+            [out, retval] VARIANT* out_Value);
+
+        [id(0x07d1)]
+        HRESULT RegWrite(
+            [in] BSTR Name,
+            [in] VARIANT* Value,
+            [in, optional] VARIANT* Type);
+
+        [id(0x07d2)]
+        HRESULT RegDelete([in] BSTR Name);
+    };
+
+    [
+      uuid(24be5a30-edfe-11d2-b933-00104b365c9f),
+      odl,
+      dual,
+      oleautomation,
+      hidden
+    ]
+    interface IWshShell2 : IWshShell {
+        [id(0x0bb8)]
+        HRESULT LogEvent(
+            [in] VARIANT* Type,
+            [in] BSTR Message,
+            [in, defaultvalue("")] BSTR Target,
+            [out, retval] VARIANT_BOOL* out_Success);
+
+        [id(0x0bc2)]
+        HRESULT AppActivate(
+            [in] VARIANT* App,
+            [in, optional] VARIANT* Wait,
+            [out, retval] VARIANT_BOOL* out_Success);
+
+        [id(0x0bc3)]
+        HRESULT SendKeys(
+            [in] BSTR Keys,
+            [in, optional] VARIANT* Wait);
+    };
+
+    [
+        uuid(41904400-be18-11d3-a28b-00104bd35090),
+        odl,
+        dual,
+        oleautomation
+    ]
+    interface IWshShell3 : IWshShell2 {
+        [id(0x0bc4)]
+        HRESULT Exec(
+            [in] BSTR Command,
+            [out, retval] IWshExec** out_Exec);
+
+        [id(0x0bc5), propget]
+        HRESULT CurrentDirectory([out, retval] BSTR* out_Directory);
+
+        [id(0x0bc5), propput]
+        HRESULT CurrentDirectory([in] BSTR out_Directory);
+    };
+
+    [
+        uuid(24be5a31-edfe-11d2-b933-00104b365c9f),
+        odl,
+        dual,
+        oleautomation
+    ]
+    interface IWshNetwork2 : IDispatch {
+        [id(0x60020000), propget]
+        HRESULT UserDomain([out, retval] BSTR *out_UserDomain);
+    }
+
+    [
+        helpstring("Windows Script Host Shell Object"),
+        uuid(f935dc22-1cf0-11d0-adb9-00c04fd58a0b),
+        threading(apartment),
+        progid("WScript.Shell.1"),
+        vi_progid("WScript.Shell")
+    ]
+    coclass IWshShell_Class {
+        [default] interface IWshShell3;
+    }
+
+    [
+        helpstring("Windows Script Host Shell Object"),
+        uuid(72c24dd5-d70a-438b-8a42-98424b88afb8),
+        threading(apartment),
+        progid("WScript.Shell.1"),
+        vi_progid("WScript.Shell")
+    ]
+    coclass WshShell {
+        [default] interface IWshShell3;
+    }
+
+    [
+        helpstring("Windows Script Host Network Object"),
+        uuid(f935dc26-1cf0-11d0-adb9-00c04fd58a0b),
+        threading(apartment),
+        progid("WScript.Network.1"),
+        vi_progid("WScript.Network")
+    ]
+    coclass IWshNetwork_Class {
+        [default] interface IWshNetwork2;
+    }
+
+    [
+        helpstring("Windows Script Host Network Object"),
+        uuid(093ff999-1ea0-4079-9525-9614c3504b74),
+        threading(apartment),
+        progid("WScript.Network.1"),
+        vi_progid("WScript.Network")
+    ]
+    coclass WshNetwork {
+        [default] interface IWshNetwork2;
+    }
+}

Propchange: trunk/reactos/dll/win32/wshom.ocx/wshom.idl
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/wshom.ocx/wshom.ocx.spec
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wshom.ocx/wshom.ocx.spec?rev=65315
==============================================================================
--- trunk/reactos/dll/win32/wshom.ocx/wshom.ocx.spec    (added)
+++ trunk/reactos/dll/win32/wshom.ocx/wshom.ocx.spec    [iso-8859-1] Sat Nov  8 
10:22:22 2014
@@ -0,0 +1,4 @@
+@ stdcall -private DllCanUnloadNow()
+@ stdcall -private DllGetClassObject(ptr ptr ptr)
+@ stdcall -private DllRegisterServer()
+@ stdcall -private DllUnregisterServer()

Propchange: trunk/reactos/dll/win32/wshom.ocx/wshom.ocx.spec
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/wshom.ocx/wshom.rc
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wshom.ocx/wshom.rc?rev=65315
==============================================================================
--- trunk/reactos/dll/win32/wshom.ocx/wshom.rc  (added)
+++ trunk/reactos/dll/win32/wshom.ocx/wshom.rc  [iso-8859-1] Sat Nov  8 
10:22:22 2014
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2011 Jacek Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <windef.h>
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+/* @makedep: wshom.rgs */
+1 WINE_REGISTRY wshom.rgs
+
+2 WINE_REGISTRY wshom.tlb.rgs
+1 TYPELIB wshom.tlb

Propchange: trunk/reactos/dll/win32/wshom.ocx/wshom.rc
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/wshom.ocx/wshom.rgs
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wshom.ocx/wshom.rgs?rev=65315
==============================================================================
--- trunk/reactos/dll/win32/wshom.ocx/wshom.rgs (added)
+++ trunk/reactos/dll/win32/wshom.ocx/wshom.rgs [iso-8859-1] Sat Nov  8 
10:22:22 2014
@@ -0,0 +1,34 @@
+HKCR
+{
+    NoRemove CLSID
+    {
+        '{f935dc22-1cf0-11d0-adb9-00c04fd58a0b}'
+        {
+            'Implemented Categories'
+            {
+                '{40fc6ed5-2438-11cf-a3db-080036f12502}'
+            }
+        }
+        '{72c24dd5-d70a-438b-8a42-98424b88afb8}'
+        {
+            'Implemented Categories'
+            {
+                '{40fc6ed5-2438-11cf-a3db-080036f12502}'
+            }
+        }
+        '{f935dc26-1cf0-11d0-adb9-00c04fd58a0b}'
+        {
+            'Implemented Categories'
+            {
+                '{40fc6ed5-2438-11cf-a3db-080036f12502}'
+            }
+        }
+        '{093ff999-1ea0-4079-9525-9614c3504b74}'
+        {
+            'Implemented Categories'
+            {
+                '{40fc6ed5-2438-11cf-a3db-080036f12502}'
+            }
+        }
+    }
+}

Propchange: trunk/reactos/dll/win32/wshom.ocx/wshom.rgs
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/wshom.ocx/wshom.tlb.rgs
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wshom.ocx/wshom.tlb.rgs?rev=65315
==============================================================================
--- trunk/reactos/dll/win32/wshom.ocx/wshom.tlb.rgs     (added)
+++ trunk/reactos/dll/win32/wshom.ocx/wshom.tlb.rgs     [iso-8859-1] Sat Nov  8 
10:22:22 2014
@@ -0,0 +1,172 @@
+HKCR
+{
+    NoRemove Typelib
+    {
+        NoRemove '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}'
+        {
+            '1.0' = s 'Windows Script Host Object Model'
+            {
+                '0' { win32 = s '%MODULE%' }
+                FLAGS = s '0'
+            }
+        }
+    }
+    NoRemove Interface
+    {
+        '{53BAD8C1-E718-11CF-893D-00A0C9054228}' = s 'ITextStream'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{C7C3F5A0-88A3-11D0-ABCB-00A0C90FFFC0}' = s 'IDrive'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{C7C3F5A4-88A3-11D0-ABCB-00A0C90FFFC0}' = s 'IFile'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{C7C3F5A5-88A3-11D0-ABCB-00A0C90FFFC0}' = s 'IFileCollection'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{C7C3F5A2-88A3-11D0-ABCB-00A0C90FFFC0}' = s 'IFolder'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{C7C3F5A3-88A3-11D0-ABCB-00A0C90FFFC0}' = s 'IFolderCollection'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{F935DC27-1CF0-11D0-ADB9-00C04FD58A0B}' = s 'IWshCollection'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{F935DC29-1CF0-11D0-ADB9-00C04FD58A0B}' = s 'IWshEnvironment'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{08FED190-BE19-11D3-A28B-00104BD35090}' = s 'IWshExec'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{F935DC23-1CF0-11D0-ADB9-00C04FD58A0B}' = s 'IWshShortcut'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{F935DC21-1CF0-11D0-ADB9-00C04FD58A0B}' = s 'IWshShell'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{24BE5A30-EDFE-11D2-B933-00104B365C9F}' = s 'IWshShell2'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{41904400-BE18-11D3-A28B-00104BD35090}' = s 'IWshShell3'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+        '{24BE5A31-EDFE-11D2-B933-00104B365C9F}' = s 'IWshNetwork2'
+        {
+            ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
+            ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}' { val Version 
= s '1.0' }
+        }
+    }
+    NoRemove CLSID
+    {
+        '{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}' = s 'Windows Script Host 
Shell Object'
+        {
+            InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' 
}
+            ProgId = s 'WScript.Shell.1'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}'
+            Version = s '1.0'
+            VersionIndependentProgId = s 'WScript.Shell'
+        }
+        '{72C24DD5-D70A-438B-8A42-98424B88AFB8}' = s 'Windows Script Host 
Shell Object'
+        {
+            InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' 
}
+            ProgId = s 'WScript.Shell.1'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}'
+            Version = s '1.0'
+            VersionIndependentProgId = s 'WScript.Shell'
+        }
+        '{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}' = s 'Windows Script Host 
Network Object'
+        {
+            InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' 
}
+            ProgId = s 'WScript.Network.1'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}'
+            Version = s '1.0'
+            VersionIndependentProgId = s 'WScript.Network'
+        }
+        '{093FF999-1EA0-4079-9525-9614C3504B74}' = s 'Windows Script Host 
Network Object'
+        {
+            InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' 
}
+            ProgId = s 'WScript.Network.1'
+            TypeLib = s '{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}'
+            Version = s '1.0'
+            VersionIndependentProgId = s 'WScript.Network'
+        }
+    }
+    'WScript.Shell.1' = s 'Windows Script Host Shell Object'
+    {
+        CLSID = s '{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}'
+    }
+    'WScript.Shell' = s 'Windows Script Host Shell Object'
+    {
+        CLSID = s '{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}'
+        CurVer = s 'WScript.Shell.1'
+    }
+    'WScript.Shell.1' = s 'Windows Script Host Shell Object'
+    {
+        CLSID = s '{72C24DD5-D70A-438B-8A42-98424B88AFB8}'
+    }
+    'WScript.Shell' = s 'Windows Script Host Shell Object'
+    {
+        CLSID = s '{72C24DD5-D70A-438B-8A42-98424B88AFB8}'
+        CurVer = s 'WScript.Shell.1'
+    }
+    'WScript.Network.1' = s 'Windows Script Host Network Object'
+    {
+        CLSID = s '{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}'
+    }
+    'WScript.Network' = s 'Windows Script Host Network Object'
+    {
+        CLSID = s '{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}'
+        CurVer = s 'WScript.Network.1'
+    }
+    'WScript.Network.1' = s 'Windows Script Host Network Object'
+    {
+        CLSID = s '{093FF999-1EA0-4079-9525-9614C3504B74}'
+    }
+    'WScript.Network' = s 'Windows Script Host Network Object'
+    {
+        CLSID = s '{093FF999-1EA0-4079-9525-9614C3504B74}'
+        CurVer = s 'WScript.Network.1'
+    }
+}

Propchange: trunk/reactos/dll/win32/wshom.ocx/wshom.tlb.rgs
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/wshom.ocx/wshom_main.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wshom.ocx/wshom_main.c?rev=65315
==============================================================================
--- trunk/reactos/dll/win32/wshom.ocx/wshom_main.c      (added)
+++ trunk/reactos/dll/win32/wshom.ocx/wshom_main.c      [iso-8859-1] Sat Nov  8 
10:22:22 2014
@@ -0,0 +1,205 @@
+/*
+ * Copyright 2011 Jacek Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "wshom_private.h"
+
+#include <rpcproxy.h>
+
+static HINSTANCE wshom_instance;
+
+static ITypeLib *typelib;
+static ITypeInfo *typeinfos[LAST_tid];
+
+static REFIID tid_ids[] = {
+    &IID_NULL,
+    &IID_IWshCollection,
+    &IID_IWshEnvironment,
+    &IID_IWshShell3,
+    &IID_IWshShortcut
+};
+
+static HRESULT load_typelib(void)
+{
+    HRESULT hres;
+    ITypeLib *tl;
+
+    hres = LoadRegTypeLib(&LIBID_IWshRuntimeLibrary, 1, 0, 
LOCALE_SYSTEM_DEFAULT, &tl);
+    if(FAILED(hres)) {
+        ERR("LoadRegTypeLib failed: %08x\n", hres);
+        return hres;
+    }
+
+    if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL))
+        ITypeLib_Release(tl);
+    return hres;
+}
+
+HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo)
+{
+    HRESULT hres;
+
+    if (!typelib)
+        hres = load_typelib();
+    if (!typelib)
+        return hres;
+
+    if(!typeinfos[tid]) {
+        ITypeInfo *ti;
+
+        hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti);
+        if(FAILED(hres)) {
+            ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", 
debugstr_guid(tid_ids[tid]), hres);
+            return hres;
+        }
+
+        if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), ti, 
NULL))
+            ITypeInfo_Release(ti);
+    }
+
+    *typeinfo = typeinfos[tid];
+    ITypeInfo_AddRef(*typeinfo);
+    return S_OK;
+}
+
+static
+void release_typelib(void)
+{
+    unsigned i;
+
+    if(!typelib)
+        return;
+
+    for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++)
+        if(typeinfos[i])
+            ITypeInfo_Release(typeinfos[i]);
+
+    ITypeLib_Release(typelib);
+}
+
+static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID 
riid, void **ppv)
+{
+    *ppv = NULL;
+
+    if(IsEqualGUID(&IID_IUnknown, riid)) {
+        TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv);
+        *ppv = iface;
+    }else if(IsEqualGUID(&IID_IClassFactory, riid)) {
+        TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv);
+        *ppv = iface;
+    }
+
+    if(*ppv) {
+        IUnknown_AddRef((IUnknown*)*ppv);
+        return S_OK;
+    }
+
+    FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
+{
+    TRACE("(%p)\n", iface);
+    return 2;
+}
+
+static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
+{
+    TRACE("(%p)\n", iface);
+    return 1;
+}
+
+static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
+{
+    TRACE("(%p)->(%x)\n", iface, fLock);
+    return S_OK;
+}
+
+static const IClassFactoryVtbl WshShellFactoryVtbl = {
+    ClassFactory_QueryInterface,
+    ClassFactory_AddRef,
+    ClassFactory_Release,
+    WshShellFactory_CreateInstance,
+    ClassFactory_LockServer
+};
+
+static IClassFactory WshShellFactory = { &WshShellFactoryVtbl };
+
+/******************************************************************
+ *              DllMain (wshom.ocx.@)
+ */
+BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
+{
+    TRACE("(%p %d %p)\n", hInstDLL, fdwReason, lpv);
+
+    switch(fdwReason)
+    {
+    case DLL_WINE_PREATTACH:
+        return FALSE;  /* prefer native version */
+    case DLL_PROCESS_ATTACH:
+        wshom_instance = hInstDLL;
+        DisableThreadLibraryCalls(wshom_instance);
+        break;
+    case DLL_PROCESS_DETACH:
+        if (lpv) break;
+        release_typelib();
+        break;
+    }
+
+    return TRUE;
+}
+
+/***********************************************************************
+ *             DllGetClassObject       (wshom.ocx.@)
+ */
+HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
+{
+    if(IsEqualGUID(&CLSID_WshShell, rclsid)) {
+        TRACE("(CLSID_WshShell %s %p)\n", debugstr_guid(riid), ppv);
+        return IClassFactory_QueryInterface(&WshShellFactory, riid, ppv);
+    }
+
+    FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+    return CLASS_E_CLASSNOTAVAILABLE;
+}
+
+/***********************************************************************
+ *          DllCanUnloadNow (wshom.ocx.@)
+ */
+HRESULT WINAPI DllCanUnloadNow(void)
+{
+    return S_FALSE;
+}
+
+/***********************************************************************
+ *          DllRegisterServer (wshom.ocx.@)
+ */
+HRESULT WINAPI DllRegisterServer(void)
+{
+    TRACE("()\n");
+    return __wine_register_resources(wshom_instance);
+}
+
+/***********************************************************************
+ *          DllUnregisterServer (wshom.ocx.@)
+ */
+HRESULT WINAPI DllUnregisterServer(void)
+{
+    TRACE("()\n");
+    return __wine_unregister_resources(wshom_instance);
+}

Propchange: trunk/reactos/dll/win32/wshom.ocx/wshom_main.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/wshom.ocx/wshom_private.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wshom.ocx/wshom_private.h?rev=65315
==============================================================================
--- trunk/reactos/dll/win32/wshom.ocx/wshom_private.h   (added)
+++ trunk/reactos/dll/win32/wshom.ocx/wshom_private.h   [iso-8859-1] Sat Nov  8 
10:22:22 2014
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2011 Jacek Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _WSHOM_PRIVATE_H_
+#define _WSHOM_PRIVATE_H_
+
+#define WIN32_NO_STATUS
+#define _INC_WINDOWS
+#define COBJMACROS
+
+#include <windef.h>
+#include <winbase.h>
+#include <wshom.h>
+
+#include <wine/debug.h>
+WINE_DEFAULT_DEBUG_CHANNEL(wshom);
+
+/* typelibs */
+typedef enum tid_t {
+    NULL_tid,
+    IWshCollection_tid,
+    IWshEnvironment_tid,
+    IWshShell3_tid,
+    IWshShortcut_tid,
+    LAST_tid
+} tid_t;
+
+HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo) DECLSPEC_HIDDEN;
+
+HRESULT WINAPI 
WshShellFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**) 
DECLSPEC_HIDDEN;
+
+#endif /* _WSHOM_PRIVATE_H_ */

Propchange: trunk/reactos/dll/win32/wshom.ocx/wshom_private.h
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/media/doc/README.WINE
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=65315&r1=65314&r2=65315&view=diff
==============================================================================
--- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original)
+++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Sat Nov  8 10:22:22 2014
@@ -221,6 +221,7 @@
 reactos/dll/win32/wintrust            # Synced to Wine-1.7.27
 reactos/dll/win32/wldap32             # Synced to Wine-1.7.27
 reactos/dll/win32/wmi                 # Synced to Wine-1.7.27
+reactos/dll/win32/wshom.ocx           # Synced to Wine-1.7.27
 reactos/dll/win32/wtsapi32            # Synced to Wine-1.7.27
 reactos/dll/win32/wuapi               # Synced to Wine-1.7.27
 reactos/dll/win32/xinput1_1           # Synced to Wine-1.7.27

Modified: trunk/reactos/media/inf/syssetup.inf
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/media/inf/syssetup.inf?rev=65315&r1=65314&r2=65315&view=diff
==============================================================================
--- trunk/reactos/media/inf/syssetup.inf        [iso-8859-1] (original)
+++ trunk/reactos/media/inf/syssetup.inf        [iso-8859-1] Sat Nov  8 
10:22:22 2014
@@ -101,6 +101,7 @@
 11,,winhttp.dll,1
 11,,wininet.dll,2
 11,,wintrust.dll,1
+11,,wshom.ocx,1
 11,,wuapi.dll,1
 11,wbem,wbemdisp.dll,1
 11,wbem,wbemprox.dll,1


Reply via email to