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
26 #include "wine/debug.h"
28 WINE_DEFAULT_DEBUG_CHANNEL(xolehlp
);
30 /* Resource manager start */
33 IResourceManager IResourceManager_iface
;
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
,
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
;
57 FIXME("(%s): not implemented\n", debugstr_guid(iid
));
62 IUnknown_AddRef((IUnknown
*)*ppv
);
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
);
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
);
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
,
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
);
104 static HRESULT WINAPI
ResourceManager_ReenlistmentComplete(IResourceManager
*iface
)
106 FIXME("(%p): stub\n", iface
);
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
);
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
;
131 if (!ppv
) return E_INVALIDARG
;
133 This
= malloc(sizeof(*This
));
134 if (!This
) return E_OUTOFMEMORY
;
136 This
->IResourceManager_iface
.lpVtbl
= &ResourceManager_Vtbl
;
139 ret
= IResourceManager_QueryInterface(&This
->IResourceManager_iface
, riid
, ppv
);
140 IResourceManager_Release(&This
->IResourceManager_iface
);
145 /* Resource manager end */
147 /* Transaction options start */
150 ITransactionOptions ITransactionOptions_iface
;
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
,
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
;
175 FIXME("(%s): not implemented\n", debugstr_guid(iid
));
177 return E_NOINTERFACE
;
180 IUnknown_AddRef((IUnknown
*)*ppv
);
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
);
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
);
208 static HRESULT WINAPI
TransactionOptions_SetOptions(ITransactionOptions
*iface
,
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
;
218 static HRESULT WINAPI
TransactionOptions_GetOptions(ITransactionOptions
*iface
,
221 TransactionOptions
*This
= impl_from_ITransactionOptions(iface
);
223 TRACE("(%p, %p)\n", iface
, pOptions
);
224 if (!pOptions
) return E_INVALIDARG
;
225 *pOptions
= This
->opts
;
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
;
249 *ppv
= &This
->ITransactionOptions_iface
;
254 /* Transaction options end */
256 /* Transaction start */
259 ITransaction ITransaction_iface
;
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
,
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
;
284 FIXME("(%s): not implemented\n", debugstr_guid(iid
));
286 return E_NOINTERFACE
;
289 IUnknown_AddRef((IUnknown
*)*ppv
);
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
);
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
);
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
);
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
);
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
;
339 static const ITransactionVtbl Transaction_Vtbl
= {
340 Transaction_QueryInterface
,
345 Transaction_GetTransactionInfo
348 static HRESULT
Transaction_Create(ISOLEVEL isoLevel
, ULONG isoFlags
,
349 ITransactionOptions
*pOptions
, ITransaction
**ppv
)
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
;
360 This
->info
.isoLevel
= isoLevel
;
361 This
->info
.isoFlags
= isoFlags
;
363 *ppv
= &This
->ITransaction_iface
;
368 /* Transaction end */
370 /* DTC Proxy Core Object start */
373 ITransactionDispenser ITransactionDispenser_iface
;
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
,
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
;
413 FIXME("(%s): not implemented\n", debugstr_guid(iid
));
415 return E_NOINTERFACE
;
418 IUnknown_AddRef((IUnknown
*)*ppv
);
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
);
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
);
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
,
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
,
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
,
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
;
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
;
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
,
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
;
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
;
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
;
625 ret
= ITransactionDispenser_QueryInterface(&This
->ITransactionDispenser_iface
, riid
, ppv
);
626 ITransactionDispenser_Release(&This
->ITransactionDispenser_iface
);
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
;
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
;
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");
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");
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");
691 return TransactionManager_Create(riid
, ppv
);