Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2008, 15:26   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Почему мой код не завершает процесс?

Господа, пишу службу (давно уж не писал их) которая будет (или вернее должна) завершать неугодные запуску программы, дабы оградить пользователя от запуска игр и прочего.

Итак:
Код:
unit Unit1;

interface

uses         tlhelp32,
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
  TService1 = class(TService)
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var  trd:Cardinal;   e,a:string;mf:textfile;
  Service1: TService1;

implementation

uses Unit2;

{$R *.DFM}

//********** FUNCTION **********
function cr:dword;
var c:Cardinal;     t:tagPROCESSENTRY32; b:boolean;r:string;
begin
 while Service1.Status<>csStopped do begin
   c:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

   if c<>-1 then begin
    if Process32First(c,t) then begin
  // writeln(mf,t.szExeFile);
     while Process32Next(c,t) do begin
      e:=t.szExeFile;
      if  pos(e,a)=0 then begin
       flush(mf);r:=string(t.szExeFile)+'='+inttostr(t.th32ProcessID);
       
      if not TerminateProcess(t.th32ProcessID,0) then
       //  MessageBox(GetForegroundWindow,t.szExeFile,'хы-хы',0);
          r:='no '+r;
      end;
     end;
     end;
     CloseHandle(c);
   end else     writeln(mf,-1);
       writeln(mf,r);
   sleep(1000);
 end;
end;
//********** END FUNCTION ******  {}



procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
var f:textfile;i:integer;
begin  i:=0;
 if FileExists(ExtractFilePath(paramstr(0))+'ok.txt') then begin
  assignfile(f,ExtractFilePath(paramstr(0))+'ok.txt');reset(f);
  readln(f,a);   closefile(f);
  assignfile(mf,ExtractFilePath(paramstr(0))+'ko.txt');rewrite(mf);
  CreateThread(0,0,@cr,0,CREATE_NEW,trd);
  Started:=true;
 end else begin
  MessageBox(GetForegroundWindow,'Нет файла Окея','Ащыпфка! хы-хы',0);
 Started :=false;end;
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
 TerminateThread(trd,0);
 Stopped:=true;
 closefile(mf);
end;

end.
в файле ок.тхт находится список разрешенных прог:

[System Process] System smss.exe csrss.exe winlogon.exe services.exe lsass.exe svchost.exe svchost.exe svchost.exe svchost.exe spoolsv.exe Apache.exe CDAC11BA.EXE ну и так далее там около 20 прог.

Служба сделав слепок ищет в списке этих прог элемент из списка и по идее его завершает, но завершения не происходит

Как раз TerminateProcess выдает false.

Вопрос: Из-за чего это может быть и что я не учитываю?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.07.2008, 20:28   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
if not TerminateProcess(t.th32ProcessID,0) then
функции надо передавать хендл процесса, а не его ID!
для завершения надо сначала открыть процесс через OpenProcess, и потом порлучив хендл завершить ег очерез TerminateProcess.
выглядит это примерно вот так
Код:
hProc:=OPenProcess(PROCESS_TERMINATE,false,t.th32ProcessID);
поищи по форуму, 100 раз уже обсуждалось.

Последний раз редактировалось rpy3uH; 24.07.2008 в 20:31.
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процесс ryton Операционные системы общие вопросы 5 28.05.2008 18:14
Завершить процесс doniyor Win Api 2 15.05.2008 21:52
Защищённый процесс Terran Win Api 2 08.12.2007 13:31
Остановить процесс Shurik Hacker Win Api 4 20.07.2007 08:05
Системный процесс Andr Win Api 8 18.06.2007 10:56