使用WTSEnumerateProcesses获取进程时遇编译链接错误求助(GCC环境)
使用WTSEnumerateProcesses获取进程时的编译错误解决
问题描述
尝试用WTSEnumerateProcesses()获取本地所有进程,代码如下:
#include <iostream> #include <Windows.h> #include <WtsApi32.h> #include <sddl.h> #pragma comment(lib, "Wtsapi32.lib") using namespace std; int main() { cout << "C++ DLL Injector"; WTS_PROCESS_INFO *processes = NULL; LPTSTR sid; DWORD count = 0; if (WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, NULL, 1, &processes, &count)) { for (DWORD i = 0; i < count; i++) { if (!ConvertSidToStringSid(processes[i].pUserSid, &sid)) { std::wcout << processes[i].pProcessName << " " << processes[i].ProcessId << " " << processes[i].SessionId << " " << std::endl; } else { std::wcout << processes[i].pProcessName << " " << processes[i].ProcessId << " " << processes[i].SessionId << " " << sid << " " << std::endl; } } } else { return GetLastError(); } WTSFreeMemory(processes); return NO_ERROR; }
使用GCC/G++编译时出现以下错误:
C:\msys64\mingw64\bin\g++.exe -fdiagnostics-color=always -g C:\Users\gabri\Downloads\Code\C++\Main.cpp -o C:\Users\gabri\Downloads\Code\C++\Main.exe C:\Users\gabri\Downloads\Code\C++\Main.cpp: In function 'int main()': C:\Users\gabri\Downloads\Code\C++\Main.cpp:16:58: warning: passing NULL to non-pointer argument 2 of 'WINBOOL WTSEnumerateProcessesA(HANDLE, DWORD, DWORD, _WTS_PROCESS_INFOA**, DWORD*)' [-Wconversion-null] 16 | if (WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, NULL, 1, &processes, &count)) { | ^~~~ In file included from C:\Users\gabri\Downloads\Code\C++\Main.cpp:3: C:/msys64/mingw64/include/WtsApi32.h:168:62: note: declared here 168 | WINBOOL WINAPI WTSEnumerateProcessesA(HANDLE hServer,DWORD Reserved,DWORD Version,PWTS_PROCESS_INFOA *ppProcessInfo,DWORD *pCount); | ~~~~~~^~~~~~~~ C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\gabri\AppData\Local\Temp\ccZGWcxq.o: in function `main': C:\Users\gabri\Downloads\Code\C++/Main.cpp:16: undefined reference to `WTSEnumerateProcessesA' C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\gabri\Downloads\Code\C++/Main.cpp:44: undefined reference to `WTSFreeMemory' collect2.exe: error: ld returned 1 exit status
错误原因及修复方法
1. 链接错误:未找到Wtsapi32库函数
#pragma comment(lib, "Wtsapi32.lib")是MSVC编译器特有的指令,GCC/G++不支持该语法。必须在编译命令中手动指定链接库。
修复方法:编译时添加-lwtsapi32参数,修改后的编译命令为:
g++ -g Main.cpp -o Main.exe -lwtsapi32
2. 类型不匹配警告:NULL传递给DWORD参数
WTSEnumerateProcesses的第二个参数Reserved是DWORD类型(无符号整数),但代码中传递了NULL(指针类型)。虽然Windows中NULL被定义为0,但GCC会触发类型不匹配警告。
修复方法:将NULL替换为0,修改后的函数调用代码:
if (WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, &processes, &count)) {
3. 潜在内存泄漏问题
调用ConvertSidToStringSid成功后,返回的sid内存需要手动释放,否则会造成内存泄漏。
修复方法:在else分支的输出语句后添加内存释放代码:
LocalFree(sid);
修复后的完整代码
#include <iostream> #include <Windows.h> #include <WtsApi32.h> #include <sddl.h> using namespace std; int main() { wcout << L"C++ DLL Injector" << endl; WTS_PROCESS_INFO *processes = NULL; LPTSTR sid = nullptr; DWORD count = 0; if (WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, &processes, &count)) { for (DWORD i = 0; i < count; i++) { if (!ConvertSidToStringSid(processes[i].pUserSid, &sid)) { std::wcout << processes[i].pProcessName << L" " << processes[i].ProcessId << L" " << processes[i].SessionId << std::endl; } else { std::wcout << processes[i].pProcessName << L" " << processes[i].ProcessId << L" " << processes[i].SessionId << L" " << sid << std::endl; LocalFree(sid); // 释放SID字符串内存 sid = nullptr; } } WTSFreeMemory(processes); } else { wcout << L"Error: " << GetLastError() << endl; return GetLastError(); } return NO_ERROR; }
内容的提问来源于stack exchange,提问作者spookyss
相关产品推荐
相关产品推荐

