Beispiel #1
0
        internal static System.Runtime.InteropServices.ComTypes.STATSTG[] GetElements(this IStorage storage)
        {
            HRESULT      hr         = HRESULT.E_FAIL;
            IEnumSTATSTG enumerator = null;
            List <System.Runtime.InteropServices.ComTypes.STATSTG> list = new List <System.Runtime.InteropServices.ComTypes.STATSTG>();

            try
            {
                if (NativeMethods.Succeeded(hr = storage.EnumElements(0, IntPtr.Zero, 0, out enumerator)))
                {
                    uint celt = 1;
                    System.Runtime.InteropServices.ComTypes.STATSTG[] statstg = new System.Runtime.InteropServices.ComTypes.STATSTG[1];
                    uint fetched = 0;

                    while ((NativeMethods.Succeeded(hr = enumerator.Next(celt, statstg, out fetched))) && (fetched > 0))
                    {
                        list.Add(statstg[0]);
                    }
                }
            }
            catch
            {
            }
            finally
            {
                if (enumerator != null)
                {
                    enumerator.FinalRelease();
                }
            }

            return(list.ToArray());
        }
Beispiel #2
0
        public unsafe void EnumStorage()
        {
            using (var cleaner = new TestFileCleaner())
            {
                string   path       = cleaner.GetTestPath();
                IStorage storage    = (IStorage)Com.CreateStorage(path, InterfaceIds.IID_IStorage);
                IStream  stream     = storage.CreateStream("mystream", StorageMode.Create | StorageMode.ReadWrite | StorageMode.ShareExclusive);
                IStorage subStorage = storage.CreateStorage("substorage", StorageMode.Create | StorageMode.ReadWrite | StorageMode.ShareExclusive);
                storage.Commit();

                IEnumSTATSTG         e    = storage.EnumElements();
                WInterop.Com.STATSTG stat = default;
                int count = 0;
                while (e.Next(1, ref stat) > 0)
                {
                    count++;
                    switch (stat.type)
                    {
                    case StorageType.Storage:
                        stat.GetAndFreeString().Should().Be("substorage");
                        break;

                    case StorageType.Stream:
                        stat.GetAndFreeString().Should().Be("mystream");
                        break;

                    default:
                        false.Should().BeTrue($"unexpected type {stat.type}");
                        break;
                    }
                }

                count.Should().Be(2);
            }
        }
Beispiel #3
0
            void IStorage.EnumElements(
                int reserved1,
                IntPtr reserved2,
                int reserved3,
                out IEnumSTATSTG ppEnum)
            {
                SecurityHelper.DemandCompoundFileIOPermission();

                UnsafeNativeCompoundFileMethods.UnsafeNativeIEnumSTATSTG enumSTATSTG;

                _unsafeStorage.EnumElements(
                    reserved1,
                    reserved2,
                    reserved3,
                    out enumSTATSTG);

                if (enumSTATSTG != null)
                {
                    ppEnum = new SafeIEnumSTATSTGImplementation(enumSTATSTG);
                }
                else
                {
                    ppEnum = null;
                }
            }
Beispiel #4
0
        private MemoryStream GetStreamFromPackage(IStorage storage, ExcelEncryption encryption)
        {
            MemoryStream ret = null;

            comTypes.STATSTG statstg;

            storage.Stat(out statstg, (uint)STATFLAG.STATFLAG_DEFAULT);

            IEnumSTATSTG pIEnumStatStg = null;

            storage.EnumElements(0, IntPtr.Zero, 0, out pIEnumStatStg);

            comTypes.STATSTG[] regelt = { statstg };
            uint fetched = 0;
            uint res     = pIEnumStatStg.Next(1, regelt, out fetched);

            //if (regelt[0].pwcsName == "DataSpaces")
            //{
            //    PrintStorage(storage, regelt[0],"");
            //}
            if (res == 0)
            {
                byte[]         data;
                EncryptionInfo encryptionInfo = null;
                while (res != 1)
                {
                    switch (statstg.pwcsName)
                    {
                    case "EncryptionInfo":
                        data = GetOleStream(storage, statstg);
                        //File.WriteAllBytes(@"c:\temp\EncInfo1.bin", data);
                        encryptionInfo = new EncryptionInfo();
                        encryptionInfo.ReadBinary(data);

                        encryption.Algorithm = encryptionInfo.Header.AlgID == AlgorithmID.AES128 ?
                                               EncryptionAlgorithm.AES128 :
                                               encryptionInfo.Header.AlgID == AlgorithmID.AES192 ?
                                               EncryptionAlgorithm.AES192 :
                                               EncryptionAlgorithm.AES256;
                        break;

                    case "EncryptedPackage":
                        data = GetOleStream(storage, statstg);
                        ret  = DecryptDocument(data, encryptionInfo, encryption.Password);
                        break;
                    }

                    if ((res = pIEnumStatStg.Next(1, regelt, out fetched)) != 1)
                    {
                        statstg = regelt[0];
                    }
                }
            }
            Marshal.ReleaseComObject(pIEnumStatStg);
            return(ret);
        }
