0

ブローディテール付きの機能があります。

typedef 部分

   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);
}

function を呼び出すとGetProcessName、これはプロセス名を返す必要がありますが、それは??? いつでも。たとえば、この関数を PID で直接呼び出しますGetProcessName(2018,szProcessName,MAX_PATH);。たとえば、2018年はpidであり、機能します。HandleToULong(hProcess) が機能しない理由がわかりません。私hProcessは確かにハンドルタイプでなければなりません。どうすればこの問題を解決できますか?

4

4 に答える 4

1

char name [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;

于 2011-01-26T15:09:36.010 に答える
0

GetProcessIdではなく呼び出す必要がありますHandleToULong。ハンドルを unsigned-long に変換するのではなく、プロセス ID が必要です

于 2010-08-13T07:30:48.233 に答える
0

In Windows, a process ID is different from a process handle. You are taking the process handle in Hook_TerminateProcess and passing it into GetProcessName as a process ID. This will never work.

You should refactor GetProcessName to take a handle and then have an overload that takes a process ID. The process ID overload does the OpenProcess work to convert it into a handle and the CloseHandle work to clean it up.

After the refactoring, you'll have two methods:

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. How can you terminate the process then expect the handle to still be valid? cause if any clean up is performed, all data is lost(you don't explicitly copy the handle, so this can happen)
  2. your error seems to stem from where your retrieving hProcess, in which case you should check GetLastError to see why its failing
于 2010-08-13T07:33:05.737 に答える