如何在NT下获取进程的路径(增补)
2007-08-30 06:26
246 查看
[align=center]如何在NT下获取进程的路径——获取NT中系统进程的路径
[/align]
[align=center]整理:Ackarlix[/align]
[align=left]下载源代码
一、程序说明
最近整理文档,发现以前写的《如何在NT下获取进程的路径》一文中还有个问题没有解决:原文中的程序无法获取系统进程的路径,如:csrss.exe。记得VCKBASE上有位网友说过一个方法:“给枚举的进程增加SE_DEBUG_NAME权限即可”,于是在网上找了些资料,解决了原文中的问题。这里要特别感谢那位名叫rovershen的网友!
我自定义了一个函数,用来赋予进程指定的权限(本例为SE_DEBUG_NAME):[/align]
[align=left]BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)[/align]
[align=left]{[/align]
[align=left] [/align]
[align=left] TOKEN_PRIVILEGES tkp;[/align]
[align=left] [/align]
[align=left] LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限[/align]
[align=left] tkp.PrivilegeCount=1;[/align]
[align=left] tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;[/align]
[align=left] AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限[/align]
[align=left] [/align]
[align=left] return( (GetLastError()==ERROR_SUCCESS) );[/align]
[align=left] [/align]
[align=left]} [/align]
[align=left] 通过OpenProcessToken函数获得进程(本例为自身进程)访问令牌的句柄,然后调用此函数后就可以像原文那样打开目标进程获取路径了。可以看到:本方法已经成功获取了系统进程csrss.exe的路径。
二、具体实践[/align]
[align=left]//////////////////////////////////////////////[/align]
[align=left]/ * ShowProcessPath 2.0[/align]
[align=left] * 版权所有 (C) 2005 赵春生[/align]
[align=left] * 2005.09.02[/align]
[align=left] * http://timw.yeah.net[/align] [align=left] * http://timw.126.com[/align] [align=left] * 本程序适用于:WinNT[/align]
[align=left] * 代码在Win2000P+SP4 + VC6+SP6测试通过[/align]
[align=left]*/[/align]
[align=left]//////////////////////////////////////////////[/align]
[align=left] [/align]
[align=left]#include <stdio.h>[/align]
[align=left]#include <windows.h>[/align]
[align=left]#include "PSAPI.H"[/align]
[align=left]#pragma comment( lib, "PSAPI.LIB" )[/align]
[align=left] [/align]
[align=left]//自定义函数:赋予指定特权。这里用来提升程序权限。[/align]
[align=left]BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);[/align]
[align=left] [/align]
[align=left]int main(void)[/align]
[align=left]{ [/align]
[align=left] DWORD processid[1024],needed,processcount,i;[/align]
[align=left] HANDLE hProcess;[/align]
[align=left] HMODULE hModule;[/align]
[align=left] char path[MAX_PATH] = "",temp[256];[/align]
[align=left] [/align]
[align=left] HANDLE hToken;[/align]
[align=left] [/align]
[align=left] printf("ShowProcessPath 2.0 with [Process Status API]/n/n");[/align]
[align=left] [/align]
[align=left] if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )[/align]
[align=left] {[/align]
[align=left] if (EnablePrivilege(hToken,SE_DEBUG_NAME))[/align]
[align=left] {[/align]
[align=left] [/align]
[align=left] EnumProcesses(processid, sizeof(processid), &needed);[/align]
[align=left] processcount=needed/sizeof(DWORD);[/align]
[align=left] [/align]
[align=left] for (i=0;i<processcount;i++)[/align]
[align=left] {[/align]
[align=left] hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,[/align]
[align=left] false,[/align]
[align=left] processid[i]);[/align]
[align=left] if (hProcess)[/align]
[align=left] {[/align]
[align=left] EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);[/align]
[align=left] GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));[/align]
[align=left] GetShortPathName(path,path,256);[/align]
[align=left] itoa(processid[i],temp,10);[/align]
[align=left] printf("%s --- %s/n",path,temp);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] printf("Failed!!!/n");[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] CloseHandle(hProcess);[/align]
[align=left] CloseHandle(hModule);[/align]
[align=left] [/align]
[align=left] itoa(processcount,temp,10);[/align]
[align=left] printf("/nProcess Count:%s/n/n",temp);[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]//////////////////////////////////////////////////////////////////////[/align]
[align=left] [/align]
[align=left]BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)[/align]
[align=left]{ [/align]
[align=left] TOKEN_PRIVILEGES tkp;[/align]
[align=left] [/align]
[align=left] LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限[/align]
[align=left] tkp.PrivilegeCount=1;[/align]
[align=left] tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;[/align]
[align=left] AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限[/align]
[align=left] [/align]
[align=left] return( (GetLastError()==ERROR_SUCCESS) ); [/align]
[align=left]} [/align]
三、以上代码在Win2000P+SP4 + VC6+SP6测试通过。
源码可从我的个人主页下载。 http://timw.yeah.net http://timw.126.com
[/align]
[align=center]整理:Ackarlix[/align]
[align=left]下载源代码
一、程序说明
最近整理文档,发现以前写的《如何在NT下获取进程的路径》一文中还有个问题没有解决:原文中的程序无法获取系统进程的路径,如:csrss.exe。记得VCKBASE上有位网友说过一个方法:“给枚举的进程增加SE_DEBUG_NAME权限即可”,于是在网上找了些资料,解决了原文中的问题。这里要特别感谢那位名叫rovershen的网友!
我自定义了一个函数,用来赋予进程指定的权限(本例为SE_DEBUG_NAME):[/align]
[align=left]BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)[/align]
[align=left]{[/align]
[align=left] [/align]
[align=left] TOKEN_PRIVILEGES tkp;[/align]
[align=left] [/align]
[align=left] LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限[/align]
[align=left] tkp.PrivilegeCount=1;[/align]
[align=left] tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;[/align]
[align=left] AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限[/align]
[align=left] [/align]
[align=left] return( (GetLastError()==ERROR_SUCCESS) );[/align]
[align=left] [/align]
[align=left]} [/align]
[align=left] 通过OpenProcessToken函数获得进程(本例为自身进程)访问令牌的句柄,然后调用此函数后就可以像原文那样打开目标进程获取路径了。可以看到:本方法已经成功获取了系统进程csrss.exe的路径。
二、具体实践[/align]
[align=left]//////////////////////////////////////////////[/align]
[align=left]/ * ShowProcessPath 2.0[/align]
[align=left] * 版权所有 (C) 2005 赵春生[/align]
[align=left] * 2005.09.02[/align]
[align=left] * http://timw.yeah.net[/align] [align=left] * http://timw.126.com[/align] [align=left] * 本程序适用于:WinNT[/align]
[align=left] * 代码在Win2000P+SP4 + VC6+SP6测试通过[/align]
[align=left]*/[/align]
[align=left]//////////////////////////////////////////////[/align]
[align=left] [/align]
[align=left]#include <stdio.h>[/align]
[align=left]#include <windows.h>[/align]
[align=left]#include "PSAPI.H"[/align]
[align=left]#pragma comment( lib, "PSAPI.LIB" )[/align]
[align=left] [/align]
[align=left]//自定义函数:赋予指定特权。这里用来提升程序权限。[/align]
[align=left]BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);[/align]
[align=left] [/align]
[align=left]int main(void)[/align]
[align=left]{ [/align]
[align=left] DWORD processid[1024],needed,processcount,i;[/align]
[align=left] HANDLE hProcess;[/align]
[align=left] HMODULE hModule;[/align]
[align=left] char path[MAX_PATH] = "",temp[256];[/align]
[align=left] [/align]
[align=left] HANDLE hToken;[/align]
[align=left] [/align]
[align=left] printf("ShowProcessPath 2.0 with [Process Status API]/n/n");[/align]
[align=left] [/align]
[align=left] if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )[/align]
[align=left] {[/align]
[align=left] if (EnablePrivilege(hToken,SE_DEBUG_NAME))[/align]
[align=left] {[/align]
[align=left] [/align]
[align=left] EnumProcesses(processid, sizeof(processid), &needed);[/align]
[align=left] processcount=needed/sizeof(DWORD);[/align]
[align=left] [/align]
[align=left] for (i=0;i<processcount;i++)[/align]
[align=left] {[/align]
[align=left] hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,[/align]
[align=left] false,[/align]
[align=left] processid[i]);[/align]
[align=left] if (hProcess)[/align]
[align=left] {[/align]
[align=left] EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);[/align]
[align=left] GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));[/align]
[align=left] GetShortPathName(path,path,256);[/align]
[align=left] itoa(processid[i],temp,10);[/align]
[align=left] printf("%s --- %s/n",path,temp);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] printf("Failed!!!/n");[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] CloseHandle(hProcess);[/align]
[align=left] CloseHandle(hModule);[/align]
[align=left] [/align]
[align=left] itoa(processcount,temp,10);[/align]
[align=left] printf("/nProcess Count:%s/n/n",temp);[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]//////////////////////////////////////////////////////////////////////[/align]
[align=left] [/align]
[align=left]BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)[/align]
[align=left]{ [/align]
[align=left] TOKEN_PRIVILEGES tkp;[/align]
[align=left] [/align]
[align=left] LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限[/align]
[align=left] tkp.PrivilegeCount=1;[/align]
[align=left] tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;[/align]
[align=left] AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限[/align]
[align=left] [/align]
[align=left] return( (GetLastError()==ERROR_SUCCESS) ); [/align]
[align=left]} [/align]
三、以上代码在Win2000P+SP4 + VC6+SP6测试通过。
源码可从我的个人主页下载。 http://timw.yeah.net http://timw.126.com
相关文章推荐
- 如何在NT下获取进程的路径
- 如何在NT下获取进程的路径
- Linux下程序(进程)如何获取自身的绝对路径
- 如何获取进程/目标对象的全路径?
- 如何获取linux进程的执行文件路径
- 获取NT中系统进程的路径
- SWT/Jface 如何获取、使用相对路径的图片?
- 【VB.NET2010】遍历进程,获取进程映像路径
- 如何获取项目中文件的路径
- 多进程如何获取进程的返回值?用get函数,apply_async()
- 有关从完整路径中如何获取文件名
- 获取进程全路径
- Linux 下当前可执行文件如何获取自身文件名与全路径<转>
- WinCE下如何获取进程所在的目录
- 如何根据进程id获取该进程的主窗口句柄
- 在MFC中如何获取文件和文件夹的路径
- 64位系统下C++获取当前所有进程的完整路径
- Android如何获取assets或者raw目录的视频文件路径播放视频
- 内核中获取进程路径学习