Beispiel #5
0
            // Methods
            internal StorageElementsCollection(IStorage storage)
            {
                StatStg tSSTG;

                IEnumSTATSTG oEnm = storage.EnumElements(0, 0, 0);

Label_0027:
                var fetched = 0;

                if (oEnm.Next(1, out tSSTG, out fetched) == 0)
                {
                    base.InnerList.Add(tSSTG);
                    goto Label_0027;
                }
                Marshal.ReleaseComObject(oEnm);
                oEnm = null;
            }
Beispiel #6
0
            void IEnumSTATSTG.Clone(
                out IEnumSTATSTG ppenum)
            {
                UnsafeNativeCompoundFileMethods.UnsafeNativeIEnumSTATSTG enumSTATSTG;

                _unsafeEnumSTATSTG.Clone(
                    out enumSTATSTG);

                if (enumSTATSTG != null)
                {
                    ppenum = new SafeIEnumSTATSTGImplementation(enumSTATSTG);
                }
                else
                {
                    ppenum = null;
                }
            }
Beispiel #7
0
            void IEnumSTATSTG.Clone(
                out IEnumSTATSTG ppenum)
            {
                SecurityHelper.DemandCompoundFileIOPermission();

                UnsafeNativeCompoundFileMethods.UnsafeNativeIEnumSTATSTG enumSTATSTG;

                _unsafeEnumSTATSTG.Clone(
                    out enumSTATSTG);

                if (enumSTATSTG != null)
                {
                    ppenum = new SafeIEnumSTATSTGImplementation(enumSTATSTG);
                }
                else
                {
                    ppenum = null;
                }
            }
Beispiel #8
0
        private MemoryStream ReadParts(IStorage storage, StoragePart storagePart)
        {
            MemoryStream ret = null;

            comTypes.STATSTG statstg;

            storage.Stat(out statstg, (uint)STATFLAG.STATFLAG_DEFAULT);

            IEnumSTATSTG pIEnumStatStg = null;

            storage.EnumElements(0, IntPtr.Zero, 0, out pIEnumStatStg);

            comTypes.STATSTG[] regelt = { statstg };
            uint fetched = 0;
            uint res     = pIEnumStatStg.Next(1, regelt, out fetched);

            //if (regelt[0].pwcsName == "DataSpaces")
            //{
            //    PrintStorage(storage, regelt[0],"");
            //}
            while (res != 1)
            {
                foreach (var item in regelt)
                {
                    if (item.type == 1)
                    {
                        IStorage subStorage;
                        storage.OpenStorage(item.pwcsName, null, STGM.DIRECT | STGM.READ | STGM.SHARE_EXCLUSIVE, IntPtr.Zero, 0, out subStorage);
                        StoragePart subStoragePart = new StoragePart();
                        storagePart.SubStorage.Add(item.pwcsName, subStoragePart);
                        ReadParts(subStorage, subStoragePart);
                    }
                    else
                    {
                        storagePart.DataStreams.Add(item.pwcsName, GetOleStream(storage, item));
                    }
                }
                res = pIEnumStatStg.Next(1, regelt, out fetched);
            }
            Marshal.ReleaseComObject(pIEnumStatStg);
            return(ret);
        }
Beispiel #9
0
        private IEnumerable <System.Runtime.InteropServices.ComTypes.STATSTG> EnumElements()
        {
            IEnumSTATSTG ssenum = null;

            Storage.EnumElements(0, IntPtr.Zero, 0, out ssenum);

            var ssstruct = new System.Runtime.InteropServices.ComTypes.STATSTG[1];

            uint numReturned;

            do
            {
                ssenum.Next(1, ssstruct, out numReturned);

                if (numReturned != 0)
                {
                    yield return(ssstruct[0]);
                }
            } while (numReturned > 0);
        }
Beispiel #10
0
 public void EnumElements(uint reserved1, IntPtr reserved2, uint reserved3, out IEnumSTATSTG ppEnum)
 {
     _stg.EnumElements(reserved1, reserved2, reserved3, out ppEnum);
 }
 public void EnumElements(uint reserved1, IntPtr reserved2, uint reserved3, out IEnumSTATSTG ppEnum)
 {
     _stg.EnumElements(reserved1, reserved2, reserved3, out ppEnum);
 }
Beispiel #12
0
 internal static void FinalRelease(this IEnumSTATSTG enumerator)
 {
     Marshal.FinalReleaseComObject(enumerator);
 }
