protected override void Visit_STRING_TYPE(STRING_TYPE node) { /* MOVE CODE HERE */ }
protected virtual void Visit_STRING_TYPE(STRING_TYPE node) { }
public static string ReadString(Process process, UInt64 address, STRING_TYPE type) { // Reads a string from the specified address. string result = ""; bool moreString = true; int chunkSize = 0x4; while (moreString) { byte[] data; try { data = ReadMemory(process, (long)address, (uint)chunkSize); } catch (Exception ex) { data = new byte[0]; } if (data.Length == 0) return result; int i = 0; while (i < chunkSize && i < data.Length && moreString) { if (isDisplayableAscii[data[i]]) result = result + ((char)data[i]); else moreString = false; if (type == STRING_TYPE.auto && i + 1 < data.Length) type = (data[i + 1] == 0 ? STRING_TYPE.unicode : STRING_TYPE.ascii); else if (type == STRING_TYPE.auto) type = STRING_TYPE.ascii; if (type == STRING_TYPE.ascii) i++; else i += 2; } address += (ulong)i; // Increase chunksize chunkSize *= 2; } return result; }
protected virtual void EmitLoadDefaultValueForPropertyModel( PropertyModel propModel, CompositeTypeGenerationInfo propertyDeclaringTypeGenInfo, MethodGenerationInfo methodGenInfo ) { var il = methodGenInfo.IL; var pInfo = propModel.NativeInfo.NewWrapper(this.ctx); var propType = propertyDeclaringTypeGenInfo.AutoGeneratedPropertyInfos[propModel.NativeInfo].PropertyType; var declType = pInfo.DeclaringType; UseDefaultsAttribute udAttr; if (propModel.DefaultValueCreator != null) { // Get creator from property model il.EmitLoadLocal(methodGenInfo.GetLocalOrThrow(LB_C_INSTANCE)) .EmitCall(MODEL_INFO_GETTER) .EmitCall(MODEL_GETTER) .EmitCall(C_METHODS_GETTER) .EmitLoadInt32(propModel.GetterMethod.MethodIndex) .EmitCall(COMPOSITE_METHODS_INDEXER) .EmitCall(PROPERTY_MODEL_GETTER) .EmitCall(DEFAULT_CREATOR_GETTER); if (WillDefaultValueCreatorParameterBeNull(pInfo)) { il.EmitLoadNull(); } else { il.EmitReflectionObjectOf(propertyDeclaringTypeGenInfo.Parents[declType]) .EmitLoadString(pInfo.Name) .EmitCall(GET_PROPERTY_INFO_METHOD); } il .EmitLoadLocal(methodGenInfo.GetLocalOrThrow(LB_C_INSTANCE)) .EmitCall(STRUCTURE_OWNER_GETTER_METHOD) .EmitCall(APPLICATION_GETTER_METHOD) .EmitCall(DEFAULT_CREATOR_INVOKER) .EmitCastToType(DEFAULT_CREATOR_INVOKER.GetReturnType(), TypeGenerationUtils.CreateTypeForEmitting(propType, propertyDeclaringTypeGenInfo.GenericArguments, null)); } else if (propModel.IsUseDefaults(out udAttr)) { var propTypeGDef = propModel.NativeInfo.PropertyType.GetGenericDefinitionIfGenericType(); System.Reflection.MethodBase defaultValueCtor; CILTypeBase nullableParameter; if (propType.IsNullable(out nullableParameter)) { il.EmitLoadDefault(nullableParameter, aType => methodGenInfo.GetOrCreateLocalBasedOnType(aType)) .EmitNewObject(GetMethodBase(propType, NULLABLE_CTOR, propertyDeclaringTypeGenInfo)); } else if (STRING_TYPE.Equals(propType)) { il.EmitLoadString(DEFAULT_STRING); } else if (DEFAULT_CREATORS.TryGetValue(propTypeGDef, out defaultValueCtor)) { if (udAttr.ActualType != null) { var otherCtor = udAttr.ActualType .GetConstructors(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public) .FirstOrDefault(ctor => ctor.GetParameters().Length == 0); if (otherCtor != null) { defaultValueCtor = otherCtor; } } if (defaultValueCtor is System.Reflection.ConstructorInfo) { il.EmitNewObject(GetMethodBase(propType, ((System.Reflection.ConstructorInfo)defaultValueCtor).NewWrapper(this.ctx), propertyDeclaringTypeGenInfo)); } else if (defaultValueCtor is System.Reflection.MethodInfo) { if (((System.Reflection.MethodInfo)defaultValueCtor).IsStatic) { il.EmitCall(GetMethodBase(propType, ((System.Reflection.MethodInfo)defaultValueCtor).NewWrapper(this.ctx), propertyDeclaringTypeGenInfo)); } else { throw new InternalException("The default creators contained non-static method for type " + propTypeGDef + "."); } } else { throw new InternalException("Unknown default value creator " + defaultValueCtor + "."); } } else if (propType.IsArray() || IENUMERABLE_GDEF_TYPE.Equals(TypeGenerationUtils.GenericDefinitionIfGArgsHaveGenericParams(propType as CILType))) // || IENUMERABLE_NO_GDEF_TYPE.Equals( propType ) ) { var elementType = propType.IsArray() ? ((CILType)propType).ElementType : /*( IENUMERABLE_NO_GDEF_TYPE.Equals( propType ) ? OBJECT_TYPE :*/ ((CILType)propType).GenericArguments[0] /* )*/; il.EmitLoadInt32(0) .EmitNewArray(TypeGenerationUtils.CreateTypeForEmitting(elementType, propertyDeclaringTypeGenInfo.GenericArguments, null)); } else if (!propType.IsValueType()) { var ctorType = udAttr.ActualType == null ? (CILType)propType : udAttr.ActualType.NewWrapperAsType(this.ctx); var eDefaultValueCtor = ctorType.Constructors.FirstOrDefault(ctor => !ctor.Parameters.Any()); if (eDefaultValueCtor != null) { il.EmitNewObject(GetMethodBase(ctorType, eDefaultValueCtor, propertyDeclaringTypeGenInfo)); } else { throw new NotSupportedException("Tried to use " + USE_DEFAULTS_ATTRIBUTE_TYPE + " on a type (" + ctorType + ") with no parameterless constructor."); } } else { throw new InternalException("Could not emit default value for " + pInfo.GetPropertyType() + "."); } } }