Example #1
0
        public void GetContentMetadata(Book.Part part, EFlags flags = default)
        {
            var filename = part.AaxFileItem.FileName;

            Log(3, this, () => $"\"{filename.SubstitUser ()}\", flags={flags}");

            try {
                var contentMetadataFile = findContentMetadataFile(filename);
                if (contentMetadataFile is null || contentMetadataFile.Filename is null)
                {
                    part.AaxFileItem.ContentMetadataFile = new AsinJsonFile(null, null);
                    return;
                }

                part.AaxFileItem.ContentMetadataFile = contentMetadataFile;
                string metafile = contentMetadataFile.Filename;
                Log(3, this, () => $"\"{metafile.SubstitUser ()}\"");

                if (flags.HasFlag(EFlags.fileOnly))
                {
                    return;
                }

                getContentMetaChapters(part, metafile, flags.HasFlag(EFlags.skuOnly));
            } catch (Exception exc) {
                Log(1, this, () => exc.ToShortString());
            }
        }
Example #2
0
 /// <summary>
 /// Consider the next character in the stream 'ch'.
 /// Returns true if currently within a string/character literal.</summary>
 public bool WithinLiteral(char ch)
 {
     if (m_in_literal_state)
     {
         if (m_escape)
         {
             // If escaped, then still within the literal
             m_escape = false;
             return(m_in_literal = true);
         }
         else if (ch == m_quote_character)
         {
             m_in_literal_state = false;
             return(m_in_literal = !m_flags.HasFlag(EFlags.ExcludeQuotes));                    // terminating quote can be part of the literal
         }
         else if (ch == '\n' && m_flags.HasFlag(EFlags.SingleLineStrings))
         {
             m_in_literal_state = false;
             return(m_in_literal = false);                    // terminating '\n' is not part of the literal
         }
         else
         {
             m_escape = (ch == m_escape_character) && m_flags.HasFlag(EFlags.Escaped);
             return(m_in_literal = true);
         }
     }
     else if (ch == '\"' || ch == '\'')
     {
         m_quote_character  = ch;
         m_in_literal_state = true;
         m_escape           = false;
         return(m_in_literal = !m_flags.HasFlag(EFlags.ExcludeQuotes));                // first quote can be part of the literal
     }
     else
     {
         return(m_in_literal = false);
     }
 }
Example #3
0
        public void UpdateFlags(ulong result, uint size, EFlags flags)
        {
            if (flags.HasFlag(EFlags.ZeroFlag))
            {
                ToggleFlagIf(EFlags.ZeroFlag, result == 0);
            }

            // http://graphics.stanford.edu/~seander/bithacks.html#ParityWith64Bits
            if (flags.HasFlag(EFlags.ParityFlag))
            {
                ToggleFlagIf(EFlags.ParityFlag, ((((((((ulong)result & 0xFF) * (ulong)0x0101010101010101) & 0x8040201008040201) % 0x1FF) & 1) == 0)));
            }

            if (flags.HasFlag(EFlags.SignFlag))
            {
                uint signFlag = (uint)(1 << (int)((size << 3) - 1));
                ToggleFlagIf(EFlags.SignFlag, (result & signFlag) == signFlag);
            }

            if (flags.HasFlag(EFlags.AdjustFlag))
            {
                ToggleFlagIf(EFlags.AdjustFlag, (result & 8) == 8);
            }

            if (flags.HasFlag(EFlags.OverflowFlag))
            {
                long signedResult = (long)result;
                if (size == 1)
                {
                    ToggleFlagIf(EFlags.OverflowFlag, signedResult > sbyte.MaxValue || signedResult < sbyte.MinValue);
                }
                else if (size == 2)
                {
                    ToggleFlagIf(EFlags.OverflowFlag, signedResult > short.MaxValue || signedResult < short.MinValue);
                }
                else if (size == 4)
                {
                    ToggleFlagIf(EFlags.OverflowFlag, signedResult > int.MaxValue || signedResult < int.MinValue);
                }
            }

            if (flags.HasFlag(EFlags.CarryFlag))
            {
                ToggleFlagIf(EFlags.CarryFlag, ((result >> ((int)size << 3)) & 1) == 1);
            }
        }
Example #4
0
        public void UpdateFlags(ulong result, uint size, EFlags flags)
        {
            if (flags.HasFlag(EFlags.ZeroFlag))
                ToggleFlagIf(EFlags.ZeroFlag, result == 0);

            // http://graphics.stanford.edu/~seander/bithacks.html#ParityWith64Bits
            if (flags.HasFlag(EFlags.ParityFlag))
                ToggleFlagIf(EFlags.ParityFlag, ((((((((ulong)result & 0xFF) * (ulong)0x0101010101010101) & 0x8040201008040201) % 0x1FF) & 1) == 0)));

            if (flags.HasFlag(EFlags.SignFlag))
            {
                uint signFlag = (uint)(1 << (int)((size << 3) - 1));
                ToggleFlagIf(EFlags.SignFlag, (result & signFlag) == signFlag);
            }

            if (flags.HasFlag(EFlags.AdjustFlag))
                ToggleFlagIf(EFlags.AdjustFlag, (result & 8) == 8);

            if (flags.HasFlag(EFlags.OverflowFlag))
            {
                long signedResult = (long)result;
                if (size == 1)
                    ToggleFlagIf(EFlags.OverflowFlag, signedResult > sbyte.MaxValue || signedResult < sbyte.MinValue);
                else if (size == 2)
                    ToggleFlagIf(EFlags.OverflowFlag, signedResult > short.MaxValue || signedResult < short.MinValue);
                else if (size == 4)
                    ToggleFlagIf(EFlags.OverflowFlag, signedResult > int.MaxValue || signedResult < int.MinValue);
            }

            if (flags.HasFlag(EFlags.CarryFlag))
                ToggleFlagIf(EFlags.CarryFlag, ((result >> ((int)size << 3)) & 1) == 1);
        }
