Beispiel #1
0
        //Сохранить
        public bool Save(string filename)
        {
            IStream pIStream;

            GlobalStorage.GetStorage("root\\Metadata").DestroyElement("Main MetaData Stream");
            GlobalStorage.GetStorage("root\\Metadata").CreateStream("Main MetaData Stream", NativeMethods.STGM.CREATE | NativeMethods.STGM.READWRITE | NativeMethods.STGM.SHARE_EXCLUSIVE, 0, 0, out pIStream);
            //Storage.OpenStream("Main MetaData Stream", IntPtr.Zero, NativeMethods.STGM.READWRITE | NativeMethods.STGM.SHARE_EXCLUSIVE, 0, out pIStream);
            byte[] data = PrepareMMSData();
            pIStream.Write(data, data.Length, IntPtr.Zero);
            pIStream.Commit((int)NativeMethods.STGC.OVERWRITE);

            Marshal.ReleaseComObject(pIStream);
            Marshal.FinalReleaseComObject(pIStream);
            pIStream = null;

            if (!IsEncrypted)                                                    // запишем расшифрованный MMS, глобальник и сменим clsid у папки MetaData
            {
                GlobalStorage.GetStorage("root\\Metadata").SetClass(Guid.Empty); //Запишем GUID = "00000000-0000-0000-0000-000000000000"
            }
            else// запишем pашифрованный MMS, глобальник и сменим clsid у папки MetaData
            {
                GlobalStorage.GetStorage("root\\Metadata").SetClass(EncryptedClass); //Запишем GUID = "0af60370-754e-11d2-9f21-008048da120f"
            }
            GlobalStorage.GetStorage("root\\Metadata").Commit(NativeMethods.STGC.OVERWRITE);
            RootStorage.Commit(NativeMethods.STGC.OVERWRITE);

            //RootStorage.OpenStorage("TypedText", null, NativeMethods.STGM.READWRITE | NativeMethods.STGM.SHARE_EXCLUSIVE, IntPtr.Zero, 0, out Storage);
            //Storage.OpenStorage("ModuleText_Number1", null, NativeMethods.STGM.READWRITE | NativeMethods.STGM.SHARE_EXCLUSIVE, IntPtr.Zero, 0, out Storage);
            GlobalStorage.GetStorage("root\\TypedText\\ModuleText_Number1").DestroyElement("MD Programm text");
            GlobalStorage.GetStorage("root\\TypedText\\ModuleText_Number1").CreateStream("MD Programm text", NativeMethods.STGM.CREATE | NativeMethods.STGM.READWRITE | NativeMethods.STGM.SHARE_EXCLUSIVE, 0, 0, out pIStream);

            data = PrepareGMData();
            pIStream.Write(data, data.Length, IntPtr.Zero);
            pIStream.Commit((int)NativeMethods.STGC.OVERWRITE);
            GlobalStorage.GetStorage("root\\TypedText\\ModuleText_Number1").Commit(NativeMethods.STGC.OVERWRITE);
            RootStorage.Commit(NativeMethods.STGC.OVERWRITE);

            NativeMethods.IStorage NewStorage;
            if (NativeMethods.StgCreateDocfile(filename, NativeMethods.STGM.CREATE | NativeMethods.STGM.READWRITE | NativeMethods.STGM.SHARE_EXCLUSIVE, 0, out NewStorage) == 0)
            {
                RootStorage.CopyTo(0, Guid.Empty, IntPtr.Zero, NewStorage);
                NewStorage.Commit(NativeMethods.STGC.DEFAULT);
            }

            Marshal.ReleaseComObject(NewStorage);
            Marshal.FinalReleaseComObject(NewStorage);
            NewStorage = null;

            GlobalStorage = null;

            Marshal.ReleaseComObject(pIStream);
            Marshal.FinalReleaseComObject(pIStream);
            pIStream = null;

            return(true);
        }
Beispiel #2
0
        public Compound(string MDFilename)
        {
            this.FileName = MDFilename;

            if (!OpenStorage(MDFilename))
            {
                throw new Exception("Не удалось открыть конфигурацию.");
            }
            GlobalStorage = new NativeMethods.Storage(RootStorage);

            System.Runtime.InteropServices.ComTypes.STATSTG MetaDataInfo;
            IStream pIStream;

            GlobalStorage.GetStorage("root\\Metadata").Stat(out MetaDataInfo, 0);
            IsEncrypted = MetaDataInfo.clsid.Equals(EncryptedClass);

            GlobalStorage.GetStorage("root\\Metadata").OpenStream("TagStream", IntPtr.Zero, NativeMethods.STGM.READWRITE | NativeMethods.STGM.SHARE_EXCLUSIVE, 0, out pIStream);
            TagStream = win1251.GetString(Encryption.Encode(NativeMethods.ReadIStream(pIStream), Encryption.Mode.TagStream));
            TagStream = TagStream.Substring(TagStream.IndexOf("{"));
            GlobalStorage.GetStorage("root\\Metadata").OpenStream("Main MetaData Stream", IntPtr.Zero, NativeMethods.STGM.READWRITE | NativeMethods.STGM.SHARE_EXCLUSIVE, 0, out pIStream);

            if (IsEncrypted)
            {
                MetaDataStream = win1251.GetString(Encryption.Encode(NativeMethods.ReadIStream(pIStream), Encryption.Mode.MetaDataStream));
            }
            else
            {
                MetaDataStream = NativeMethods.ReadIStreamToString(ref pIStream);
            }

            MetaDataStream = MetaDataStream.Substring(MetaDataStream.IndexOf('{'));

            PasswordHash = MetaDataStream.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).First(x => x.StartsWith("{\"1\",")).Split(',')[4].Replace("\"", "");

            if (MetaDataStream.Contains("CRC"))
            {
                CRC = MetaDataStream.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).First(x => x.StartsWith("{\"CRC\",")).Split(',')[1].Replace("\"", "").Replace("}", "");
            }

            GlobalStorage.GetStorage("root\\TypedText\\ModuleText_Number1").OpenStream("MD Programm text", IntPtr.Zero, NativeMethods.STGM.READ | NativeMethods.STGM.SHARE_EXCLUSIVE, 0, out pIStream);

            if (IsEncrypted)
            {
                GlobalModule = win1251.GetString(Encryption.Encode(NativeMethods.ReadCompressedIStream(ref pIStream), Encryption.Mode.GlobalModule));
            }
            else
            {
                GlobalModule = win1251.GetString(NativeMethods.ReadCompressedIStream(ref pIStream));
            }

            //вытащим картинки и инфу об авторе
            AuthorName     = GetTag(AuthorTags._AUTOR_SHOR_STRING_).Replace("\"\"", "\"");
            AuthorFullName = GetTag(AuthorTags._AUTOR_LONG_STRING_).Replace("\"\"", "\"");

            if (GetTag(AuthorTags._AUTOR_LOGO_INDEX_) != string.Empty)
            {
                AuthorLogo = new Bitmap(new MemoryStream(bitmapFromUU(GetTag(AuthorTags._AUTOR_LOGO_INDEX_))));
            }
            if (GetTag(AuthorTags._AUTOR_SPLASH_INDEX_) != string.Empty)
            {
                AuthorSplash = new Bitmap(new MemoryStream(bitmapFromUU(GetTag(AuthorTags._AUTOR_SPLASH_INDEX_))));
            }
        }