dxdiagn: Remove DECLSPEC_HIDDEN usage.
[wine.git] / dlls / xolehlp / xolehlp.c
blob126425c784db98e8d081c10ab2b62cc949f10d73
1 /*
2 * Copyright 2011 Hans Leidekker for CodeWeavers
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.
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.
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
19 #include <stdarg.h>
20 #define COBJMACROS
21 #include "windef.h"
22 #include "winbase.h"
23 #include "transact.h"
24 #include "initguid.h"
25 #include "txdtc.h"
26 #include "wine/debug.h"
28 WINE_DEFAULT_DEBUG_CHANNEL(xolehlp);
30 /* Resource manager start */
32 typedef struct {
33 IResourceManager IResourceManager_iface;
34 LONG ref;
35 } ResourceManager;
37 static inline ResourceManager *impl_from_IResourceManager(IResourceManager *iface)
39 return CONTAINING_RECORD(iface, ResourceManager, IResourceManager_iface);
42 static HRESULT WINAPI ResourceManager_QueryInterface(IResourceManager *iface, REFIID iid,
43 void **ppv)
45 ResourceManager *This = impl_from_IResourceManager(iface);
46 TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
48 if (!ppv) return E_INVALIDARG;
50 if (IsEqualIID(&IID_IUnknown, iid) ||
51 IsEqualIID(&IID_IResourceManager, iid))
53 *ppv = &This->IResourceManager_iface;
55 else
57 FIXME("(%s): not implemented\n", debugstr_guid(iid));
58 *ppv = NULL;
59 return E_NOINTERFACE;
62 IUnknown_AddRef((IUnknown*)*ppv);
63 return S_OK;
66 static ULONG WINAPI ResourceManager_AddRef(IResourceManager *iface)
68 ResourceManager *This = impl_from_IResourceManager(iface);
69 ULONG ref = InterlockedIncrement(&This->ref);
71 TRACE("(%p) refcount=%lu\n", iface, ref);
73 return ref;
76 static ULONG WINAPI ResourceManager_Release(IResourceManager *iface)
78 ResourceManager *This = impl_from_IResourceManager(iface);
79 ULONG ref = InterlockedDecrement(&This->ref);
81 TRACE("(%p) refcount=%lu\n", iface, ref);
83 if (ref == 0)
85 free(This);
88 return ref;
90 static HRESULT WINAPI ResourceManager_Enlist(IResourceManager *iface,
91 ITransaction *pTransaction,ITransactionResourceAsync *pRes,XACTUOW *pUOW,
92 LONG *pisoLevel,ITransactionEnlistmentAsync **ppEnlist)
94 FIXME("(%p, %p, %p, %p, %p, %p): stub\n", iface, pTransaction,pRes,pUOW,
95 pisoLevel,ppEnlist);
96 return E_NOTIMPL;
98 static HRESULT WINAPI ResourceManager_Reenlist(IResourceManager *iface,
99 byte *pPrepInfo,ULONG cbPrepInfo,DWORD lTimeout,XACTSTAT *pXactStat)
101 FIXME("(%p, %p, %lu, %lu, %p): stub\n", iface, pPrepInfo, cbPrepInfo, lTimeout, pXactStat);
102 return E_NOTIMPL;
104 static HRESULT WINAPI ResourceManager_ReenlistmentComplete(IResourceManager *iface)
106 FIXME("(%p): stub\n", iface);
107 return S_OK;
109 static HRESULT WINAPI ResourceManager_GetDistributedTransactionManager(IResourceManager *iface,
110 REFIID iid,void **ppvObject)
112 FIXME("(%p, %s, %p): stub\n", iface, debugstr_guid(iid), ppvObject);
113 return E_NOTIMPL;
116 static const IResourceManagerVtbl ResourceManager_Vtbl = {
117 ResourceManager_QueryInterface,
118 ResourceManager_AddRef,
119 ResourceManager_Release,
120 ResourceManager_Enlist,
121 ResourceManager_Reenlist,
122 ResourceManager_ReenlistmentComplete,
123 ResourceManager_GetDistributedTransactionManager
126 static HRESULT ResourceManager_Create(REFIID riid, void **ppv)
128 ResourceManager *This;
129 HRESULT ret;
131 if (!ppv) return E_INVALIDARG;
133 This = malloc(sizeof(*This));
134 if (!This) return E_OUTOFMEMORY;
136 This->IResourceManager_iface.lpVtbl = &ResourceManager_Vtbl;
137 This->ref = 1;
139 ret = IResourceManager_QueryInterface(&This->IResourceManager_iface, riid, ppv);
140 IResourceManager_Release(&This->IResourceManager_iface);
142 return ret;
145 /* Resource manager end */
147 /* Transaction options start */
149 typedef struct {
150 ITransactionOptions ITransactionOptions_iface;
151 LONG ref;
152 XACTOPT opts;
153 } TransactionOptions;
155 static inline TransactionOptions *impl_from_ITransactionOptions(ITransactionOptions *iface)
157 return CONTAINING_RECORD(iface, TransactionOptions, ITransactionOptions_iface);
160 static HRESULT WINAPI TransactionOptions_QueryInterface(ITransactionOptions *iface, REFIID iid,
161 void **ppv)
163 TransactionOptions *This = impl_from_ITransactionOptions(iface);
164 TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
166 if (!ppv) return E_INVALIDARG;
168 if (IsEqualIID(&IID_IUnknown, iid) ||
169 IsEqualIID(&IID_ITransactionOptions, iid))
171 *ppv = &This->ITransactionOptions_iface;
173 else
175 FIXME("(%s): not implemented\n", debugstr_guid(iid));
176 *ppv = NULL;
177 return E_NOINTERFACE;
180 IUnknown_AddRef((IUnknown*)*ppv);
181 return S_OK;
184 static ULONG WINAPI TransactionOptions_AddRef(ITransactionOptions *iface)
186 TransactionOptions *This = impl_from_ITransactionOptions(iface);
187 ULONG ref = InterlockedIncrement(&This->ref);
189 TRACE("(%p) refcount=%lu\n", iface, ref);
191 return ref;
194 static ULONG WINAPI TransactionOptions_Release(ITransactionOptions *iface)
196 TransactionOptions *This = impl_from_ITransactionOptions(iface);
197 ULONG ref = InterlockedDecrement(&This->ref);
199 TRACE("(%p) refcount=%lu\n", iface, ref);
201 if (ref == 0)
203 free(This);
206 return ref;
208 static HRESULT WINAPI TransactionOptions_SetOptions(ITransactionOptions *iface,
209 XACTOPT *pOptions)
211 TransactionOptions *This = impl_from_ITransactionOptions(iface);
213 if (!pOptions) return E_INVALIDARG;
214 TRACE("(%p, %lu, %s)\n", iface, pOptions->ulTimeout, debugstr_a(pOptions->szDescription));
215 This->opts = *pOptions;
216 return S_OK;
218 static HRESULT WINAPI TransactionOptions_GetOptions(ITransactionOptions *iface,
219 XACTOPT *pOptions)
221 TransactionOptions *This = impl_from_ITransactionOptions(iface);
223 TRACE("(%p, %p)\n", iface, pOptions);
224 if (!pOptions) return E_INVALIDARG;
225 *pOptions = This->opts;
226 return S_OK;
229 static const ITransactionOptionsVtbl TransactionOptions_Vtbl = {
230 TransactionOptions_QueryInterface,
231 TransactionOptions_AddRef,
232 TransactionOptions_Release,
233 TransactionOptions_SetOptions,
234 TransactionOptions_GetOptions
237 static HRESULT TransactionOptions_Create(ITransactionOptions **ppv)
239 TransactionOptions *This;
241 if (!ppv) return E_INVALIDARG;
243 This = malloc(sizeof(*This));
244 if (!This) return E_OUTOFMEMORY;
246 This->ITransactionOptions_iface.lpVtbl = &TransactionOptions_Vtbl;
247 This->ref = 1;
249 *ppv = &This->ITransactionOptions_iface;
251 return S_OK;
254 /* Transaction options end */
256 /* Transaction start */
258 typedef struct {
259 ITransaction ITransaction_iface;
260 LONG ref;
261 XACTTRANSINFO info;
262 } Transaction;
264 static inline Transaction *impl_from_ITransaction(ITransaction *iface)
266 return CONTAINING_RECORD(iface, Transaction, ITransaction_iface);
269 static HRESULT WINAPI Transaction_QueryInterface(ITransaction *iface, REFIID iid,
270 void **ppv)
272 Transaction *This = impl_from_ITransaction(iface);
273 TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
275 if (!ppv) return E_INVALIDARG;
277 if (IsEqualIID(&IID_IUnknown, iid) ||
278 IsEqualIID(&IID_ITransaction, iid))
280 *ppv = &This->ITransaction_iface;
282 else
284 FIXME("(%s): not implemented\n", debugstr_guid(iid));
285 *ppv = NULL;
286 return E_NOINTERFACE;
289 IUnknown_AddRef((IUnknown*)*ppv);
290 return S_OK;
293 static ULONG WINAPI Transaction_AddRef(ITransaction *iface)
295 Transaction *This = impl_from_ITransaction(iface);
296 ULONG ref = InterlockedIncrement(&This->ref);
298 TRACE("(%p) refcount=%lu\n", iface, ref);
300 return ref;
303 static ULONG WINAPI Transaction_Release(ITransaction *iface)
305 Transaction *This = impl_from_ITransaction(iface);
306 ULONG ref = InterlockedDecrement(&This->ref);
308 TRACE("(%p) refcount=%lu\n", iface, ref);
310 if (ref == 0)
312 free(This);
315 return ref;
317 static HRESULT WINAPI Transaction_Commit(ITransaction *iface,
318 BOOL fRetaining, DWORD grfTC, DWORD grfRM)
320 FIXME("(%p, %d, %08lx, %08lx): stub\n", iface, fRetaining, grfTC, grfRM);
321 return E_NOTIMPL;
323 static HRESULT WINAPI Transaction_Abort(ITransaction *iface,
324 BOID *pboidReason, BOOL fRetaining, BOOL fAsync)
326 FIXME("(%p, %p, %d, %d): stub\n", iface, pboidReason, fRetaining, fAsync);
327 return E_NOTIMPL;
329 static HRESULT WINAPI Transaction_GetTransactionInfo(ITransaction *iface,
330 XACTTRANSINFO *pinfo)
332 Transaction *This = impl_from_ITransaction(iface);
333 TRACE("(%p, %p)\n", iface, pinfo);
334 if (!pinfo) return E_INVALIDARG;
335 *pinfo = This->info;
336 return S_OK;
339 static const ITransactionVtbl Transaction_Vtbl = {
340 Transaction_QueryInterface,
341 Transaction_AddRef,
342 Transaction_Release,
343 Transaction_Commit,
344 Transaction_Abort,
345 Transaction_GetTransactionInfo
348 static HRESULT Transaction_Create(ISOLEVEL isoLevel, ULONG isoFlags,
349 ITransactionOptions *pOptions, ITransaction **ppv)
351 Transaction *This;
353 if (!ppv) return E_INVALIDARG;
355 This = calloc(1, sizeof(*This));
356 if (!This) return E_OUTOFMEMORY;
358 This->ITransaction_iface.lpVtbl = &Transaction_Vtbl;
359 This->ref = 1;
360 This->info.isoLevel = isoLevel;
361 This->info.isoFlags = isoFlags;
363 *ppv = &This->ITransaction_iface;
365 return S_OK;
368 /* Transaction end */
370 /* DTC Proxy Core Object start */
372 typedef struct {
373 ITransactionDispenser ITransactionDispenser_iface;
374 LONG ref;
375 IResourceManagerFactory2 IResourceManagerFactory2_iface;
376 ITransactionImportWhereabouts ITransactionImportWhereabouts_iface;
377 ITransactionImport ITransactionImport_iface;
378 } TransactionManager;
380 static inline TransactionManager *impl_from_ITransactionDispenser(ITransactionDispenser *iface)
382 return CONTAINING_RECORD(iface, TransactionManager, ITransactionDispenser_iface);
385 static HRESULT WINAPI TransactionDispenser_QueryInterface(ITransactionDispenser *iface, REFIID iid,
386 void **ppv)
388 TransactionManager *This = impl_from_ITransactionDispenser(iface);
389 TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
391 if (!ppv) return E_INVALIDARG;
393 if (IsEqualIID(&IID_IUnknown, iid) ||
394 IsEqualIID(&IID_ITransactionDispenser, iid))
396 *ppv = &This->ITransactionDispenser_iface;
398 else if (IsEqualIID(&IID_IResourceManagerFactory, iid) ||
399 IsEqualIID(&IID_IResourceManagerFactory2, iid))
401 *ppv = &This->IResourceManagerFactory2_iface;
403 else if (IsEqualIID(&IID_ITransactionImportWhereabouts, iid))
405 *ppv = &This->ITransactionImportWhereabouts_iface;
407 else if (IsEqualIID(&IID_ITransactionImport, iid))
409 *ppv = &This->ITransactionImport_iface;
411 else
413 FIXME("(%s): not implemented\n", debugstr_guid(iid));
414 *ppv = NULL;
415 return E_NOINTERFACE;
418 IUnknown_AddRef((IUnknown*)*ppv);
419 return S_OK;
422 static ULONG WINAPI TransactionDispenser_AddRef(ITransactionDispenser *iface)
424 TransactionManager *This = impl_from_ITransactionDispenser(iface);
425 ULONG ref = InterlockedIncrement(&This->ref);
427 TRACE("(%p) refcount=%lu\n", iface, ref);
429 return ref;
432 static ULONG WINAPI TransactionDispenser_Release(ITransactionDispenser *iface)
434 TransactionManager *This = impl_from_ITransactionDispenser(iface);
435 ULONG ref = InterlockedDecrement(&This->ref);
437 TRACE("(%p) refcount=%lu\n", iface, ref);
439 if (ref == 0)
441 free(This);
444 return ref;
447 static HRESULT WINAPI TransactionDispenser_GetOptionsObject(ITransactionDispenser *iface,
448 ITransactionOptions **ppOptions)
450 TRACE("(%p, %p)\n", iface, ppOptions);
452 if (!ppOptions) return E_INVALIDARG;
453 return TransactionOptions_Create(ppOptions);
455 static HRESULT WINAPI TransactionDispenser_BeginTransaction(ITransactionDispenser *iface,
456 IUnknown *punkOuter,
457 ISOLEVEL isoLevel,
458 ULONG isoFlags,
459 ITransactionOptions *pOptions,
460 ITransaction **ppTransaction)
462 FIXME("(%p, %p, %08lx, %08lx, %p, %p): semi-stub\n", iface, punkOuter,
463 isoLevel, isoFlags, pOptions, ppTransaction);
465 if (!ppTransaction) return E_INVALIDARG;
466 if (punkOuter) return CLASS_E_NOAGGREGATION;
467 return Transaction_Create(isoLevel, isoFlags, pOptions, ppTransaction);
469 static const ITransactionDispenserVtbl TransactionDispenser_Vtbl = {
470 TransactionDispenser_QueryInterface,
471 TransactionDispenser_AddRef,
472 TransactionDispenser_Release,
473 TransactionDispenser_GetOptionsObject,
474 TransactionDispenser_BeginTransaction
477 static inline TransactionManager *impl_from_IResourceManagerFactory2(IResourceManagerFactory2 *iface)
479 return CONTAINING_RECORD(iface, TransactionManager, IResourceManagerFactory2_iface);
482 static HRESULT WINAPI ResourceManagerFactory2_QueryInterface(IResourceManagerFactory2 *iface, REFIID iid,
483 void **ppv)
485 TransactionManager *This = impl_from_IResourceManagerFactory2(iface);
486 return TransactionDispenser_QueryInterface(&This->ITransactionDispenser_iface, iid, ppv);
489 static ULONG WINAPI ResourceManagerFactory2_AddRef(IResourceManagerFactory2 *iface)
491 TransactionManager *This = impl_from_IResourceManagerFactory2(iface);
492 return TransactionDispenser_AddRef(&This->ITransactionDispenser_iface);
495 static ULONG WINAPI ResourceManagerFactory2_Release(IResourceManagerFactory2 *iface)
497 TransactionManager *This = impl_from_IResourceManagerFactory2(iface);
498 return TransactionDispenser_Release(&This->ITransactionDispenser_iface);
500 static HRESULT WINAPI ResourceManagerFactory2_Create(IResourceManagerFactory2 *iface,
501 GUID *pguidRM, CHAR *pszRMName, IResourceManagerSink *pIResMgrSink, IResourceManager **ppResMgr)
503 FIXME("(%p, %s, %s, %p, %p): semi-stub\n", iface, debugstr_guid(pguidRM),
504 debugstr_a(pszRMName), pIResMgrSink, ppResMgr);
505 return ResourceManager_Create(&IID_IResourceManager, (void**)ppResMgr);
507 static HRESULT WINAPI ResourceManagerFactory2_CreateEx(IResourceManagerFactory2 *iface,
508 GUID *pguidRM, CHAR *pszRMName, IResourceManagerSink *pIResMgrSink, REFIID riidRequested, void **ppResMgr)
510 FIXME("(%p, %s, %s, %p, %s, %p): semi-stub\n", iface, debugstr_guid(pguidRM),
511 debugstr_a(pszRMName), pIResMgrSink, debugstr_guid(riidRequested), ppResMgr);
513 return ResourceManager_Create(riidRequested, ppResMgr);
515 static const IResourceManagerFactory2Vtbl ResourceManagerFactory2_Vtbl = {
516 ResourceManagerFactory2_QueryInterface,
517 ResourceManagerFactory2_AddRef,
518 ResourceManagerFactory2_Release,
519 ResourceManagerFactory2_Create,
520 ResourceManagerFactory2_CreateEx
523 static inline TransactionManager *impl_from_ITransactionImportWhereabouts(ITransactionImportWhereabouts *iface)
525 return CONTAINING_RECORD(iface, TransactionManager, ITransactionImportWhereabouts_iface);
528 static HRESULT WINAPI TransactionImportWhereabouts_QueryInterface(ITransactionImportWhereabouts *iface, REFIID iid,
529 void **ppv)
531 TransactionManager *This = impl_from_ITransactionImportWhereabouts(iface);
532 return TransactionDispenser_QueryInterface(&This->ITransactionDispenser_iface, iid, ppv);
535 static ULONG WINAPI TransactionImportWhereabouts_AddRef(ITransactionImportWhereabouts *iface)
537 TransactionManager *This = impl_from_ITransactionImportWhereabouts(iface);
538 return TransactionDispenser_AddRef(&This->ITransactionDispenser_iface);
541 static ULONG WINAPI TransactionImportWhereabouts_Release(ITransactionImportWhereabouts *iface)
543 TransactionManager *This = impl_from_ITransactionImportWhereabouts(iface);
544 return TransactionDispenser_Release(&This->ITransactionDispenser_iface);
546 static HRESULT WINAPI TransactionImportWhereabouts_GetWhereaboutsSize(ITransactionImportWhereabouts *iface,
547 ULONG *pcbWhereabouts)
549 FIXME("(%p, %p): stub returning fake value\n", iface, pcbWhereabouts);
551 if (!pcbWhereabouts) return E_INVALIDARG;
552 *pcbWhereabouts = 1;
553 return S_OK;
555 static HRESULT WINAPI TransactionImportWhereabouts_GetWhereabouts(ITransactionImportWhereabouts *iface,
556 ULONG cbWhereabouts, BYTE *rgbWhereabouts,ULONG *pcbUsed)
558 FIXME("(%p, %lu, %p, %p): stub returning fake value\n", iface, cbWhereabouts, rgbWhereabouts, pcbUsed);
560 if (!rgbWhereabouts || !pcbUsed) return E_INVALIDARG;
561 *rgbWhereabouts = 0;
562 *pcbUsed = 1;
563 return S_OK;
565 static const ITransactionImportWhereaboutsVtbl TransactionImportWhereabouts_Vtbl = {
566 TransactionImportWhereabouts_QueryInterface,
567 TransactionImportWhereabouts_AddRef,
568 TransactionImportWhereabouts_Release,
569 TransactionImportWhereabouts_GetWhereaboutsSize,
570 TransactionImportWhereabouts_GetWhereabouts
573 static inline TransactionManager *impl_from_ITransactionImport(ITransactionImport *iface)
575 return CONTAINING_RECORD(iface, TransactionManager, ITransactionImport_iface);
578 static HRESULT WINAPI TransactionImport_QueryInterface(ITransactionImport *iface, REFIID iid,
579 void **ppv)
581 TransactionManager *This = impl_from_ITransactionImport(iface);
582 return TransactionDispenser_QueryInterface(&This->ITransactionDispenser_iface, iid, ppv);
585 static ULONG WINAPI TransactionImport_AddRef(ITransactionImport *iface)
587 TransactionManager *This = impl_from_ITransactionImport(iface);
588 return TransactionDispenser_AddRef(&This->ITransactionDispenser_iface);
591 static ULONG WINAPI TransactionImport_Release(ITransactionImport *iface)
593 TransactionManager *This = impl_from_ITransactionImport(iface);
594 return TransactionDispenser_Release(&This->ITransactionDispenser_iface);
596 static HRESULT WINAPI TransactionImport_Import(ITransactionImport *iface,
597 ULONG cbTransactionCookie, byte *rgbTransactionCookie, IID *piid, void **ppvTransaction)
599 FIXME("(%p, %lu, %p, %s, %p): stub\n", iface, cbTransactionCookie, rgbTransactionCookie, debugstr_guid(piid), ppvTransaction);
601 if (!rgbTransactionCookie || !piid || !ppvTransaction) return E_INVALIDARG;
602 return E_NOTIMPL;
604 static const ITransactionImportVtbl TransactionImport_Vtbl = {
605 TransactionImport_QueryInterface,
606 TransactionImport_AddRef,
607 TransactionImport_Release,
608 TransactionImport_Import
611 static HRESULT TransactionManager_Create(REFIID riid, void **ppv)
613 TransactionManager *This;
614 HRESULT ret;
616 This = malloc(sizeof(*This));
617 if (!This) return E_OUTOFMEMORY;
619 This->ITransactionDispenser_iface.lpVtbl = &TransactionDispenser_Vtbl;
620 This->IResourceManagerFactory2_iface.lpVtbl = &ResourceManagerFactory2_Vtbl;
621 This->ITransactionImportWhereabouts_iface.lpVtbl = &TransactionImportWhereabouts_Vtbl;
622 This->ITransactionImport_iface.lpVtbl = &TransactionImport_Vtbl;
623 This->ref = 1;
625 ret = ITransactionDispenser_QueryInterface(&This->ITransactionDispenser_iface, riid, ppv);
626 ITransactionDispenser_Release(&This->ITransactionDispenser_iface);
628 return ret;
630 /* DTC Proxy Core Object end */
632 static BOOL is_local_machineA( const CHAR *server )
634 static const CHAR dot[] = ".";
635 CHAR buffer[MAX_COMPUTERNAME_LENGTH + 1];
636 DWORD len = ARRAY_SIZE( buffer );
638 if (!server || !strcmp( server, dot )) return TRUE;
639 if (GetComputerNameA( buffer, &len ) && !lstrcmpiA( server, buffer )) return TRUE;
640 return FALSE;
642 static BOOL is_local_machineW( const WCHAR *server )
644 WCHAR buffer[MAX_COMPUTERNAME_LENGTH + 1];
645 DWORD len = ARRAY_SIZE( buffer );
647 if (!server || !wcscmp( server, L"." )) return TRUE;
648 if (GetComputerNameW( buffer, &len ) && !wcsicmp( server, buffer )) return TRUE;
649 return FALSE;
652 HRESULT CDECL DtcGetTransactionManager(char *host, char *tm_name, REFIID riid,
653 DWORD dwReserved1, WORD wcbReserved2, void *pvReserved2, void **ppv)
655 TRACE("(%s, %s, %s, %ld, %d, %p, %p)\n", debugstr_a(host), debugstr_a(tm_name),
656 debugstr_guid(riid), dwReserved1, wcbReserved2, pvReserved2, ppv);
658 if (!is_local_machineA(host))
660 FIXME("remote computer not supported\n");
661 return E_NOTIMPL;
663 return TransactionManager_Create(riid, ppv);
666 HRESULT CDECL DtcGetTransactionManagerExA(CHAR *host, CHAR *tm_name, REFIID riid,
667 DWORD options, void *config, void **ppv)
669 TRACE("(%s, %s, %s, %ld, %p, %p)\n", debugstr_a(host), debugstr_a(tm_name),
670 debugstr_guid(riid), options, config, ppv);
672 if (!is_local_machineA(host))
674 FIXME("remote computer not supported\n");
675 return E_NOTIMPL;
677 return TransactionManager_Create(riid, ppv);
680 HRESULT CDECL DtcGetTransactionManagerExW(WCHAR *host, WCHAR *tm_name, REFIID riid,
681 DWORD options, void *config, void **ppv)
683 TRACE("(%s, %s, %s, %ld, %p, %p)\n", debugstr_w(host), debugstr_w(tm_name),
684 debugstr_guid(riid), options, config, ppv);
686 if (!is_local_machineW(host))
688 FIXME("remote computer not supported\n");
689 return E_NOTIMPL;
691 return TransactionManager_Create(riid, ppv);