Esempio n. 1
0
        public unsafe bool Check(byte[] fileimage)
        {
            if (this.TagName == "head")
                fixed(byte *img = &fileimage[0])
                {
                    // reset checkSumAdjustment
                    headTable *head = (headTable *)(img + (uint)this.offset);
                    ULONG      csa  = head->checkSumAdjustment;

                    head->checkSumAdjustment = (ULONG)0;

                    bool ret = this.CalculateTableSum(fileimage) == (uint)this.checkSum;

                    // Check checkSumAdjustment
                    OffsetTable *        offset = (OffsetTable *)img;
                    TableDirectoryEntry *entry  = (TableDirectoryEntry *)(offset + 1);
                    TableDirectoryEntry *end    = entry + (uint)offset->numTables;
                    uint sum = (uint)offset->Sum;

                    for (; entry < end; entry++)
                    {
                        sum += entry->Sum;
                        sum += (uint)entry->checkSum;
                    }

                    // restore checkSumAdjustment
                    head->checkSumAdjustment = csa;

                    return(ret);           //&&sum==0xB1B0AFBA-(uint)csa;
                }
            return(this.CalculateTableSum(fileimage) == (uint)this.checkSum);
        }
Esempio n. 2
0
        public bool Read()
        {
            Program.ErrorOut.WriteLine("TTF ファイル '{0}' を読み込みます。", path);
            Program.ErrorOut.AddIndent();
            try{
                if (!System.IO.File.Exists(path))
                {
                    Program.ErrorOut.WriteLine("読み込もうとしたファイルは存在しませんので読み込む事は出来ません", path);
                    return(false);
                }
                this.image = System.IO.File.ReadAllBytes(this.path);

                //-- TableDirectoryEntries の読込
                unsafe
                {
                    fixed(byte *img = &this.image[0])
                    {
                        OffsetTable *header = (OffsetTable *)img;

                        if (!header->Check())
                        {
                            Program.ErrorOut.WriteLine("ファイルヘッダに異常がありましたので読込を中止します。");
                            return(false);
                        }
                        TableDirectoryEntry *entry  = (TableDirectoryEntry *)(header + 1);
                        TableDirectoryEntry *mEntry = entry + (ushort)header->numTables;

                        while (entry < mEntry)
                        {
                            this.tables[entry->TagName] = *entry;
                            if (!entry->Check(image))
                            {
                                Program.ErrorOut.WriteLine("表 '{0}' の checkSum が合いません", entry->TagName);
                            }
                            entry++;
                        }
                    }
                }
            }finally{
                Program.ErrorOut.RemoveIndent();
            }
            return(true);
        }
Esempio n. 3
0
        public unsafe bool Check(byte[] fileimage)
        {
            if (this.TagName == "head")
                fixed(byte *img = &fileimage[0])
                {
                    // reset checkSumAdjustment
                    headTable *head = (headTable *)(img + (uint)this.offset);
                    ULONG      csa  = head->checkSumAdjustment;

                    head->checkSumAdjustment = (ULONG)0;
                    uint csaR = 0xB1B0AFBA - (uint)csa;

                    bool ret = this.CalculateTableSum(fileimage) == (uint)this.checkSum;

                    // Check checkSumAdjustment
                    OffsetTable *        offset = (OffsetTable *)img;
                    TableDirectoryEntry *entry  = (TableDirectoryEntry *)(offset + 1);
                    TableDirectoryEntry *end    = entry + (uint)offset->numTables;
                    uint sum = (uint)offset->Sum;

                    for (; entry < end; entry++)
                    {
                        sum += entry->Sum;
                        sum += (uint)entry->checkSum;
                    }

                    uint sum2 = this.SumEntireFont(fileimage);

                    // restore checkSumAdjustment
                    head->checkSumAdjustment = csa;

                    if (sum != sum2)
                    {
                        System.Console.WriteLine("checkSums of all the structures and the entire file are diffrent from each other.");
                        if (sum == csaR)
                        {
                            System.Console.WriteLine("checkSumAdjustment is calculated from all the structures.");
                        }
                        else if (sum2 == csaR)
                        {
                            System.Console.WriteLine("checkSumAdjustment is calculated from the entire file.");
                        }
                        else
                        {
                            System.Console.WriteLine("Neither structures nor entire file is used to calculate checkSumAdjustment: 0x{0:X8}", csaR);
                        }
                    }
                    else
                    {
                        if (sum != csaR)
                        {
                            System.Console.WriteLine("checkSumAdjustment is unexpected value: 0x{0:X8}", csaR);
                        }
                    }
                    System.Console.WriteLine("Σ1: 0x{0:X8}; checkSumAdjustment: 0x{1:X8}", sum, csaR);
                    System.Console.WriteLine("Σ2: 0x{0:X8}; checkSumAdjustment: 0x{1:X8}", sum2, csaR);
                    System.Console.WriteLine("Σ1 〜 checkSumAdjustment: 0x{0:X8} / 0x{1:X8}", csaR - sum, sum - csaR);
                    System.Console.WriteLine("Σ2 〜 checkSumAdjustment: 0x{0:X8} / 0x{1:X8}", csaR - sum2, sum2 - csaR);
                    return(ret);
                }
            return(this.CalculateTableSum(fileimage) == (uint)this.checkSum);
        }