diff --git a/.gitignore b/.gitignore index 036a810c025..b565fabecb8 100644 --- a/.gitignore +++ b/.gitignore @@ -259,6 +259,7 @@ include/wine/itss.h include/wine/svcctl.h include/wine/winedxgi.h include/winsxs.h +include/wmiutils.h include/wmsbuffer.h include/wmsdkidl.h include/wpcapi.h diff --git a/dlls/wmiutils/Makefile.in b/dlls/wmiutils/Makefile.in index c6ef89202e4..39e21b0edfa 100644 --- a/dlls/wmiutils/Makefile.in +++ b/dlls/wmiutils/Makefile.in @@ -3,6 +3,7 @@ IMPORTS = oleaut32 ole32 advapi32 C_SRCS = \ main.c \ + path.c \ statuscode.c IDL_R_SRCS = wmiutils_classes.idl diff --git a/dlls/wmiutils/main.c b/dlls/wmiutils/main.c index edc7c71f0fd..f249f309d5a 100644 --- a/dlls/wmiutils/main.c +++ b/dlls/wmiutils/main.c @@ -24,8 +24,10 @@ #include "windef.h" #include "winbase.h" #include "winuser.h" +#include "initguid.h" #include "objbase.h" #include "wbemcli.h" +#include "wmiutils.h" #include "rpcproxy.h" #include "wine/debug.h" @@ -113,6 +115,7 @@ static const struct IClassFactoryVtbl wmiutils_cf_vtbl = }; static wmiutils_cf status_code_cf = { { &wmiutils_cf_vtbl }, WbemStatusCodeText_create }; +static wmiutils_cf path_cf = { { &wmiutils_cf_vtbl }, WbemPath_create }; BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID lpv ) { @@ -140,6 +143,10 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) { cf = &status_code_cf.IClassFactory_iface; } + else if (IsEqualGUID( rclsid, &CLSID_WbemDefPath )) + { + cf = &path_cf.IClassFactory_iface; + } if (!cf) return CLASS_E_CLASSNOTAVAILABLE; return IClassFactory_QueryInterface( cf, iid, ppv ); } diff --git a/dlls/wmiutils/path.c b/dlls/wmiutils/path.c new file mode 100644 index 00000000000..d67849b8180 --- /dev/null +++ b/dlls/wmiutils/path.c @@ -0,0 +1,363 @@ +/* + * Copyright 2012 Hans Leidekker 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 + */ + +#define COBJMACROS + +#include "config.h" +#include + +#include "windef.h" +#include "winbase.h" +#include "ole2.h" +#include "wmiutils.h" + +#include "wine/debug.h" +#include "wine/unicode.h" +#include "wmiutils_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wmiutils); + +struct path +{ + IWbemPath IWbemPath_iface; + LONG refs; +}; + +static inline struct path *impl_from_IWbemPath( IWbemPath *iface ) +{ + return CONTAINING_RECORD(iface, struct path, IWbemPath_iface); +} + +static ULONG WINAPI path_AddRef( + IWbemPath *iface ) +{ + struct path *path = impl_from_IWbemPath( iface ); + return InterlockedIncrement( &path->refs ); +} + +static ULONG WINAPI path_Release( + IWbemPath *iface ) +{ + struct path *path = impl_from_IWbemPath( iface ); + LONG refs = InterlockedDecrement( &path->refs ); + if (!refs) + { + TRACE("destroying %p\n", path); + HeapFree( GetProcessHeap(), 0, path ); + } + return refs; +} + +static HRESULT WINAPI path_QueryInterface( + IWbemPath *iface, + REFIID riid, + void **ppvObject ) +{ + struct path *path = impl_from_IWbemPath( iface ); + + TRACE("%p, %s, %p\n", path, debugstr_guid( riid ), ppvObject ); + + if ( IsEqualGUID( riid, &IID_IWbemPath ) || + IsEqualGUID( riid, &IID_IUnknown ) ) + { + *ppvObject = iface; + } + else + { + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + IWbemPath_AddRef( iface ); + return S_OK; +} + +static HRESULT WINAPI path_SetText( + IWbemPath *iface, + ULONG uMode, + LPCWSTR pszPath) +{ + FIXME("%p, %u, %s\n", iface, uMode, debugstr_w(pszPath)); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_GetText( + IWbemPath *iface, + LONG lFlags, + ULONG *puBufferLength, + LPWSTR pszText) +{ + FIXME("%p, 0x%x, %p, %p\n", iface, lFlags, puBufferLength, pszText); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_GetInfo( + IWbemPath *iface, + ULONG uRequestedInfo, + ULONGLONG *puResponse) +{ + FIXME("%p, %d, %p\n", iface, uRequestedInfo, puResponse); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_SetServer( + IWbemPath *iface, + LPCWSTR Name) +{ + FIXME("%p, %s\n", iface, debugstr_w(Name)); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_GetServer( + IWbemPath *iface, + ULONG *puNameBufLength, + LPWSTR pName) +{ + FIXME("%p, %p, %p\n", iface, puNameBufLength, pName); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_GetNamespaceCount( + IWbemPath *iface, + ULONG *puCount) +{ + FIXME("%p, %p\n", iface, puCount); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_SetNamespaceAt( + IWbemPath *iface, + ULONG uIndex, + LPCWSTR pszName) +{ + FIXME("%p, %u, %s\n", iface, uIndex, debugstr_w(pszName)); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_GetNamespaceAt( + IWbemPath *iface, + ULONG uIndex, + ULONG *puNameBufLength, + LPWSTR pName) +{ + FIXME("%p, %u, %p, %p\n", iface, uIndex, puNameBufLength, pName); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_RemoveNamespaceAt( + IWbemPath *iface, + ULONG uIndex) +{ + FIXME("%p, %u\n", iface, uIndex); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_RemoveAllNamespaces( + IWbemPath *iface) +{ + FIXME("%p\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_GetScopeCount( + IWbemPath *iface, + ULONG *puCount) +{ + FIXME("%p, %p\n", iface, puCount); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_SetScope( + IWbemPath *iface, + ULONG uIndex, + LPWSTR pszClass) +{ + FIXME("%p, %u, %s\n", iface, uIndex, debugstr_w(pszClass)); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_SetScopeFromText( + IWbemPath *iface, + ULONG uIndex, + LPWSTR pszText) +{ + FIXME("%p, %u, %s\n", iface, uIndex, debugstr_w(pszText)); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_GetScope( + IWbemPath *iface, + ULONG uIndex, + ULONG *puClassNameBufSize, + LPWSTR pszClass, + IWbemPathKeyList **pKeyList) +{ + FIXME("%p, %u, %p, %p, %p\n", iface, uIndex, puClassNameBufSize, pszClass, pKeyList); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_GetScopeAsText( + IWbemPath *iface, + ULONG uIndex, + ULONG *puTextBufSize, + LPWSTR pszText) +{ + FIXME("%p, %u, %p, %p\n", iface, uIndex, puTextBufSize, pszText); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_RemoveScope( + IWbemPath *iface, + ULONG uIndex) +{ + FIXME("%p, %u\n", iface, uIndex); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_RemoveAllScopes( + IWbemPath *iface) +{ + FIXME("%p\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_SetClassName( + IWbemPath *iface, + LPCWSTR Name) +{ + FIXME("%p, %s\n", iface, debugstr_w(Name)); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_GetClassName( + IWbemPath *iface, + ULONG *puBufferLength, + LPWSTR pszName) +{ + FIXME("%p,%p, %p\n", iface, puBufferLength, pszName); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_GetKeyList( + IWbemPath *iface, + IWbemPathKeyList **pOut) +{ + FIXME("%p, %p\n", iface, pOut); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_CreateClassPart( + IWbemPath *iface, + LONG lFlags, + LPCWSTR Name) +{ + FIXME("%p, 0x%x, %s\n", iface, lFlags, debugstr_w(Name)); + return E_NOTIMPL; +} + +static HRESULT WINAPI path_DeleteClassPart( + IWbemPath *iface, + LONG lFlags) +{ + FIXME("%p, 0x%x\n", iface, lFlags); + return E_NOTIMPL; +} + +static BOOL WINAPI path_IsRelative( + IWbemPath *iface, + LPWSTR wszMachine, + LPWSTR wszNamespace) +{ + FIXME("%p, %s, %s\n", iface, debugstr_w(wszMachine), debugstr_w(wszNamespace)); + return E_NOTIMPL; +} + +static BOOL WINAPI path_IsRelativeOrChild( + IWbemPath *iface, + LPWSTR wszMachine, + LPWSTR wszNamespace, + LONG lFlags) +{ + FIXME("%p, %s, %s, 0x%x\n", iface, debugstr_w(wszMachine), debugstr_w(wszNamespace), lFlags); + return E_NOTIMPL; +} + +static BOOL WINAPI path_IsLocal( + IWbemPath *iface, + LPCWSTR wszMachine) +{ + FIXME("%p, %s\n", iface, debugstr_w(wszMachine)); + return E_NOTIMPL; +} + +static BOOL WINAPI path_IsSameClassName( + IWbemPath *iface, + LPCWSTR wszClass) +{ + FIXME("%p, %s\n", iface, debugstr_w(wszClass)); + return E_NOTIMPL; +} + +static const struct IWbemPathVtbl path_vtbl = +{ + path_QueryInterface, + path_AddRef, + path_Release, + path_SetText, + path_GetText, + path_GetInfo, + path_SetServer, + path_GetServer, + path_GetNamespaceCount, + path_SetNamespaceAt, + path_GetNamespaceAt, + path_RemoveNamespaceAt, + path_RemoveAllNamespaces, + path_GetScopeCount, + path_SetScope, + path_SetScopeFromText, + path_GetScope, + path_GetScopeAsText, + path_RemoveScope, + path_RemoveAllScopes, + path_SetClassName, + path_GetClassName, + path_GetKeyList, + path_CreateClassPart, + path_DeleteClassPart, + path_IsRelative, + path_IsRelativeOrChild, + path_IsLocal, + path_IsSameClassName +}; + +HRESULT WbemPath_create( IUnknown *pUnkOuter, LPVOID *ppObj ) +{ + struct path *path; + + TRACE("%p, %p\n", pUnkOuter, ppObj); + + if (!(path = HeapAlloc( GetProcessHeap(), 0, sizeof(*path) ))) return E_OUTOFMEMORY; + + path->IWbemPath_iface.lpVtbl = &path_vtbl; + path->refs = 1; + + *ppObj = &path->IWbemPath_iface; + + TRACE("returning iface %p\n", *ppObj); + return S_OK; +} diff --git a/dlls/wmiutils/statuscode.c b/dlls/wmiutils/statuscode.c index 6a060dbb526..2d8a3f8d39b 100644 --- a/dlls/wmiutils/statuscode.c +++ b/dlls/wmiutils/statuscode.c @@ -24,8 +24,6 @@ #include "windef.h" #include "winbase.h" -#include "winuser.h" -#include "initguid.h" #include "ole2.h" #include "wbemcli.h" diff --git a/dlls/wmiutils/wmiutils_private.h b/dlls/wmiutils/wmiutils_private.h index 58b47640937..fdcd48fd226 100644 --- a/dlls/wmiutils/wmiutils_private.h +++ b/dlls/wmiutils/wmiutils_private.h @@ -16,4 +16,5 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +HRESULT WbemPath_create(IUnknown *, LPVOID *) DECLSPEC_HIDDEN; HRESULT WbemStatusCodeText_create(IUnknown *, LPVOID *) DECLSPEC_HIDDEN; diff --git a/include/Makefile.in b/include/Makefile.in index c2ca25a6e84..ace89bb75f1 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -112,6 +112,7 @@ PUBLIC_IDL_H_SRCS = \ wine/itss.idl \ wine/svcctl.idl \ winsxs.idl \ + wmiutils.idl \ wmsbuffer.idl \ wmsdkidl.idl \ wpcapi.idl \ diff --git a/include/wmiutils.idl b/include/wmiutils.idl new file mode 100644 index 00000000000..81834ecaf55 --- /dev/null +++ b/include/wmiutils.idl @@ -0,0 +1,196 @@ +/* + * Copyright 2012 Hans Leidekker 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 + */ + +import "oaidl.idl"; + +interface IWbemPath; +interface IWbemPathKeyList; + +[ + local, + object, + uuid(9ae62877-7544-4bb0-aa26-a13824659ed6) +] +interface IWbemPathKeyList : IUnknown +{ + HRESULT GetCount( + [out] ULONG *puKeyCount); + + HRESULT SetKey( + [in,string] LPCWSTR wszName, + [in] ULONG uFlags, + [in] ULONG uCimType, + [in] LPVOID pKeyVal); + + HRESULT SetKey2( + [in,string] LPCWSTR wszName, + [in] ULONG uFlags, + [in] ULONG uCimType, + [in] VARIANT *pKeyVal); + + HRESULT GetKey( + [in] ULONG uKeyIx, + [in] ULONG uFlags, + [in,out] ULONG *puNameBufSize, + [in,out] LPWSTR pszKeyName, + [in,out] ULONG *puKeyValBufSize, + [in,out] LPVOID pKeyVal, + [out] ULONG *puApparentCimType); + + HRESULT GetKey2( + [in] ULONG uKeyIx, + [in] ULONG uFlags, + [in,out] ULONG *puNameBufSize, + [in,out] LPWSTR pszKeyName, + [in,out] VARIANT *pKeyValue, + [out] ULONG *puApparentCimType); + + HRESULT RemoveKey( + [in,string] LPCWSTR wszName, + [in] ULONG uFlags); + + HRESULT RemoveAllKeys( + [in] ULONG uFlags); + + HRESULT MakeSingleton([in] boolean bSet); + + HRESULT GetInfo( + [in] ULONG uRequestedInfo, + [out] ULONGLONG *puResponse); + + HRESULT GetText( + [in] long lFlags, + [in,out] ULONG *puBuffLength, + [in,out,string] LPWSTR pszText); +}; + +cpp_quote("#ifdef WINE_NO_UNICODE_MACROS") +cpp_quote("#undef GetClassName") +cpp_quote("#endif") + +[ + local, + object, + uuid(3bc15af2-736c-477e-9e51-238af8667dcc) +] +interface IWbemPath : IUnknown +{ + HRESULT SetText( + [in] ULONG uMode, + [in] LPCWSTR pszPath); + + HRESULT GetText( + [in] long lFlags, + [in,out] ULONG *puBuffLength, + [in,out,string] LPWSTR pszText); + + HRESULT GetInfo( + [in] ULONG uRequestedInfo, + [out] ULONGLONG *puResponse); + + HRESULT SetServer( + [in,string] LPCWSTR Name); + + HRESULT GetServer( + [in,out] ULONG *puNameBufLength, + [in,out,string] LPWSTR pName); + + HRESULT GetNamespaceCount( + [out] ULONG *puCount); + + HRESULT SetNamespaceAt( + [in] ULONG uIndex, + [in,string] LPCWSTR pszName); + + HRESULT GetNamespaceAt( + [in] ULONG uIndex, + [in,out] ULONG *puNameBufLength, + [in,out,string] LPWSTR pName); + + HRESULT RemoveNamespaceAt( + [in] ULONG uIndex); + + HRESULT RemoveAllNamespaces(); + + HRESULT GetScopeCount( + [out] ULONG *puCount); + + HRESULT SetScope( + [in] ULONG uIndex, + [in] LPWSTR pszClass); + + HRESULT SetScopeFromText( + [in] ULONG uIndex, + [in] LPWSTR pszText); + + HRESULT GetScope( + [in] ULONG uIndex, + [in,out] ULONG *puClassNameBufSize, + [in,out] LPWSTR pszClass, + [out] IWbemPathKeyList **pKeyList); + + HRESULT GetScopeAsText( + [in] ULONG uIndex, + [in,out] ULONG *puTextBufSize, + [in,out] LPWSTR pszText); + + HRESULT RemoveScope( + [in] ULONG uIndex); + + HRESULT RemoveAllScopes(); + + HRESULT SetClassName( + [in,string] LPCWSTR Name); + + HRESULT GetClassName( + [in,out] ULONG *puBuffLength, + [in,out,string] LPWSTR pszName); + + HRESULT GetKeyList( + [out] IWbemPathKeyList **pOut); + + HRESULT CreateClassPart( + [in] long lFlags, + [in,string] LPCWSTR Name); + + HRESULT DeleteClassPart( + [in] long lFlags); + + BOOL IsRelative( + [in,string] LPWSTR wszMachine, + [in,string] LPWSTR wszNamespace); + + BOOL IsRelativeOrChild( + [in,string] LPWSTR wszMachine, + [in,string] LPWSTR wszNamespace, + [in] long lFlags); + + BOOL IsLocal( + [in,string] LPCWSTR wszMachine); + + BOOL IsSameClassName( + [in,string] LPCWSTR wszClass); +}; + +[ + uuid(cf4cc405-e2c5-4ddd-b3ce-5e7582d8c9fa) +] +coclass WbemDefPath +{ + interface IWbemPath; +};