(path string, data []byte, options ...Option)
| 249 | } |
| 250 | |
| 251 | func parse(path string, data []byte, options ...Option) (*PE, error) { |
| 252 | var opts opts |
| 253 | for _, opt := range options { |
| 254 | opt(&opts) |
| 255 | } |
| 256 | if opts.isImageExcluded(path) { |
| 257 | return nil, nil |
| 258 | } |
| 259 | var pe *peparser.File |
| 260 | var err error |
| 261 | if data == nil { |
| 262 | pe, err = peparser.New(path, newParserOpts(opts)) |
| 263 | } else { |
| 264 | pe, err = peparser.NewBytes(data, newParserOpts(opts)) |
| 265 | } |
| 266 | if err != nil { |
| 267 | return nil, err |
| 268 | } |
| 269 | defer pe.Close() |
| 270 | |
| 271 | // parse the DOS header |
| 272 | err = pe.ParseDOSHeader() |
| 273 | if err != nil { |
| 274 | return nil, err |
| 275 | } |
| 276 | |
| 277 | // parse the NT header |
| 278 | err = pe.ParseNTHeader() |
| 279 | if err != nil { |
| 280 | return nil, err |
| 281 | } |
| 282 | |
| 283 | timestamp := pe.NtHeader.FileHeader.TimeDateStamp |
| 284 | linkTime := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC).Add(time.Second * time.Duration(timestamp)) |
| 285 | p := &PE{ |
| 286 | NumberOfSections: pe.NtHeader.FileHeader.NumberOfSections, |
| 287 | LinkTime: linkTime, |
| 288 | Symbols: make([]string, 0), |
| 289 | Imports: make([]string, 0), |
| 290 | Sections: make([]Sec, 0), |
| 291 | Exports: make(map[uint32]string, 0), |
| 292 | VersionResources: make(map[string]string), |
| 293 | Is64: pe.Is64, |
| 294 | filename: path, |
| 295 | dosHeader: pe.DOSHeader, |
| 296 | ntHeader: pe.NtHeader, |
| 297 | sectionHeaders: make([]peparser.ImageSectionHeader, 0), |
| 298 | } |
| 299 | |
| 300 | switch pe.Is64 { |
| 301 | case true: |
| 302 | oh64 := pe.NtHeader.OptionalHeader.(peparser.ImageOptionalHeader64) |
| 303 | p.ImageBase = format.UintToHex(oh64.ImageBase) |
| 304 | p.EntryPoint = format.UintToHex(uint64(oh64.AddressOfEntryPoint)) |
| 305 | case false: |
| 306 | oh32 := pe.NtHeader.OptionalHeader.(peparser.ImageOptionalHeader32) |
| 307 | p.ImageBase = format.UintToHex(uint64(oh32.ImageBase)) |
| 308 | p.EntryPoint = format.UintToHex(uint64(oh32.AddressOfEntryPoint)) |
no test coverage detected