![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с ExitProcess( ) [D6, NT4, Win2k, WinXP]
Alexis © (2004-09-15 18:55:00)Написал прогу для закрытия определенного процесса по имени(в примере это 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-16 19:05:00) [1]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?
VMcL (2004-09-16 13:59:00) [2]>> Alexis © (16.09.04 10:25) [10]
> ExitProcess'om nelzia zavershit' storonnee prilozenije, a tol'ko svoje?
Ты читать не умеешь? Тебе об этом написали еще в посте [2].
Alexis (2004-09-16 10:25:00) [3]2 DeadMeat-tak po-tvojemu ExitProcess'om nelzia zavershit' storonnee prilozenije, a tol'ko svoje?
DeadMeat (2004-09-15 21:32:00) [4]Значит ты уверен, что ExitCode характеризует (нет, лучше идентифицирует) каждый процесс в отдельности?
Ты знаешь, что есть ExitCode?
И чем он отличается от PID или hProcess?
---
...Death Is Only The Begining...
Alexis (2004-09-15 19:42:00) [5]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 19:28:00) [6]А раз в MSDN все написано правильно, то можно ссылочку на это плииз...
---
...Death Is Only The Begining...
DeadMeat (2004-09-15 19:27:00) [7]А если передаешь, то он видимо тебе возвращается от GetExitCodeProcess?
Так чтоли получается?
---
...Death Is Only The Begining...
DeadMeat (2004-09-15 19:25:00) [8]А можно вопрос?
Каким макаром ExitProcess будет завершать чужое приложение?
Ты ему передаешь PID чтоли?
---
...Death Is Only The Begining...
VMcL (2004-09-15 19:24:00) [9]>> Alexis © (15.09.04 19:19) [3]
> Кстати TerminateProcess не выгружает DLL, использовавшиеся процессом
Перечитай пост [2]. "Можно два раза" © ИШ
Alexis (2004-09-15 19:19:00) [10]2 noname-MSDN почитай! Кстати TerminateProcess не выгружает DLL, использовавшиеся процессом, поэтому в моем случае необходим ExitProcess.
noname (2004-09-15 19:01:00) [11]ExitProcess - выход из своего приложения.
Использую TerminateProcess.
Alexis (2004-09-15 18:59:00) [12]Пардон, забыл выделить код :) Вот...
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.