Ошибка GetProcessMemoryInfo с ошибкой 6 Дескриптор недействителен - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь получить список процессов, запущенных в системе с использованием C ++. Я использую функции, доступные в Windows API (такие как OpenProcess & CreateToolhelp32Snapshot), чтобы сделать это.

Проблема в том, что код работает нормально для большинства процессов, но не может получить информацию о памяти только для важных системных процессов, я также дал seDebugPrivilege и запустил программу только от имени администратора.

Я получаю вывод как

File Name PID Memory Used

winlogon.exe 1248 2432 KB

fontdrvhost.exe 1308

WARNING: GetProcessMemoryInfo failed with error 6 (The handle is invalid)

dwm.exe 1384

WARNING: GetProcessMemoryInfo failed with error 6 (The handle is invalid)

svchost.exe 1448 4744 KB

Мой код:

BOOL GetProcessList( )
{
    HANDLE hProcessSnap;
    HANDLE hProcess;
    HANDLE hToken;
    PROCESSENTRY32 pe32;
    DWORD dwPriorityClass;
    PROCESS_MEMORY_COUNTERS pmc;

  hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  if( hProcessSnap == INVALID_HANDLE_VALUE )
  {
      char err[]="CreateToolhelp32Snapshot (of processes)";
    printError( err );
    return( FALSE );
  }

  pe32.dwSize = sizeof( PROCESSENTRY32 );

  if( !Process32First( hProcessSnap, &pe32 ) )
  {
    char err[]="Process32First";
    printError( err ); // show cause of failure
    CloseHandle( hProcessSnap );          // clean the snapshot object
    return( FALSE );
  }
  if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))
    {
        if (GetLastError() == ERROR_NO_TOKEN)
        {
            if (!ImpersonateSelf(SecurityImpersonation))
            return FALSE;

            if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken)){
                char err[]="OpenThreadToken";
                printError( err );
                return FALSE;
            }
         }
        else
            return FALSE;
     }
    SetPrivilege(hToken, SE_DEBUG_NAME, FALSE);
  do
  {
    printf( "%-25s", pe32.szExeFile );
    dwPriorityClass = 0;
    SIZE_T  dwMin, dwMax;
    hProcess = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION , FALSE, pe32.th32ProcessID );
    printf("%-10d", pe32.th32ProcessID );
    if(GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS *)&pmc, sizeof(pmc)))
    {

        printf( "%-10d KB", pmc.PagefileUsage/1024); 
    } else{
        char err[]="GetProcessMemoryInfo";
        printError( err );
    }
        printf("\n");
    CloseHandle(hProcess);
  }while( Process32Next( hProcessSnap, &pe32 ) );
  CloseHandle( hProcessSnap );
  return( TRUE );
}

1 Ответ

0 голосов
/ 25 июня 2018

Чтобы получить этот код для Работа , вам необходимо изменить:

SetPrivilege(hToken, SE_DEBUG_NAME, FALSE)

на:

SetPrivilege(hToken, SE_DEBUG_NAME, TRUE)

Как прокомментировали другие, чтобы получить этот коддля правильной работы необходимо:

  • проверить и сообщить все возможные ошибки
  • освободить все ресурсы после завершения, в этом случае отпустите hToken (через CloseHandle()) и, если потребуется, позвоните revertToSelf().

Кроме этого, это приличное усилие, поэтому большие пальцы за это.

Ссылка на SetPrivilege(), на случай, если это понадобится любому будущему посетителю:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa446619.aspx

Счастливого взлома.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...