Example #5
0
        private bool ExecuteJump(string disasmStr, Disasm disasm, string mnemonic)
        {
            bool shouldJump = false;

            if (mnemonic == "jmp")
            {
                shouldJump = true;
            }
            else if (mnemonic == "je" || mnemonic == "jz") // Jump short if equal (ZF=1).
            {
                shouldJump = EFlags.HasFlag(EFlags.ZeroFlag);
            }
            else if (mnemonic == "jne" || mnemonic == "jnz") // Jump short if not equal (ZF=0).
            {
                shouldJump = !EFlags.HasFlag(EFlags.ZeroFlag);
            }
            else if (mnemonic == "ja" || mnemonic == "jnbe") // Jump short if not below or equal (CF=0 and ZF=0).
            {
                shouldJump = !EFlags.HasFlag(EFlags.CarryFlag) && !EFlags.HasFlag(EFlags.ZeroFlag);
            }
            else if (mnemonic == "jb" || mnemonic == "jc" || mnemonic == "jnae")  // Jump short if not above or equal (CF=1).
            {
                shouldJump = EFlags.HasFlag(EFlags.CarryFlag);
            }
            else if (mnemonic == "jng" || mnemonic == "jle") // Jump short if not greater (ZF=1 or SF != OF).
            {
                shouldJump = EFlags.HasFlag(EFlags.ZeroFlag) || (EFlags.HasFlag(EFlags.SignFlag) != EFlags.HasFlag(EFlags.OverflowFlag));
            }
            else if (mnemonic == "jnc" || mnemonic == "jnb" || mnemonic == "jae") // Jump short if not carry (CF=0).
            {
                shouldJump = !EFlags.HasFlag(EFlags.CarryFlag);
            }
            else if (mnemonic == "jna" || mnemonic == "jbe") // Jump short if not above (CF=1 or ZF=1).
            {
                shouldJump = EFlags.HasFlag(EFlags.CarryFlag) || EFlags.HasFlag(EFlags.ZeroFlag);
            }
            else if (mnemonic == "jge" || mnemonic == "jnl") // Jump short if greater or equal (SF=OF).
            {
                shouldJump = EFlags.HasFlag(EFlags.SignFlag) == EFlags.HasFlag(EFlags.OverflowFlag);
            }
            else if (mnemonic == "jg" || mnemonic == "jnle") // Jump short if greater (ZF=0 and SF=OF).
            {
                shouldJump = !EFlags.HasFlag(EFlags.ZeroFlag) && (EFlags.HasFlag(EFlags.SignFlag) == EFlags.HasFlag(EFlags.OverflowFlag));
            }
            else if (mnemonic == "jl" || mnemonic == "jnge") // Jump short if less (SF != OF).
            {
                shouldJump = EFlags.HasFlag(EFlags.SignFlag) != EFlags.HasFlag(EFlags.OverflowFlag);
            }
            else if (mnemonic == "jecxz") // Jump short if ECX register is 0.
            {
                shouldJump = Ecx.Value == 0;
            }
            else if (mnemonic == "jcxz") // Jump short if CX register is 0.
            {
                shouldJump = Ecx.Cx == 0;
            }
            else if (mnemonic == "jno") // Jump short if not overflow (OF=0)
            {
                shouldJump = !EFlags.HasFlag(EFlags.OverflowFlag);
            }
            else if (mnemonic == "jnp" || mnemonic == "jpo") // Jump short if not parity (PF=0)
            {
                shouldJump = !EFlags.HasFlag(EFlags.ParityFlag);
            }
            else if (mnemonic == "jns") // Jump short if not sign (SF=0)
            {
                shouldJump = !EFlags.HasFlag(EFlags.SignFlag);
            }
            else if (mnemonic == "jo") // Jump short if overflow (OF=1)
            {
                shouldJump = !EFlags.HasFlag(EFlags.OverflowFlag);
            }
            else if (mnemonic == "jp" || mnemonic == "jpe") // Jump short if parity (PF=1)
            {
                shouldJump = !EFlags.HasFlag(EFlags.ParityFlag);
            }
            else if (mnemonic == "js") // Jump short if sign (SF=1)
            {
                shouldJump = !EFlags.HasFlag(EFlags.SignFlag);
            }
            else
            {
                throw new Exception("Invalid jump type detected.");
            }

            if (!shouldJump)
            {
                return(false);
            }

            // We should jump.
            return(true);
        }