0

我有一个带有打击细节的功能。

类型定义部分

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

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

/// 获取进程名称函数

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 是一个 pid,它可以工作。我不知道为什么 HandleToULong(hProcess) 不起作用。我hProcess现在肯定是手柄类型我怎么解决这个问题?

4

4 回答 4

1

字符名称[MAX_PATH * 2] = "\0", *p;

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

p = 名称 + strlen(名称) - 1;

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

p++;

std::cout << p << std::endl;

于 2011-01-26T15:09:36.010 回答
0

您必须调用GetProcessId而不是HandleToULong. 您需要一个进程 ID,而不是句柄转换为无符号长

于 2010-08-13T07:30:48.233 回答
0

在 Windows 中,进程 ID 与进程句柄不同。您正在获取进程句柄Hook_TerminateProcess并将其GetProcessName作为进程 ID 传递。这永远不会奏效。

您应该重构GetProcessName以获取句柄,然后使用进程 ID 进行重载。进程 ID 重载OpenProcess负责将其转换为句柄并CloseHandle进行清理。

重构后,您将有两种方法:

void GetProcessName(HANDLE hProcess, PTSTR szProcessName, size_t cchSize);
void GetProcessName(DWORD PID, PTSTR szProcessName, size_t cchSize);
于 2010-08-13T07:32:27.920 回答
0
  1. 如何终止进程然后期望句柄仍然有效?导致如果执行任何清理,所有数据都会丢失(您没有显式复制句柄,因此可能会发生这种情况)
  2. 您的错误似乎源于您检索 hProcess 的位置,在这种情况下,您应该检查 GetLastError 以了解其失败的原因
于 2010-08-13T07:33:05.737 回答