[SDK] Add transact.idl, txcoord.idl and txdtc.idl, and introduce MS-PSDK-compatible...
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Fri, 30 Nov 2018 20:44:21 +0000 (21:44 +0100)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Fri, 30 Nov 2018 20:49:23 +0000 (21:49 +0100)
sdk/include/psdk/CMakeLists.txt
sdk/include/psdk/transact.idl [new file with mode: 0644]
sdk/include/psdk/txcoord.idl [new file with mode: 0644]
sdk/include/psdk/txdtc.idl [new file with mode: 0644]

index 845873f..7667ff0 100644 (file)
@@ -116,7 +116,10 @@ list(APPEND SOURCE
     textstor.idl
     tlogstg.idl
     tom.idl
+    transact.idl
     tuner.idl
+    txcoord.idl
+    txdtc.idl
     unknwn.idl
     urlhist.idl
     urlmon.idl
@@ -149,6 +152,7 @@ add_custom_target(stdole2 DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/stdole2.tlb)
 
 add_idl_headers(d3d_idl_headers d3dcommon.idl)
 
+add_iid_library(adsiid iads.idl transact.idl)
 add_iid_library(wuguid wuapi.idl)
 add_iid_library(xml_uuids msxml2.idl)
 
diff --git a/sdk/include/psdk/transact.idl b/sdk/include/psdk/transact.idl
new file mode 100644 (file)
index 0000000..fb3bd42
--- /dev/null
@@ -0,0 +1,226 @@
+/*
+ * 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 "unknwn.idl";
+
+cpp_quote("#include <winerror.h>")
+
+interface ITransaction;
+interface ITransactionCloner;
+interface ITransaction2;
+interface ITransactionDispenser;
+interface ITransactionOptions;
+interface ITransactionOutcomeEvents;
+interface ITmNodeName;
+
+typedef struct BOID {
+    byte rgb[16];
+} BOID;
+
+cpp_quote("#ifndef MAX_TRAN_DESC_DEFINED")
+cpp_quote("#define MAX_TRAN_DESC_DEFINED")
+typedef enum TX_MISC_CONSTANTS {
+    MAX_TRAN_DESC = 40
+} TX_MISC_CONSTANTS;
+cpp_quote("#endif")
+
+typedef BOID XACTUOW;
+typedef LONG ISOLEVEL;
+
+typedef enum ISOLATIONLEVEL {
+    ISOLATIONLEVEL_UNSPECIFIED = 0xffffffff,
+    ISOLATIONLEVEL_CHAOS = 0x10,
+    ISOLATIONLEVEL_READUNCOMMITTED = 0x100,
+    ISOLATIONLEVEL_BROWSE = 0x100,
+    ISOLATIONLEVEL_CURSORSTABILITY = 0x1000,
+    ISOLATIONLEVEL_READCOMMITTED = 0x1000,
+    ISOLATIONLEVEL_REPEATABLEREAD = 0x10000,
+    ISOLATIONLEVEL_SERIALIZABLE = 0x100000,
+    ISOLATIONLEVEL_ISOLATED = 0x100000
+} ISOLATIONLEVEL;
+
+typedef struct XACTTRANSINFO {
+    XACTUOW uow;
+    ISOLEVEL isoLevel;
+    ULONG isoFlags;
+    DWORD grfTCSupported;
+    DWORD grfRMSupported;
+    DWORD grfTCSupportedRetaining;
+    DWORD grfRMSupportedRetaining;
+} XACTTRANSINFO;
+
+typedef struct XACTSTATS {
+    ULONG cOpen;
+    ULONG cCommitting;
+    ULONG cCommitted;
+    ULONG cAborting;
+    ULONG cAborted;
+    ULONG cInDoubt;
+    ULONG cHeuristicDecision;
+    FILETIME timeTransactionsUp;
+} XACTSTATS;
+
+typedef enum ISOFLAG {
+    ISOFLAG_RETAIN_COMMIT_DC = 1,
+    ISOFLAG_RETAIN_COMMIT = 2,
+    ISOFLAG_RETAIN_COMMIT_NO = 3,
+    ISOFLAG_RETAIN_ABORT_DC = 4,
+    ISOFLAG_RETAIN_ABORT = 8,
+    ISOFLAG_RETAIN_ABORT_NO = 12,
+    ISOFLAG_RETAIN_DONTCARE = ISOFLAG_RETAIN_COMMIT_DC | ISOFLAG_RETAIN_ABORT_DC,
+    ISOFLAG_RETAIN_BOTH = ISOFLAG_RETAIN_COMMIT | ISOFLAG_RETAIN_ABORT,
+    ISOFLAG_RETAIN_NONE = ISOFLAG_RETAIN_COMMIT_NO | ISOFLAG_RETAIN_ABORT_NO,
+    ISOFLAG_OPTIMISTIC = 16,
+    ISOFLAG_READONLY = 32
+} ISOFLAG;
+
+typedef enum XACTTC {
+    XACTTC_NONE = 0,
+    XACTTC_SYNC_PHASEONE = 1,
+    XACTTC_SYNC_PHASETWO = 2,
+    XACTTC_SYNC = 2,
+    XACTTC_ASYNC_PHASEONE = 4,
+    XACTTC_ASYNC = 4
+} XACTTC;
+
+typedef enum XACTRM {
+    XACTRM_OPTIMISTICLASTWINS = 1,
+    XACTRM_NOREADONLYPREPARES
+} XACTRM;
+
+typedef enum XACTCONST {
+    XACTCONST_TIMEOUTINFINITE
+} XACTCONST;
+
+typedef enum XACTHEURISTIC {
+    XACTHEURISTIC_ABORT = 1,
+    XACTHEURISTIC_COMMIT,
+    XACTHEURISTIC_DAMAGE,
+    XACTHEURISTIC_DANGER
+} XACTHEURISTIC;
+
+typedef enum XACTSTAT {
+    XACTSTAT_NONE = 0,
+    XACTSTAT_OPENNORMAL = 0x1,
+    XACTSTAT_OPENREFUSED = 0x2,
+    XACTSTAT_PREPARING = 0x4,
+    XACTSTAT_PREPARED = 0x8,
+    XACTSTAT_PREPARERETAINING = 0x10,
+    XACTSTAT_PREPARERETAINED = 0x20,
+    XACTSTAT_COMMITTING = 0x40,
+    XACTSTAT_COMMITRETAINING = 0x80,
+    XACTSTAT_ABORTING = 0x100,
+    XACTSTAT_ABORTED = 0x200,
+    XACTSTAT_COMMITTED = 0x400,
+    XACTSTAT_HEURISTIC_ABORT = 0x800,
+    XACTSTAT_HEURISTIC_COMMIT = 0x1000,
+    XACTSTAT_HEURISTIC_DAMAGE = 0x2000,
+    XACTSTAT_HEURISTIC_DANGER = 0x4000,
+    XACTSTAT_FORCED_ABORT = 0x8000,
+    XACTSTAT_FORCED_COMMIT = 0x10000,
+    XACTSTAT_INDOUBT = 0x20000,
+    XACTSTAT_CLOSED = 0x40000,
+    XACTSTAT_OPEN = 0x3,
+    XACTSTAT_NOTPREPARED = 0x7ffc3,
+    XACTSTAT_ALL = 0x7ffff
+} XACTSTAT;
+
+typedef struct XACTOPT {
+    ULONG ulTimeout;
+    char szDescription[40 ];
+} XACTOPT;
+
+[
+    object,
+    uuid(0fb15084-af41-11ce-bd2b-204c4f4f5020)
+]
+interface ITransaction : IUnknown {
+    HRESULT Commit([in] BOOL fRetaining,
+                   [in] DWORD grfTC,
+                   [in] DWORD grfRM);
+    HRESULT Abort([in, unique] BOID *pboidReason,
+                  [in] BOOL fRetaining,
+                  [in] BOOL fAsync);
+    HRESULT GetTransactionInfo([out] XACTTRANSINFO *pinfo);
+}
+
+[
+    object,
+    uuid(02656950-2152-11d0-944C-00A0C905416E)
+]
+interface ITransactionCloner : ITransaction {
+    HRESULT CloneWithCommitDisabled([out] ITransaction **ppITransaction);
+}
+
+[
+    object,
+    uuid(34021548-0065-11d3-bac1-00c04f797be2)
+]
+interface ITransaction2 : ITransactionCloner {
+    HRESULT GetTransactionInfo2([out] XACTTRANSINFO *pinfo);
+}
+
+[
+    object,
+    uuid(3A6AD9E1-23B9-11cf-AD60-00AA00A74CCD)
+]
+interface ITransactionDispenser : IUnknown {
+    HRESULT GetOptionsObject([out] ITransactionOptions **ppOptions);
+    HRESULT BeginTransaction([in, unique] IUnknown *punkOuter,
+                             [in] ISOLEVEL isoLevel,
+                             [in] ULONG isoFlags,
+                             [in, unique] ITransactionOptions *pOptions,
+                             [out] ITransaction **ppTransaction);
+}
+
+[
+    object,
+    uuid(3A6AD9E0-23B9-11cf-AD60-00AA00A74CCD)
+]
+interface ITransactionOptions : IUnknown {
+    HRESULT SetOptions([in] XACTOPT *pOptions);
+    HRESULT GetOptions([in, out] XACTOPT *pOptions);
+}
+
+[
+    object,
+    uuid(3A6AD9E2-23B9-11cf-AD60-00AA00A74CCD)
+]
+interface ITransactionOutcomeEvents : IUnknown {
+    HRESULT Committed([in] BOOL fRetaining,
+                      [in, unique] XACTUOW *pNewUOW,
+                      [in] HRESULT hr);
+    HRESULT Aborted([in, unique] BOID *pboidReason,
+                    [in] BOOL fRetaining,
+                    [in, unique] XACTUOW *pNewUOW,
+                    [in] HRESULT hr);
+    HRESULT HeuristicDecision([in] DWORD dwDecision,
+                              [in, unique] BOID *pboidReason,
+                              [in] HRESULT hr);
+    HRESULT Indoubt(void);
+}
+
+[
+    object,
+    uuid(30274F88-6EE4-474e-9B95-7807BC9EF8CF)
+]
+interface ITmNodeName : IUnknown {
+    HRESULT GetNodeNameSize([out] ULONG *pcbNodeNameSize);
+    HRESULT GetNodeName([in] ULONG cbNodeNameBufferSize,
+                        [in, out] LPWSTR pNodeNameBuffer);
+}
diff --git a/sdk/include/psdk/txcoord.idl b/sdk/include/psdk/txcoord.idl
new file mode 100644 (file)
index 0000000..e4a5784
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * 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 "transact.idl";
+import "objidl.idl";
+
+interface ITransactionResourceAsync;
+interface ITransactionLastResourceAsync;
+interface ITransactionResource;
+interface ITransactionEnlistmentAsync;
+interface ITransactionLastEnlistmentAsync;
+interface ITransactionExportFactory;
+interface ITransactionImportWhereabouts;
+interface ITransactionExport;
+interface ITransactionImport;
+interface ITipTransaction;
+interface ITipHelper;
+interface ITipPullSink;
+interface IDtcNetworkAccessConfig;
+interface IDtcNetworkAccessConfig2;
+
+[
+    object,
+    uuid(69e971f0-23ce-11cf-ad60-00aa00a74ccd)
+]
+interface ITransactionResourceAsync : IUnknown {
+    HRESULT PrepareRequest([in]BOOL fRetaining,[in]DWORD grfRM,[in]BOOL fWantMoniker,[in]BOOL fSinglePhase);
+    HRESULT CommitRequest([in]DWORD grfRM,[in]XACTUOW *pNewUOW);
+    HRESULT AbortRequest([in]BOID *pboidReason,[in]BOOL fRetaining,[in]XACTUOW *pNewUOW);
+    HRESULT TMDown(void);
+}
+
+[
+    object,
+    uuid(c82bd532-5b30-11d3-8a91-00c04f79eb6d)
+]
+interface ITransactionLastResourceAsync : IUnknown {
+    HRESULT DelegateCommit([in]DWORD grfRM);
+    HRESULT ForgetRequest([in]XACTUOW *pNewUOW);
+}
+
+[
+    object,
+    uuid(ee5ff7b3-4572-11d0-9452-00a0c905416e)
+]
+interface ITransactionResource : IUnknown {
+    HRESULT PrepareRequest([in]BOOL fRetaining,[in]DWORD grfRM,[in]BOOL fWantMoniker,[in]BOOL fSinglePhase);
+    HRESULT CommitRequest([in]DWORD grfRM,[in]XACTUOW *pNewUOW);
+    HRESULT AbortRequest([in]BOID *pboidReason,[in]BOOL fRetaining,[in]XACTUOW *pNewUOW);
+    HRESULT TMDown(void);
+}
+
+[
+    object,
+    uuid(0fb15081-af41-11ce-bd2b-204c4f4f5020)
+]
+interface ITransactionEnlistmentAsync : IUnknown {
+    HRESULT PrepareRequestDone([in]HRESULT hr,[in]IMoniker *pmk,[in]BOID *pboidReason);
+    HRESULT CommitRequestDone([in]HRESULT hr);
+    HRESULT AbortRequestDone([in]HRESULT hr);
+}
+
+[
+    object,
+    uuid(c82bd533-5b30-11d3-8a91-00c04f79eb6d)
+]
+interface ITransactionLastEnlistmentAsync : IUnknown {
+    HRESULT TransactionOutcome([in]XACTSTAT XactStat,[in]BOID *pboidReason);
+}
+
+[
+    object,
+    uuid(e1cf9b53-8745-11ce-a9ba-00aa006c3706)
+]
+interface ITransactionExportFactory : IUnknown {
+    HRESULT GetRemoteClassId([in]CLSID *pclsid);
+    HRESULT Create([in]ULONG cbWhereabouts,[in]byte *rgbWhereabouts,[out]ITransactionExport **ppExport);
+}
+
+[
+    object,
+    uuid(0141fda4-8fc0-11ce-bd18-204c4f4f5020)
+]
+interface ITransactionImportWhereabouts : IUnknown {
+    HRESULT GetWhereaboutsSize([out]ULONG *pcbWhereabouts);
+    HRESULT GetWhereabouts([in]ULONG cbWhereabouts,[out]byte *rgbWhereabouts,[out]ULONG *pcbUsed);
+}
+
+[
+    object,
+    uuid(0141fda5-8fc0-11ce-bd18-204c4f4f5020)
+]
+interface ITransactionExport : IUnknown {
+    HRESULT Export([in]IUnknown *punkTransaction,[out]ULONG *pcbTransactionCookie);
+    HRESULT GetTransactionCookie([in]IUnknown *punkTransaction,[in]ULONG cbTransactionCookie,[out]byte *rgbTransactionCookie,[out]ULONG *pcbUsed);
+}
+
+[
+    object,
+    uuid(e1cf9b5a-8745-11ce-a9ba-00aa006c3706)
+]
+interface ITransactionImport : IUnknown {
+    HRESULT Import([in]ULONG cbTransactionCookie,[in]byte *rgbTransactionCookie,[in]IID *piid,[out,iid_is(piid)]void **ppvTransaction);
+}
+[
+    object,
+    uuid(17cf72d0-bac5-11d1-b1bf-00c04fc2f3ef)
+]
+interface ITipTransaction : IUnknown {
+    HRESULT Push([in]char *i_pszRemoteTmUrl,[out]char **o_ppszRemoteTxUrl);
+    HRESULT GetTransactionUrl([out]char **o_ppszLocalTxUrl);
+}
+[
+    object,
+    uuid(17cf72d1-bac5-11d1-b1bf-00c04fc2f3ef)
+]
+interface ITipHelper : IUnknown {
+    HRESULT Pull([in]char *i_pszTxUrl,[out]ITransaction **o_ppITransaction);
+    HRESULT PullAsync([in]char *i_pszTxUrl,[in]ITipPullSink *i_pTipPullSink,[out]ITransaction **o_ppITransaction);
+    HRESULT GetLocalTmUrl([out]char **o_ppszLocalTmUrl);
+}
+[
+    object,
+    uuid(17cf72d2-bac5-11d1-b1bf-00c04fc2f3ef)
+]
+interface ITipPullSink : IUnknown {
+    HRESULT PullComplete([in]HRESULT i_hrPull);
+}
+[
+    object,
+    uuid(9797c15d-a428-4291-87b6-0995031a678d)
+]
+interface IDtcNetworkAccessConfig : IUnknown {
+    HRESULT GetAnyNetworkAccess([out]BOOL *pbAnyNetworkAccess);
+    HRESULT SetAnyNetworkAccess([in]BOOL bAnyNetworkAccess);
+    HRESULT GetNetworkAdministrationAccess([out]BOOL *pbNetworkAdministrationAccess);
+    HRESULT SetNetworkAdministrationAccess([in]BOOL bNetworkAdministrationAccess);
+    HRESULT GetNetworkTransactionAccess([out]BOOL *pbNetworkTransactionAccess);
+    HRESULT SetNetworkTransactionAccess([in]BOOL bNetworkTransactionAccess);
+    HRESULT GetNetworkClientAccess([out]BOOL *pbNetworkClientAccess);
+    HRESULT SetNetworkClientAccess([in]BOOL bNetworkClientAccess);
+    HRESULT GetNetworkTIPAccess([out]BOOL *pbNetworkTIPAccess);
+    HRESULT SetNetworkTIPAccess([in]BOOL bNetworkTIPAccess);
+    HRESULT GetXAAccess([out]BOOL *pbXAAccess);
+    HRESULT SetXAAccess([in]BOOL bXAAccess);
+    HRESULT RestartDtcService(void);
+}
+
+typedef enum AUTHENTICATION_LEVEL {
+    NO_AUTHENTICATION_REQUIRED,
+    INCOMING_AUTHENTICATION_REQUIRED,
+    MUTUAL_AUTHENTICATION_REQUIRED
+} AUTHENTICATION_LEVEL;
+
+[
+    object,
+    uuid(a7aa013b-eb7d-4f42-b41c-b2dec09ae034)
+]
+interface IDtcNetworkAccessConfig2 : IDtcNetworkAccessConfig {
+    HRESULT GetNetworkInboundAccess([out]BOOL *pbInbound);
+    HRESULT GetNetworkOutboundAccess([out]BOOL *pbOutbound);
+    HRESULT SetNetworkInboundAccess([in]BOOL bInbound);
+    HRESULT SetNetworkOutboundAccess([in]BOOL bOutbound);
+    HRESULT GetAuthenticationLevel([out]AUTHENTICATION_LEVEL *pAuthLevel);
+    HRESULT SetAuthenticationLevel([in]AUTHENTICATION_LEVEL AuthLevel);
+}
diff --git a/sdk/include/psdk/txdtc.idl b/sdk/include/psdk/txdtc.idl
new file mode 100644 (file)
index 0000000..c294470
--- /dev/null
@@ -0,0 +1,515 @@
+/*
+ * 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);
+*/