1 #include "windows_tools.h"
2 
3 #if defined(QMC2_OS_WIN)
4 
5 #include <psapi.h>
6 #include <stdio.h>
7 #include <io.h>
8 #include <fcntl.h>
9 
10 // To ensure correct resolution of symbols, add psapi.lib to LIBS
11 // and compile with -DPSAPI_VERSION=1
12 // (see http://msdn.microsoft.com/en-us/library/ms682623.aspx)
13 
14 QString winSearchText;
15 QMap<HWND, QString> winWindowMap;
16 HWND winFoundHandle;
17 
winFindProcessHandle(QString procName)18 HANDLE winFindProcessHandle(QString procName)
19 {
20 	HANDLE processHandle = 0;
21 	DWORD procs[QMC2_WIN_MAX_PROCS], bytesNeeded;
22 	if ( EnumProcesses(procs, sizeof(procs), &bytesNeeded) ) {
23 		DWORD numProcesses = bytesNeeded / sizeof(DWORD);
24 		for (uint i = 0; i < numProcesses; i++) {
25 			HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, procs[i]);
26 			if ( hProcess != 0 ) {
27 				HMODULE hMod;
28 				DWORD bN;
29 				if ( EnumProcessModules(hProcess, &hMod, sizeof(hMod), &bN) ) {
30 					TCHAR processName[MAX_PATH];
31 					GetModuleBaseName(hProcess, hMod, processName, sizeof(processName)/sizeof(TCHAR));
32 #ifdef UNICODE
33 					QString pN(QString::fromUtf16((ushort*)processName));
34 #else
35 					QString pN(QString::fromLocal8Bit(processName));
36 #endif
37 					if ( pN == procName ) {
38 						processHandle = hProcess;
39 						CloseHandle(hProcess);
40 						break;
41 					}
42 				}
43 				CloseHandle(hProcess);
44 			}
45 		}
46 	}
47 
48 	return processHandle;
49 }
50 
winFindWindowHandleCallbackProc(HWND hwnd,LPARAM lParam)51 BOOL CALLBACK winFindWindowHandleCallbackProc(HWND hwnd, LPARAM lParam)
52 {
53 	WCHAR winTitle[QMC2_WIN_MAX_NAMELEN];
54 	if ( !GetWindow(hwnd, GW_OWNER) ) {
55 		GetWindowText(hwnd, winTitle, QMC2_WIN_MAX_NAMELEN - 1);
56 		QString windowTitle = QString::fromWCharArray(winTitle);
57 		if ( windowTitle == winSearchText )
58 			winFoundHandle = hwnd;
59 		winWindowMap[hwnd] = windowTitle;
60 	}
61 	return true;
62 }
63 
winFindWindowHandle(QString windowTitle)64 HWND winFindWindowHandle(QString windowTitle)
65 {
66 	winFoundHandle = 0;
67 	winSearchText = windowTitle;
68 	winWindowMap.clear();
69 	EnumWindows((WNDENUMPROC)winFindWindowHandleCallbackProc, 0);
70 	return winFoundHandle;
71 }
72 
winRefreshWindowMap()73 void winRefreshWindowMap()
74 {
75 	winFindWindowHandle("DUMMY");
76 }
77 
winFindWindowHandleOfProcess(Q_PID processInfo,QString subString)78 HWND winFindWindowHandleOfProcess(Q_PID processInfo, QString subString)
79 {
80 	bool handleFound = false;
81 	HWND windowHandle = GetTopWindow(0);
82 	DWORD pid;
83 	while ( windowHandle && !handleFound ) {
84 		GetWindowThreadProcessId(windowHandle, &pid);
85 		if ( pid == processInfo->dwProcessId ) {
86 			if ( !subString.isEmpty() ) {
87 				WCHAR winTitle[QMC2_WIN_MAX_NAMELEN];
88 				GetWindowText(windowHandle, winTitle, QMC2_WIN_MAX_NAMELEN - 1);
89 				QString windowTitle = QString::fromWCharArray(winTitle);
90 				if ( windowTitle.contains(subString) )
91 					handleFound = true;
92 			} else
93 				handleFound = true;
94 		}
95 		if ( !handleFound )
96          		windowHandle = GetNextWindow(windowHandle, GW_HWNDNEXT);
97 	}
98 	return handleFound ? windowHandle : 0;
99 }
100 
winAllocConsole(bool parentOnly)101 void winAllocConsole(bool parentOnly)
102 {
103         bool parentConsoleAttached = true;
104 	if ( !AttachConsole(ATTACH_PARENT_PROCESS) ) {
105 		if ( !parentOnly ) {
106 			AllocConsole();
107 			parentConsoleAttached = false;
108 		} else
109 			return;
110 	}
111 
112 	HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
113 	int hCrt = _open_osfhandle((intptr_t) handle_out, _O_TEXT);
114 	FILE *hf_out = _fdopen(hCrt, "w");
115 	setvbuf(hf_out, 0, _IONBF, 1);
116 	*stdout = *hf_out;
117 
118 	HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
119 	hCrt = _open_osfhandle((intptr_t) handle_in, _O_TEXT);
120 	FILE *hf_in = _fdopen(hCrt, "r");
121 	setvbuf(hf_in, 0, _IONBF, 128);
122 	*stdin = *hf_in;
123 
124 	if ( parentConsoleAttached ) {
125 		printf("\n");
126 		fflush(stdout);
127 	}
128 }
129 
winFreeConsole()130 void winFreeConsole()
131 {
132 	FreeConsole();
133 }
134 
winGetMemoryInfo(quint64 * totalSize,quint64 * totalUsed,quint64 * totalFree)135 void winGetMemoryInfo(quint64 *totalSize, quint64 *totalUsed, quint64 *totalFree)
136 {
137 	MEMORYSTATUSEX memStatus;
138 	memStatus.dwLength = sizeof(memStatus);
139 	if ( GlobalMemoryStatusEx(&memStatus) ) {
140 		*totalSize = memStatus.ullTotalPhys / QMC2_1M;
141 		*totalFree = memStatus.ullAvailPhys / QMC2_1M;
142 		*totalUsed = *totalSize - *totalFree;
143 	}
144 }
145 
146 #endif
147