/*
 * Copyright (C) 2013 Daniel Jeliński
 *
 * 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
 */

import "txcoord.idl";

interface IXATransLookup;
interface IXATransLookup2;
interface IResourceManagerSink;
interface IResourceManager;
interface ILastResourceManager;
interface IResourceManager2;
interface IXAConfig;
/*interface IRMHelper;
interface IXAObtainRMInfo;*/
interface IResourceManagerFactory;
interface IResourceManagerFactory2;
interface IPrepareInfo;
interface IPrepareInfo2;
interface IGetDispenser;
interface ITransactionVoterBallotAsync2;
interface ITransactionVoterNotifyAsync2;
interface ITransactionVoterFactory2;
interface ITransactionPhase0EnlistmentAsync;
interface ITransactionPhase0NotifyAsync;
interface ITransactionPhase0Factory;
interface ITransactionTransmitter;
interface ITransactionTransmitterFactory;
interface ITransactionReceiver;
interface ITransactionReceiverFactory;
interface IDtcLuConfigure;
interface IDtcLuRecovery;
interface IDtcLuRecoveryFactory;
interface IDtcLuRecoveryInitiatedByDtcTransWork;
interface IDtcLuRecoveryInitiatedByDtcStatusWork;
interface IDtcLuRecoveryInitiatedByDtc;
interface IDtcLuRecoveryInitiatedByLuWork;
interface IDtcLuRecoveryInitiatedByLu;
interface IDtcLuRmEnlistment;
interface IDtcLuRmEnlistmentSink;
interface IDtcLuRmEnlistmentFactory;
interface IDtcLuSubordinateDtc;
interface IDtcLuSubordinateDtcSink;
interface IDtcLuSubordinateDtcFactory;

cpp_quote("#define XACTTOMSG(dwXact) (dwXact-0x00040000+0x40000000)")
typedef enum XACT_DTC_CONSTANTS {
    XACT_E_CONNECTION_REQUEST_DENIED = 0x8004d100,
    XACT_E_TOOMANY_ENLISTMENTS = 0x8004d101,
    XACT_E_DUPLICATE_GUID = 0x8004d102,
    XACT_E_NOTSINGLEPHASE = 0x8004d103,
    XACT_E_RECOVERYALREADYDONE = 0x8004d104,
    XACT_E_PROTOCOL = 0x8004d105,
    XACT_E_RM_FAILURE = 0x8004d106,
    XACT_E_RECOVERY_FAILED = 0x8004d107,
    XACT_E_LU_NOT_FOUND = 0x8004d108,
    XACT_E_DUPLICATE_LU = 0x8004d109,
    XACT_E_LU_NOT_CONNECTED = 0x8004d10a,
    XACT_E_DUPLICATE_TRANSID = 0x8004d10b,
    XACT_E_LU_BUSY = 0x8004d10c,
    XACT_E_LU_NO_RECOVERY_PROCESS = 0x8004d10d,
    XACT_E_LU_DOWN = 0x8004d10e,
    XACT_E_LU_RECOVERING = 0x8004d10f,
    XACT_E_LU_RECOVERY_MISMATCH = 0x8004d110,
    XACT_E_RM_UNAVAILABLE = 0x8004d111,
    XACT_E_LRMRECOVERYALREADYDONE = 0x8004d112,
    XACT_E_NOLASTRESOURCEINTERFACE = 0x8004d113,
    XACT_S_NONOTIFY = 0x4d100,
    XACT_OK_NONOTIFY = 0x4d101,
    dwUSER_MS_SQLSERVER = 0xffff
} XACT_DTC_CONSTANTS;

