1 //===-- WindowsResourceDumper.cpp - Windows Resource printer --------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the Windows resource (.res) dumper for llvm-readobj. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "WindowsResourceDumper.h" 15 #include "Error.h" 16 #include "llvm/Object/WindowsResource.h" 17 #include "llvm/Support/ConvertUTF.h" 18 #include "llvm/Support/ScopedPrinter.h" 19 20 namespace llvm { 21 namespace object { 22 namespace WindowsRes { 23 24 std::string stripUTF16(const ArrayRef<UTF16> &UTF16Str) { 25 std::string Result; 26 Result.reserve(UTF16Str.size()); 27 28 for (UTF16 Ch : UTF16Str) { 29 // UTF16Str will have swapped byte order in case of big-endian machines. 30 // Swap it back in such a case. 31 uint16_t ChValue = support::endian::byte_swap(Ch, support::little); 32 if (ChValue <= 0xFF) 33 Result += ChValue; 34 else 35 Result += '?'; 36 } 37 return Result; 38 } 39 40 Error Dumper::printData() { 41 auto EntryPtrOrErr = WinRes->getHeadEntry(); 42 if (!EntryPtrOrErr) 43 return EntryPtrOrErr.takeError(); 44 auto EntryPtr = *EntryPtrOrErr; 45 46 bool IsEnd = false; 47 while (!IsEnd) { 48 printEntry(EntryPtr); 49 50 if (auto Err = EntryPtr.moveNext(IsEnd)) 51 return Err; 52 } 53 return Error::success(); 54 } 55 56 void Dumper::printEntry(const ResourceEntryRef &Ref) { 57 if (Ref.checkTypeString()) { 58 auto NarrowStr = stripUTF16(Ref.getTypeString()); 59 SW.printString("Resource type (string)", NarrowStr); 60 } else 61 SW.printNumber("Resource type (int)", Ref.getTypeID()); 62 63 if (Ref.checkNameString()) { 64 auto NarrowStr = stripUTF16(Ref.getNameString()); 65 SW.printString("Resource name (string)", NarrowStr); 66 } else 67 SW.printNumber("Resource name (int)", Ref.getNameID()); 68 69 SW.printNumber("Data version", Ref.getDataVersion()); 70 SW.printHex("Memory flags", Ref.getMemoryFlags()); 71 SW.printNumber("Language ID", Ref.getLanguage()); 72 SW.printNumber("Version (major)", Ref.getMajorVersion()); 73 SW.printNumber("Version (minor)", Ref.getMinorVersion()); 74 SW.printNumber("Characteristics", Ref.getCharacteristics()); 75 SW.printNumber("Data size", (uint64_t)Ref.getData().size()); 76 SW.printBinary("Data:", Ref.getData()); 77 SW.startLine() << "\n"; 78 } 79 80 } // namespace WindowsRes 81 } // namespace object 82 } // namespace llvm 83