您的位置:首页 > 编程语言 > C语言/C++

C++进程检测,发现进程路径,关闭进程(一)

2014-12-14 18:49 190 查看
#include "stdafx.h"

#include <windows.h>

#include "stdio.h"

#include <tlhelp32.h>

#include "Psapi.h"

BOOL DosPathToNtPath(LPTSTR pszDosPath, LPTSTR pszNtPath)  

{  

    TCHAR           szDriveStr[500];  

    TCHAR           szDrive[3];  

    TCHAR           szDevName[100];  

    INT             cchDevName;  

    INT             i;  

      

    //检查参数  

    if(!pszDosPath || !pszNtPath )  

        return FALSE;  

  

    //获取本地磁盘字符串  

    if(GetLogicalDriveStrings(sizeof(szDriveStr), szDriveStr))  //"szDriveStr包含各个分区c:\\, d:\\, e:\\, f:\\"

    {  

        for(i = 0; szDriveStr[i]; i += 4)  

        {  

            if(!lstrcmpi(&(szDriveStr[i]), _T("A:\\")) || !lstrcmpi(&(szDriveStr[i]), _T("B:\\")))  

                continue;  

  

            szDrive[0] = szDriveStr[i];  

            szDrive[1] = szDriveStr[i + 1];  

            szDrive[2] = '\0';  

            if(!QueryDosDevice(szDrive, szDevName, 100))//查询 Dos 设备,并给szDevName赋值为:\\Device\\HarddiskVolume2

                return FALSE;  

  

            cchDevName = lstrlen(szDevName);  

            if(_tcsnicmp(pszDosPath, szDevName, cchDevName) == 0)//命中  

            {  

                lstrcpy(pszNtPath, szDrive);//复制驱动器  

                lstrcat(pszNtPath, pszDosPath + cchDevName);//复制路径  

  

                return TRUE;  

            }             

        }  

    }  

  

    lstrcpy(pszNtPath, pszDosPath);  

      

    return FALSE;  

}  

BOOL GetProcessFullPath(DWORD dwPID, TCHAR pszFullPath[MAX_PATH])  

{  

    TCHAR       szImagePath[MAX_PATH];  

    HANDLE      hProcess;  

      

    if(!pszFullPath)  

        return FALSE;  

      

    pszFullPath[0] = '\0';  

    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID);  

    if(!hProcess)  

        return FALSE;  

  

    if(!GetProcessImageFileName(hProcess, szImagePath, MAX_PATH))  //获取进程路径名(包含设备地址)\\Device\\HarddiskVolume2\\Program files\\**

    {  

        CloseHandle(hProcess);  

        return FALSE;  

    }  

  

    if(!DosPathToNtPath(szImagePath, pszFullPath))  //将路径名从包含设备地址的字符串中提取出来

    {  

        CloseHandle(hProcess);  

        return FALSE;  

    }  

  

    CloseHandle(hProcess);  

  

    return TRUE;  

}  

int _tmain(int argc, _TCHAR* argv[])

{

int num=0;
TCHAR exe_name[20]=_T("notepad++.exe");//要查询的进程名
TCHAR pszFullPath[MAX_PATH];

PROCESSENTRY32 pe32;//用于存放进程信息的结构体
HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//创建进程快照

pe32.dwSize=sizeof(pe32);

if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot failed!\n");
return -1;
}

BOOL bMore=::Process32First(hProcessSnap,&pe32);//获取第一个进程信息到pe32结构体中

while(bMore)
{
printf("name is: %ls\n",pe32.szExeFile);

printf("num is: %d\n",num);
printf("ID is: %d\n",pe32.th32ProcessID);

if(!_tcscmp(exe_name,pe32.szExeFile))//发现要寻找的进程后结束查找
{
printf("find the file you want: %ls\n",pe32.szExeFile);
break;
}

num++;
bMore=::Process32Next(hProcessSnap,&pe32);
}

if(!_tcscmp(exe_name,pe32.szExeFile))
{
if(GetProcessFullPath(pe32.th32ProcessID, pszFullPath))//根据进程ID获取进程路径名
printf("the path of the process is: %ls\n\n",pszFullPath);

HANDLE hprocess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);
if(hprocess!=NULL)
{
::TerminateProcess(hprocess,0);//关闭进程
printf("I have close the process you choose!\n");
::CloseHandle(hprocess);

}
}

CloseHandle(hProcessSnap);

getchar();//让程序有输入,在结束

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息