您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:33 来源:vckbase.com

本文章共1748字,分2页,当前第1页,快速翻页:
 

如何在NT下获取进程的路径(增补)
——获取NT中系统进程的路径

天津 赵春生

下载源代码
逆风编程技术

一、程序说明

  最近整理文档,发现以前写的《如何在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

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

}       
 
本文章更多内容1 - 2 - 下一页>>
相关文章

高效开发与彻底测试
对话框模板,RegexTest
在MDI程序中实现类似WPS2000的文件切换标签
用DirectShow抓取影片帧
用微软的实时通信API集成丰富的客户端通信
盗QQ,我也会
对《一个完善的ODBC数据库程序》一文的补充
Python 的数据库操作
类似 MSN 信息发送框的制作(上)
阻止全局钩子的加载
在MFC中用正则表达式对窗体进行有效性验证
对《一个简单的学生成绩管理系统》优化的一
深入浅出 CPropertySheet
实现类似Excel和Visual C 里文件夹式样的标
利用OpenGL实现动画效果
一个简单的时钟程序
一个完善的ODBC数据库程序
如何定制浮动工具条
一步步制作真彩工具条
自动查找并删除VC生成的临时文件

相关评论


本文章所属分类:首页 VC++

  热门关键字: