0

私は次のコードを持っています (すべてのプロセスを取得し、それらの正規表現パターンを検索し、マルウェア検出のためのより大きな個人プロジェクトのコード)、コードは私が望むことを行いますが、CPU の 100% を使用している唯一の問題です私は間違っていますか?メモリ割り当てが悪い?MS Visual Studio 2010 でコンパイルしました (cl.exe /EHsc mycode.cpp)

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <tlhelp32.h>
#include <psapi.h>
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <iterator>
#include <regex>

using namespace std;

#pragma comment(lib, "psapi.lib") 

void PrintProcessNameAndID(DWORD);
void find_locs(HANDLE process);
void ListProcesses();

int main(int argc, char **argv) {
    ListProcesses();
}

void find_locs(HANDLE process) {

    unsigned char *p = NULL;
    MEMORY_BASIC_INFORMATION info;

    for ( p = NULL;
        VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info);
        p += info.RegionSize )
    {
        std::string buffer;

        if (info.State == MEM_COMMIT &&
            (info.Type == MEM_MAPPED || info.Type == MEM_PRIVATE))
        {
            DWORD bytes_read;

            buffer.resize(info.RegionSize);
            ReadProcessMemory(process, p, &buffer[0], info.RegionSize, &bytes_read);
            buffer.resize(bytes_read);

            const std::tr1::regex rx("([\\w-+]+(?:\\.[\\w-+]+)*@(?:[\\w-]+\\.)+[a-zA-Z]{2,7})");
            std::tr1::match_results<std::string::const_iterator> res; 
            std::tr1::regex_search(buffer, res, rx);

            ofstream myfile;
            myfile.open ("proc.txt", ios::app);

            for (unsigned int i=0; i<res.size(); ++i)
            {
                std::cout << res[i] << std::endl;
                myfile << res[i] << "\n";
            }

            myfile.close();
        }
    }
}

void ListProcesses()
{
    DWORD aProcesses[1024];
    DWORD cbNeeded;
    DWORD cProcesses;
    unsigned int i;

    if (!EnumProcesses(aProcesses,sizeof(aProcesses),&cbNeeded))
        return;

    cProcesses = cbNeeded / sizeof(DWORD);

    for ( i = 0; i < cProcesses; i++ )
    {
        PrintProcessNameAndID(aProcesses[i]);
    }
}

void PrintProcessNameAndID(DWORD processID)
{
    TCHAR szProcessName[MAX_PATH]; // = TEXT("<unknown>");

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);

    if (NULL != hProcess)
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if (EnumProcessModules(hProcess, &hMod, sizeof(hMod),
             &cbNeeded))
        {
            GetModuleBaseName(hProcess, hMod, szProcessName,
                               sizeof(szProcessName)/sizeof(TCHAR));
        }
    }
    _tprintf(TEXT("pid: %u file: %s\n"), processID, szProcessName);
    find_locs(hProcess);
    CloseHandle(hProcess);
}

手伝ってくれてありがとう!

4

3 に答える 3

7

プログラムがプロセッサの 100% を占有することに問題はありません... (この回答をこれ以上に拡張する方法がわかりません)

于 2013-01-03T14:02:44.500 に答える
3

呼び出しなしで継続的に実行されているプログラムSleep(OS に「今のところ完了しました」と言うようなもの) は、前のループの直後にループの次の反復を要求して、できるだけ速く実行しようとします。あなたがそうするように要求したので、利用可能なすべてのCPUサイクルが必要です。

于 2013-01-03T14:07:40.447 に答える
2

いくつかのこと:

100% で実行されている CPU も珍しくありません。これは、計算集約型のタスク (素数の計算など) を実行している場合に特に当てはまります。例えば:

C プログラムから 100% の CPU 使用率を取得する方法

または、おそらくあなたの場合により適切なのは、Windows自体、ハードウェアの組み合わせ、および構成に関連する無数の組み合わせが原因であるということです。

http://www.techradar.com/us/news/computing/why-is-my-cpu-running-at-100-710254

全体として、あまり心配する必要はありません。一般的に、つまり。

于 2013-01-03T14:10:51.770 に答える