Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.037 c
3-1095768608
Vasis
2004-09-21 16:10
2004.10.17
Русские буквы в FB


14-1096024805
VEG
2004-09-24 15:20
2004.10.17
Посоветуйте Flash Player


14-1096399489
Rzhevskiy
2004-09-28 23:24
2004.10.17
ADSL


8-1090408912
asat
2004-07-21 15:21
2004.10.17
{BMP} -> AVI


4-1095420430
Black CAT
2004-09-17 15:27
2004.10.17
И опять про CAD





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский