Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8194713
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-03-14 15:28:12

下载本文示例代码
一、程序说明

  最近整理文档,发现以前写的《如何在NT下获取进程的路径》一文中还有个问题没有解决:原文中的程序无法获取系统进程的路径,如:csrss.exe。记得VCKBASE上有位网友说过一个方法:“给枚举的进程增加SE_DEBUG_NAME权限即可”,于是在网上找了些资料,解决了原文中的问题。这里要特别感谢那位名叫rovershen的网友!

我自定义了一个函数,用来赋予进程指定的权限(本例为SE_DEBUG_NAME):
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) );
 
}  
  通过OpenProcessToken函数获得进程(本例为自身进程)访问令牌的句柄,然后调用此函数后就可以像原文那样打开目标进程获取路径了。可以看到:本方法已经成功获取了系统进程csrss.exe的路径。

二、具体实践
//////////////////////////////////////////////
/ * ShowProcessPath 2.0
 * 版权所有 (C) 2005 赵春生
 * 2005.09.02
 * 
 * 
 * 本程序适用于:WinNT
 * 代码在Win2000P+SP4 + VC6+SP6测试通过
*/
//////////////////////////////////////////////

#include 
#include 
#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三、以上代码在Win2000P+SP4 + VC6+SP6测试通过。

源码可从我的个人主页下载。
下载本文示例代码
阅读(710) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~