public DotNetHeadersImpl(PeHeaders peHeaders, DotNetCor20Data cor20, DotNetMetadataHeaders metadataHeaders, VirtualArrayData <ByteData> strongNameSignature, DotNetMethodProvider methodProvider, DotNetResourceProvider resourceProvider) { if (peHeaders == null) { throw new ArgumentNullException(nameof(peHeaders)); } if (cor20 == null) { throw new ArgumentNullException(nameof(cor20)); } if (methodProvider == null) { throw new ArgumentNullException(nameof(methodProvider)); } if (resourceProvider == null) { throw new ArgumentNullException(nameof(resourceProvider)); } PeHeaders = peHeaders; Cor20 = cor20; MetadataHeaders = metadataHeaders; StrongNameSignature = strongNameSignature; MethodProvider = methodProvider; ResourceProvider = resourceProvider; }
HexSpan?GetFieldReferenceSpan(HexBufferFile file, DotNetCor20Data cor20, HexPosition position) { HexSpan?span; if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.Metadata.Data, position)) != null) { return(span); } if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.Resources.Data, position)) != null) { return(span); } if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.StrongNameSignature.Data, position)) != null) { return(span); } if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.CodeManagerTable.Data, position)) != null) { return(span); } if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.VTableFixups.Data, position)) != null) { return(span); } if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.ExportAddressTableJumps.Data, position)) != null) { return(span); } if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.ManagedNativeHeader.Data, position)) != null) { return(span); } if (cor20.EntryPointTokenOrRVA.Data.Span.Span.Contains(position)) { uint value = cor20.EntryPointTokenOrRVA.Data.ReadValue(); if (value == 0) { return(null); } if ((cor20.Flags.Data.ReadValue() & 0x10) != 0) { var peHeaders = file.GetHeaders <PeHeaders>(); if (peHeaders == null) { return(null); } return(new HexSpan(peHeaders.RvaToBufferPosition(value), 0)); } else { return(TryGetTokenSpan(file, value)); } } return(null); }
public override bool Initialize() { HexSpan?resourcesSpan = null; var peHeaders = file.GetHeaders <PeHeaders>(); if (peHeaders != null) { if (peHeaders.OptionalHeader.DataDirectory.Data.FieldCount < 15) { return(false); } var cor20Span = Read(peHeaders, peHeaders.OptionalHeader.DataDirectory.Data[14].Data); if (cor20Span == null) { return(false); } cor20 = DotNetCor20DataImpl.TryCreate(file, cor20Span.Value.Start); if (cor20 == null) { return(false); } var mdSpan = Read(peHeaders, cor20.MetaData.Data); resourcesSpan = Read(peHeaders, cor20.Resources.Data); var snSpan = Read(peHeaders, cor20.StrongNameSignature.Data); ReadDotNetMetadataHeader(peHeaders, mdSpan); ReadStrongNameSignature(peHeaders, snSpan); } else { // Could be a portable PDB file (or a metadata only file) ReadDotNetMetadataHeader(file.Span); } if (mdHeader != null && dotNetHeaps != null) { dotNetMetadataHeaders = new DotNetMetadataHeadersImpl(metadataSpan, mdHeader, dotNetHeaps); } if (peHeaders != null && cor20 != null) { dotNetMethodProvider = new DotNetMethodProviderImpl(file, peHeaders, dotNetMetadataHeaders?.TablesStream); dotNetResourceProvider = new DotNetResourceProviderImpl(file, peHeaders, dotNetMetadataHeaders, resourcesSpan); dotNetHeaders = new DotNetHeadersImpl(peHeaders, cor20, dotNetMetadataHeaders, strongNameSignature, dotNetMethodProvider, dotNetResourceProvider); } return(cor20 != null || !metadataSpan.IsEmpty); }
public ImageCor20HeaderVM(HexBuffer buffer, DotNetCor20Data cor20) : base(cor20.Span) { Name = cor20.Name; CbVM = new UInt32HexField(cor20.Cb); MajorRuntimeVersionVM = new UInt16HexField(cor20.MajorRuntimeVersion, true); MinorRuntimeVersionVM = new UInt16HexField(cor20.MinorRuntimeVersion, true); MetaDataVM = new DataDirectoryVM(cor20.MetaData); FlagsVM = new UInt32FlagsHexField(cor20.Flags); FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_IL_Only, 0)); FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_32BitReqd, 1)); FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_ILLibrary, 2)); FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_StrongNameSigned, 3)); FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_NativeEntryPoint, 4)); FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_TrackDebugData, 16)); FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_32BitPref, 17)); EntryPointTokenRVAVM = new UInt32HexField(cor20.EntryPointTokenOrRVA); ResourcesVM = new DataDirectoryVM(cor20.Resources); StrongNameSignatureVM = new DataDirectoryVM(cor20.StrongNameSignature); CodeManagerTableVM = new DataDirectoryVM(cor20.CodeManagerTable); VTableFixupsVM = new DataDirectoryVM(cor20.VTableFixups); ExportAddressTableJumpsVM = new DataDirectoryVM(cor20.ExportAddressTableJumps); ManagedNativeHeaderVM = new DataDirectoryVM(cor20.ManagedNativeHeader); hexFields = new HexField[] { CbVM, MajorRuntimeVersionVM, MinorRuntimeVersionVM, MetaDataVM.RVAVM, MetaDataVM.SizeVM, FlagsVM, EntryPointTokenRVAVM, ResourcesVM.RVAVM, ResourcesVM.SizeVM, StrongNameSignatureVM.RVAVM, StrongNameSignatureVM.SizeVM, CodeManagerTableVM.RVAVM, CodeManagerTableVM.SizeVM, VTableFixupsVM.RVAVM, VTableFixupsVM.SizeVM, ExportAddressTableJumpsVM.RVAVM, ExportAddressTableJumpsVM.SizeVM, ManagedNativeHeaderVM.RVAVM, ManagedNativeHeaderVM.SizeVM, }; }