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;
}
#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;
}
相关文章推荐
- C++进程检测,发现进程路径,关闭进程(二)
- [经验总结]Windows中关闭进程的C++实现
- 利用shutdown.bat关闭Tomcat,发现进程关闭了,但是TOmcat启动窗口没关闭
- c++ 进程_调用其他程序,关闭其他程序
- C++获取当前进程绝对路径
- Qt / C++ 如何关闭外部进程
- 发现系统中有Excel进程,要关闭所有Excel进程
- C/C++检测路径是否存在并创建
- C/C++检测进程是否被调试
- C/C++获取windows进程路径的方法
- C++ 获取当前进程加载模块的完整路径读取配置文件
- C++调用NTAPI枚举并强制关闭指定进程
- 【C#学习笔记】检测进程是否存在并关闭
- C++ windows多线程 线程描述了进程内代码的执行路径。进程中同时可以有多个线程在执行,为了使他们能够同时运行,操作系统为每个线程轮流分配CPU时间片,为了充分地利用CPU提高软件产品的性能,一
- [C/C++]获得本进程可执行文件的全路径
- C++关闭和创建进程
- c++获取进程的运行路径
- 64位系统下C++获取当前所有进程的完整路径
- c++如何关闭进程,比如网吧收银系统
- C++ 获取进程列表 并关闭相应的进程