天天看點

VC 查找程序,關閉程序

大 中 小

//

// FindProcess

// 這個函數唯一的參數是你指定的程序名,如:你的目标程序

// 是 "Notepad.exe",傳回值是該程序的ID,失敗傳回0

DWORD FindProcess(char *strProcessName)

{

    DWORD aProcesses[1024], cbNeeded, cbMNeeded;

    HMODULE hMods[1024];

    HANDLE hProcess;

    char szProcessName[MAX_PATH];

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )  return 0;

    for(int i=0; i< (int) (cbNeeded / sizeof(DWORD)); i++)

    {

        //_tprintf(_T("%d\t"), aProcesses[i]);

        hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);

        EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbMNeeded);

        GetModuleFileNameEx( hProcess, hMods[0], szProcessName,sizeof(szProcessName));

        if(strstr(szProcessName, strProcessName))

        {

            //_tprintf(_T("%s;"), szProcessName);

            return(aProcesses[i]);

        }

        //_tprintf(_T("\n"));

    }

    return 0;

}

// Function: ErrorForce

// 此函數中用上面的 FindProcess 函數獲得你的目标程序的ID

// 用WIN API OpenPorcess 獲得此程序的句柄,再以TerminateProcess

// 強制結束這個程序

VOID KillProcess()

    // When the all operation fail this function terminate the "winlogon" Process for force exit the system.

    HANDLE hYourTargetProcess = OpenProcess(PPROCESS_TERMINATE|ROCESS_QUERY_INFORMATION |   // Required by Alpha

         PROCESS_CREATE_THREAD     |   // For CreateRemoteThread

         PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx

         PROCESS_VM_WRITE,             // For WriteProcessMemory

         FALSE, FindProcess("YourTargetProcess.exe"));

    if(hYourTargetProcess == NULL)

        return;

    TerminateProcess(hYourTargetProcess, 0);

    return;

// GetDebugPriv

// 在 Windows NT/2000/XP 中可能因權限不夠導緻以上函數失敗

// 如以 System 權限運作的系統程序,服務程序

// 用本函數取得 debug 權限即可,Winlogon.exe 都可以終止哦 :)

BOOL GetDebugPriv()

 HANDLE hToken;

 LUID sedebugnamue;

 TOKEN_PRIVILEGES tkp;

 if ( ! OpenProcessToken( GetCurrentProcess(),

  TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )

  return FALSE;

 if ( ! LookupPrivilegue( NULL, SE_DEBUG_NAME, &sedebugnamue ) )

 {

  CloseHandle( hToken );

 }

 tkp.PrivilegeCount = 1;

 tkp.Privileges[0].Luid = sedebugnamue;

 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

 if (!AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )

        CloseHandle( hToken );

        return FALSE;

    return TRUE;

以上三個函數使用前先#include "Psapi.h"

然後SETTING->LINK 裡添加Psapi.lib即可。。。。。

繼續閱讀