cpp_quote("#ifndef _XID_T_DEFINED")
cpp_quote("#define _XID_T_DEFINED")
typedef struct xid_t {
    LONG32 formatID;
    LONG32 gtrid_length;
    LONG32 bqual_length;
    char data[128 ];
} XID;
cpp_quote("#endif")
/* idl doesn't like this type
cpp_quote("#ifndef _XA_SWITCH_T_DEFINED")
cpp_quote("#define _XA_SWITCH_T_DEFINED")
typedef struct xa_switch_t {
    char name[32 ];
    LONG32 flags;
    LONG32 version;
    int (__cdecl *xa_open_entry)(char *__MIDL_0004,int __MIDL_0005,LONG32 __MIDL_0006);
    int (__cdecl *xa_close_entry)(char *__MIDL_0008,int __MIDL_0009,LONG32 __MIDL_0010);
    int (__cdecl *xa_start_entry)(XID *__MIDL_0012,int __MIDL_0013,LONG32 __MIDL_0014);
    int (__cdecl *xa_end_entry)(XID *__MIDL_0016,int __MIDL_0017,LONG32 __MIDL_0018);
    int (__cdecl *xa_rollback_entry)(XID *__MIDL_0020,int __MIDL_0021,LONG32 __MIDL_0022);
    int (__cdecl *xa_prepare_entry)(XID *__MIDL_0024,int __MIDL_0025,LONG32 __MIDL_0026);
    int (__cdecl *xa_commit_entry)(XID *__MIDL_0028,int __MIDL_0029,LONG32 __MIDL_0030);
    int (__cdecl *xa_recover_entry)(XID *__MIDL_0032,LONG32 __MIDL_0033,int __MIDL_0034,LONG32 __MIDL_0035);
    int (__cdecl *xa_forget_entry)(XID *__MIDL_0037,int __MIDL_0038,LONG32 __MIDL_0039);
    int (__cdecl *xa_complete_entry)(int *__MIDL_0041,int *__MIDL_0042,int __MIDL_0043,LONG32 __MIDL_0044);
} xa_switch_t;
cpp_quote("#endif")
*/
[
    object,
    uuid(f3b1f131-eeda-11ce-aed4-00aa0051e2c4)
]
interface IXATransLookup : IUnknown {
    HRESULT Lookup([out]ITransaction **ppTransaction);
};
[
    object,
    uuid(bf193c85-0d1a-4290-b88f-d2cb8873d1e7)
]
interface IXATransLookup2 : IUnknown {
    HRESULT Lookup([in]XID *pXID,[out]ITransaction **ppTransaction);
};
[
    object,
    uuid(0d563181-defb-11ce-aed1-00aa0051e2c4)
]
interface IResourceManagerSink : IUnknown {
    HRESULT TMDown(void);
};
[
    object,
    uuid(13741d21-87eb-11ce-8081-0080c758527e)
]
interface IResourceManager : IUnknown {
    HRESULT Enlist([in]ITransaction *pTransaction,[in]ITransactionResourceAsync *pRes,[out]XACTUOW *pUOW,[out]LONG *pisoLevel,[out]ITransactionEnlistmentAsync **ppEnlist);
    HRESULT Reenlist([in]byte *pPrepInfo,[in]ULONG cbPrepInfo,[in]DWORD lTimeout,[out]XACTSTAT *pXactStat);
    HRESULT ReenlistmentComplete(void);
    HRESULT GetDistributedTransactionManager([in]REFIID iid,[out,iid_is(iid)]void **ppvObject);
};
[
    object,
    uuid(4d964ad4-5b33-11d3-8a91-00c04f79eb6d)
]
interface ILastResourceManager : IUnknown {
    HRESULT TransactionCommitted([in]byte *pPrepInfo,[in]ULONG cbPrepInfo);
    HRESULT RecoveryDone(void);
};
[
    object,
    uuid(d136c69a-f749-11d1-8f47-00c04f8ee57d)
]
interface IResourceManager2 : IResourceManager {
    HRESULT Enlist2([in]ITransaction *pTransaction,[in]ITransactionResourceAsync *pResAsync,[out]XACTUOW *pUOW,[out]LONG *pisoLevel,[out]XID *pXid,[out]ITransactionEnlistmentAsync **ppEnlist);
    HRESULT Reenlist2([in]XID *pXid,[in]DWORD dwTimeout,[out]XACTSTAT *pXactStat);
};
[
    object,
    uuid(c8a6e3a1-9a8c-11cf-a308-00a0c905416e)
]
interface IXAConfig : IUnknown {
    HRESULT Initialize([in]GUID clsidHelperDll);
    HRESULT Terminate(void);
};
/* commented out because idl doesn't accept xa_switch_t type
[
    object,
    uuid(E793F6D1-F53D-11cf-A60D-00A0C905416E)
]
interface IRMHelper : IUnknown {
    HRESULT RMCount([in]DWORD dwcTotalNumberOfRMs);
    HRESULT RMInfo([in]xa_switch_t *pXa_Switch,[in]BOOL fCDeclCallingConv,[in]char *pszOpenString,[in]char *pszCloseString,[in]GUID guidRMRecovery);
};
[
    object,
    uuid(E793F6D2-F53D-11cf-A60D-00A0C905416E)
]
interface IXAObtainRMInfo : IUnknown {
    HRESULT ObtainRMInfo([in]IRMHelper *pIRMHelper);
};*/
[
    object,
    uuid(13741d20-87eb-11ce-8081-0080c758527e)
]
interface IResourceManagerFactory : IUnknown {
    HRESULT Create([in]GUID *pguidRM,[in]CHAR *pszRMName,[in]IResourceManagerSink *pIResMgrSink,[out]IResourceManager **ppResMgr);
};
[
    object,
    uuid(6b369c21-fbd2-11d1-8f47-00c04f8ee57d)
]
interface IResourceManagerFactory2 : IResourceManagerFactory {
    HRESULT CreateEx([in]GUID *pguidRM,[in]CHAR *pszRMName,[in]IResourceManagerSink *pIResMgrSink,[in]REFIID riidRequested,[out, iid_is(riidRequested)]void **ppvResMgr);
};

