我正在
dumpcap.exe
窗口中使用 cmd.exe
捕获数据包:
dumpcap.exe -i 5 -w:\\Users\\xyz.abc\\Desktop\\allPacketTMC.pcapng
此捕获方法适用于 QT GUI。当我单击“Start LOG”按钮时,它开始捕获数据包。下面的代码可以在 QT Creator 中用于捕获:
const char *command = "dumpcap.exe -i 5 -w:\\Users\\xyz.abc\\Desktop\\allPacketTMC.pcapng";
std::system(command);
我可以使用
Ctrl-C关闭
dumpcap.exe
窗口中的 cmd
。但我想用 Win32 API(或其他方法)关闭 dumpcap
。
当我单击按钮时,我会使用
EnumProcessModules()
读取所有进程,并且可以显示它们的进程 PID。但是 dumpcap.exe
的 PID 没有出现,所以我无法从 GUI 中关闭 dumpcap
。
我使用
QProcess
在QT中创建流程,但它在打开的窗口中不起作用。
我使用
std::system()
功能并使用 Ctrl-C从
dumpcap.exe
窗口关闭 cmd
,但我不想以这种方式关闭 dumpcap
。
我搜索了如何使用
CreateProcess()
函数从 Win32 API 创建 cmd.exe
,但我没有使用 dumpcap.exe
运行 CreateProcess()
,因为我没有声明 lpCommandLine
参数。
只需将您传递给
CreateProcess()
的命令行传递给 system()
即可。 CreateProcess()
为您提供可与 GenerateConsoleCtrlEvent()
一起使用的进程 ID,以及可与 TerminateProcess()
一起使用的进程句柄。
const char *command = "dumpcap.exe -i 5 -w:\\Users\\xyz.abc\\Desktop\\allPacketTMC.pcapng";
STARTUPINFOA si = {};
si.cb = sizeof(si);
PROCESS_INFORMATION pi = {};
if (CreateProcessA(NULL, command, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW, NULL, NULL, &si, &pi)
{
...
AttachConsole(pi.dwProcessID);
GenerateConsoleCtrlEvent(CTRL_C_EVENT, pi.dwProcessID);
AttachConsole(ATTACH_PARENT_PROCESS);
// or:
TerminateProcess(pi.hProcess);
...
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
另一种选择是根本不使用
dumpcap.exe
。使用像 libpcap 这样的库,并直接在自己的代码中进行捕获。