Форум: "WinAPI";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизПроблема с ExitProcess( ) Найти похожие ветки
← →
Alexis © (2004-09-15 18:55) [0]Написал прогу для закрытия определенного процесса по имени(в примере это rundll32.exe), но при выполнении выделенных строк кода прога не закрывает rundll32, а закрывается сама!
program dll_changer;
{$APPTYPE CONSOLE}
uses
Windows,
psapi;
var
pidProcess : array[0..1024] of DWORD;
cProcesses, cbNeeded, lpcbNeeded : DWORD;
phModule : HMODULE;
I : Integer;
hProcess, hExitProcess, lpExitCode : Cardinal;
lpBaseName, lpMsgBuf : LPTSTR;
begin
if EnumProcesses(@pidProcess, SizeOf(pidProcess), cbNeeded) then
begin
cProcesses := cbNeeded div SizeOf(DWORD);
for I := 0 to cProcesses - 1 do
begin
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
False,
pidProcess[I]);
if hProcess <> 0 then
begin
if EnumProcessModules(hProcess, @phModule, SizeOf(HMODULE), lpcbNeeded) then
begin
GetMem(lpBaseName, MAX_PATH);
GetModuleBaseName(hProcess, phModule, lpBaseName, MAX_PATH);
if CharUpper(lpBaseName) = "RUNDLL32.EXE" then
begin
MessageBox(0, "rundll32.exe detected!", "OK", MB_OK);
GetMem(lpMsgBuf, MAX_PATH);
hExitProcess := OpenProcess(PROCESS_QUERY_INFORMATION,
True,//False,
pidProcess[I]);
if hExitProcess = 0 then
MessageBox(0, "OpenProcess failed", "OK", MB_OK);
if GetExitCodeProcess(hExitProcess, lpExitCode) then
MessageBox(0, "GetExitCodeProcess ok", "OK", MB_OK)
else
MessageBox(0, "GetExitCodeProcess failed", "OK", MB_OK);
ExitProcess(lpExitCode);
CloseHandle(hExitProcess);
end;
FreeMem(lpBaseName);
end; //end of EnumProcessModules
end; //end of OpenProcess
CloseHandle(hProcess);
end;
end; //end of EnumProcesses
MessageBox(0, "end", "OK", MB_OK);
end.
В чем может быть причина никак понять не могу!
← →
Alexis © (2004-09-15 18:59) [1]Пардон, забыл выделить код :) Вот...
program dll_changer;
{$APPTYPE CONSOLE}
uses
Windows,
psapi;
var
pidProcess : array[0..1024] of DWORD;
cProcesses, cbNeeded, lpcbNeeded : DWORD;
phModule : HMODULE;
I : Integer;
hProcess, hExitProcess, lpExitCode : Cardinal;
lpBaseName, lpMsgBuf : LPTSTR;
begin
if EnumProcesses(@pidProcess, SizeOf(pidProcess), cbNeeded) then
begin
cProcesses := cbNeeded div SizeOf(DWORD);
for I := 0 to cProcesses - 1 do
begin
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
False,
pidProcess[I]);
if hProcess <> 0 then
begin
if EnumProcessModules(hProcess, @phModule, SizeOf(HMODULE), lpcbNeeded) then
begin
GetMem(lpBaseName, MAX_PATH);
GetModuleBaseName(hProcess, phModule, lpBaseName, MAX_PATH);
if CharUpper(lpBaseName) = "RUNDLL32.EXE" then
begin
MessageBox(0, "rundll32.exe detected!", "OK", MB_OK);
GetMem(lpMsgBuf, MAX_PATH);
hExitProcess := OpenProcess(PROCESS_QUERY_INFORMATION,
False,
pidProcess[I]);
if hExitProcess = 0 then
MessageBox(0, "OpenProcess failed", "OK", MB_OK);
if GetExitCodeProcess(hExitProcess, lpExitCode) then
MessageBox(0, "GetExitCodeProcess ok", "OK", MB_OK)
else
MessageBox(0, "GetExitCodeProcess failed", "OK", MB_OK);
ExitProcess(lpExitCode);
CloseHandle(hExitProcess);
end;
FreeMem(lpBaseName);
end; //end of EnumProcessModules
end; //end of OpenProcess
CloseHandle(hProcess);
end;
end; //end of EnumProcesses
MessageBox(0, "end", "OK", MB_OK);
end.
← →
noname © (2004-09-15 19:01) [2]ExitProcess - выход из своего приложения.
Использую TerminateProcess.
← →
Alexis © (2004-09-15 19:19) [3]2 noname-MSDN почитай! Кстати TerminateProcess не выгружает DLL, использовавшиеся процессом, поэтому в моем случае необходим ExitProcess.
← →
VMcL © (2004-09-15 19:24) [4]>>Alexis © (15.09.04 19:19) [3]
>Кстати TerminateProcess не выгружает DLL, использовавшиеся процессом
Перечитай пост [2]. "Можно два раза" © ИШ
← →
DeadMeat © (2004-09-15 19:25) [5]А можно вопрос?
Каким макаром ExitProcess будет завершать чужое приложение?
Ты ему передаешь PID чтоли?
---
...Death Is Only The Begining...
← →
DeadMeat © (2004-09-15 19:27) [6]А если передаешь, то он видимо тебе возвращается от GetExitCodeProcess?
Так чтоли получается?
---
...Death Is Only The Begining...
← →
DeadMeat © (2004-09-15 19:28) [7]А раз в MSDN все написано правильно, то можно ссылочку на это плииз...
---
...Death Is Only The Begining...
← →
Alexis © (2004-09-15 19:42) [8]2 DeadMeat-http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/exitprocess.asp
Пожалуйста...
Вот, ф-цией GetExitCodeProcess получаю значение, которое передаю в ExitProcess, а в GetExitCodeProcess я передаю хендл процесса
hExitProcess := OpenProcess(PROCESS_QUERY_INFORMATION,False,pidProcess[I]);
где pidProcess[I] это не id моей проги, а id rundll32.exe!
← →
DeadMeat © (2004-09-15 21:32) [9]Значит ты уверен, что ExitCode характеризует (нет, лучше идентифицирует) каждый процесс в отдельности?
Ты знаешь, что есть ExitCode?
И чем он отличается от PID или hProcess?
---
...Death Is Only The Begining...
← →
Alexis © (2004-09-16 10:25) [10]2 DeadMeat-tak po-tvojemu ExitProcess"om nelzia zavershit" storonnee prilozenije, a tol"ko svoje?
← →
VMcL © (2004-09-16 13:59) [11]>>Alexis © (16.09.04 10:25) [10]
>ExitProcess"om nelzia zavershit" storonnee prilozenije, a tol"ko svoje?
Ты читать не умеешь? Тебе об этом написали еще в посте [2].
← →
Alexis © (2004-09-16 19:05) [12]2 VMcL-хорошо, допустим. Но ф-ция TerminateProcess не выгружает DLL"ки.
Вот цитата из MSDN :
If you terminate a process by calling TerminateProcess or TerminateJobObject, the DLLs of that process do not receive DLL_PROCESS_DETACH notifications. If you terminate a thread by calling TerminateThread, the DLLs of that thread do not receive DLL_THREAD_DETACH notifications.
И как быть в случае, если мне надо выгрузить библиотеку, используемую только процессом rundll32.exe?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c