void DelayLoadContents::create(Defined *H) { Helper = H; std::map<StringRef, std::vector<DefinedImportData *>> Map = binImports(Imports); // Create .didat contents for each DLL. for (auto &P : Map) { StringRef Name = P.first; std::vector<DefinedImportData *> &Syms = P.second; // Create the delay import table header. if (!DLLNames.count(Name)) DLLNames[Name] = make_unique<StringChunk>(Name); auto Dir = make_unique<DelayDirectoryChunk>(DLLNames[Name].get()); size_t Base = Addresses.size(); for (DefinedImportData *S : Syms) { auto T = make_unique<ThunkChunk>(S, Dir.get(), Helper); auto A = make_unique<DelayAddressChunk>(T.get()); Addresses.push_back(std::move(A)); Thunks.push_back(std::move(T)); StringRef ExtName = S->getExternalName(); if (ExtName.empty()) { Names.push_back(make_unique<OrdinalOnlyChunk>(S->getOrdinal())); } else { auto C = make_unique<HintNameChunk>(ExtName, 0); Names.push_back(make_unique<LookupChunk>(C.get())); HintNames.push_back(std::move(C)); } } // Terminate with null values. Addresses.push_back(make_unique<NullChunk>(8)); Names.push_back(make_unique<NullChunk>(8)); for (int I = 0, E = Syms.size(); I < E; ++I) Syms[I]->setLocation(Addresses[Base + I].get()); auto *MH = new NullChunk(8); MH->setAlign(8); ModuleHandles.push_back(std::unique_ptr<Chunk>(MH)); // Fill the delay import table header fields. Dir->ModuleHandle = MH; Dir->AddressTab = Addresses[Base].get(); Dir->NameTab = Names[Base].get(); Dirs.push_back(std::move(Dir)); } // Add null terminator. Dirs.push_back( make_unique<NullChunk>(sizeof(delay_import_directory_table_entry))); }
void DelayLoadContents::create(Defined *H) { Helper = H; std::vector<std::vector<DefinedImportData *>> V = binImports(Imports); // Create .didat contents for each DLL. for (std::vector<DefinedImportData *> &Syms : V) { // Create the delay import table header. DLLNames.push_back(make<StringChunk>(Syms[0]->getDLLName())); auto *Dir = make<DelayDirectoryChunk>(DLLNames.back()); size_t Base = Addresses.size(); for (DefinedImportData *S : Syms) { Chunk *T = newThunkChunk(S, Dir); auto *A = make<DelayAddressChunk>(T); Addresses.push_back(A); Thunks.push_back(T); StringRef ExtName = S->getExternalName(); if (ExtName.empty()) { Names.push_back(make<OrdinalOnlyChunk>(S->getOrdinal())); } else { auto *C = make<HintNameChunk>(ExtName, 0); Names.push_back(make<LookupChunk>(C)); HintNames.push_back(C); } } // Terminate with null values. Addresses.push_back(make<NullChunk>(8)); Names.push_back(make<NullChunk>(8)); for (int I = 0, E = Syms.size(); I < E; ++I) Syms[I]->setLocation(Addresses[Base + I]); auto *MH = make<NullChunk>(8); MH->Alignment = 8; ModuleHandles.push_back(MH); // Fill the delay import table header fields. Dir->ModuleHandle = MH; Dir->AddressTab = Addresses[Base]; Dir->NameTab = Names[Base]; Dirs.push_back(Dir); } // Add null terminator. Dirs.push_back(make<NullChunk>(sizeof(delay_import_directory_table_entry))); }
void IdataContents::create() { std::map<StringRef, std::vector<DefinedImportData *>> Map = binImports(Imports); // Create .idata contents for each DLL. for (auto &P : Map) { StringRef Name = P.first; std::vector<DefinedImportData *> &Syms = P.second; // Create lookup and address tables. If they have external names, // we need to create HintName chunks to store the names. // If they don't (if they are import-by-ordinals), we store only // ordinal values to the table. size_t Base = Lookups.size(); for (DefinedImportData *S : Syms) { uint16_t Ord = S->getOrdinal(); if (S->getExternalName().empty()) { Lookups.push_back(make_unique<OrdinalOnlyChunk>(Ord)); Addresses.push_back(make_unique<OrdinalOnlyChunk>(Ord)); continue; } auto C = make_unique<HintNameChunk>(S->getExternalName(), Ord); Lookups.push_back(make_unique<LookupChunk>(C.get())); Addresses.push_back(make_unique<LookupChunk>(C.get())); Hints.push_back(std::move(C)); } // Terminate with null values. Lookups.push_back(make_unique<NullChunk>(ptrSize())); Addresses.push_back(make_unique<NullChunk>(ptrSize())); for (int I = 0, E = Syms.size(); I < E; ++I) Syms[I]->setLocation(Addresses[Base + I].get()); // Create the import table header. if (!DLLNames.count(Name)) DLLNames[Name] = make_unique<StringChunk>(Name); auto Dir = make_unique<ImportDirectoryChunk>(DLLNames[Name].get()); Dir->LookupTab = Lookups[Base].get(); Dir->AddressTab = Addresses[Base].get(); Dirs.push_back(std::move(Dir)); } // Add null terminator. Dirs.push_back(make_unique<NullChunk>(sizeof(ImportDirectoryTableEntry))); }
void IdataContents::create() { std::vector<std::vector<DefinedImportData *>> V = binImports(Imports); // Create .idata contents for each DLL. for (std::vector<DefinedImportData *> &Syms : V) { // Create lookup and address tables. If they have external names, // we need to create HintName chunks to store the names. // If they don't (if they are import-by-ordinals), we store only // ordinal values to the table. size_t Base = Lookups.size(); for (DefinedImportData *S : Syms) { uint16_t Ord = S->getOrdinal(); if (S->getExternalName().empty()) { Lookups.push_back(make<OrdinalOnlyChunk>(Ord)); Addresses.push_back(make<OrdinalOnlyChunk>(Ord)); continue; } auto *C = make<HintNameChunk>(S->getExternalName(), Ord); Lookups.push_back(make<LookupChunk>(C)); Addresses.push_back(make<LookupChunk>(C)); Hints.push_back(C); } // Terminate with null values. Lookups.push_back(make<NullChunk>(Config->Wordsize)); Addresses.push_back(make<NullChunk>(Config->Wordsize)); for (int I = 0, E = Syms.size(); I < E; ++I) Syms[I]->setLocation(Addresses[Base + I]); // Create the import table header. DLLNames.push_back(make<StringChunk>(Syms[0]->getDLLName())); auto *Dir = make<ImportDirectoryChunk>(DLLNames.back()); Dir->LookupTab = Lookups[Base]; Dir->AddressTab = Addresses[Base]; Dirs.push_back(Dir); } // Add null terminator. Dirs.push_back(make<NullChunk>(sizeof(ImportDirectoryTableEntry))); }