[
    object,
    uuid(80c7bfd0-87ee-11ce-8081-0080c758527e)
]
interface IPrepareInfo : IUnknown {
    HRESULT GetPrepareInfoSize([out]ULONG *pcbPrepInfo);
    HRESULT GetPrepareInfo([out]byte *pPrepInfo);
};
[
    object,
    uuid(5fab2547-9779-11d1-b886-00c04fb9618a)
]
interface IPrepareInfo2 : IUnknown {
    HRESULT GetPrepareInfoSize([out]ULONG *pcbPrepInfo);
    HRESULT GetPrepareInfo([in]ULONG cbPrepareInfo,[out]byte *pPrepInfo);
};
[
    object,
    uuid(c23cc370-87ef-11ce-8081-0080c758527e)
]
interface IGetDispenser : IUnknown {
    HRESULT GetDispenser([in]REFIID iid,[out,iid_is(iid)]void **ppvObject);
};
[
    object,
    uuid(5433376c-414d-11d3-b206-00c04fc2f3ef)
]
interface ITransactionVoterBallotAsync2 : IUnknown {
    HRESULT VoteRequestDone([in]HRESULT hr,[in]BOID *pboidReason);
};
[
    object,
    uuid(5433376b-414d-11d3-b206-00c04fc2f3ef)
]
interface ITransactionVoterNotifyAsync2 : ITransactionOutcomeEvents {
    HRESULT VoteRequest(void);
};
[
    object,
    uuid(5433376a-414d-11d3-b206-00c04fc2f3ef)
]
interface ITransactionVoterFactory2 : IUnknown {
    HRESULT Create([in]ITransaction *pTransaction,[in]ITransactionVoterNotifyAsync2 *pVoterNotify,[out]ITransactionVoterBallotAsync2 **ppVoterBallot);
};
[
    object,
    uuid(82dc88e1-a954-11d1-8f88-00600895e7d5)
]
interface ITransactionPhase0EnlistmentAsync : IUnknown {
    HRESULT Enable(void);
    HRESULT WaitForEnlistment(void);
    HRESULT Phase0Done(void);
    HRESULT Unenlist(void);
    HRESULT GetTransaction([out]ITransaction **ppITransaction);
};
[
    object,
    uuid(ef081809-0c76-11d2-87a6-00c04f990f34)
]
interface ITransactionPhase0NotifyAsync : IUnknown {
    HRESULT Phase0Request([in]BOOL fAbortingHint);
    HRESULT EnlistCompleted([in]HRESULT status);
};
[
    object,
    uuid(82dc88e0-a954-11d1-8f88-00600895e7d5)
]
interface ITransactionPhase0Factory : IUnknown {
    HRESULT Create([in]ITransactionPhase0NotifyAsync *pPhase0Notify,[out]ITransactionPhase0EnlistmentAsync **ppPhase0Enlistment);
};
[
    object,
    uuid(59313e01-b36c-11cf-a539-00aa006887c3)
]
interface ITransactionTransmitter : IUnknown {
    HRESULT Set([in]ITransaction *pTransaction);
    HRESULT GetPropagationTokenSize([out]ULONG *pcbToken);
    HRESULT MarshalPropagationToken([in]ULONG cbToken,[out]byte *rgbToken,[out]ULONG *pcbUsed);
    HRESULT UnmarshalReturnToken([in]ULONG cbReturnToken,[in]byte *rgbReturnToken);
    HRESULT Reset(void);
};
[
    object,
    uuid(59313e00-b36c-11cf-a539-00aa006887c3)
]
interface ITransactionTransmitterFactory : IUnknown {
    HRESULT Create([out]ITransactionTransmitter **ppTransmitter);
};
[
    object,
    uuid(59313e03-b36c-11cf-a539-00aa006887c3)
]
interface ITransactionReceiver : IUnknown {
    HRESULT UnmarshalPropagationToken([in]ULONG cbToken,[in]byte *rgbToken,[out]ITransaction **ppTransaction);
    HRESULT GetReturnTokenSize([out]ULONG *pcbReturnToken);
    HRESULT MarshalReturnToken([in]ULONG cbReturnToken,[out]byte *rgbReturnToken,[out]ULONG *pcbUsed);
    HRESULT Reset(void);
};
[
    object,
    uuid(59313e02-b36c-11cf-a539-00aa006887c3)
]
interface ITransactionReceiverFactory : IUnknown {
    HRESULT Create([out]ITransactionReceiver **ppReceiver);
};

