Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
peheaderinfo.h
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#ifndef PEHEADERINFO_H
5#define PEHEADERINFO_H
6
7#include <qt_windows.h>
8
9#include <QString>
10#include <QStringList>
11
12QT_BEGIN_NAMESPACE
13
14class PeHeaderInfo {
15public:
16 PeHeaderInfo(const QString fileName);
17
18 ~PeHeaderInfo();
19
20 bool isValid();
21
22 QString errorMessage();
23
24 unsigned wordSize();
25
26 unsigned int machineArch();
27
28 QStringList dependentLibs();
29
30 bool isDebug();
31
32private:
33 bool mValid = false;
34 QString mErrorMessage;
35
36 QStringList mDependentLibs;
37 std::optional<bool> mIsDebug;
38
39 HANDLE mFileHandle = NULL;
40 HANDLE mFileMapHandle = NULL;
41 void *mFileMemory = nullptr;
42 IMAGE_NT_HEADERS *mNtHeaders = nullptr;
43
44 IMAGE_NT_HEADERS *getNtHeader();
45 template <class ImageNtHeader>
46 QStringList readImportSections(const ImageNtHeader *ntHeaders);
47 template <class ImageNtHeader>
48 QStringList determineDependentLibs(const ImageNtHeader *nth);
49 template <class ImageNtHeader>
50 bool determineDebug(const ImageNtHeader *nth);
51
52 static QString stringFromRvaPtr(const void *rvaPtr);
53
54 // Helper for reading out PE executable files: Find a section header for an RVA
55 // (IMAGE_NT_HEADERS64, IMAGE_NT_HEADERS32).
56 template <class ImageNtHeader>
57 const IMAGE_SECTION_HEADER *findSectionHeader(DWORD rva, const ImageNtHeader *nTHeader);
58
59 // Helper for reading out PE executable files: convert RVA to pointer (IMAGE_NT_HEADERS64, IMAGE_NT_HEADERS32).
60 template <class ImageNtHeader>
61 const void *rvaToPtr(DWORD rva, const ImageNtHeader *nTHeader, const void *imageBase);
62
63 template <class ImageNtHeader>
64 unsigned ntHeaderWordSize(const ImageNtHeader *header);
65
66 // Check for MSCV runtime (MSVCP90D.dll/MSVCP90.dll, MSVCP120D.dll/MSVCP120.dll,
67 // VCRUNTIME140D.DLL/VCRUNTIME140.DLL (VS2015) or msvcp120d_app.dll/msvcp120_app.dll).
68 enum MsvcDebugRuntimeResult { MsvcDebugRuntime, MsvcReleaseRuntime, NoMsvcRuntime };
69
70 MsvcDebugRuntimeResult checkMsvcDebugRuntime();
71};
72
74public:
76
77 static PeHeaderInfo *peHeaderInfo(const QString &fileName);
78};
79
80QT_END_NAMESPACE
81
82#endif // PEHEADERINFO_H
static PeHeaderInfo * peHeaderInfo(const QString &fileName)
PeHeaderInfoCache()=delete
unsigned int ntHeaderWordSize(const ImageNtHeader *header)
QMap< QString, PeHeaderInfo * > PeHeaderInfoMap
Q_GLOBAL_STATIC(QReadWriteLock, g_updateMutex)