Exemple #1
0
 internal PDBFunctionInfo(PDBFunction func, Int32 addr, UInt16 seg, Int32 funcPtr)
 {
     this.function    = func;
     this.address     = addr;
     this.segment     = seg;
     this.funcPointer = funcPtr;
 }
Exemple #2
0
        private static void HandleOEM(PDBFunction func, Byte[] array, ref Int32 idx)
        {
            var guid    = array.ReadGUIDFromBytes(ref idx);
            var typeIdx = array.ReadUInt32LEFromBytes(ref idx);

            if (guid == GUIDs.MSIL_METADATA_GUID)
            {
                var oemName = array.ReadZeroTerminatedUTF16String(ref idx);
                switch (oemName)
                {
                case MD_OEM_NAME:
                    ReadMD2OEM(func, array, ref idx);
                    break;

                case ASYNC_METHOD_OEM_NAME:
                    func.AsyncMethodInfo = NewPDBAsyncMethodInfo(array, ref idx);
                    break;

                case ENC_OEM_NAME:
#if DEBUG
                    if (func.ENCID != 0)
                    {
                        throw new PDBException("Debyyg");
                    }
#endif
                    func.ENCID = array.ReadUInt32LEFromBytes(ref idx);
                    break;

                default:
#if DEBUG
                    throw new PDBException("Debyyg");
#else
                    break;
#endif
                }
            }
            else
            {
                throw new PDBException("Unknown OEM guid: " + guid + " with type index " + typeIdx + " in " + func.Name + ".");
            }
        }
Exemple #3
0
        private static PDBFunction NewPDBFunction(String moduleName, Byte[] array, ref Int32 idx, Int32 listsStartIdx, out Int32 address, out UInt16 segment)
        {
            var result = new PDBFunction();

            /*var parent = */
            array.ReadInt32LEFromBytes(ref idx);
            var end = array.ReadInt32LEFromBytes(ref idx);

            /*var next = */
            array.ReadInt32LEFromBytes(ref idx);
            result.Length = array.ReadInt32LEFromBytes(ref idx);
            /*var debugStart = */
            array.ReadInt32LEFromBytes(ref idx);
            /*var debugEnd = */
            array.ReadInt32LEFromBytes(ref idx);
            result.Token = array.ReadUInt32LEFromBytes(ref idx);
            address      = array.ReadInt32LEFromBytes(ref idx);
            segment      = array.ReadUInt16LEFromBytes(ref idx);
            /*var flags = */
            array.ReadByteFromBytes(ref idx);
            /*var returnReg = */
            array.ReadUInt16LEFromBytes(ref idx);
            result.Name = array.ReadZeroTerminatedStringFromBytes(ref idx, NAME_ENCODING);

            idx = listsStartIdx;
            try
            {
                ReadListsFromBytes(result, array, ref idx, end, address);
            }
            catch (Exception e)
            {
                throw new PDBException("Error when reading function " + result.Name + " in " + moduleName + ".", e);
            }

            return(result);
        }
Exemple #4
0
        private static void ReadMD2OEM(PDBFunction func, Byte[] array, ref Int32 idx)
        {
            ++idx; // Skip version byte
            var amountOfMDInfos = array.ReadByteFromBytes(ref idx);

            Align4(ref idx);
            while (amountOfMDInfos > 0)
            {
                // Save current index
                var oldIdx = idx;
                // Skip version byte, again
                ++idx;
                // Read metadata item kind
                var mdKind = array.ReadByteFromBytes(ref idx);
                // Align
                Align4(ref idx);
                // Read metadata item byte size
                var byteCount = array.ReadInt32LEFromBytes(ref idx);
                switch (mdKind)
                {
                case MD2_USED_NAMESPACES:
                    // Using info
                    var uSize = array.ReadUInt16LEFromBytes(ref idx);
                    func.UsingCounts.Capacity = uSize;
                    for (UInt16 i = 0; i < uSize; ++i)
                    {
                        func.UsingCounts.Add(array.ReadUInt16LEFromBytes(ref idx));
                    }
                    break;

                case MD2_FORWARDING_METHOD_TOKEN:
                    // Forwarding information
                    func.ForwardingMethodToken = array.ReadUInt32LEFromBytes(ref idx);
                    break;

                case MD2_FORWARDING_MODULE_METHOD_TOKEN:
#if DEBUG
                    if (func.ModuleForwardingMethodToken != 0)
                    {
                        throw new PDBException("Debyyg");
                    }
#endif
                    func.ModuleForwardingMethodToken = array.ReadUInt32LEFromBytes(ref idx);
                    break;

                case MD2_LOCAL_SCOPES:
                    // Local scopes
                    var localSize = array.ReadInt32LEFromBytes(ref idx);
                    func.LocalScopes.Capacity = localSize;
                    for (var i = 0; i < localSize; ++i)
                    {
                        func.LocalScopes.Add(NewPDBLocalScope(array, ref idx));
                    }
                    break;

                case MD2_ITERATOR_CLASS:
                    // Forward iterator class
                    func.IteratorClass = array.ReadZeroTerminatedStringFromBytes(ref idx, NAME_ENCODING);
                    break;

                default:
#if DEBUG
                    throw new PDBException("Debyyg");
#else
                    break;
#endif
                }
                // Set index always to the size specified in bytes
                idx = oldIdx + byteCount;
                // Remember decrement loop variable
                --amountOfMDInfos;
            }
        }