private static IEnumerable <NdrProcedureDefinition> ReadProcs(IMemoryReader reader, MIDL_SERVER_INFO server_info, int start_offset, int dispatch_count, NdrTypeCache type_cache, ISymbolResolver symbol_resolver, IList <string> names, NdrParserFlags parser_flags, IntPtr base_address) { RPC_SYNTAX_IDENTIFIER transfer_syntax = server_info.GetTransferSyntax(reader); IntPtr proc_str = IntPtr.Zero; IntPtr fmt_str_ofs = IntPtr.Zero; if (transfer_syntax.SyntaxGUID != NdrNativeUtils.DCE_TransferSyntax) { MIDL_SYNTAX_INFO[] syntax_info = server_info.GetSyntaxInfo(reader); if (!syntax_info.Any(s => s.TransferSyntax.SyntaxGUID == NdrNativeUtils.DCE_TransferSyntax)) { throw new NdrParserException("Can't parse NDR64 syntax data"); } MIDL_SYNTAX_INFO dce_syntax_info = syntax_info.First(s => s.TransferSyntax.SyntaxGUID == NdrNativeUtils.DCE_TransferSyntax); proc_str = dce_syntax_info.ProcString; fmt_str_ofs = dce_syntax_info.FmtStringOffset; } else { proc_str = server_info.ProcString; fmt_str_ofs = server_info.FmtStringOffset; } IntPtr[] dispatch_funcs = server_info.GetDispatchTable(reader, dispatch_count); MIDL_STUB_DESC stub_desc = server_info.GetStubDesc(reader); IntPtr type_desc = stub_desc.pFormatTypes; NDR_EXPR_DESC expr_desc = stub_desc.GetExprDesc(reader); List <NdrProcedureDefinition> procs = new List <NdrProcedureDefinition>(); if (fmt_str_ofs != IntPtr.Zero) { for (int i = start_offset; i < dispatch_count; ++i) { int fmt_ofs = reader.ReadInt16(fmt_str_ofs + i * 2); if (fmt_ofs >= 0) { string name = null; if (names != null) { name = names[i - start_offset]; } procs.Add(new NdrProcedureDefinition(reader, type_cache, symbol_resolver, stub_desc, proc_str + fmt_ofs, type_desc, expr_desc, dispatch_funcs[i], base_address, name, parser_flags)); } } } FixupStructureNames(procs, symbol_resolver, parser_flags); return(procs.AsReadOnly()); }
private void ReadTypes(IntPtr midl_type_pickling_info_ptr, IntPtr midl_stub_desc_ptr, IEnumerable <int> fmt_offsets) { if (midl_type_pickling_info_ptr == IntPtr.Zero) { throw new ArgumentException("Must specify the MIDL_TYPE_PICKLING_INFO pointer"); } if (midl_stub_desc_ptr == IntPtr.Zero) { throw new ArgumentException("Must specify the MIDL_STUB_DESC pointer"); } var pickle_info = _reader.ReadStruct <MIDL_TYPE_PICKLING_INFO>(midl_type_pickling_info_ptr); if (pickle_info.Version != 0x33205054) { throw new ArgumentException($"Unsupported picking type version {pickle_info.Version:X}"); } var flags = pickle_info.Flags.HasFlag(MidlTypePicklingInfoFlags.NewCorrDesc) ? NdrInterpreterOptFlags2.HasNewCorrDesc : 0; MIDL_STUB_DESC stub_desc = _reader.ReadStruct <MIDL_STUB_DESC>(midl_stub_desc_ptr); NdrParseContext context = new NdrParseContext(_type_cache, null, stub_desc, stub_desc.pFormatTypes, stub_desc.GetExprDesc(_reader), flags, _reader, NdrParserFlags.IgnoreUserMarshal); foreach (var i in fmt_offsets) { NdrBaseTypeReference.Read(context, i); } }