看windows api的時候,作爲練習,編寫了個刪除進程的程序。覺得裏面知識點挺多的,所以貼上來當個筆記用。當然難免有錯誤,歡迎指教 ^^
其中也用到了上篇文章裏面說到的調整權限的函數,於是就直接從關機程序裏面copy過來了。下面是程序,關鍵地方給了註釋。
#include<stdio.h>
#include<windows.h>
#include<Tlhelp32.h>
void ListProcess() //列出進程名稱及ID
{
HANDLE hProcessSnap=NULL;
PROCESSENTRY32 pe32={0}; //存放進程信息的結構體
hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //創建系統所有進程的快照
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot failed: %d\n",GetLastError());
return;
}
pe32.dwSize=sizeof(PROCESSENTRY32);
printf("ProcessName ProcessID\n");
if(Process32First(hProcessSnap,&pe32)) //指向第一個進程,並將其放入PROCESSENTRY32結構體中
{
char c[5];
do
{
itoa(pe32.th32ProcessID,c,10);
printf("%-30s%d\n",pe32.szExeFile,pe32.th32ProcessID); //szExeFile爲進程的可執行文件名稱
}
while(Process32Next(hProcessSnap,&pe32));
}
else
{
printf("Process32First() failed:%d\n",GetLastError());
}
CloseHandle(hProcessSnap);
return;
}
BOOL EnablePrivilege() //獲取系統權限
{
HANDLE hProcess = NULL;
HANDLE hToken = NULL;
LUID uID = {0};
TOKEN_PRIVILEGES stToken_Privileges = {0};
hProcess = GetCurrentProcess(); //獲取當前應用程序進程句柄
if(!OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken)) //打開當前進程的訪問令牌句柄
//(OpenProcessToken函數調用失敗返回值爲零)
return FALSE;
if(!LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&uID)) //獲取權限名稱爲"SeShutdownPrivilege"的LUID
//LookupPrivilegeValue函數調用失敗返回值爲零
return FALSE;
stToken_Privileges.PrivilegeCount = 1; //欲調整的權限個數
stToken_Privileges.Privileges[0].Luid = uID; //權限的LUID
stToken_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //權限的屬性,
//SE_PRIVILEGE_ENABLED爲使能該權限
//調整訪問令牌裏的指定權限(AdjustTokenPrivileges函數調用失敗返回值爲零)
if(!AdjustTokenPrivileges(hToken,FALSE,&stToken_Privileges,sizeof stToken_Privileges,NULL,NULL))
return FALSE;
if(GetLastError() != ERROR_SUCCESS) //查看權限是否調整成功
return FALSE;
CloseHandle(hToken);
return TRUE;
}
bool KillProcess(DWORD id)
{
HANDLE hProcess=NULL,hProcessToken=NULL;
bool isKilled=false,bRet=false;
EnablePrivilege(); //調整權限
printf("Enable Privilege OK!\n");
if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,id))==NULL) //打開進程獲得句柄
{
printf("Open process %d failed: %d\n",id,GetLastError());
return false;
}
if(!TerminateProcess(hProcess,1)) //終結進程
{
printf("TerminateProcess failed: %d\n",GetLastError());
return false;
}
isKilled=true;
if(hProcessToken!=NULL)
CloseHandle(hProcessToken);
if(hProcess!=NULL)
CloseHandle(hProcess);
return isKilled;
}
void main()
{
int id=0;
ListProcess();
while(1)
{
printf("選擇要刪除的進程ID:");
scanf("%d",&id);
if(KillProcess(id)==true)
{
system("cls");
ListProcess();
}
else
printf("Failed!!");
}
}
練習編的一個刪除進程的小程序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
android的線程和進程
尋夢緣2008
2019-02-23 13:56:51
系統常見系統進程文件
soda119
2019-02-23 13:17:01
關於System Volume Information佔用的大量磁盤空間
781732825
2019-02-23 13:39:40
oracle刪除及導入數據庫
曉竹
2019-02-23 13:35:55
恢復FAT16文件—誤刪除
zhanglong0123
2019-02-23 13:27:42
域內有個病毒,是由X軟件生成的,怎麼刪除?
Hack38
2019-02-23 13:22:24
linux學習筆記-基礎部分
zyos
2019-02-23 13:43:17
Windows 7 安裝時候提示,無法更改啓動項安裝失敗,以及msr分區
781732825
2019-02-23 13:39:40
獲取程序路徑的方法.\\,GetCurrentDirectory與GetModuleFileName的區別
小顏
2019-02-23 13:29:34
linux Nginx+Php+Mysql+mssql動靜頁面分離
wlzxzxw
2019-02-23 13:28:10
Linux 程序包管理
qq_tang
2019-02-23 13:27:08
卡巴斯基稱圖片會捆綁惡意程序 危害非常嚴重
GABY0625
2019-02-23 13:23:27