Search code examples
c++windowswinapisystem

Permission denied while taking a snapshot of running process using CreateToolhelp32Snapshot()


Today I was requested to turn my console app(eg:App.exe) into a service, just googled and found nssm then used its effective commands to turn my APP.exe to a service,My next job is to monitor the running process(APP.exe) and if its size exceeds >30MB restart it that's all.What I've learned previously from nssm is when I kill the APP.exe nssm automatically restart it, So now I only need to code for only monitoring and killing the APP.exe when it exceeds 30MB,finally I've created an app that does monitoring There comes the problem, In the monitoring app I have been using CreateToolhelp32Snapshot() to take a snapshot of all running processes and try to find my APP.exe by its name then get it's size by pmc.WorkingSetSize, Yet When I ran my monitoring app it can't find the APP.EXE though i see it exist in the task manager I even ran it as an administrator yet it remains the same can any one helpme rid of this issue.

The error I am getting while taking a snapshot is permission denied.

please see my code below:

int main()
{
LOG mon;
PROCESSENTRY32 pe32 = {0};
HANDLE    hSnap;
HANDLE   hprocess;
PROCESS_MEMORY_COUNTERS pmc;
int       iDone;
int       iTime = 60;
bool      bProcessFound;

while(true)    // go forever
{
    cout<<"adjfhaljkehdfhwoefjiej";
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    pe32.dwSize = sizeof(PROCESSENTRY32);
    Process32First(hSnap,&pe32);     // Can throw away, never an actual app

    bProcessFound = false;   //init values
    iDone = 1;

    while(iDone)    // go until out of Processes
    {
        iDone = Process32Next(hSnap,&pe32);
        if (strcmp(pe32.szExeFile,"APP.exe") == 0)    // Did we find our process?
        {
            DWORD processID = pe32.th32ProcessID;
            hprocess= OpenProcess(  PROCESS_QUERY_INFORMATION |
                                    PROCESS_VM_READ,
                                    FALSE, processID );
            if (GetProcessMemoryInfo( hprocess, &pmc, sizeof(pmc)))
                {
                    size_t procsize=pmc.WorkingSetSize;
                    cout<<procsize;
                    if(procsize>30MB)--mylogic
                    {
            hprocess=OpenProcess(PROCESS_TERMINATE,0, processID);
            TerminateProcess (hprocess, 0);
            mon.RestartLog("Server Closed due to large size");

                    }
                }


            bProcessFound = true;
            iDone = 0;
        }
    }

    if(!bProcessFound)   .
    {

         mon.RestartLog("Server Down ");

    }
    Sleep(iTime*50);    // delay x amount of seconds.
}
return 0;

}

Solution

  • Run the above said monitor app as a system process. i.e, make it as a service.