typedef struct _ProxyConfigParams {
    WORD wcThreadsMax;
} PROXY_CONFIG_PARAMS;

[
    object,
    uuid(4131e760-1aea-11d0-944b-00a0c905416e)
]
interface IDtcLuConfigure : IUnknown {
    HRESULT Add([in]byte *pucLuPair,[in]DWORD cbLuPair);
    HRESULT Delete([in]byte *pucLuPair,[in]DWORD cbLuPair);
};
[
    object,
    uuid(ac2b8ad2-d6f0-11d0-b386-00a0c9083365)
]
interface IDtcLuRecovery : IUnknown {
};
[
    object,
    uuid(4131e762-1aea-11d0-944b-00a0c905416e)
]
interface IDtcLuRecoveryFactory : IUnknown {
    HRESULT Create([in]byte *pucLuPair,[in]DWORD cbLuPair,[out]IDtcLuRecovery **ppRecovery);
};

typedef enum _DtcLu_LocalRecovery_Work {
    DTCINITIATEDRECOVERYWORK_CHECKLUSTATUS = 1,
    DTCINITIATEDRECOVERYWORK_TRANS,
    DTCINITIATEDRECOVERYWORK_TMDOWN
} DTCINITIATEDRECOVERYWORK;

typedef enum _DtcLu_Xln {
    DTCLUXLN_COLD = 1,
    DTCLUXLN_WARM
} DTCLUXLN;

typedef enum _DtcLu_Xln_Confirmation {
    DTCLUXLNCONFIRMATION_CONFIRM = 1,
    DTCLUXLNCONFIRMATION_LOGNAMEMISMATCH,
    DTCLUXLNCONFIRMATION_COLDWARMMISMATCH,
    DTCLUXLNCONFIRMATION_OBSOLETE
} DTCLUXLNCONFIRMATION;

typedef enum _DtcLu_Xln_Response {
    DTCLUXLNRESPONSE_OK_SENDOURXLNBACK = 1,
    DTCLUXLNRESPONSE_OK_SENDCONFIRMATION,
    DTCLUXLNRESPONSE_LOGNAMEMISMATCH,
    DTCLUXLNRESPONSE_COLDWARMMISMATCH
} DTCLUXLNRESPONSE;

typedef enum _DtcLu_Xln_Error {
    DTCLUXLNERROR_PROTOCOL = 1,
    DTCLUXLNERROR_LOGNAMEMISMATCH,
    DTCLUXLNERROR_COLDWARMMISMATCH
} DTCLUXLNERROR;

typedef enum _DtcLu_CompareState {
    DTCLUCOMPARESTATE_COMMITTED = 1,
    DTCLUCOMPARESTATE_HEURISTICCOMMITTED,
    DTCLUCOMPARESTATE_HEURISTICMIXED,
    DTCLUCOMPARESTATE_HEURISTICRESET,
    DTCLUCOMPARESTATE_INDOUBT,
    DTCLUCOMPARESTATE_RESET
} DTCLUCOMPARESTATE;