Beispiel #13
0
            void IStorage.EnumElements(
                int reserved1,
                IntPtr reserved2,
                int reserved3,
                out IEnumSTATSTG ppEnum )
            {
                SecurityHelper.DemandCompoundFileIOPermission();

                UnsafeNativeCompoundFileMethods.UnsafeNativeIEnumSTATSTG enumSTATSTG;

                _unsafeStorage.EnumElements(
                    reserved1,
                    reserved2,
                    reserved3,
                    out enumSTATSTG);

                if (enumSTATSTG != null)
                    ppEnum = new SafeIEnumSTATSTGImplementation(enumSTATSTG);
                else
                    ppEnum = null;
            }
Beispiel #14
0
            void IEnumSTATSTG.Clone(
                out IEnumSTATSTG ppenum )
            {
                SecurityHelper.DemandCompoundFileIOPermission();

                UnsafeNativeCompoundFileMethods.UnsafeNativeIEnumSTATSTG enumSTATSTG;

                _unsafeEnumSTATSTG.Clone(
                    out enumSTATSTG );

                if (enumSTATSTG != null)
                    ppenum = new SafeIEnumSTATSTGImplementation(enumSTATSTG);
                else
                    ppenum = null;
            }
Beispiel #15
0
        public static void OpenAndExtractStorages(string filename, string dir)
        {
            IStorage rootStorage = null;
            int      hresult     = Ole32.StgOpenStorage(filename, null, STGM.STGM_READ | STGM.STGM_SHARE_EXCLUSIVE, IntPtr.Zero, 0, out rootStorage);

            if ((hresult == S_OK) && (rootStorage != null))
            {
                if (IsPatch(rootStorage))
                {
                    try
                    {
                        IEnumSTATSTG rootStorageEnum = null;
                        rootStorage.EnumElements(0, IntPtr.Zero, 0, out rootStorageEnum);

                        STATSTG[] enumStg    = new STATSTG[] { new STATSTG() };
                        uint      numFetched = 0;
                        rootStorageEnum.Next(1, enumStg, out numFetched);

                        while (numFetched == 1)
                        {
                            if (enumStg[0].type == (uint)STGTY.STGTY_STORAGE)
                            {
                                // Save the nested transform storages with an .mst extension
                                SaveStorage(rootStorage, dir, enumStg[0].pwcsName, ".mst");
                            }

                            rootStorageEnum.Next(1, enumStg, out numFetched);
                        }

                        if (enumStg != null)
                        {
                            Marshal.ReleaseComObject(rootStorageEnum);
                        }

                        if (rootStorage != null)
                        {
                            Marshal.ReleaseComObject(rootStorage);
                        }

                        using (Database installDatabase = new Database(filename, DatabaseOpenMode.ReadOnly))
                            using (View view = installDatabase.OpenView("SELECT `Name`, `Data` FROM `_Streams`"))
                            {
                                view.Execute();

                                foreach (Record record in view)
                                {
                                    SaveStream(record, dir);
                                    record.Close();
                                }
                            }
                    }
                    finally
                    {
                        if (rootStorage != null)
                        {
                            Marshal.ReleaseComObject(rootStorage);
                        }
                    }
                }
            }
        }
Beispiel #16
0
        unsafe public int EnumElements(uint p1, void *p2, uint p3, out IEnumSTATSTG enm)
        {
            enm = new XPBurnEnumStorageElements(this);

            return(CONSTS.S_OK);
        }
