日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Win 2000下的進(jìn)程枚舉( 二 )


SE_CREATE_PERMANENT_NAME SeCreatePermanentPrivilege
SE_BACKUP_NAME SeBackupPrivilege
SE_RESTORE_NAME SeRestorePrivilege
SE_SHUTDOWN_NAME SeShutdownPrivilege
SE_DEBUG_NAME SeDebugPrivilege
SE_AUDIT_NAME SeAuditPrivilege
SE_SYSTEM_ENVIRONMENT_NAME SeSystemEnvironmentPrivilege
SE_CHANGE_NOTIFY_NAME SeChangeNotifyPrivilege
SE_REMOTE_SHUTDOWN_NAME SeRemoteShutdownPrivilege
ADMINISTRATOR 被默認(rèn)授于以下這16個權(quán)限:
SeChangeNotifyPrivilege
SeSecurityPrivilege
SeBackupPrivilege
SeRestorePrivilege
SeSystemtimePrivilege
SeShutdownPrivilege
SeRemoteShutdownPrivilege
SeTakeOwnershipPrivilege
SeDebugPrivilege
SeSystemEnvironmentPrivilege
SeSystemProfilePrivilege
SeProfileSingleProcessPrivilege
SeIncreaseBasePriorityPrivilege
SeLoadDriverPrivilege
SeCreatePagefilePrivilege
SeIncreaseQuotaPrivilege
可以用 OpenProcessToken 和 AdjustTokenPrivileges 這兩個函數(shù)來提升進(jìn)程的特權(quán) 。

講了那么多,現(xiàn)在回到主題上來 。到底使用哪個方法比較好呢?在 win 2000 下有3個方法可供選擇,我比較喜歡簡單的方法 。NtQuerySystemInformation 功能固然強(qiáng)大,但使用比較麻煩 。而 win 2000 的 TOOLHELP32 API 其本質(zhì)還是調(diào)用了 NtQuerySystemInformation 函數(shù),由于它發(fā)生錯誤時,可能不能正確返回返回值,所以不是很穩(wěn)定,使用起來也是很麻煩的,不符合我的懶人本性 。還是采用 PSAPI 比較好,簡單又方便,只需要三個函數(shù),且沒有復(fù)雜的結(jié)構(gòu)體參數(shù) 。
函數(shù)原型:
BOOL
WINAPI
EnumProcesses(
DWord * lpidProcess,//指針指向存放進(jìn)程ID的數(shù)組
DWORD cb, //數(shù)組大小
DWORD * cbNeeded //返回的實際大小
);
BOOL
WINAPI
EnumProcessModules(
HANDLE hProcess, //進(jìn)程句柄
HMODULE *lphModule, //指針指向存放模塊句柄的數(shù)組
DWORD cb, //數(shù)組大小
LPDWORD lpcbNeeded //返回的實際大小
);
DWORD
WINAPI
GetModuleFileNameEx(
HANDLE hProcess, //進(jìn)程句柄
HMODULE hModule, //模塊句柄
LPSTR lpFilename, //存放模塊文件名的字符串
DWORD nSize //字符串大小
);
 他們的作用分別是:枚舉進(jìn)程,枚舉進(jìn)程模塊,獲取模塊文件名(包含路徑) 。詳細(xì)的源代碼如下:

// EnumProcess.cpp : Defines the entry point for the console application.
// Code By : tabris17
#include "stdafx.h"
#include "Psapi.h"
#pragma comment (lib,"Psapi.lib")
void PrintFileName(DWORD processID)
{
char fn[MAX_PATH];
HANDLE hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,processID);
if (hProcess)
{
HMODULE hMod[1024];
DWORD cbNeeded,size;
unsigned int i;
if (EnumProcessModules(hProcess,hMod,sizeof(hMod),&cbNeeded))
{
size=cbNeeded/sizeof(HMODULE);
GetModuleFileNameEx(hProcess,hMod[0],fn,sizeof(fn));
printf("n(\u)t%sn",processID,fn);
for(i=1;i<size;i)
{
GetModuleFileNameEx(hProcess,hMod[i],fn,sizeof(fn));
printf("t%sn",fn);
}
}
}
CloseHandle(hProcess);
}
int plist()
{
DWORD Processesid[1024], cbNeeded,size;
unsigned int i;
if (!EnumProcesses(Processesid,sizeof(Processesid),&cbNeeded))
return 0;
size=cbNeeded/sizeof(DWORD);
for (i=0;i<size;i)
PrintFileName(Processesid[i]);
return 0;
}
int main(int argc, char* argv[])
{
plist();
return 0;
}

推薦閱讀