GetProcessName в C ++ - PullRequest
       45

GetProcessName в C ++

0 голосов
/ 13 августа 2010

У меня есть функция с детализацией удара.

typedef part

   typedef DWORD (WINAPI *GETMODULEFILENAMEEX)(HANDLE hProcess, HMODULE hModule, LPTSTR   lpBaseName,DWORD nSize); 

   typedef BOOL (WINAPI *PFNTERMINATEPROCESS)(HANDLE hProcess,UINT uExitCode);

/// Функция GetProcessName

void GetProcessName(DWORD PID, PTSTR szProcessName, size_t cchSize)
{

    HMODULE lib=LoadLibrary(TEXT("Psapi.dll"));
    GetModuleFileNameEx=(GETMODULEFILENAMEEX)GetProcAddress
    (lib,"GetModuleFileNameExW");
    _tcscpy_s(szProcessName, cchSize, TEXT("---"));


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

   if (hProcess == NULL) {
      _tcscpy_s(szProcessName, cchSize, TEXT("???"));
      return;
   }

   if (GetModuleFileNameEx(hProcess,(HMODULE)0, szProcessName, cchSize) 
       == 0) {
     if (!GetProcessImageFileName(hProcess, szProcessName, cchSize)) {
         _tcscpy_s(szProcessName, cchSize, TEXT("???"));
      }
   }
   CloseHandle(hProcess);
}

Я хочу использовать эту функцию в следующей функции

BOOL WINAPI Hook_TerminateProcess(HANDLE hProcess,UINT uExitCode) {
  BOOL nResult=false;
  TCHAR szProcessName[MAX_PATH];


 nResult = ((PFNTERMINATEPROCESS)(PROC) g_TerminateProcess)(hProcess,uExitCode);

 GetProcessName(HandleToULong(hProcess),szProcessName,MAX_PATH); //my question here


    MessageBox(0, szProcessName  ,TEXT("My MessageBox Info"),MB_OK | MB_ICONERROR);

   return(nResult);
}

Когда я вызываю функцию GetProcessName, это должно вернуть имя процесса, но оно ???ул всегда.Я вызываю эту функцию напрямую по PID, например GetProcessName(2018,szProcessName,MAX_PATH);.2018 к примеру это пид и все работает.Я не знаю, почему HandleToULong (hProcess) не работает.Мой hProcess должен быть ручного типа, конечно, теперь, как я могу решить эту проблему?

Ответы [ 4 ]

1 голос
/ 26 января 2011

имя символа [MAX_PATH * 2] = "\ 0", * p;

GetModuleFileName (GetModuleHandle (NULL), name, MAX_PATH);

p = name + strlen (name) - 1;

while (isalnum (* p) || ('.' == * p) || ('_' == * p)) p -;

p ++;

std :: cout << p << std :: endl; </p>

0 голосов
/ 13 августа 2010

В Windows идентификатор процесса отличается от дескриптора процесса.Вы берете дескриптор процесса в Hook_TerminateProcess и передаете его в GetProcessName в качестве идентификатора процесса.Это никогда не сработает.

Вы должны провести рефакторинг GetProcessName, чтобы получить дескриптор, а затем иметь перегрузку, которая принимает идентификатор процесса.Перегрузка идентификатора процесса OpenProcess выполняет преобразование его в дескриптор, а CloseHandle - его очистку.

После рефакторинга у вас будет два метода:

void GetProcessName(HANDLE hProcess, PTSTR szProcessName, size_t cchSize);
void GetProcessName(DWORD PID, PTSTR szProcessName, size_t cchSize);
0 голосов
/ 13 августа 2010
  1. Как вы можете завершить процесс и ожидать, что дескриптор останется действительным?причина, если выполняется какая-либо очистка, все данные теряются (вы не копируете дескриптор явно, так что это может произойти)
  2. ваша ошибка, по-видимому, связана с тем, где вы извлекаете hProcess, и в этом случае вам следует проверитьGetLastError, чтобы увидеть, почему его ошибка
0 голосов
/ 13 августа 2010

Вы должны позвонить GetProcessId вместо HandleToULong.Вам нужен идентификатор процесса, а не дескриптор, преобразованный в длинную без знака

...