Beispiel #17
0
        static void Main(string[] args)
        {
            string filename = @"f:\temp\treta2.msg";

            if (StgIsStorageFile(filename) == 0)
            {
                IStorage storage = null;
                if (StgOpenStorage(
                        filename,
                        null,
                        STGM.DIRECT | STGM.READ | STGM.SHARE_EXCLUSIVE,
                        IntPtr.Zero,
                        0,
                        out storage) == 0)
                {
                    System.Runtime.InteropServices.ComTypes.STATSTG statstg;
                    storage.Stat(out statstg, (uint)STATFLAG.STATFLAG_DEFAULT);

                    IEnumSTATSTG pIEnumStatStg = null;
                    storage.EnumElements(0, IntPtr.Zero, 0, out pIEnumStatStg);

                    System.Runtime.InteropServices.ComTypes.STATSTG[] regelt = { statstg };
                    uint fetched = 0;
                    uint res     = pIEnumStatStg.Next(1, regelt, out fetched);

                    if (res == 0)
                    {
                        while (res != 1)
                        {
                            string strNode    = statstg.pwcsName;
                            bool   bNodeFound = false;

                            Console.WriteLine(strNode);

                            if (strNode == "__substg1.0_0E04001E" ||
                                strNode == "__substg1.0_0E1D001E" ||
                                strNode == "__substg1.0_1000001E" ||
                                strNode == "__substg1.0_1013001E")
                            {
                                bNodeFound = true;
                            }

                            if (bNodeFound)
                            {
                                switch (statstg.type)
                                {
                                case (int)STGTY.STGTY_STORAGE:
                                {
                                    IStorage pIChildStorage;
                                    storage.OpenStorage(statstg.pwcsName,
                                                        null,
                                                        (uint)(STGM.READ | STGM.SHARE_EXCLUSIVE),
                                                        IntPtr.Zero,
                                                        0,
                                                        out pIChildStorage);
                                }
                                break;

                                case (int)STGTY.STGTY_STREAM:
                                {
                                    IStream pIStream;
                                    storage.OpenStream(statstg.pwcsName,
                                                       IntPtr.Zero,
                                                       (uint)(STGM.READ | STGM.SHARE_EXCLUSIVE),
                                                       0,
                                                       out pIStream);

                                    byte[] data = new byte[255];

                                    pIStream.Read(data, 255, IntPtr.Zero);
                                }
                                break;
                                }
                            }

                            res = pIEnumStatStg.Next(1, regelt, out fetched);
                        }
                    }
                }
            }

            Console.ReadLine();
        }
 int IStorage.EnumElements(uint reserved1, IntPtr reserved2, uint reserved3, out IEnumSTATSTG ppEnum)
 {
     return(_storage.EnumElements(reserved1, reserved2, reserved3, out ppEnum));
 }
Beispiel #19
0
        public static List <string> GetUsers(string filename)
        {
            List <string> users = new List <string>();

            if (StgIsStorageFile(filename) == 0)
            {
                IStorage storage = null;

                if (StgOpenStorage(
                        filename,
                        null,
                        STGM.DIRECT | STGM.READ | STGM.SHARE_EXCLUSIVE,
                        IntPtr.Zero,
                        0,
                        out storage) == 0)
                {
                    System.Runtime.InteropServices.ComTypes.STATSTG statstg;
                    storage.Stat(out statstg, (uint)STATFLAG.STATFLAG_DEFAULT);
                    IEnumSTATSTG pIEnumStatStg = null;
                    storage.EnumElements(0, IntPtr.Zero, 0, out pIEnumStatStg);
                    System.Runtime.InteropServices.ComTypes.STATSTG[] regelt = { statstg };
                    uint fetched = 0;
                    uint res     = pIEnumStatStg.Next(1, regelt, out fetched);
                    if (res == 0)
                    {
                        while (res != 1)
                        {
                            string strNode    = statstg.pwcsName;
                            bool   bNodeFound = false;
                            if (strNode.IndexOf("Container.Contents") != -1)
                            {
                                bNodeFound = true;
                            }
                            if (bNodeFound)
                            {
                                switch (statstg.type)
                                {
                                case (int)STGTY.STGTY_STORAGE:
                                {
                                    IStorage pIChildStorage;
                                    storage.OpenStorage(statstg.pwcsName,
                                                        null,
                                                        (uint)(STGM.READ | STGM.SHARE_EXCLUSIVE),
                                                        IntPtr.Zero,
                                                        0,
                                                        out pIChildStorage);
                                }
                                break;

                                case (int)STGTY.STGTY_STREAM:
                                {
                                    IStream pIStream;
                                    storage.OpenStream(statstg.pwcsName,
                                                       IntPtr.Zero,
                                                       (uint)(STGM.READ | STGM.SHARE_EXCLUSIVE),
                                                       0,
                                                       out pIStream);
                                    if (statstg.cbSize > 0)
                                    {
                                        byte[] data = new byte[statstg.cbSize];
                                        pIStream.Read(data, (int)statstg.cbSize, IntPtr.Zero);
                                        Encoding en     = Encoding.Default;
                                        string   tmpStr = en.GetString(data);

                                        int pos = tmpStr.IndexOf("Page");
                                        while (pos > 0)
                                        {
                                            tmpStr = tmpStr.Remove(0, pos);
                                            pos    = tmpStr.IndexOf(",\"");
                                            if (pos > 0)
                                            {
                                                tmpStr = tmpStr.Remove(0, pos + 2);
                                                users.Add(tmpStr.Substring(0, tmpStr.IndexOf('"')));
                                            }
                                            pos = tmpStr.IndexOf("Page");
                                        }
                                    }
                                    pIStream = null;
                                }
                                break;
                                }
                            }
                            if ((res = pIEnumStatStg.Next(1, regelt, out fetched)) != 1)
                            {
                                statstg = regelt[0];
                            }
                        }
                        storage = null;
                    }
                }
            }
            return(users);
        }