func (loader *PELoader) Load(ws *workspace.Workspace) (*workspace.LoadedModule, error) { var imageBase AS.VA var addressOfEntryPoint AS.RVA var dataDirectory [16]pe.DataDirectory if optionalHeader, ok := loader.file.OptionalHeader.(*pe.OptionalHeader32); ok { imageBase = AS.VA(optionalHeader.ImageBase) addressOfEntryPoint = AS.RVA(optionalHeader.AddressOfEntryPoint) dataDirectory = optionalHeader.DataDirectory } else { return nil, workspace.InvalidModeError } mod := &workspace.LoadedModule{ Name: loader.name, BaseAddress: imageBase, EntryPoint: addressOfEntryPoint.VA(imageBase), Imports: map[AS.RVA]workspace.LinkedSymbol{}, ExportsByName: map[string]workspace.ExportedSymbol{}, ExportsByOrdinal: map[uint16]workspace.ExportedSymbol{}, } for _, section := range loader.file.Sections { e := loader.loadPESection(ws, mod, section) check(e) } e := loader.resolveImports(ws, mod, dataDirectory) check(e) e = loader.resolveExports(ws, mod, dataDirectory) check(e) e = ws.AddLoadedModule(mod) check(e) return mod, nil }
func (m LoadedModule) VA(rva AS.RVA) AS.VA { return rva.VA(m.BaseAddress) }