oleaut32: Use a saner calling convention for the marshaller asm thunks.
[wine] / dlls / wmiutils / main.c
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 "config.h"
20 #include <stdarg.h>
21
22 #define COBJMACROS
23
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winuser.h"
27 #include "objbase.h"
28 #include "wbemcli.h"
29 #include "rpcproxy.h"
30
31 #include "wine/debug.h"
32 #include "wmiutils_private.h"
33
34 WINE_DEFAULT_DEBUG_CHANNEL(wmiutils);
35
36 static HINSTANCE instance;
37
38 typedef HRESULT (*fnCreateInstance)( IUnknown *pUnkOuter, LPVOID *ppObj );
39
40 typedef struct
41 {
42     IClassFactory IClassFactory_iface;
43     fnCreateInstance pfnCreateInstance;
44 } wmiutils_cf;
45
46 static inline wmiutils_cf *impl_from_IClassFactory( IClassFactory *iface )
47 {
48     return CONTAINING_RECORD(iface, wmiutils_cf, IClassFactory_iface);
49 }
50
51 static HRESULT WINAPI wmiutils_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj )
52 {
53     if (IsEqualGUID(riid, &IID_IUnknown) ||
54         IsEqualGUID(riid, &IID_IClassFactory))
55     {
56         IClassFactory_AddRef( iface );
57         *ppobj = iface;
58         return S_OK;
59     }
60     FIXME("interface %s not implemented\n", debugstr_guid(riid));
61     return E_NOINTERFACE;
62 }
63
64 static ULONG WINAPI wmiutils_cf_AddRef( IClassFactory *iface )
65 {
66     return 2;
67 }
68
69 static ULONG WINAPI wmiutils_cf_Release( IClassFactory *iface )
70 {
71     return 1;
72 }
73
74 static HRESULT WINAPI wmiutils_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter,
75                                                   REFIID riid, LPVOID *ppobj )
76 {
77     wmiutils_cf *This = impl_from_IClassFactory( iface );
78     HRESULT r;
79     IUnknown *punk;
80
81     TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj);
82
83     *ppobj = NULL;
84
85     if (pOuter)
86         return CLASS_E_NOAGGREGATION;
87
88     r = This->pfnCreateInstance( pOuter, (LPVOID *)&punk );
89     if (FAILED(r))
90         return r;
91
92     r = IUnknown_QueryInterface( punk, riid, ppobj );
93     if (FAILED(r))
94         return r;
95
96     IUnknown_Release( punk );
97     return r;
98 }
99
100 static HRESULT WINAPI wmiutils_cf_LockServer( IClassFactory *iface, BOOL dolock )
101 {
102     FIXME("(%p)->(%d)\n", iface, dolock);
103     return S_OK;
104 }
105
106 static const struct IClassFactoryVtbl wmiutils_cf_vtbl =
107 {
108     wmiutils_cf_QueryInterface,
109     wmiutils_cf_AddRef,
110     wmiutils_cf_Release,
111     wmiutils_cf_CreateInstance,
112     wmiutils_cf_LockServer
113 };
114
115 static wmiutils_cf status_code_cf = { { &wmiutils_cf_vtbl }, WbemStatusCodeText_create };
116
117 BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID lpv )
118 {
119     switch(reason)
120     {
121     case DLL_WINE_PREATTACH:
122         return FALSE;  /* prefer native version */
123     case DLL_PROCESS_ATTACH:
124         instance = hinst;
125         DisableThreadLibraryCalls( hinst );
126         break;
127     case DLL_PROCESS_DETACH:
128         break;
129     }
130     return TRUE;
131 }
132
133 HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv )
134 {
135     IClassFactory *cf = NULL;
136
137     TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
138
139     if (IsEqualGUID( rclsid, &CLSID_WbemStatusCode ))
140     {
141        cf = &status_code_cf.IClassFactory_iface;
142     }
143     if (!cf) return CLASS_E_CLASSNOTAVAILABLE;
144     return IClassFactory_QueryInterface( cf, iid, ppv );
145 }
146
147 /***********************************************************************
148  *              DllCanUnloadNow (WMIUTILS.@)
149  */
150 HRESULT WINAPI DllCanUnloadNow( void )
151 {
152     return S_FALSE;
153 }
154
155 /***********************************************************************
156  *              DllRegisterServer (WMIUTILS.@)
157  */
158 HRESULT WINAPI DllRegisterServer(void)
159 {
160     return __wine_register_resources( instance );
161 }
162
163 /***********************************************************************
164  *              DllUnregisterServer (WMIUTILS.@)
165  */
166 HRESULT WINAPI DllUnregisterServer(void)
167 {
168     return __wine_unregister_resources( instance );
169 }