From 591c186371dae09d129dd0a89976153e79b347a5 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Wed, 6 May 2009 15:05:07 +0200
Subject: [PATCH] Made SharedLibraryInjector compile with MinGW.

---
 .../debugger/win/sharedlibraryinjector.cpp    | 34 +++++++++++--------
 src/plugins/debugger/win/win.pri              |  7 ++--
 2 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/src/plugins/debugger/win/sharedlibraryinjector.cpp b/src/plugins/debugger/win/sharedlibraryinjector.cpp
index 628263d3e15..1c5bf8d96ad 100644
--- a/src/plugins/debugger/win/sharedlibraryinjector.cpp
+++ b/src/plugins/debugger/win/sharedlibraryinjector.cpp
@@ -56,6 +56,12 @@
 
 #include <QtCore/QDebug>
 
+#ifdef __GNUC__   // MinGW does not have a complete windows.h
+
+typedef DWORD (__stdcall *PTHREAD_START_ROUTINE) (LPVOID lpThreadParameter);
+
+#endif
+
 enum { debug = 0 };
 
 static QString msgFuncFailed(const char *f, unsigned long error)
@@ -68,7 +74,7 @@ template <class SymbolType>
 inline bool resolveSymbol(const char *libraryName, HMODULE libraryHandle, const char *symbolName, SymbolType *s, QString *errorMessage)
 {
     *s = 0;
-    void *vs = ::GetProcAddress(libraryHandle, symbolName);
+    FARPROC WINAPI vs = ::GetProcAddress(libraryHandle, symbolName);
     if (vs == 0) {
         *errorMessage = QString::fromLatin1("Unable to resolve '%2' in '%1'.").arg(QString::fromAscii(symbolName), QString::fromAscii(libraryName));
         return false;
@@ -158,29 +164,29 @@ bool SharedLibraryInjector::hasLoaded(const QString &modulePath)
 
 QString SharedLibraryInjector::findModule(const QString &moduleName)
 {
-    const TCHAR *moduleNameC = moduleName.utf16();
+    const TCHAR *moduleNameC = reinterpret_cast<const TCHAR*>(moduleName.utf16());
     if (GetFileAttributesW(moduleNameC) != INVALID_FILE_ATTRIBUTES)
         return moduleName;
 
     TCHAR testpathC[MAX_PATH];
     // Check application path first
     GetModuleFileNameW(NULL, testpathC, MAX_PATH);
-    QString testPath = QString::fromUtf16(testpathC);
+    QString testPath = QString::fromUtf16(reinterpret_cast<unsigned short*>(testpathC));
     const int lastSlash = testPath.lastIndexOf(QLatin1Char('\\'));
     if (lastSlash != -1)
         testPath.truncate(lastSlash + 1);
     testPath += moduleName;
-    if (GetFileAttributesW(testPath.utf16()) != INVALID_FILE_ATTRIBUTES)
+    if (GetFileAttributesW(reinterpret_cast<const TCHAR*>(testPath.utf16())) != INVALID_FILE_ATTRIBUTES)
         return testPath;
     // Path Search
-    if (SearchPathW(NULL, moduleName.utf16(), NULL, sizeof(testpathC)/2, testpathC, NULL))
-        return QString::fromUtf16(testpathC);
+    if (SearchPathW(NULL, reinterpret_cast<const TCHAR*>(moduleName.utf16()), NULL, sizeof(testpathC)/2, testpathC, NULL))
+        return QString::fromUtf16(reinterpret_cast<unsigned short*>(testpathC));
     // Last chance, if the module has already been loaded in this process, then use that path
-    const HMODULE loadedModule = GetModuleHandleW(moduleName.utf16());
+    const HMODULE loadedModule = GetModuleHandleW(reinterpret_cast<const TCHAR*>(moduleName.utf16()));
     if (loadedModule) {
         GetModuleFileNameW(loadedModule, testpathC, sizeof(testpathC));
         if (GetFileAttributes(testpathC) != INVALID_FILE_ATTRIBUTES)
-            return QString::fromUtf16(testpathC);
+            return QString::fromUtf16(reinterpret_cast<unsigned short*>(testpathC));
     }
     return QString();
 }
@@ -188,13 +194,13 @@ QString SharedLibraryInjector::findModule(const QString &moduleName)
 unsigned long SharedLibraryInjector::getModuleEntryPoint(const QString &moduleName)
 {
     // If file doesn't exist, just treat it like we cannot figure out the entry point
-    if (moduleName.isEmpty() || GetFileAttributesW(moduleName.utf16()) == INVALID_FILE_ATTRIBUTES)
+    if (moduleName.isEmpty() || GetFileAttributesW(reinterpret_cast<const TCHAR*>(moduleName.utf16())) == INVALID_FILE_ATTRIBUTES)
         return 0;
 
     // Read the first 1K of data from the file
     unsigned char peData[1024];
     unsigned long peDataSize = 0;
-    const HANDLE hFile = CreateFileW(moduleName.utf16(), FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
+    const HANDLE hFile = CreateFileW(reinterpret_cast<const WCHAR*>(moduleName.utf16()), FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
     if (hFile == INVALID_HANDLE_VALUE
         || !ReadFile(hFile, peData, sizeof(peData), &peDataSize, NULL))
         return 0;
@@ -236,7 +242,7 @@ bool SharedLibraryInjector::escalatePrivileges(QString *errorMessage)
         Debug_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // set to enable privilege
         Debug_Privileges.PrivilegeCount = 1;                              // working with only 1
 
-        if (!OpenProcessToken (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) {
+        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) {
             *errorMessage = msgFuncFailed("OpenProcessToken", GetLastError());
             break;
         }
@@ -289,8 +295,8 @@ bool SharedLibraryInjector::doStubInjection(unsigned long pid,
 
     if (!escalatePrivileges(errorMessage))
         return false;
-
-#if (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
+//  MinGW lacks  OpenThread() and the advapi.lib as of 6.5.2009
+#if (defined(WIN64) || defined(_WIN64) || defined(__WIN64__)) || defined(__GNUC__)
     *errorMessage = QLatin1String("Not implemented for this architecture.");
     return false;
 #else
@@ -462,7 +468,7 @@ HMODULE SharedLibraryInjector::findModuleHandle(const QString &modulePath, QStri
         for (unsigned i = 0; i < count; i++) {
             TCHAR szModName[MAX_PATH];
             if (m_pfnGetModuleFileNameExW(hProcess, hMods[i], szModName, sizeof(szModName))) {
-                if (QString::fromUtf16(szModName) == modulePath) {
+                if (QString::fromUtf16(reinterpret_cast<const unsigned short *>(szModName)) == modulePath) {
                     ::FreeLibrary(m_hModPSAPI);
                     ::CloseHandle(hProcess);
                     return hMods[i];
diff --git a/src/plugins/debugger/win/win.pri b/src/plugins/debugger/win/win.pri
index a0b1ef45cbb..4f0fe796c36 100644
--- a/src/plugins/debugger/win/win.pri
+++ b/src/plugins/debugger/win/win.pri
@@ -7,5 +7,8 @@ HEADERS += $$PWD/peutils.h \
            $$PWD/dbgwinutils.h \
            $$PWD/sharedlibraryinjector.h
 
-# For the Privilege manipulation functions in sharedlibraryinjector.cpp
-LIBS += advapi32.lib
+contains(QMAKE_CXX, cl) {
+#   For the Privilege manipulation functions in sharedlibraryinjector.cpp.
+#   Not required for MinGW.
+    LIBS += advapi32.lib
+}       
-- 
GitLab