Example #1
0
		string ReadUTF8String() {
			byte b = reader.ReadByte();
			if (b == 0xFF)
				return null;
			uint len = reader.ReadCompressedUInt32(b);
			if (len == 0)
				return string.Empty;
			return Encoding.UTF8.GetString(reader.ReadBytes((int)len));
		}
        // Reads the new (.NET 2.0+) DeclSecurity blob format
        DmdCustomAttributeData[] ReadBinaryFormat(SecurityAction action)
        {
            int numAttrs = (int)reader.ReadCompressedUInt32();

            DmdCustomAttributeData[]? res = new DmdCustomAttributeData[numAttrs];

            IList <DmdType>?genericTypeArguments = null;
            int             w = 0;

            for (int i = 0; i < numAttrs; i++)
            {
                var name = ReadUTF8String();
                var type = DmdTypeNameParser.ParseThrow(module, name ?? string.Empty, genericTypeArguments);
                reader.ReadCompressedUInt32();                // int blobLength
                int numNamedArgs = (int)reader.ReadCompressedUInt32();
                var namedArgs    = DmdCustomAttributeReader.ReadNamedArguments(module, reader, type, numNamedArgs, genericTypeArguments);
                if (namedArgs is null)
                {
                    throw new IOException();
                }
                var(ctor, ctorArguments) = GetConstructor(type, action);
                Debug.Assert(!(ctor is null));
                if (ctor is null)
                {
                    continue;
                }
                res[w++] = new DmdCustomAttributeData(ctor, ctorArguments, namedArgs, isPseudoCustomAttribute: false);
            }
            if (res.Length != w)
            {
                if (w == 0)
                {
                    return(Array.Empty <DmdCustomAttributeData>());
                }
                Array.Resize(ref res, w);
            }

            return(res !);
        }
Example #3
0
        string ReadUTF8String()
        {
            byte b = reader.ReadByte();

            if (b == 0xFF)
            {
                return(null);
            }
            uint len = reader.ReadCompressedUInt32(b);

            if (len == 0)
            {
                return(string.Empty);
            }
            return(Encoding.UTF8.GetString(reader.ReadBytes((int)len)));
        }
Example #4
0
        DmdMarshalType Read()
        {
            const int DEFAULT = 0;

            try {
                var           nativeType = (UnmanagedType)reader.ReadByte();
                UnmanagedType nt;
                int           size;
                switch (nativeType)
                {
                case UnmanagedType.ByValTStr:
                    size = CanRead ? (int)reader.ReadCompressedUInt32() : DEFAULT;
                    return(DmdMarshalType.CreateFixedSysString(size));

                case UnmanagedType.SafeArray:
                    var vt      = CanRead ? (VarEnum)reader.ReadCompressedUInt32() : DEFAULT;
                    var udtName = CanRead ? ReadUTF8String() : null;
                    var udtRef  = udtName == null ? null : DmdTypeNameParser.Parse(module, udtName, genericTypeArguments);
                    return(DmdMarshalType.CreateSafeArray(vt, udtRef));

                case UnmanagedType.ByValArray:
                    size = CanRead ? (int)reader.ReadCompressedUInt32() : DEFAULT;
                    nt   = CanRead ? (UnmanagedType)reader.ReadCompressedUInt32() : DEFAULT;
                    return(DmdMarshalType.CreateFixedArray(size, nt));

                case UnmanagedType.LPArray:
                    nt = CanRead ? (UnmanagedType)reader.ReadCompressedUInt32() : DEFAULT;
                    int paramNum = CanRead ? (int)reader.ReadCompressedUInt32() : DEFAULT;
                    size = CanRead ? (int)reader.ReadCompressedUInt32() : DEFAULT;
                    bool      hasFlags = CanRead;
                    int       flags    = hasFlags ? (int)reader.ReadCompressedUInt32() : DEFAULT;
                    const int ntaSizeParamIndexSpecified = 1;
                    if (hasFlags && (flags & ntaSizeParamIndexSpecified) == 0)
                    {
                        paramNum = 0;
                    }
                    return(DmdMarshalType.CreateArray(nt, (short)paramNum, size));

                case UnmanagedType.CustomMarshaler:
                    var guid              = ReadUTF8String();
                    var nativeTypeName    = ReadUTF8String();
                    var custMarshalerName = ReadUTF8String();
                    var cmRef             = DmdTypeNameParser.Parse(module, custMarshalerName, genericTypeArguments);
                    var cookie            = ReadUTF8String();
                    return(DmdMarshalType.CreateCustomMarshaler(custMarshalerName, cmRef, cookie));

                case UnmanagedType.IUnknown:
                case UnmanagedType.IDispatch:
                case UnmanagedType.Interface:
                    int iidParamIndex = CanRead ? (int)reader.ReadCompressedUInt32() : DEFAULT;
                    return(DmdMarshalType.CreateInterface(nativeType, iidParamIndex));

                default:
                    return(DmdMarshalType.Create(nativeType));
                }
            }
            catch (ArgumentException) {
            }
            catch (IOException) {
            }
            return(null);
        }