#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define MAX_PATH 1024
bool KillProcByPid(DWORD pid);
bool ListProcess(void);
void PrintProcess(DWORD pid);
int main(int argc, char* argv[])
{ DWORD pid;
ListProcess();
PrintProcess(pid);
KillProcByPid(pid);
(void)getch();
return 0;
}
bool KillProcByPid(DWORD pid)
{
DWORD ExitCode;//Êîä çàâåðøåíèÿ ïðîöåññà
HANDLE hp;// óêàçàòåëü íà pid ïðîöåññà
bool ret = true;
puts("\t\nenter pid->");
scanf("%ld",&pid);
if(pid!=NULL)//Ïðîâåðÿåì íå 0 ëè íîìåð ïðîöåññà åñëè äà òî ->... åñëè íåò -> return
{
hp = OpenProcess(PROCESS_ALL_ACCESS, true, pid);//hp=&pid
if (hp!=NULL)
{
GetExitCodeProcess(hp, &ExitCode);//ïðîâåðÿåì çàâåðøèëñÿ ëè ïðîöåññ ñàì ïî ñåáå
ret=TerminateProcess(hp, ExitCode);//çàâåðøàåì ïðîöåññ ïðèíóäèòåëüíî
}
else
{
return false;
}
}
else
{
return false;
}
CloseHandle(hp);
return ret;
}
bool ListProcess(void)
{ DWORD *PidProcess[1024],i,*cbNeeded,cb;
DWORD CountProcess;
EnumProcesses(&PidProcess[0],sizeof(PidProcess),&cbNeeded);
CountProcess=(*cbNeeded)/sizeof(DWORD);
for(i=0;i<CountProcess;i++)
{ printf("\n\t\t");
printf("%ld",*PidProcess[i]);
}
return true;
}
void PrintProcess(DWORD pid)
{
HMODULE *hProc[1024];
HANDLE hp;
DWORD cbNeeded,i;
char NameProcess[MAX_PATH];
hp=OpenProcess(PROCESS_ALL_ACCESS,false,pid);//ñîçäàåì óêàçàòåëü íà ïðîöåññ
if (hp!=NULL)
{ if(EnumProcessModules(hp,hProc,sizeof(hProc),&cbNeeded)!=NULL)
{ for(i=0;i<cbNeeded/sizeof(HMODULE);i++)
{ if(GetModuleFileEx(hp,*hProc[i],NameProcess,sizeof(NameProcess)))//ïîëó÷àåì ïóòü ïðîöåññà
printf("\t%s (0x%08X)\n",NameProcess,*hProc[i]);//âûâîäèì èìÿ ïðîöåññà è åãî äåñêðèïòîð äëÿ ÎÑ
}
}
}
CloseHandle(hp);
}
Суть проблемы вот в чем. Компилятор ругается в вункциях ListProcess и PrintProcess говорит что не знает ф. EnumProcess... хотя хедер я подключил. Помогите пожалуста!
shplint,
1. Функции EnumProcesses, EnumProcessModules и GetModuleFileNameEx (а не GetModuleFileEx) определены в инклюде psapi.h, который у тебя не подключен.
2. С этим кодом очень возможно получить Access Violation - память под массивы PidProcess, hProc вообще не выделяется.
Я попробовал включить <psapi.h> но у меня компилятор говорит я рне знаю такой директории...
Если я применю функцию GetModuleBaseName(hp,*hProc[i],NameProcess,sizeof(NameProcess)) я смогу узнать название процессов по их pid-ам?
Да, функция вернет названия (без путей). Но она, опять-таки, определена в psapi.h. Обычно этот файл есть в MS Platform SDK, но у тебя, как я понял, его нет, так что текст psapi.h можешь получить хотя бы http://www.programmersheaven.com/download/37002/63/ZipView.aspx и записать его в директорию Include своего компилятора.
Квазимодо пасибо за подсказку! Но в коде врзникли др ошибки, я вроде его поправил, но ничего не помогло. Посмотри пож еще один вариант кода. Обрати внимание на то что я убрал указатели и еще изменения в main,ListProcess,PrintProcess ну думаю ты сам знаешь что не так
ВОТ СПИСОК ОШИБОК
Linking...
handleprocess.obj : error LNK2001: unresolved external symbol _EnumProcesses@12
handleprocess.obj : error LNK2001: unresolved external symbol _GetModuleBaseNameA@16
handleprocess.obj : error LNK2001: unresolved external symbol _EnumProcessModules@16
Debug/handleprocess.exe : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.
handleprocess.exe - 4 error(s), 0 warning(s)
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include "psapi.h"
#define MAX_PATH 1024
bool KillProcByPid(DWORD pid);
bool ListProcess(void);
void PrintProcess(DWORD *ptrPidProcess,DWORD CountProcess);
int main(int argc, char* argv[])
{ DWORD pid;
DWORD *ptrPidProcess,CountProcess;
ListProcess();
PrintProcess(ptrPidProcess,CountProcess);
KillProcByPid(pid);
(void)getch();
return 0;
}
bool KillProcByPid(DWORD pid)
{
DWORD ExitCode;//Êîä çàâåðøåíèÿ ïðîöåññà
HANDLE hp;// óêàçàòåëü íà pid ïðîöåññà
bool ret = true;
puts("\t\nenter pid->");
scanf("%ld",&pid);
if(pid!=NULL)//Ïðîâåðÿåì íå 0 ëè íîìåð ïðîöåññà åñëè äà òî ->... åñëè íåò -> return
{
hp = OpenProcess(PROCESS_ALL_ACCESS, true, pid);//hp=&pid
if (hp!=NULL)
{
GetExitCodeProcess(hp, &ExitCode);//ïðîâåðÿåì çàâåðøèëñÿ ëè ïðîöåññ ñàì ïî ñåáå
ret=TerminateProcess(hp, ExitCode);//çàâåðøàåì ïðîöåññ ïðèíóäèòåëüíî
}
else
{
return false;
}
}
else
{
return false;
}
CloseHandle(hp);
return ret;
}
bool ListProcess(void)
{ DWORD PidProcess[1024],i,cbNeeded,cb;
DWORD CountProcess, *ptrPidProcess;
EnumProcesses(PidProcess,sizeof(PidProcess),&cbNeeded);
CountProcess=cbNeeded/sizeof(DWORD);
for(i=0;i<CountProcess;i++)
{ printf("\n\t\t");
printf("%ld",PidProcess[i]);
}
ptrPidProcess=&PidProcess[0];
return true;
}
void PrintProcess(DWORD *ptrPidProcess,DWORD CountProcess)
{
HMODULE hProc[1024];
HANDLE hp;
DWORD cbNeeded,i,Pid;
char NameProcess[MAX_PATH];
for(i=0;i<CountProcess;i++)
{
hp=OpenProcess(PROCESS_ALL_ACCESS,false,*ptrPidProcess);//ñîçäàåì óêàçàòåëü íà ïðîöåññ
ptrPidProcess++;
}
if (hp!=NULL)
{ if(EnumProcessModules(hp,hProc,sizeof(hProc),&cbNeeded)!=NULL)
{ for(i=0;i<cbNeeded/sizeof(HMODULE);i++)
{ if(GetModuleBaseName(hp,hProc[i],NameProcess,sizeof(NameProcess)))//ïîëó÷àåì èìÿ ïðîöåññà
printf("\t%s (0x%08X)\n",NameProcess,hProc[i]);//âûâîäèì èìÿ ïðîöåññà è åãî äåñêðèïòîð äëÿ ÎÑ
}
}
}
CloseHandle(hp);
}
Ошибки в линковке пошли... Тогда напиши, pls, на какой ящик тебе прислать версии файлов psapi.h и psapi.lib из Platform SDK для Windows 2003 (.h запишешь в Include, а .lib - в Lib). Насколько я понимаю, у тебя Visual C++. Значит, придется зайти в меню Project -> Settings -> Link - там в Project Options указаны подключенные библиотеки (*.lib). Добавишь в этот список еще и psapi.lib.
А вот эти функции правильно написаны?
{ DWORD PidProcess[1024],i,cbNeeded,cb;
DWORD CountProcess, *ptrPidProcess,*ptrcbNeeeded;
ptrcbNeeded=&cbNeeded;
ptrPidProcess=PidProcess;
EnumProcesses(*ptrPidProcess,sizeof(PidProcess),*ptrcbNeeded);
CountProcess=cbNeeded/sizeof(DWORD);
for(i=0;i<CountProcess;i++)
{ printf("ntt");
printf("%ld",PidProcess[i]);
}
ptrPidProcess=&PidProcess[0];
return true;
}
void PrintProcess(DWORD *ptrPidProcess,DWORD CountProcess)
{
HMODULE hProc[1024];
HANDLE hp;
DWORD cbNeeded,i,Pid;
char NameProcess[MAX_PATH];
Чтоыб получить названия всех процессов мне ведь нужен здесь цикл, это правильно?
for(i=0;i<CountProcess;i++)
{
hp=OpenProcess(PROCESS_ALL_ACCESS,false,*ptrPidProcess);//ñîçäàåì óêàçàòåëü íà ïðîöåññ
if (hp!=NULL)
{ if(EnumProcessModules(hp,hProc,sizeof(hProc),&cbNeeded)!=NULL)
{ for(i=0;i<cbNeeded/sizeof(HMODULE);i++)
{ if(GetModuleBaseName(hp,hProc[i],NameProcess,sizeof(NameProcess)))//ïîëó÷àåì èìÿ ïðîöåññà
printf("t%s (0x%08X)n",NameProcess,hProc[i]);//âûâîäèì èìÿ ïðîöåññà è åãî äåñêðèïòîð äëÿ ÎÑ
}
}
}
ptrPidProcess++:
}
CloseHandle(hp);
}
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)