File indexing completed on 2024-12-01 13:33:59
0001 /****************************************************************** 0002 * 0003 * kdbgwin - Helper application for DrKonqi 0004 * 0005 * This file is part of the KDE project 0006 * 0007 * SPDX-FileCopyrightText: 2010 Ilie Halip <lupuroshu@gmail.com> 0008 * 0009 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0010 *****************************************************************/ 0011 0012 #pragma once 0013 0014 #include "common.h" 0015 0016 #include <QMap> 0017 #include <QString> 0018 0019 typedef QMap<DWORD, HANDLE> TThreadsMap; 0020 typedef QMap<QString, HMODULE> TModulesMap; 0021 0022 /** 0023 * \brief Describes a process. 0024 * 0025 * This is a helper class when dealing with another process. When kdbgwin starts, 0026 * it attaches to the crashing process and tries to retrieve useful information: 0027 * pid, threads, modules, image path. These will be used later. 0028 */ 0029 class Process 0030 { 0031 private: 0032 /// Flag to check if the information about this process is valid and can be used 0033 BOOL m_bValid; 0034 0035 /// Process ID 0036 DWORD m_dwPid; 0037 0038 /// Failing thread ID - I need this because for the crashing thread, I need to get 0039 /// the CONTEXT from a piece of shared memory in KCrash 0040 DWORD m_dwThread; 0041 0042 /// A handle to the process 0043 HANDLE m_hProcess; 0044 0045 /// A QMap<DWORD, HANDLE> which associates thread IDs with opened handles for each 0046 /// of them 0047 TThreadsMap m_threads; 0048 0049 /// The full path to the executable file which started this process 0050 QString m_path; 0051 0052 /// A QMap<QString, HMODULE> which contains the paths to the loaded modules and 0053 /// handles to each of them 0054 TModulesMap m_modules; 0055 0056 public: 0057 Process(); 0058 0059 public: 0060 /// kdbgwin needs to enable the debug privilege in order to read from 0061 /// another process's memory. 0062 static BOOL EnableDebugPrivilege(); 0063 0064 public: 0065 /// Attaches to the process and gets all required information 0066 /// @return TRUE if operation succeeds 0067 BOOL GetInfo(const char *pid, const char *threadId); 0068 0069 /// Checks if the information is valid 0070 BOOL IsValid() const 0071 { 0072 assert(m_bValid); 0073 return m_bValid; 0074 } 0075 0076 /// Get the process ID 0077 DWORD GetId() const 0078 { 0079 assert(m_dwPid); 0080 return m_dwPid; 0081 } 0082 0083 /// Returns an open handle to the process (opened with PROCESS_ALL_ACCESS) 0084 HANDLE GetHandle() const 0085 { 0086 assert(m_hProcess); 0087 return m_hProcess; 0088 } 0089 0090 /// Returns the thread ID of the thread that caused the exception 0091 DWORD GetThreadId() const 0092 { 0093 assert(m_dwThread); 0094 return m_dwThread; 0095 } 0096 0097 /// Returns the threads map 0098 const TThreadsMap &GetThreads() const 0099 { 0100 return m_threads; 0101 } 0102 0103 /// Returns the full path to the executable on the disk 0104 const QString &GetPath() const 0105 { 0106 return m_path; 0107 } 0108 0109 /// Returns a map of all the loaded modules 0110 const TModulesMap &GetModules() const 0111 { 0112 return m_modules; 0113 } 0114 };