public override ExternalProcedure SignatureFromName(string fnName) { StructField_v1 field = null; try { var gcc = new GccMangledNameParser(fnName, this.PointerType.Size); field = gcc.Parse(); } catch (Exception ex) { Debug.Print("*** Error parsing {0}. {1}", fnName, ex.Message); return(null); } if (field == null) { return(null); } var sproc = field.Type as SerializedSignature; if (sproc != null) { var loader = new TypeLibraryDeserializer(this, false, Metadata); var sser = this.CreateProcedureSerializer(loader, sproc.Convention); var sig = sser.Deserialize(sproc, this.Architecture.CreateFrame()); //$BUGBUG: catch dupes? return(new ExternalProcedure(field.Name, sig) { EnclosingType = sproc.EnclosingType }); } return(null); }
public override ProcedureBase_v1 SignatureFromName(string fnName) { StructField_v1 field = null; try { var gcc = new GccMangledNameParser(fnName, this.PointerType.Size); field = gcc.Parse(); } catch (Exception ex) { Debug.Print("*** Error parsing {0}. {1}", fnName, ex.Message); return(null); } if (field == null) { return(null); } if (field.Type is SerializedSignature sproc) { return(new Procedure_v1 { Name = field.Name, Signature = sproc, }); } return(null); }
private IEnumerable <StructField_v1> VisitFields(List <Core.Pascal.Field> fields) { var result = new List <StructField_v1>(); foreach (var recfield in fields) { var dt = recfield.Type.Accept(this); foreach (string fieldName in recfield.Names) { var field = new StructField_v1 { Name = fieldName, Type = dt }; result.Add(field); //$REVIEW: alignment? } } return(result); }
private void BuildStructure(Structure st, StructType_v1 str) { var fieldTypes = (object[])dictionary[st.TypeList].Leaves[0]; var fieldNamesOffsets = (object[])dictionary[st.NameOffsetList].Leaves[0]; if (2 * fieldTypes.Length != fieldNamesOffsets.Length || fieldTypes.Length != st.FieldCount) { throw new FormatException(); } var fields = new StructField_v1[st.FieldCount]; for (int i = 0; i < st.FieldCount; ++i) { var type = TranslateType(Convert.ToInt32(fieldTypes[i])); var name = (string)fieldNamesOffsets[i * 2]; var offset = Convert.ToInt32(fieldNamesOffsets[i * 2 + 1]); fields[i] = new StructField_v1(offset, name, type); } str.Fields = fields; str.ByteSize = (st.BitSize + 7) / 8; }
/// <summary> /// Guesses the signature of a procedure based on its name. /// </summary> /// <param name="fnName"></param> /// <param name="loader"></param> /// <param name="arch"></param> /// <returns></returns> public static ExternalProcedure SignatureFromName(string fnName, TypeLibraryDeserializer loader, IPlatform platform) { int argBytes; if (fnName[0] == '_') { // Win32 prefixes cdecl and stdcall functions with '_'. Stdcalls will have @<nn> // where <nn> is the number of bytes pushed on the stack. If 0 bytes are pushed // the result is indistinguishable from the corresponding cdecl call, which is OK. int lastAt = fnName.LastIndexOf('@'); if (lastAt < 0) { return(CdeclSignature(fnName.Substring(1), platform.Architecture)); } string name = fnName.Substring(1, lastAt - 1); if (!Int32.TryParse(fnName.Substring(lastAt + 1), out argBytes)) { return(CdeclSignature(name, platform.Architecture)); } else { return(StdcallSignature(name, argBytes, platform.Architecture)); } } else if (fnName[0] == '@') { // Win32 prefixes fastcall functions with '@'. int lastAt = fnName.LastIndexOf('@'); if (lastAt <= 0) { return(CdeclSignature(fnName.Substring(1), platform.Architecture)); } string name = fnName.Substring(1, lastAt - 1); if (!Int32.TryParse(fnName.Substring(lastAt + 1), out argBytes)) { return(CdeclSignature(name, platform.Architecture)); } else { return(FastcallSignature(name, argBytes, platform.Architecture)); } } else if (fnName[0] == '?') { // Microsoft-mangled signatures begin with '?' var pmnp = new MsMangledNameParser(fnName); StructField_v1 field = null; try { field = pmnp.Parse(); } catch (Exception ex) { Debug.Print("*** Error parsing {0}. {1}", fnName, ex.Message); return(null); } var sproc = field.Type as SerializedSignature; if (sproc != null) { var sser = platform.CreateProcedureSerializer(loader, sproc.Convention); var sig = sser.Deserialize(sproc, platform.Architecture.CreateFrame()); //$BUGBUG: catch dupes? return(new ExternalProcedure(field.Name, sig) { EnclosingType = sproc.EnclosingType }); } } return(null); }