Мониторы ресурсов Windows "Сетевая активность" C++

Я пытаюсь выяснить, как получить всю сетевую активность для данного процесса. В приложении Windows "Resource Monitor" в поле "Сетевая активность" вы можете видеть все соединения tcp / udp, отправляемые данные и т. Д. Сначала я попытался использовать команду netstat cmd и собирался проанализировать это, но быстро понял, что "пропускает" целую кучу соединений udp. Так что это было вне. Теперь я искал в использовании iphlpapi.h в C++ вместе с его GetExtendedUdpTable функция. Но даже это, кажется, не показывает все данные, которые показывает Resource Monitor. Может кто-нибудь направить меня к надлежащему API Windows, который может получить ту же информацию, что и на вкладке "Сетевая активность" в разделе "Монитор ресурсов". Я долго искал, и все, что я нашел, очень старое, я надеюсь использовать любой современный / современный подход. Это не обязательно должно быть обратно совместимо, хорошо только для windows 10.

По сути, моей конечной целью является создание приложения, которое может автоматически определять местоположение ip с использованием базы данных для целевого приложения (включая соединения UDP). Теперь я уверен, что есть много библиотек / приложений, которые уже могут это сделать. Я просто хочу сделать это как учебный процесс, поэтому я хотел бы избегать любых библиотек /API, кроме предоставляемых Windows.

Это то, с чем я сейчас работаю, пожалуйста, прости использование плохих практик, таких как использование 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 ответов

Другие вопросы по тегам