private static NdrBaseTypeReference FixupUserMarshal(NdrParseContext context, NdrUserMarshalTypeReference type)
        {
            if (context.StubDesc.aUserMarshalQuadruple == IntPtr.Zero)
            {
                return(type);
            }

            IntPtr marshal_ptr = context.Reader.ReadIntPtr(context.StubDesc.aUserMarshalQuadruple
                                                           + (type.QuadrupleIndex * context.Reader.PointerSize * 4));

            // If in process try and read out known type by walking pointers.
            if (context.Reader.InProcess && !context.HasFlag(NdrParserFlags.IgnoreUserMarshal))
            {
                using (var module = SafeLoadLibraryHandle.GetModuleHandle(context.StubDesc.aUserMarshalQuadruple))
                {
                    if (module == null)
                    {
                        return(type);
                    }

                    if (m_marshalers == null)
                    {
                        m_marshalers = new StandardUserMarshalers();
                    }

                    NdrKnownTypes known_type = m_marshalers.GetKnownType(marshal_ptr);
                    if (known_type == NdrKnownTypes.None)
                    {
                        IntPtr usersize_ptr = GetTargetAddress(module, marshal_ptr);
                        known_type = m_marshalers.GetKnownType(usersize_ptr);
                    }

                    if (known_type != NdrKnownTypes.None)
                    {
                        return(new NdrKnownTypeReference(known_type));
                    }
                }
            }

            // If we have a symbol resolver then see if we can get it from the symbol name.
            if (context.SymbolResolver != null)
            {
                string name  = context.SymbolResolver.GetSymbolForAddress(marshal_ptr);
                int    index = name.IndexOf("_UserSize", StringComparison.OrdinalIgnoreCase);
                if (index > 0)
                {
                    name = name.Substring(0, index);
                    if (Enum.TryParse(name.Substring(0, index), true, out NdrKnownTypes known_type) &&
                        known_type != NdrKnownTypes.None)
                    {
                        return(new NdrKnownTypeReference(known_type));
                    }
                    return(new NdrNamedTypeReference(name));
                }
            }

            return(type);
        }
Example #2
0
 public StandardUserMarshaler(SafeLoadLibraryHandle lib, NdrKnownTypes known_type)
 {
     _size_ptr    = lib.GetProcAddress(string.Format("{0}_UserSize", known_type));
     _size_64_ptr = lib.GetProcAddress(string.Format("{0}_UserSize64", known_type));
     KnownType    = known_type;
 }
 public StandardUserMarshaler(SafeLoadLibraryHandle lib, NdrKnownTypes known_type)
 {
     _size_ptr    = lib.GetProcAddress($"{known_type}_UserSize");
     _size_64_ptr = lib.GetProcAddress($"{known_type}_UserSize64");
     KnownType    = known_type;
 }
 public NdrKnownTypeReference(NdrKnownTypes type)
     : base(NdrFormatCharacter.FC_USER_MARSHAL)
 {
     KnownType = type;
 }