您所在的位置: 首页 > 操作系统 > Windows >

获取NT中系统进程的路径

http://os.51cto.com  2005-12-08 13:48    51CTO.com整理  我要评论(0)
  • 摘要:本文介绍如何获取NT中系统进程的路径的代码实例
  • 标签:系统  

程序说明

自定义了一个函数,用来赋予进程指定的权限(本例为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) );
}

以上代码在Win2000P+SP4 + VC6+SP6测试通过。


系统应用日志分析管理
网络管理系统如何支撑ITSM
企业Web安全威胁在线评估系统
赛门铁克诺顿误杀Windows系统文件 导致百万系统崩溃
Windows系统加固专题
 
 验证码: (点击刷新验证码)   匿名发表
  • .NET程序员面试指南

  • 作者:朱毅
  • 本书着重针对.NET技术职位的应聘者,在.NET框架各个技术类别中,选取最常出现在.NET面试中的问题,进行分析和解答,同时解释和..
Copyright©2005-2008 51CTO.COM 版权所有