protected override void InnerBegin()
        {
            // we have a ongoing current transaction, join it!
            if (System.Transactions.Transaction.Current != null)
            {
                var ktx = (IKernelTransaction)TransactionInterop
                          .GetDtcTransaction(System.Transactions.Transaction.Current);

                SafeTransactionHandle handle;
                ktx.GetHandle(out handle);

                // even though _TransactionHandle can already contain a handle if this thread
                // had been yielded just before setting this reference, the "safe"-ness of the wrapper should
                // not dispose the other handle which is now removed
                _TransactionHandle = handle;
                IsAmbient          = true;
            }
            else
            {
                _TransactionHandle = createTransaction(string.Format("{0} Transaction", theName));
            }
            if (!_TransactionHandle.IsInvalid)
            {
                return;
            }

            throw new TransactionException(
                      "Cannot begin file transaction. CreateTransaction failed and there's no ambient transaction.",
                      LastEx());
        }
 private static extern SafeFindHandle FindFirstFileTransactedW(
     [In, MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
     [In] FINDEX_INFO_LEVELS fInfoLevelId,             // TODO: Won't work.
     [Out] out WIN32_FIND_DATA lpFindFileData,
     [In] FINDEX_SEARCH_OPS fSearchOp,
     IntPtr lpSearchFilter,
     [In] uint dwAdditionalFlags,
     [In] SafeTransactionHandle hTransaction);
 private static extern SafeFileHandle CreateFileTransactedW(
     [In, MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
     [In] NativeFileAccess dwDesiredAccess,
     [In] NativeFileShare dwShareMode,
     [In] IntPtr lpSecurityAttributes,
     [In] NativeFileMode dwCreationDisposition,
     [In] uint dwFlagsAndAttributes,
     [In] IntPtr hTemplateFile,
     [In] SafeTransactionHandle hTransaction,
     [In] IntPtr pusMiniVersion,
     [In] IntPtr pExtendedParameter);
 private static extern bool DeleteFileTransactedW(
     [MarshalAs(UnmanagedType.LPWStr)] string file,
     SafeTransactionHandle transaction);
 private static extern bool MoveFileTransacted([In] string lpExistingFileName,
                                               [In] string lpNewFileName, [In] IntPtr lpProgressRoutine,
                                               [In] IntPtr lpData,
                                               [In] MoveFileFlags dwFlags,
                                               [In] SafeTransactionHandle hTransaction);
 private static extern bool CreateHardLinkTransacted([In] string lpFileName,
                                                     [In] string lpExistingFileName,
                                                     [In] IntPtr lpSecurityAttributes,
                                                     [In] SafeTransactionHandle hTransaction);
 private static extern bool RollbackTransaction(SafeTransactionHandle transaction);
 private static extern bool CommitTransaction(SafeTransactionHandle transaction);
		private static extern bool RollbackTransaction(SafeTransactionHandle transaction);
 private static extern int GetFullPathNameTransactedW(
     [In, MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
     [In] int nBufferLength,
     [Out] StringBuilder lpBuffer,
     [In, Out] ref IntPtr lpFilePart,
     [In] SafeTransactionHandle hTransaction);
 private static extern bool RemoveDirectoryTransactedW(
     [MarshalAs(UnmanagedType.LPWStr)] string lpPathName,
     SafeTransactionHandle hTransaction);
		protected override void InnerBegin()
		{
			// we have a ongoing current transaction, join it!
			if (System.Transactions.Transaction.Current != null)
			{
				var ktx = (IKernelTransaction) TransactionInterop
				                               	.GetDtcTransaction(System.Transactions.Transaction.Current);

				SafeTransactionHandle handle;
				ktx.GetHandle(out handle);

				// even though _TransactionHandle can already contain a handle if this thread 
				// had been yielded just before setting this reference, the "safe"-ness of the wrapper should
				// not dispose the other handle which is now removed
				_TransactionHandle = handle;
				IsAmbient = true;
			}
			else _TransactionHandle = createTransaction(string.Format("{0} Transaction", theName));
			if (!_TransactionHandle.IsInvalid) return;

			throw new TransactionException(
				"Cannot begin file transaction. CreateTransaction failed and there's no ambient transaction.",
				LastEx());
		}
		private static extern bool RemoveDirectoryTransactedW(
			[MarshalAs(UnmanagedType.LPWStr)] string lpPathName,
			SafeTransactionHandle hTransaction);
		private static extern bool CreateDirectoryTransactedW(
			[MarshalAs(UnmanagedType.LPWStr)] string lpTemplateDirectory,
			[MarshalAs(UnmanagedType.LPWStr)] string lpNewDirectory,
			IntPtr lpSecurityAttributes,
			SafeTransactionHandle hTransaction);
		private static extern bool DeleteFileTransactedW(
			[MarshalAs(UnmanagedType.LPWStr)] string file,
			SafeTransactionHandle transaction);
 private static extern bool CreateDirectoryTransactedW(
     [MarshalAs(UnmanagedType.LPWStr)] string lpTemplateDirectory,
     [MarshalAs(UnmanagedType.LPWStr)] string lpNewDirectory,
     IntPtr lpSecurityAttributes,
     SafeTransactionHandle hTransaction);
		private static extern bool CommitTransaction(SafeTransactionHandle transaction);