typedef enum _DtcLu_CompareStates_Confirmation {
    DTCLUCOMPARESTATESCONFIRMATION_CONFIRM = 1,
    DTCLUCOMPARESTATESCONFIRMATION_PROTOCOL
} DTCLUCOMPARESTATESCONFIRMATION;

typedef enum _DtcLu_CompareStates_Error {
    DTCLUCOMPARESTATESERROR_PROTOCOL = 1
} DTCLUCOMPARESTATESERROR;

typedef enum _DtcLu_CompareStates_Response {
    DTCLUCOMPARESTATESRESPONSE_OK = 1,
    DTCLUCOMPARESTATESRESPONSE_PROTOCOL
} DTCLUCOMPARESTATESRESPONSE;

[
    object,
    uuid(4131e765-1aea-11d0-944b-00a0c905416e)
]
interface IDtcLuRecoveryInitiatedByDtcTransWork : IUnknown {
    HRESULT GetLogNameSizes([out]DWORD *pcbOurLogName,[out]DWORD *pcbRemoteLogName);
    HRESULT GetOurXln([out]DTCLUXLN *pXln,[in,out]unsigned char *pOurLogName,[in,out]unsigned char *pRemoteLogName,[out]DWORD *pdwProtocol);
    HRESULT HandleConfirmationFromOurXln([in]DTCLUXLNCONFIRMATION Confirmation);
    HRESULT HandleTheirXlnResponse([in]DTCLUXLN Xln,[in]unsigned char *pRemoteLogName,[in]DWORD cbRemoteLogName,[in]DWORD dwProtocol,[out]DTCLUXLNCONFIRMATION *pConfirmation);
    HRESULT HandleErrorFromOurXln([in]DTCLUXLNERROR Error);
    HRESULT CheckForCompareStates([out]BOOL *fCompareStates);
    HRESULT GetOurTransIdSize([in,out]DWORD *pcbOurTransId);
    HRESULT GetOurCompareStates([in,out]unsigned char *pOurTransId,[out]DTCLUCOMPARESTATE *pCompareState);
    HRESULT HandleTheirCompareStatesResponse([in]DTCLUCOMPARESTATE CompareState,[out]DTCLUCOMPARESTATESCONFIRMATION *pConfirmation);
    HRESULT HandleErrorFromOurCompareStates([in]DTCLUCOMPARESTATESERROR Error);
    HRESULT ConversationLost(void);
    HRESULT GetRecoverySeqNum([out]LONG *plRecoverySeqNum);
    HRESULT ObsoleteRecoverySeqNum([in]LONG lNewRecoverySeqNum);
};
[
    object,
    uuid(4131e766-1aea-11d0-944b-00a0c905416e)
]
interface IDtcLuRecoveryInitiatedByDtcStatusWork : IUnknown {
    HRESULT HandleCheckLuStatus([in]LONG lRecoverySeqNum);
};
[
    object,
    uuid(4131e764-1aea-11d0-944b-00a0c905416e)
]
[local] interface IDtcLuRecoveryInitiatedByDtc : IUnknown {
    HRESULT GetWork([in,out]DTCINITIATEDRECOVERYWORK *pWork,[in,out]void **ppv);
};
[
    object,
    uuid(ac2b8ad1-d6f0-11d0-b386-00a0c9083365)
]
interface IDtcLuRecoveryInitiatedByLuWork : IUnknown {
    HRESULT HandleTheirXln([in]LONG lRecoverySeqNum,[in]DTCLUXLN Xln,[in]unsigned char *pRemoteLogName,[in]DWORD cbRemoteLogName,[in]unsigned char *pOurLogName,[in]DWORD cbOurLogName,[in]DWORD dwProtocol,[out]DTCLUXLNRESPONSE *pResponse);
    HRESULT GetOurLogNameSize([in,out]DWORD *pcbOurLogName);
    HRESULT GetOurXln([out]DTCLUXLN *pXln,[in,out]unsigned char *pOurLogName,[out]DWORD *pdwProtocol);
    HRESULT HandleConfirmationOfOurXln([in]DTCLUXLNCONFIRMATION Confirmation);
    HRESULT HandleTheirCompareStates([in,out]unsigned char *pRemoteTransId,[in]DWORD cbRemoteTransId,[in]DTCLUCOMPARESTATE CompareState,[out]DTCLUCOMPARESTATESRESPONSE *pResponse,[out]DTCLUCOMPARESTATE *pCompareState);
    HRESULT HandleConfirmationOfOurCompareStates([in]DTCLUCOMPARESTATESCONFIRMATION Confirmation);
    HRESULT HandleErrorFromOurCompareStates([in]DTCLUCOMPARESTATESERROR Error);
    HRESULT ConversationLost(void);
};
[
    object,
    uuid(4131e768-1aea-11d0-944b-00a0c905416e)
]
interface IDtcLuRecoveryInitiatedByLu : IUnknown {
    HRESULT GetObjectToHandleWorkFromLu([out]IDtcLuRecoveryInitiatedByLuWork **ppWork);
};
[
    object,
    uuid(4131e769-1aea-11d0-944b-00a0c905416e)
]
interface IDtcLuRmEnlistment : IUnknown {
    HRESULT Unplug([in]BOOL fConversationLost);
    HRESULT BackedOut(void);
    HRESULT BackOut(void);
    HRESULT Committed(void);
    HRESULT Forget(void);
    HRESULT RequestCommit(void);
};
[
    object,
    uuid(4131e770-1aea-11d0-944b-00a0c905416e)
]
interface IDtcLuRmEnlistmentSink : IUnknown {
    HRESULT AckUnplug(void);
    HRESULT TmDown(void);
    HRESULT SessionLost(void);
    HRESULT BackedOut(void);
    HRESULT BackOut(void);
    HRESULT Committed(void);
    HRESULT Forget(void);
    HRESULT Prepare(void);
    HRESULT RequestCommit(void);
};
[
    object,
    uuid(4131e771-1aea-11d0-944b-00a0c905416e)
]
interface IDtcLuRmEnlistmentFactory : IUnknown {
    HRESULT Create([in]unsigned char *pucLuPair,[in]DWORD cbLuPair,[in]ITransaction *pITransaction,[in]unsigned char *pTransId,[in]DWORD cbTransId,[in]IDtcLuRmEnlistmentSink *pRmEnlistmentSink,[in,out]IDtcLuRmEnlistment **ppRmEnlistment);
};
[
    object,
    uuid(4131e773-1aea-11d0-944b-00a0c905416e)
]
interface IDtcLuSubordinateDtc : IUnknown {
    HRESULT Unplug([in]BOOL fConversationLost);
    HRESULT BackedOut(void);
    HRESULT BackOut(void);
    HRESULT Committed(void);
    HRESULT Forget(void);
    HRESULT Prepare(void);
    HRESULT RequestCommit(void);
};
[
    object,
    uuid(4131e774-1aea-11d0-944b-00a0c905416e)
]
interface IDtcLuSubordinateDtcSink : IUnknown {
    HRESULT AckUnplug(void);
    HRESULT TmDown(void);
    HRESULT SessionLost(void);
    HRESULT BackedOut(void);
    HRESULT BackOut(void);
    HRESULT Committed(void);
    HRESULT Forget(void);
    HRESULT RequestCommit(void);
};
[
    object,
    uuid(4131e775-1aea-11d0-944b-00a0c905416e)
]
interface IDtcLuSubordinateDtcFactory : IUnknown {
    HRESULT Create([in]unsigned char *pucLuPair,[in]DWORD cbLuPair,[in]IUnknown *punkTransactionOuter,[in]ISOLEVEL isoLevel,[in]ULONG isoFlags,[in]ITransactionOptions *pOptions,[out]ITransaction **ppTransaction,[in]unsigned char *pTransId,[in]DWORD cbTransId,[in]IDtcLuSubordinateDtcSink *pSubordinateDtcSink,[in,out]IDtcLuSubordinateDtc **ppSubordinateDtc);
};

/* these GUIDs were found in mingw header, but without corresponding interface definitions
  DEFINE_GUID(IID_IXAResourceManager,0x4131e751,0x1aea,0x11d0,0x94,0x4b,0x00,0xa0,0xc9,0x05,0x41,0x6e);
  DEFINE_GUID(IID_IXAResourceManagerFactory,0x4131e750,0x1aea,0x11d0,0x94,0x4b,0x00,0xa0,0xc9,0x05,0x41,0x6e);
  DEFINE_GUID(IID_IXATransaction,0x4131e752,0x1aea,0x11d0,0x94,0x4b,0x00,0xa0,0xc9,0x05,0x41,0x6e);
*/
