xref: /reactos/dll/win32/wmiutils/main.c (revision bd003271)
1 /*
2  * Copyright 2009 Hans Leidekker for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #include <stdarg.h>
20 
21 #define COBJMACROS
22 
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "initguid.h"
27 #include "objbase.h"
28 #include "wbemcli.h"
29 #include "wmiutils.h"
30 #include "rpcproxy.h"
31 
32 #include "wine/debug.h"
33 #include "wmiutils_private.h"
34 
35 WINE_DEFAULT_DEBUG_CHANNEL(wmiutils);
36 
37 static HINSTANCE instance;
38 
39 typedef HRESULT (*fnCreateInstance)( LPVOID *ppObj );
40 
41 typedef struct
42 {
43     IClassFactory IClassFactory_iface;
44     fnCreateInstance pfnCreateInstance;
45 } wmiutils_cf;
46 
impl_from_IClassFactory(IClassFactory * iface)47 static inline wmiutils_cf *impl_from_IClassFactory( IClassFactory *iface )
48 {
49     return CONTAINING_RECORD(iface, wmiutils_cf, IClassFactory_iface);
50 }
51 
wmiutils_cf_QueryInterface(IClassFactory * iface,REFIID riid,LPVOID * ppobj)52 static HRESULT WINAPI wmiutils_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj )
53 {
54     if (IsEqualGUID(riid, &IID_IUnknown) ||
55         IsEqualGUID(riid, &IID_IClassFactory))
56     {
57         IClassFactory_AddRef( iface );
58         *ppobj = iface;
59         return S_OK;
60     }
61     FIXME("interface %s not implemented\n", debugstr_guid(riid));
62     return E_NOINTERFACE;
63 }
64 
wmiutils_cf_AddRef(IClassFactory * iface)65 static ULONG WINAPI wmiutils_cf_AddRef( IClassFactory *iface )
66 {
67     return 2;
68 }
69 
wmiutils_cf_Release(IClassFactory * iface)70 static ULONG WINAPI wmiutils_cf_Release( IClassFactory *iface )
71 {
72     return 1;
73 }
74 
wmiutils_cf_CreateInstance(IClassFactory * iface,LPUNKNOWN pOuter,REFIID riid,LPVOID * ppobj)75 static HRESULT WINAPI wmiutils_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter,
76                                                   REFIID riid, LPVOID *ppobj )
77 {
78     wmiutils_cf *This = impl_from_IClassFactory( iface );
79     HRESULT r;
80     IUnknown *punk;
81 
82     TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj);
83 
84     *ppobj = NULL;
85 
86     if (pOuter)
87         return CLASS_E_NOAGGREGATION;
88 
89     r = This->pfnCreateInstance( (LPVOID *)&punk );
90     if (FAILED(r))
91         return r;
92 
93     r = IUnknown_QueryInterface( punk, riid, ppobj );
94     IUnknown_Release( punk );
95     return r;
96 }
97 
wmiutils_cf_LockServer(IClassFactory * iface,BOOL dolock)98 static HRESULT WINAPI wmiutils_cf_LockServer( IClassFactory *iface, BOOL dolock )
99 {
100     FIXME("(%p)->(%d)\n", iface, dolock);
101     return S_OK;
102 }
103 
104 static const struct IClassFactoryVtbl wmiutils_cf_vtbl =
105 {
106     wmiutils_cf_QueryInterface,
107     wmiutils_cf_AddRef,
108     wmiutils_cf_Release,
109     wmiutils_cf_CreateInstance,
110     wmiutils_cf_LockServer
111 };
112 
113 static wmiutils_cf status_code_cf = { { &wmiutils_cf_vtbl }, WbemStatusCodeText_create };
114 static wmiutils_cf path_cf = { { &wmiutils_cf_vtbl }, WbemPath_create };
115 
DllMain(HINSTANCE hinst,DWORD reason,LPVOID lpv)116 BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID lpv )
117 {
118     switch(reason)
119     {
120     case DLL_WINE_PREATTACH:
121         return FALSE;  /* prefer native version */
122     case DLL_PROCESS_ATTACH:
123         instance = hinst;
124         DisableThreadLibraryCalls( hinst );
125         break;
126     }
127     return TRUE;
128 }
129 
DllGetClassObject(REFCLSID rclsid,REFIID iid,LPVOID * ppv)130 HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv )
131 {
132     IClassFactory *cf = NULL;
133 
134     TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
135 
136     if (IsEqualGUID( rclsid, &CLSID_WbemStatusCode ))
137     {
138        cf = &status_code_cf.IClassFactory_iface;
139     }
140     else if (IsEqualGUID( rclsid, &CLSID_WbemDefPath ))
141     {
142         cf = &path_cf.IClassFactory_iface;
143     }
144     if (!cf) return CLASS_E_CLASSNOTAVAILABLE;
145     return IClassFactory_QueryInterface( cf, iid, ppv );
146 }
147 
148 /***********************************************************************
149  *              DllCanUnloadNow (WMIUTILS.@)
150  */
DllCanUnloadNow(void)151 HRESULT WINAPI DllCanUnloadNow( void )
152 {
153     return S_FALSE;
154 }
155 
156 /***********************************************************************
157  *		DllRegisterServer (WMIUTILS.@)
158  */
DllRegisterServer(void)159 HRESULT WINAPI DllRegisterServer(void)
160 {
161     return __wine_register_resources( instance );
162 }
163 
164 /***********************************************************************
165  *		DllUnregisterServer (WMIUTILS.@)
166  */
DllUnregisterServer(void)167 HRESULT WINAPI DllUnregisterServer(void)
168 {
169     return __wine_unregister_resources( instance );
170 }
171