gusucode.com > 如何在NT下获取进程的路径(增补)C#源码程序 > 如何在NT下获取进程的路径(增补)/showprocesspath2/ShowProcessPath2.cpp

    
/*
 *	ShowProcessPath 2.0
 *	版权所有 (C) 2005 赵春生
 *	2005.09.02
 *	http://timw.yeah.net
 *	http://timw.126.com
 *	本程序适用于:WinNT
 *	代码在Win2000P+SP4 + VC6+SP6测试通过
*/

#include <stdio.h>
#include <windows.h>
#include "PSAPI.H"
#pragma comment( lib, "PSAPI.LIB" )

//自定义函数:赋予指定特权。这里用来提升程序权限。
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);

int main(void)
{
	
	DWORD processid[1024],needed,processcount,i;
	HANDLE hProcess;
	HMODULE hModule;
	char path[MAX_PATH] = "",temp[256];
	
	HANDLE hToken;
	
	printf("ShowProcessPath 2.0 with [Process Status API]\n\n");
	
	if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
	{
		if (EnablePrivilege(hToken,SE_DEBUG_NAME))
		{
			
			EnumProcesses(processid, sizeof(processid), &needed);
			processcount=needed/sizeof(DWORD);
			
			for (i=0;i<processcount;i++)
			{
				hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);
				if (hProcess)
				{
					EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
					GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
					GetShortPathName(path,path,256);
					itoa(processid[i],temp,10);
					printf("%s --- %s\n",path,temp);
				}
				else
					printf("Failed!!!\n");
			}
		}
	}
	
	CloseHandle(hProcess);
	CloseHandle(hModule);
	
	itoa(processcount,temp,10);
	printf("\nProcess Count:%s\n\n",temp);
	
	return 0;
}

//////////////////////////////////////////////////////////////////////

BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
{
	
	TOKEN_PRIVILEGES tkp;
	
	LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
	tkp.PrivilegeCount=1;
	tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
	AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
	
	return( (GetLastError()==ERROR_SUCCESS) );
	
}

//////////////////////////////////////////////////////////////////////