netcfgx: Add INetCfg interface support.
This commit is contained in:
parent
66c1a099aa
commit
f9862efa48
|
@ -17024,6 +17024,7 @@ wine_fn_config_dll nddeapi enable_nddeapi implib
|
||||||
wine_fn_config_dll netapi32 enable_netapi32 implib
|
wine_fn_config_dll netapi32 enable_netapi32 implib
|
||||||
wine_fn_config_test dlls/netapi32/tests netapi32_test
|
wine_fn_config_test dlls/netapi32/tests netapi32_test
|
||||||
wine_fn_config_dll netcfgx enable_netcfgx clean
|
wine_fn_config_dll netcfgx enable_netcfgx clean
|
||||||
|
wine_fn_config_test dlls/netcfgx/tests netcfgx_test
|
||||||
wine_fn_config_dll newdev enable_newdev implib
|
wine_fn_config_dll newdev enable_newdev implib
|
||||||
wine_fn_config_dll normaliz enable_normaliz implib
|
wine_fn_config_dll normaliz enable_normaliz implib
|
||||||
wine_fn_config_dll npmshtml enable_npmshtml
|
wine_fn_config_dll npmshtml enable_npmshtml
|
||||||
|
|
|
@ -3028,6 +3028,7 @@ WINE_CONFIG_DLL(nddeapi,,[implib])
|
||||||
WINE_CONFIG_DLL(netapi32,,[implib])
|
WINE_CONFIG_DLL(netapi32,,[implib])
|
||||||
WINE_CONFIG_TEST(dlls/netapi32/tests)
|
WINE_CONFIG_TEST(dlls/netapi32/tests)
|
||||||
WINE_CONFIG_DLL(netcfgx,,[clean])
|
WINE_CONFIG_DLL(netcfgx,,[clean])
|
||||||
|
WINE_CONFIG_TEST(dlls/netcfgx/tests)
|
||||||
WINE_CONFIG_DLL(newdev,,[implib])
|
WINE_CONFIG_DLL(newdev,,[implib])
|
||||||
WINE_CONFIG_DLL(normaliz,,[implib])
|
WINE_CONFIG_DLL(normaliz,,[implib])
|
||||||
WINE_CONFIG_DLL(npmshtml)
|
WINE_CONFIG_DLL(npmshtml)
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
MODULE = netcfgx.dll
|
MODULE = netcfgx.dll
|
||||||
|
IMPORTS = uuid
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
main.c
|
main.c \
|
||||||
|
netcfg.c
|
||||||
|
|
||||||
IDL_SRCS = netcfgx_classes.idl
|
IDL_SRCS = netcfgx_classes.idl
|
||||||
|
|
|
@ -19,16 +19,107 @@
|
||||||
*/
|
*/
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#define COBJMACROS
|
||||||
|
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "ole2.h"
|
#include "ole2.h"
|
||||||
#include "rpcproxy.h"
|
#include "rpcproxy.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
#include "netcfgx.h"
|
||||||
|
#include "netcfg_private.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(netcfgx);
|
WINE_DEFAULT_DEBUG_CHANNEL(netcfgx);
|
||||||
|
|
||||||
static HINSTANCE NETCFGX_hInstance;
|
static HINSTANCE NETCFGX_hInstance;
|
||||||
|
|
||||||
|
typedef HRESULT (*ClassFactoryCreateInstanceFunc)(IUnknown **);
|
||||||
|
|
||||||
|
typedef struct netcfgcf
|
||||||
|
{
|
||||||
|
IClassFactory IClassFactory_iface;
|
||||||
|
ClassFactoryCreateInstanceFunc fnCreateInstance;
|
||||||
|
} netcfgcf;
|
||||||
|
|
||||||
|
static inline netcfgcf *impl_from_IClassFactory( IClassFactory *iface )
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, netcfgcf, IClassFactory_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI netcfgcf_QueryInterface(IClassFactory *iface, REFIID riid, LPVOID *ppobj )
|
||||||
|
{
|
||||||
|
TRACE("%s %p\n", debugstr_guid(riid), ppobj);
|
||||||
|
|
||||||
|
if (IsEqualGUID(riid, &IID_IUnknown) ||
|
||||||
|
IsEqualGUID(riid, &IID_IClassFactory))
|
||||||
|
{
|
||||||
|
IClassFactory_AddRef( iface );
|
||||||
|
*ppobj = iface;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ERR("interface %s not implemented\n", debugstr_guid(riid));
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI netcfgcf_AddRef(IClassFactory *iface )
|
||||||
|
{
|
||||||
|
TRACE("%p\n", iface);
|
||||||
|
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI netcfgcf_Release(IClassFactory *iface )
|
||||||
|
{
|
||||||
|
TRACE("%p\n", iface);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI netcfgcf_CreateInstance(IClassFactory *iface,LPUNKNOWN pOuter,
|
||||||
|
REFIID riid, LPVOID *ppobj )
|
||||||
|
{
|
||||||
|
netcfgcf *This = impl_from_IClassFactory( iface );
|
||||||
|
HRESULT hr;
|
||||||
|
IUnknown *punk;
|
||||||
|
|
||||||
|
TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj );
|
||||||
|
|
||||||
|
*ppobj = NULL;
|
||||||
|
|
||||||
|
if (pOuter)
|
||||||
|
return CLASS_E_NOAGGREGATION;
|
||||||
|
|
||||||
|
hr = This->fnCreateInstance( &punk );
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
hr = IUnknown_QueryInterface( punk, riid, ppobj );
|
||||||
|
|
||||||
|
IUnknown_Release( punk );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WARN("Cannot create an instance object. 0x%08x\n", hr);
|
||||||
|
}
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI netcfgcf_LockServer(IClassFactory *iface, BOOL dolock)
|
||||||
|
{
|
||||||
|
FIXME("(%p)->(%d),stub!\n",iface,dolock);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct IClassFactoryVtbl netcfgcf_vtbl =
|
||||||
|
{
|
||||||
|
netcfgcf_QueryInterface,
|
||||||
|
netcfgcf_AddRef,
|
||||||
|
netcfgcf_Release,
|
||||||
|
netcfgcf_CreateInstance,
|
||||||
|
netcfgcf_LockServer
|
||||||
|
};
|
||||||
|
|
||||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
{
|
{
|
||||||
TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
|
TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
|
||||||
|
@ -49,11 +140,23 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static netcfgcf netconfigcf = { {&netcfgcf_vtbl}, INetCfg_CreateInstance };
|
||||||
|
|
||||||
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
|
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
|
||||||
{
|
{
|
||||||
FIXME("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
|
IClassFactory *cf = NULL;
|
||||||
|
|
||||||
return CLASS_E_CLASSNOTAVAILABLE;
|
TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
|
||||||
|
|
||||||
|
if(IsEqualCLSID(rclsid, &CLSID_CNetCfg))
|
||||||
|
{
|
||||||
|
cf = &netconfigcf.IClassFactory_iface;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!cf)
|
||||||
|
return CLASS_E_CLASSNOTAVAILABLE;
|
||||||
|
|
||||||
|
return IClassFactory_QueryInterface(cf, riid, ppv);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI DllRegisterServer(void)
|
HRESULT WINAPI DllRegisterServer(void)
|
||||||
|
|
|
@ -0,0 +1,170 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alistair Leslie-Hughes
|
||||||
|
*
|
||||||
|
* 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 <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#define COBJMACROS
|
||||||
|
|
||||||
|
#include "netcfgx.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL( netcfgx );
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct NetConfiguration
|
||||||
|
{
|
||||||
|
INetCfg INetCfg_iface;
|
||||||
|
LONG ref;
|
||||||
|
} NetConfiguration;
|
||||||
|
|
||||||
|
static inline NetConfiguration *impl_from_INetCfg(INetCfg *iface)
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, NetConfiguration, INetCfg_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI netcfg_QueryInterface(INetCfg *iface, REFIID riid, void **ppvObject)
|
||||||
|
{
|
||||||
|
TRACE("%p %s %p\n", iface, debugstr_guid(riid), ppvObject);
|
||||||
|
|
||||||
|
if (IsEqualGUID(riid, &IID_INetCfg) ||
|
||||||
|
IsEqualGUID(riid, &IID_IUnknown))
|
||||||
|
{
|
||||||
|
*ppvObject = iface;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FIXME("Unsupported interface %s\n", debugstr_guid(riid));
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
INetCfg_AddRef( iface );
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI netcfg_AddRef(INetCfg *iface)
|
||||||
|
{
|
||||||
|
NetConfiguration *This = impl_from_INetCfg(iface);
|
||||||
|
ULONG ref = InterlockedIncrement(&This->ref);
|
||||||
|
|
||||||
|
TRACE("%p ref=%u\n", This, ref);
|
||||||
|
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI netcfg_Release(INetCfg *iface)
|
||||||
|
{
|
||||||
|
NetConfiguration *This = impl_from_INetCfg(iface);
|
||||||
|
ULONG ref = InterlockedDecrement(&This->ref);
|
||||||
|
|
||||||
|
TRACE("%p ref=%u\n", This, ref);
|
||||||
|
|
||||||
|
if (ref == 0)
|
||||||
|
{
|
||||||
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI netcfg_Initialize(INetCfg *iface, PVOID pvReserved)
|
||||||
|
{
|
||||||
|
NetConfiguration *This = impl_from_INetCfg(iface);
|
||||||
|
FIXME("%p %p\n", This, pvReserved);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI netcfg_Uninitialize(INetCfg *iface)
|
||||||
|
{
|
||||||
|
NetConfiguration *This = impl_from_INetCfg(iface);
|
||||||
|
FIXME("%p\n", This);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI netcfg_Apply(INetCfg *iface)
|
||||||
|
{
|
||||||
|
NetConfiguration *This = impl_from_INetCfg(iface);
|
||||||
|
FIXME("%p\n", This);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI netcfg_Cancel(INetCfg *iface)
|
||||||
|
{
|
||||||
|
NetConfiguration *This = impl_from_INetCfg(iface);
|
||||||
|
FIXME("%p\n", This);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI netcfg_EnumComponents(INetCfg *iface, const GUID *pguidClass, IEnumNetCfgComponent **ppenumComponent)
|
||||||
|
{
|
||||||
|
NetConfiguration *This = impl_from_INetCfg(iface);
|
||||||
|
FIXME("%p %s %p\n", This, debugstr_guid(pguidClass), ppenumComponent);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI netcfg_FindComponent(INetCfg *iface, LPCWSTR pszwInfId, INetCfgComponent **pComponent)
|
||||||
|
{
|
||||||
|
NetConfiguration *This = impl_from_INetCfg(iface);
|
||||||
|
FIXME("%p %s %p\n", This, debugstr_w(pszwInfId), pComponent);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI netcfg_QueryNetCfgClass(INetCfg *iface, const GUID *pguidClass, REFIID riid, void **ppvObject)
|
||||||
|
{
|
||||||
|
NetConfiguration *This = impl_from_INetCfg(iface);
|
||||||
|
FIXME("%p %s %p\n", This, debugstr_guid(pguidClass), ppvObject);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct INetCfgVtbl NetCfgVtbl =
|
||||||
|
{
|
||||||
|
netcfg_QueryInterface,
|
||||||
|
netcfg_AddRef,
|
||||||
|
netcfg_Release,
|
||||||
|
netcfg_Initialize,
|
||||||
|
netcfg_Uninitialize,
|
||||||
|
netcfg_Apply,
|
||||||
|
netcfg_Cancel,
|
||||||
|
netcfg_EnumComponents,
|
||||||
|
netcfg_FindComponent,
|
||||||
|
netcfg_QueryNetCfgClass
|
||||||
|
};
|
||||||
|
|
||||||
|
HRESULT INetCfg_CreateInstance(IUnknown **ppUnk)
|
||||||
|
{
|
||||||
|
NetConfiguration *This;
|
||||||
|
|
||||||
|
This = HeapAlloc(GetProcessHeap(), 0, sizeof(NetConfiguration));
|
||||||
|
if (!This)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
This->INetCfg_iface.lpVtbl = &NetCfgVtbl;
|
||||||
|
This->ref = 1;
|
||||||
|
|
||||||
|
*ppUnk = (IUnknown*)This;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alistair Leslie-Hughes
|
||||||
|
*
|
||||||
|
* 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 __NETCFG_PRIVATE_H__
|
||||||
|
#define __NETCFG_PRIVATE_H__
|
||||||
|
|
||||||
|
extern HRESULT INetCfg_CreateInstance(IUnknown **ppUnk) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,5 @@
|
||||||
|
TESTDLL = netcfgx.dll
|
||||||
|
IMPORTS = uuid ole32
|
||||||
|
|
||||||
|
C_SRCS = \
|
||||||
|
netcfgx.c
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alistair Leslie-Hughes
|
||||||
|
*
|
||||||
|
* 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 WIN32_LEAN_AND_MEAN
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define COBJMACROS
|
||||||
|
|
||||||
|
#include "netcfgx.h"
|
||||||
|
#include "wine/test.h"
|
||||||
|
|
||||||
|
void create_configuration(void)
|
||||||
|
{
|
||||||
|
static const WCHAR tcpipW[] = {'M','S','_','T','C','P','I','P',0};
|
||||||
|
HRESULT hr;
|
||||||
|
INetCfg *config = NULL;
|
||||||
|
INetCfgComponent *component = NULL;
|
||||||
|
|
||||||
|
hr = CoCreateInstance( &CLSID_CNetCfg, NULL, CLSCTX_ALL, &IID_INetCfg, (LPVOID*)&config);
|
||||||
|
ok(hr == S_OK, "Failed to create object\n");
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
hr = INetCfg_Initialize(config, NULL);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
hr = INetCfg_FindComponent(config, tcpipW, &component);
|
||||||
|
todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
if(hr == S_OK)
|
||||||
|
{
|
||||||
|
INetCfgComponent_Release(component);
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = INetCfg_Uninitialize(config);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
INetCfg_Release(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
START_TEST(netcfgx)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
hr = CoInitialize(0);
|
||||||
|
ok( hr == S_OK, "failed to init com\n");
|
||||||
|
if (hr != S_OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
create_configuration();
|
||||||
|
|
||||||
|
CoUninitialize();
|
||||||
|
}
|
Loading…
Reference in New Issue