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); }
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; }