internal PDBFunctionInfo(PDBFunction func, Int32 addr, UInt16 seg, Int32 funcPtr) { this.function = func; this.address = addr; this.segment = seg; this.funcPointer = funcPtr; }
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 + "."); } }
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); }
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; } }