練習編的一個刪除進程的小程序

看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!!");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章