Windows资源监视器“网络活动” c ++

时间:2018-09-17 03:08:03

标签: c++ windows networking udp resource-monitor

我试图弄清楚如何获得给定进程的所有网络活动。在Windows的“网络活动”框中的“资源监视器”应用程序中,您可以看到所有tcp / udp连接以及正在发送的数据。我首先尝试使用cmd netstat,并打算对此进行解析,但很快意识到它“丢失”了很多udp连接。这样就出来了。现在,我一直在研究在c ++中使用iphlpapi.h及其GetExtendedUdpTable函数。但这似乎并没有显示Resource Monitor显示的所有数据。任何人都可以将我定向到正确的Windows API,该API可以获得与资源监视器下“网络活动”选项卡中所示的相同信息。我已经搜索了一段时间,发现的一切都非常古老,我希望使用当前/现代的方法。不必向后兼容,仅Windows 10可以。

基本上,我的最终目标是构建一个应用程序,该应用程序可以使用数据库自​​动为目标应用程序(包括UDP连接)对IP进行地理位置定位。现在,我确定有很多库/应用程序已经可以做到这一点。我只是想将其作为学习过程来做,所以我想避免使用Windows提供的库/ API以外的任何库/ API。

这是我目前正在使用的方法,请原谅使用不良做法,例如使用printf和不使用static_cast等。一旦完成,我将正确重写所有内容找到了一种获取我所追求的信息的方法。

    MIB_UDPTABLE_OWNER_PID* pUdpTable;
    MIB_UDPROW_OWNER_PID* owner;

    DWORD dwSize;
    DWORD dwResult;

    dwResult = GetExtendedUdpTable(NULL, &dwSize, false, AF_INET, UDP_TABLE_OWNER_PID, 0);
    pUdpTable = (MIB_UDPTABLE_OWNER_PID*)MALLOC(dwSize);
    dwResult = GetExtendedUdpTable(pUdpTable, &dwSize, false, AF_INET, UDP_TABLE_OWNER_PID, 0);

    for (DWORD dwLoop = 0; dwLoop < pUdpTable->dwNumEntries; dwLoop++) {
        owner = &pUdpTable->table[dwLoop];
        printf("%ld ", owner->dwOwningPid);

        HANDLE Handle = OpenProcess(
            PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
            FALSE,
            owner->dwOwningPid
        );
        if (Handle) {
            TCHAR Buffer[MAX_PATH];
            if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH)) {
                printf(Buffer);
                printf("\n");
            } else {
                printf("Error GetModuleFileNameEx : %lu\n", GetLastError());
            }
            CloseHandle(Handle);
        } else {
            printf("Error OpenProcess : %lu\n", GetLastError());
        }
    }

    FREE(pUdpTable);

0 个答案:

没有答案