Lines Matching +full:os +full:- +full:manifest +full:- +full:offset

1 //===-- WindowsResource.cpp -------------------------------------*- C++ -*-===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
47 // 8-byte because it makes everyone happy.
106 Reader.getOffset() -
107 sizeof(uint16_t)); // Re-read the bytes which we used to check the flag.
119 if (Prefix->HeaderSize < MIN_HEADER_SIZE)
120 return make_error<GenericBinaryError>(Owner->getFileName() +
132 RETURN_IF_ERROR(Reader.readArray(Data, Prefix->DataSize));
142 void printResourceTypeName(uint16_t TypeID, raw_ostream &OS) {
144 case 1: OS << "CURSOR (ID 1)"; break;
145 case 2: OS << "BITMAP (ID 2)"; break;
146 case 3: OS << "ICON (ID 3)"; break;
147 case 4: OS << "MENU (ID 4)"; break;
148 case 5: OS << "DIALOG (ID 5)"; break;
149 case 6: OS << "STRINGTABLE (ID 6)"; break;
150 case 7: OS << "FONTDIR (ID 7)"; break;
151 case 8: OS << "FONT (ID 8)"; break;
152 case 9: OS << "ACCELERATOR (ID 9)"; break;
153 case 10: OS << "RCDATA (ID 10)"; break;
154 case 11: OS << "MESSAGETABLE (ID 11)"; break;
155 case 12: OS << "GROUP_CURSOR (ID 12)"; break;
156 case 14: OS << "GROUP_ICON (ID 14)"; break;
157 case 16: OS << "VERSIONINFO (ID 16)"; break;
158 case 17: OS << "DLGINCLUDE (ID 17)"; break;
159 case 19: OS << "PLUGPLAY (ID 19)"; break;
160 case 20: OS << "VXD (ID 20)"; break;
161 case 21: OS << "ANICURSOR (ID 21)"; break;
162 case 22: OS << "ANIICON (ID 22)"; break;
163 case 23: OS << "HTML (ID 23)"; break;
164 case 24: OS << "MANIFEST (ID 24)"; break;
165 default: OS << "ID " << TypeID; break;
183 raw_string_ostream OS(Ret);
185 OS << "duplicate resource:";
187 OS << " type ";
192 OS << '\"' << UTF8 << '\"';
194 printResourceTypeName(Entry.getTypeID(), OS);
196 OS << "/name ";
201 OS << '\"' << UTF8 << '\"';
203 OS << "ID " << Entry.getNameID();
206 OS << "/language " << Entry.getLanguage() << ", in " << File1 << " and in "
209 return OS.str();
213 raw_string_ostream &OS, bool IsType, bool IsID) {
218 OS << '\"' << UTF8 << '\"';
220 printResourceTypeName(S.ID, OS);
222 OS << "ID " << S.ID;
224 OS << S.ID;
231 raw_string_ostream OS(Ret);
233 OS << "duplicate resource:";
236 OS << " type ";
237 printStringOrID(Context[0], OS, /* IsType */ true, /* IsID */ true);
241 OS << "/name ";
242 printStringOrID(Context[1], OS, /* IsType */ false, /* IsID */ true);
246 OS << "/language ";
247 printStringOrID(Context[2], OS, /* IsType */ false, /* IsID */ false);
249 OS << ", in " << File1 << " and in " << File2;
251 return OS.str();
256 // manifest with a non-zero language code.
257 // GCC has the concept of a default manifest resource object, which gets
258 // linked in implicitly if present. This default manifest has got language
259 // id zero, and should be dropped silently if there's another manifest present.
260 // If the user resources surprisignly had a manifest with language id zero,
261 // we should also ignore the duplicate default manifest.
268 TreeNode *TypeNode = TypeIt->second.get();
270 TypeNode->IDChildren.find(/* CREATEPROCESS_MANIFEST_RESOURCE_ID */ 1);
271 if (NameIt == TypeNode->IDChildren.end())
274 TreeNode *NameNode = NameIt->second.get();
275 if (NameNode->IDChildren.size() <= 1)
276 return; // None or one manifest present, all good.
278 // If we have more than one manifest, drop the language zero one if present,
280 auto LangZeroIt = NameNode->IDChildren.find(0);
281 if (LangZeroIt != NameNode->IDChildren.end() &&
282 LangZeroIt->second->IsDataNode) {
283 uint32_t RemovedIndex = LangZeroIt->second->DataIndex;
284 NameNode->IDChildren.erase(LangZeroIt);
288 // If we're now down to one manifest, all is good.
289 if (NameNode->IDChildren.size() <= 1)
293 // More than one non-language-zero manifest
294 auto FirstIt = NameNode->IDChildren.begin();
295 uint32_t FirstLang = FirstIt->first;
296 TreeNode *FirstNode = FirstIt->second.get();
297 auto LastIt = NameNode->IDChildren.rbegin();
298 uint32_t LastLang = LastIt->first;
299 TreeNode *LastNode = LastIt->second.get();
301 ("duplicate non-default manifests with languages " + Twine(FirstLang) +
302 " in " + InputFilenames[FirstNode->Origin] + " and " + Twine(LastLang) +
303 " in " + InputFilenames[LastNode->Origin])
307 // Ignore duplicates of manifests with language zero (the default manifest),
308 // in case the user has provided a manifest with that language id. See
330 auto EntryOrErr = WR->getHeadEntry();
348 InputFilenames.push_back(std::string(WR->getFileName()));
357 Entry, InputFilenames[Node->Origin], WR->getFileName()));
375 void WindowsResourceParser::printTree(raw_ostream &OS) const {
376 ScopedPrinter Writer(OS);
401 if (Entry.Offset.isSubDir()) {
442 Context, InputFilenames[Child->Origin], InputFilenames.back()));
518 Result = ElementInserted.first->second.get();
531 return *(Child->second);
547 return *(Child->second);
554 Child.second->print(Writer, Child.first);
557 Child.second->print(Writer, to_string(Child.first));
579 Size += Child.second->getTreeSize();
582 Size += Child.second->getTreeSize();
591 DataIndex--;
594 Child.second->shiftDataIndexDown(Index);
596 Child.second->shiftDataIndexDown(Index);
692 // add size of .rsrc$2 section, which contains all resource data on 8-byte
706 BufferStart = OutputBuffer->getBufferStart();
732 Header->Machine = MachineType;
733 Header->NumberOfSections = 2;
734 Header->TimeDateStamp = TimeDateStamp;
735 Header->PointerToSymbolTable = SymbolTableOffset;
737 Header->NumberOfSymbols = Data.size() + 5;
738 Header->SizeOfOptionalHeader = 0;
739 // cvtres.exe sets 32BIT_MACHINE even for 64-bit machine types. Match it.
740 Header->Characteristics = COFF::IMAGE_FILE_32BIT_MACHINE;
748 coffnamecpy(SectionOneHeader->Name, ".rsrc$01");
749 SectionOneHeader->VirtualSize = 0;
750 SectionOneHeader->VirtualAddress = 0;
751 SectionOneHeader->SizeOfRawData = SectionOneSize;
752 SectionOneHeader->PointerToRawData = SectionOneOffset;
753 SectionOneHeader->PointerToRelocations = SectionOneRelocations;
754 SectionOneHeader->PointerToLinenumbers = 0;
755 SectionOneHeader->NumberOfRelocations = Data.size();
756 SectionOneHeader->NumberOfLinenumbers = 0;
757 SectionOneHeader->Characteristics += COFF::IMAGE_SCN_CNT_INITIALIZED_DATA;
758 SectionOneHeader->Characteristics += COFF::IMAGE_SCN_MEM_READ;
766 coffnamecpy(SectionTwoHeader->Name, ".rsrc$02");
767 SectionTwoHeader->VirtualSize = 0;
768 SectionTwoHeader->VirtualAddress = 0;
769 SectionTwoHeader->SizeOfRawData = SectionTwoSize;
770 SectionTwoHeader->PointerToRawData = SectionTwoOffset;
771 SectionTwoHeader->PointerToRelocations = 0;
772 SectionTwoHeader->PointerToLinenumbers = 0;
773 SectionTwoHeader->NumberOfRelocations = 0;
774 SectionTwoHeader->NumberOfLinenumbers = 0;
775 SectionTwoHeader->Characteristics = COFF::IMAGE_SCN_CNT_INITIALIZED_DATA;
776 SectionTwoHeader->Characteristics += COFF::IMAGE_SCN_MEM_READ;
804 coffnamecpy(Symbol->Name.ShortName, "@feat.00");
805 Symbol->Value = 0x11;
806 Symbol->SectionNumber = 0xffff;
807 Symbol->Type = COFF::IMAGE_SYM_DTYPE_NULL;
808 Symbol->StorageClass = COFF::IMAGE_SYM_CLASS_STATIC;
809 Symbol->NumberOfAuxSymbols = 0;
814 coffnamecpy(Symbol->Name.ShortName, ".rsrc$01");
815 Symbol->Value = 0;
816 Symbol->SectionNumber = 1;
817 Symbol->Type = COFF::IMAGE_SYM_DTYPE_NULL;
818 Symbol->StorageClass = COFF::IMAGE_SYM_CLASS_STATIC;
819 Symbol->NumberOfAuxSymbols = 1;
823 Aux->Length = SectionOneSize;
824 Aux->NumberOfRelocations = Data.size();
825 Aux->NumberOfLinenumbers = 0;
826 Aux->CheckSum = 0;
827 Aux->NumberLowPart = 0;
828 Aux->Selection = 0;
833 coffnamecpy(Symbol->Name.ShortName, ".rsrc$02");
834 Symbol->Value = 0;
835 Symbol->SectionNumber = 2;
836 Symbol->Type = COFF::IMAGE_SYM_DTYPE_NULL;
837 Symbol->StorageClass = COFF::IMAGE_SYM_CLASS_STATIC;
838 Symbol->NumberOfAuxSymbols = 1;
842 Aux->Length = SectionTwoSize;
843 Aux->NumberOfRelocations = 0;
844 Aux->NumberOfLinenumbers = 0;
845 Aux->CheckSum = 0;
846 Aux->NumberLowPart = 0;
847 Aux->Selection = 0;
852 auto RelocationName = formatv("$R{0:X-6}", i & 0xffffff).sstr<COFF::NameSize>();
854 coffnamecpy(Symbol->Name.ShortName, RelocationName);
855 Symbol->Value = DataOffsets[i];
856 Symbol->SectionNumber = 2;
857 Symbol->Type = COFF::IMAGE_SYM_DTYPE_NULL;
858 Symbol->StorageClass = COFF::IMAGE_SYM_CLASS_STATIC;
859 Symbol->NumberOfAuxSymbols = 0;
871 // Traverse parsed resource tree breadth-first and write the corresponding
887 Table->Characteristics = CurrentNode->getCharacteristics();
888 Table->TimeDateStamp = 0;
889 Table->MajorVersion = CurrentNode->getMajorVersion();
890 Table->MinorVersion = CurrentNode->getMinorVersion();
891 auto &IDChildren = CurrentNode->getIDChildren();
892 auto &StringChildren = CurrentNode->getStringChildren();
893 Table->NumberOfNameEntries = StringChildren.size();
894 Table->NumberOfIDEntries = IDChildren.size();
902 Entry->Identifier.setNameOffset(
903 StringTableOffsets[Child.second->getStringIndex()]);
904 if (Child.second->checkIsDataNode()) {
905 Entry->Offset.DataEntryOffset = NextLevelOffset;
909 Entry->Offset.SubdirOffset = NextLevelOffset + (1 << 31);
911 (Child.second->getStringChildren().size() +
912 Child.second->getIDChildren().size()) *
922 Entry->Identifier.ID = Child.first;
923 if (Child.second->checkIsDataNode()) {
924 Entry->Offset.DataEntryOffset = NextLevelOffset;
928 Entry->Offset.SubdirOffset = NextLevelOffset + (1 << 31);
930 (Child.second->getStringChildren().size() +
931 Child.second->getIDChildren().size()) *
945 RelocationAddresses[DataNodes->getDataIndex()] = CurrentRelativeOffset;
946 Entry->DataRVA = 0; // Set to zero because it is a relocation.
947 Entry->DataSize = Data[DataNodes->getDataIndex()].size();
948 Entry->Codepage = 0;
949 Entry->Reserved = 0;
968 alignTo(TotalStringTableSize, sizeof(uint32_t)) - TotalStringTableSize;
980 Reloc->VirtualAddress = RelocationAddresses[i];
981 Reloc->SymbolTableIndex = NextSymbolIndex++;
984 Reloc->Type = COFF::IMAGE_REL_ARM_ADDR32NB;
987 Reloc->Type = COFF::IMAGE_REL_AMD64_ADDR32NB;
990 Reloc->Type = COFF::IMAGE_REL_I386_DIR32NB;
993 Reloc->Type = COFF::IMAGE_REL_ARM64_ADDR32NB;