/// <summary> /// Reads a marshal descriptor signature from the provided input stream. /// </summary> /// <param name="parentModule">The module that defines the marshal descriptor</param> /// <param name="reader">The input stream.</param> /// <returns>The marshal descriptor.</returns> public static MarshalDescriptor FromReader(ModuleDefinition parentModule, ref BinaryStreamReader reader) { var nativeType = (NativeType)reader.ReadByte(); MarshalDescriptor descriptor = nativeType switch { NativeType.SafeArray => SafeArrayMarshalDescriptor.FromReader(parentModule, ref reader), NativeType.FixedArray => FixedArrayMarshalDescriptor.FromReader(ref reader), NativeType.LPArray => LPArrayMarshalDescriptor.FromReader(ref reader), NativeType.CustomMarshaller => CustomMarshalDescriptor.FromReader(parentModule, ref reader), NativeType.FixedSysString => FixedSysStringMarshalDescriptor.FromReader(ref reader), NativeType.Interface => ComInterfaceMarshalDescriptor.FromReader(nativeType, ref reader), NativeType.IDispatch => ComInterfaceMarshalDescriptor.FromReader(nativeType, ref reader), NativeType.IUnknown => ComInterfaceMarshalDescriptor.FromReader(nativeType, ref reader), _ => new SimpleMarshalDescriptor(nativeType) }; descriptor.ExtraData = reader.ReadToEnd(); return(descriptor); }
/// <summary> /// Reads a single array marshal descriptor at the current position of the binary stream reader. /// </summary> /// <param name="reader">The reader to use.</param> /// <returns>The read array descriptor.</returns> /// <remarks> /// This method assumes the native type has already been read from the binary stream reader. /// </remarks> public static LPArrayMarshalDescriptor FromReader(ref BinaryStreamReader reader) { var descriptor = new LPArrayMarshalDescriptor((NativeType)reader.ReadByte()); if (!reader.TryReadCompressedUInt32(out uint value)) { return(descriptor); } descriptor.ParameterIndex = (int)value; if (!reader.TryReadCompressedUInt32(out value)) { return(descriptor); } descriptor.NumberOfElements = (int)value; if (!reader.TryReadCompressedUInt32(out value)) { return(descriptor); } descriptor.Flags = (LPArrayFlags)value; return(descriptor); }