Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
 public void ReleaseMarshalData(ImmIStream pStm)
 {
     Console.WriteLine(">> " + GetCurrentMethod());
 }
Ejemplo n.º 3
0
 public void UnmarshalInterface(ImmIStream pStm, ref Guid riid, out IntPtr ppv)
 {
     Console.WriteLine(">> " + GetCurrentMethod());
     ppv = IntPtr.Zero;
 }
Ejemplo n.º 4
0
 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);
 }
Ejemplo n.º 5
0
 public static extern void OleSaveToStream(ImmIPersistStream pPStm,
                                           ImmIStream pStm);
Ejemplo n.º 6
0
    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);
    }