LIEF: Library to Instrument Executable Formats Version 0.17.0
Loading...
Searching...
No Matches
ResourceVersion.hpp
Go to the documentation of this file.
1/* Copyright 2017 - 2025 R. Thomas
2 * Copyright 2017 - 2025 Quarkslab
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#ifndef LIEF_PE_RESOURCE_VERSION_H
17#define LIEF_PE_RESOURCE_VERSION_H
18#include <ostream>
19
20#include "LIEF/visibility.h"
21#include "LIEF/Object.hpp"
22#include "LIEF/errors.hpp"
23#include "LIEF/optional.hpp"
24
27
28namespace LIEF {
29class BinaryStream;
30
31namespace PE {
32class ResourceData;
33class LIEF_API ResourceVersion : public Object {
38 public:
39 static result<ResourceVersion> parse(const ResourceData& node);
40 static result<ResourceVersion> parse(const uint8_t* p, size_t sz);
41 static result<ResourceVersion> parse(BinaryStream& stream);
42 struct fixed_file_info_t {
46 enum class VERSION_OS : uint32_t { UNKNOWN = 0x00000000,
49 DOS = 0x00010000,
52 OS216 = 0x00020000,
55 OS232 = 0x00030000,
58 NT = 0x00040000,
61 WINCE = 0x00050000,
64 WINDOWS16 = 0x00000001,
67 PM16 = 0x00000002,
70 PM32 = 0x00000003,
73 WINDOWS32 = 0x00000004,
76 DOS_WINDOWS16 = DOS | WINDOWS16,
79 DOS_WINDOWS32 = DOS | WINDOWS32,
82 OS216_PM16 = OS216 | PM16,
86 OS232_PM32 = OS232 | PM32,
90 NT_WINDOWS32 = NT | WINDOWS32,
93 };
94
95 enum class FILE_TYPE : uint32_t { UNKNOWN = 0x00000000,
98 APP = 0x00000001,
101 DLL = 0x00000002,
104 DRV = 0x00000003,
108 FONT = 0x00000004,
112 VXD = 0x00000005,
115 STATIC_LIB = 0x00000007,
118 };
119
120 static constexpr auto DRV_K = uint64_t(1) << 33;
121 static constexpr auto FONT_K = uint64_t(1) << 34;
122
123 enum class FILE_TYPE_DETAILS : uint64_t { UNKNOWN = 0x00000000, DRV_PRINTER = 0x00000001 | DRV_K, DRV_KEYBOARD = 0x00000002 | DRV_K, DRV_LANGUAGE = 0x00000003 | DRV_K, DRV_DISPLAY = 0x00000004 | DRV_K, DRV_MOUSE = 0x00000005 | DRV_K, DRV_NETWORK = 0x00000006 | DRV_K, DRV_SYSTEM = 0x00000007 | DRV_K, DRV_INSTALLABLE = 0x00000008 | DRV_K, DRV_SOUND = 0x00000009 | DRV_K, DRV_COMM = 0x0000000A | DRV_K,
146
147 DRV_INPUTMETHOD = 0x0000000B | DRV_K,
148 DRV_VERSIONED_PRINTER = 0x0000000C,
151 FONT_RASTER = 0x00000001 | FONT_K,
154 FONT_VECTOR = 0x00000002 | FONT_K,
157 FONT_TRUETYPE = 0x00000003 | FONT_K,
160 };
161
162 enum class FILE_FLAGS : uint32_t { DEBUG = 0x00000001,
166 INFO_INFERRED = 0x00000010,
171 PATCHED = 0x00000004,
175 PRERELEASE = 0x00000002,
178 PRIVATEBUILD = 0x00000008,
182 SPECIALBUILD = 0x00000020,
188 };
189
190 static constexpr auto SIGNATURE_VALUE = 0xFEEF04BD; uint32_t signature = 0;
195 uint32_t struct_version = 0;
200 uint32_t file_version_ms = 0;
205 uint32_t file_version_ls = 0;
210 uint32_t product_version_ms = 0;
215 uint32_t product_version_ls = 0;
220 uint32_t file_flags_mask = 0;
224 uint32_t file_flags = 0;
228 uint32_t file_os = 0;
232 uint32_t file_type = 0;
236 uint32_t file_subtype = 0;
240 uint32_t file_date_ms = 0;
244 uint32_t file_date_ls = 0;
248 bool has(FILE_FLAGS f) const {
251 return ((file_flags & file_flags_mask) & (uint32_t)f) != 0;
252 }
253 std::vector<FILE_FLAGS> flags() const;
256
257 FILE_TYPE_DETAILS file_type_details() const {
258 if (file_subtype == 0) {
259 return FILE_TYPE_DETAILS::UNKNOWN;
260 }
261
262 auto ty = FILE_TYPE(file_type);
263 if (ty == FILE_TYPE::DRV) {
264 return FILE_TYPE_DETAILS(file_subtype | DRV_K);
265 }
266
267 if (ty == FILE_TYPE::FONT) {
268 return FILE_TYPE_DETAILS(file_subtype | FONT_K);
269 }
270
271 return FILE_TYPE_DETAILS::UNKNOWN;
272 }
273
274 std::string to_string() const;
275
276 LIEF_API friend
277 std::ostream& operator<<(std::ostream& os, const fixed_file_info_t& info)
278 {
279 os << info.to_string();
280 return os;
281 }
282 };
283
284 ResourceVersion(const ResourceVersion&) = default;
285 ResourceVersion& operator=(const ResourceVersion&) = default;
286
287 ResourceVersion(ResourceVersion&&) = default;
288 ResourceVersion& operator=(ResourceVersion&&) = default;
289
290 ~ResourceVersion() override = default;
291 const fixed_file_info_t& file_info() const {
294 return fixed_file_info_;
295 }
296
297 fixed_file_info_t& file_info() {
298 return fixed_file_info_;
299 }
300 ResourceStringFileInfo* string_file_info() {
303 if (auto& info = string_file_info_) {
304 return &info.value();
305 }
306 return nullptr;
307 }
308
309 const ResourceStringFileInfo* string_file_info() const {
310 return const_cast<ResourceVersion*>(this)->string_file_info();
311 }
312 ResourceVarFileInfo* var_file_info() {
315 if (auto& info = var_file_info_) {
316 return &info.value();
317 }
318 return nullptr;
319 }
320 uint16_t type() const {
325 return type_;
326 }
327 const std::u16string& key() const {
330 return key_;
331 }
332 std::string key_u8() const;
335
336 ResourceVersion& type(uint16_t value) {
337 type_ = value;
338 return *this;
339 }
340
341 ResourceVersion& key(std::u16string value) {
342 key_ = std::move(value);
343 return *this;
344 }
345 const ResourceVarFileInfo* var_file_info() const {
346 return const_cast<ResourceVersion*>(this)->var_file_info();
347 }
348
349 ResourceVersion& var_file_info(ResourceVarFileInfo info) {
350 var_file_info_ = std::move(info);
351 return *this;
352 }
353
354 ResourceVersion& string_file_info(ResourceStringFileInfo info) {
355 string_file_info_ = std::move(info);
356 return *this;
357 }
358
359 void accept(Visitor& visitor) const override;
360
361 LIEF_API friend
362 std::ostream& operator<<(std::ostream& os, const ResourceVersion& version);
363
364 private:
365 ResourceVersion() = default;
366
367 static ok_error_t parse_children(ResourceVersion& version, BinaryStream& stream);
368 static ok_error_t parse_child(ResourceVersion& version, BinaryStream& stream);
369 static ok_error_t parse_fixed_file_info(ResourceVersion& version, BinaryStream& stream);
370 static ok_error_t parse_str_file_info(ResourceVersion& version, BinaryStream& stream);
371 static ok_error_t parse_var_file_info(ResourceVersion& version, BinaryStream& stream);
372
373 uint16_t type_ = 0;
374 std::u16string key_;
375 fixed_file_info_t fixed_file_info_;
376
377 optional<ResourceStringFileInfo> string_file_info_;
378 optional<ResourceVarFileInfo> var_file_info_;
379};
380
381LIEF_API const char* to_string(ResourceVersion::fixed_file_info_t::FILE_FLAGS e);
382LIEF_API const char* to_string(ResourceVersion::fixed_file_info_t::VERSION_OS e);
383LIEF_API const char* to_string(ResourceVersion::fixed_file_info_t::FILE_TYPE e);
384LIEF_API const char* to_string(ResourceVersion::fixed_file_info_t::FILE_TYPE_DETAILS e);
385
386}
387}
388
389#endif
Object.hpp
ResourceStringFileInfo.hpp
ResourceVarFileInfo.hpp
LIEF::BinaryStream
Class that is used to a read stream of data from different sources.
Definition BinaryStream.hpp:33
LIEF::PE::ResourceData
Class which represents a Data Node in the PE resources tree.
Definition ResourceData.hpp:33
LIEF::PE::ResourceVersion
Representation of the data associated with the RT_VERSION entry.
Definition ResourceVersion.hpp:37
LIEF::PE::ResourceVersion::file_info
const fixed_file_info_t & file_info() const
Return the fixed file info (VS_FIXEDFILEINFO)
Definition ResourceVersion.hpp:293
LIEF::PE::ResourceVersion::ResourceVersion
ResourceVersion(ResourceVersion &&)=default
LIEF::PE::ResourceVersion::operator=
ResourceVersion & operator=(const ResourceVersion &)=default
LIEF::PE::ResourceVersion::var_file_info
const ResourceVarFileInfo * var_file_info() const
Definition ResourceVersion.hpp:345
LIEF::PE::ResourceVersion::file_info
fixed_file_info_t & file_info()
Definition ResourceVersion.hpp:297
LIEF::PE::ResourceVersion::string_file_info
const ResourceStringFileInfo * string_file_info() const
Definition ResourceVersion.hpp:309
LIEF::PE::ResourceVersion::~ResourceVersion
~ResourceVersion() override=default
LIEF::PE::ResourceVersion::string_file_info
ResourceVersion & string_file_info(ResourceStringFileInfo info)
Definition ResourceVersion.hpp:354
LIEF::PE::ResourceVersion::key_u8
std::string key_u8() const
The key as an utf8 string.
LIEF::PE::ResourceVersion::ResourceVersion
ResourceVersion(const ResourceVersion &)=default
LIEF::PE::ResourceVersion::parse
static result< ResourceVersion > parse(const ResourceData &node)
LIEF::PE::ResourceVersion::key
ResourceVersion & key(std::u16string value)
Definition ResourceVersion.hpp:341
LIEF::PE::ResourceVersion::var_file_info
ResourceVarFileInfo * var_file_info()
Return the VarFileInfo element.
Definition ResourceVersion.hpp:314
LIEF::PE::ResourceVersion::string_file_info
ResourceStringFileInfo * string_file_info()
Return the StringFileInfo element.
Definition ResourceVersion.hpp:302
LIEF::PE::ResourceVersion::operator=
ResourceVersion & operator=(ResourceVersion &&)=default
LIEF::PE::ResourceVersion::var_file_info
ResourceVersion & var_file_info(ResourceVarFileInfo info)
Definition ResourceVersion.hpp:349
LIEF::PE::ResourceVersion::operator<<
friend std::ostream & operator<<(std::ostream &os, const ResourceVersion &version)
LIEF::PE::ResourceVersion::type
uint16_t type() const
The type of data in the version resource.
Definition ResourceVersion.hpp:324
LIEF::PE::ResourceVersion::type
ResourceVersion & type(uint16_t value)
Definition ResourceVersion.hpp:336
LIEF::PE::ResourceVersion::parse
static result< ResourceVersion > parse(BinaryStream &stream)
LIEF::PE::ResourceVersion::key
const std::u16string & key() const
The Unicode string L"VS_VERSION_INFO".
Definition ResourceVersion.hpp:329
LIEF::PE::ResourceVersion::parse
static result< ResourceVersion > parse(const uint8_t *p, size_t sz)
LIEF::PE::ResourceVersion::accept
void accept(Visitor &visitor) const override
errors.hpp
LIEF::PE
Namespace related to the LIEF's PE module.
Definition Abstract/Header.hpp:32
LIEF::PE::to_string
const char * to_string(AuxiliaryWeakExternal::CHARACTERISTICS e)
LIEF
LIEF namespace.
Definition Abstract/Binary.hpp:36
LIEF::ok_error_t
result< ok_t > ok_error_t
Opaque structure that is used by LIEF to avoid writing result<void> f(...). Instead,...
Definition errors.hpp:109
optional.hpp
LIEF::PE::ResourceVersion::fixed_file_info_t::FILE_FLAGS
FILE_FLAGS
Definition ResourceVersion.hpp:162
LIEF::PE::ResourceVersion::fixed_file_info_t::VERSION_OS
VERSION_OS
Definition ResourceVersion.hpp:46
LIEF::PE::ResourceVersion::fixed_file_info_t::file_type_details
FILE_TYPE_DETAILS file_type_details() const
Definition ResourceVersion.hpp:257
LIEF::PE::ResourceVersion::fixed_file_info_t::operator<<
friend std::ostream & operator<<(std::ostream &os, const fixed_file_info_t &info)
Definition ResourceVersion.hpp:277
LIEF::PE::ResourceVersion::fixed_file_info_t::FILE_TYPE
FILE_TYPE
Definition ResourceVersion.hpp:95
LIEF::PE::ResourceVersion::fixed_file_info_t::flags
std::vector< FILE_FLAGS > flags() const
List of FILE_FLAGS.
LIEF::PE::ResourceVersion::fixed_file_info_t::to_string
std::string to_string() const
LIEF::PE::ResourceVersion::fixed_file_info_t::FILE_TYPE_DETAILS
FILE_TYPE_DETAILS
Definition ResourceVersion.hpp:123
LIEF::PE::ResourceVersion::fixed_file_info_t::has
bool has(FILE_FLAGS f) const
Check if the given FILE_FLAGS is present.
Definition ResourceVersion.hpp:250
visibility.h
LIEF_API
#define LIEF_API
Definition visibility.h:41