github.com/anchore/syft@v1.38.2/syft/pkg/cataloger/binary/pe_package_cataloger.go (about) 1 package binary 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/anchore/syft/internal/unknown" 8 "github.com/anchore/syft/syft/artifact" 9 "github.com/anchore/syft/syft/file" 10 "github.com/anchore/syft/syft/pkg" 11 "github.com/anchore/syft/syft/pkg/cataloger/generic" 12 "github.com/anchore/syft/syft/pkg/cataloger/internal/pe" 13 ) 14 15 // NewPEPackageCataloger returns a cataloger that interprets packages from DLL and EXE files. 16 func NewPEPackageCataloger() pkg.Cataloger { 17 return generic.NewCataloger("pe-binary-package-cataloger"). 18 WithParserByGlobs(parsePE, "**/*.dll", "**/*.exe") 19 } 20 21 func parsePE(_ context.Context, _ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) { 22 f, err := pe.Read(reader) 23 if err != nil { 24 return nil, nil, fmt.Errorf("failed to parse PE file %q: %w", reader.RealPath, err) 25 } 26 27 if f == nil { 28 return nil, nil, unknown.Newf(reader, "unable to determine packages") 29 } 30 31 if f.CLR.HasEvidenceOfCLR() { 32 // this is for a .NET application, which is covered by other catalogers already 33 return nil, nil, nil 34 } 35 36 p := newPEPackage(f.VersionResources, f.Location) 37 38 return []pkg.Package{p}, nil, nil 39 }