如何使用WinAPI关闭dumpcap.exe? Dumpcap.exe 由 cmd.exe 运行

问题描述 投票:0回答:1

我正在

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
参数。

winapi qprocess createprocess
1个回答
0
投票

只需将您传递给

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 这样的库,并直接在自己的代码中进行捕获。

© www.soinside.com 2019 - 2024. All rights reserved.