#ifndef __PSLIB_H__ #define __PSLIB_H__ DWORD WINAPI GetProcessName(DWORD dwProcessId, LPTSTR pszName, DWORD nSize, BOOL bFullPath); #endif // __PSLIB_H__
实现为:
#include <windows.h>
#include <tlhelp32.h>
#include <psapi.h>
// For _tcsrchr()
#include <stdlib.h>
#include <tchar.h>
#include "pslib.h"
// For Windows 9x series
typedef HANDLE (WINAPI * fnCreateToolhelp32Snapshot)(DWORD dwFlags, DWORD th32ProcessID);
typedef BOOL (WINAPI * fnProcess32First)(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
typedef BOOL (WINAPI * fnProcess32Next)(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
typedef BOOL (WINAPI * fnThread32First)(HANDLE hSnapshot, LPTHREADENTRY32 lpte);
typedef BOOL (WINAPI * fnThread32Next)(HANDLE hSnapshot, LPTHREADENTRY32 lpte);
// For Windows NT series
typedef BOOL (WINAPI * fnEnumProcessModules)(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded);
typedef DWORD (WINAPI * fnGetModuleBaseName)(HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
typedef DWORD (WINAPI * fnGetModuleFileNameEx)(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize);
#define DECL_PFUNC(f) static fn##f my##f = NULL
DECL_PFUNC(CreateToolhelp32Snapshot);
DECL_PFUNC(Process32First);
DECL_PFUNC(Process32Next);
// DECL_PFUNC(Thread32First);
// DECL_PFUNC(Thread32Next);
DECL_PFUNC(EnumProcessModules);
DECL_PFUNC(GetModuleBaseName);
DECL_PFUNC(GetModuleFileNameEx);
#undef DECL_PFUNC
#ifdef UNICODE
#define TAIL_CHAR TEXT("W")
#else
#define TAIL_CHAR TEXT("A")
#endif // !UNICODE
static void GetSnapshotFunctions()
{
HINSTANCE hKernel32 = GetModuleHandle(TEXT("Kernel32.dll"));
#define GET_KERNEL_FUNCTION(f) if(my##f == NULL) my##f = (fn##f)GetProcAddress(hKernel32, #f)
GET_KERNEL_FUNCTION(CreateToolhelp32Snapshot);
GET_KERNEL_FUNCTION(Process32First);
GET_KERNEL_FUNCTION(Process32Next);
// GET_KERNEL_FUNCTION(Thread32First);
// GET_KERNEL_FUNCTION(Thread32Next);
#undef GET_KERNEL_FUNCTION
}
static void GetPsapiFunctions()
{
HINSTANCE hPsapi = GetModuleHandle(TEXT("psapi.dll"));
if(hPsapi == NULL)
hPsapi = LoadLibrary(TEXT("psapi.dll"));
#define GET_PSAPI_FUNCTION(f) if(my##f == NULL) my##f = (fn##f)GetProcAddress(hPsapi, #f)
#define GET_PSAPI_FUNCTION_T(f) if(my##f == NULL) my##f = (fn##f)GetProcAddress(hPsapi, #f ##TAIL_CHAR)
GET_PSAPI_FUNCTION(EnumProcessModules);
GET_PSAPI_FUNCTION_T(GetModuleBaseName);
GET_PSAPI_FUNCTION_T(GetModuleFileNameEx);
#undef GET_KERNEL_FUNCTION
#undef GET_KERNEL_FUNCTION_T
}
DWORD WINAPI GetProcessName(DWORD dwProcessId, LPTSTR pszName, DWORD nSize, BOOL bFullPath)
{
BOOL bWindows9x = (HIWORD(GetVersion()) & 0x8000);
if(bWindows9x)
{
GetSnapshotFunctions();
// Take a snapshot of all processes in the system.
HANDLE hProcessSnap = myCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
return 0;
DWORD dwRet = 0;
// Retrieve information
PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
if(myProcess32First(hProcessSnap, &pe32))
{
do
{
if(pe32.th32ProcessID == dwProcessId)
{
LPTSTR pszExeFile = pe32.szExeFile;
if(!bFullPath)
{
pszExeFile = _tcsrchr(pe32.szExeFile, _T('//'));
if(pszExeFile)
pszExeFile++;
}
lstrcpyn(pszName, pszExeFile, nSize);
dwRet = lstrlen(pszName) + 1;
break;
}
} while(myProcess32Next(hProcessSnap, &pe32));
}
CloseHandle(hProcessSnap); // Must clean up the snapshot object!
return dwRet;
}
else
{
GetPsapiFunctions();
// Get a handle to the process.
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId);
// Get the process name.
if(hProcess == NULL)
return 0;
HMODULE hMod;
DWORD cb;
BOOL bRet = myEnumProcessModules(hProcess, &hMod, sizeof(hMod), &cb);
if(bRet)
{
if(bFullPath)
cb = myGetModuleFileNameEx(hProcess, hMod, pszName, nSize);
else
cb = myGetModuleBaseName(hProcess, hMod, pszName, nSize);
}
CloseHandle(hProcess);
return bRet ? cb : 0;
}
}
362





