|  | 
 
 | 
| 
			 
			#1  
			
			
			
			
		 | |||
| 
 | |||
|  Доступ к процессу Здравствуйте, уважаемые. Суть вопроса в следующем: Пишу простенький диспетчер задач, с функцией вывода информации о процессе(производитель экзешника, путь к файлу) и с функцией убийства процесса. Думаю, многие из вас сталкивались с ситуацией, когда вредоносными программами(Вирусами) отключался регэдит и диспетчер задач. Есть PID процесса, есть функция, убивающая процесс. Процесс можно убить почти любой.(не получалось убить только avp.exe - каспер) Но, это при запуске программы из-под компилятора.(кнопка F9 - Run) Если скомпилировать, и запустить - то некоторые процессы убить не получается. Подозреваю, что отказано в доступе. error code: 6 Если запускать из компилятора - то функцией возвращается 0 код и процесс убит. Антивирус не при чем. Функция: Код: function KillProcess(PID: Integer): Integer;
var
  PH, EC: Cardinal;
begin
  Result:= 0;
  PH:= OpenProcess(PROCESS_ALL_ACCESS, True, PID);
  GetExitCodeProcess(PH, EC);
  if (PH = 0) then
    Result:= GetLastError
  else begin
    if not TerminateProcess(PH, EC) then
      Result:= GetLastError;
    CloseHandle(PH);
  end;
end;Вопросы: 1) Коим образом можно извлечь информацию о производителе?(майкрософт, адоб, и.т.п.) // Это не столь важно 2) Коим образом можно получить необходимый доступ к процессу, не зависимо от компилятора? | 
| 
			 
			#2  
			
			
			
			
		 | ||||
| 
 | ||||
|   Операционка? Подозреваю, что Win7. Delphi, скорее всего, от админа, а значит, и твоя прога "от имени администратора". А если не из Delphi запускаешь, то от "юзера" запускается, и получаешь свой заслуженный "error code 6". | 
| 
			 
			#3  
			
			
			
			
		 | ||||
| 
 | ||||
|   А может не нужен велосипед, а использовать Process Explorer | 
| 
			 
			#4  
			
			
			
			
		 | |||
| 
 | |||
|   Нормальное вирьё его тоже заблочит, так что не всегда.  По проблеме: Вероятнее всего именно из-за отсутствия админских прав и не завершается. Тут есть два варианта - где-то видел функцию, проверяющую есть ли права админа у программы, а во-вторых можно подправить манифест и UAC будет сам запрашивать права | 
| 
			 
			#5  
			
			
			
			
		 | ||||
| 
 | ||||
|   TheHavoc, если используешь TXPManifest, то удали его и из всех uses удали XPMan. положи в папку с *.dpr файлик Manifest.res и в *.dpr добавь строчку: Код: {$R Manifest.res} | 
| 
			 
			#6  
			
			
			
			
		 | |||
| 
 | |||
|   Ось Вин ХР, сижу из-под админа Компилятор Delphi XE Изобретать велосипед не надо, но эта возможность мне необходима. Мне нужно знать, как это работает. С XP Манифестом попробую поэкспериментировать. Последний раз редактировалось TheHavoc, 01.07.2011 в 17:29. | 
| 
			 
			#7  
			
			
			
			
		 | |||
| 
 | |||
|   Код: type
  TVersionInfo = record
    CompanyName: WideString;
    FileDescription: WideString;
    FileVersion: WideString;
    InternalName: WideString;
    LegalCopyright: WideString;
    LegalTradeMarks: WideString;
    OriginalFilename: WideString;
    ProductName: WideString;
    ProductVersion: WideString;
    Comments: WideString;
    Language: WideString;
    Translation: WideString;
    FileVersionMajor: Word;
    FileVersionMinor: Word;
    FileVersionRelease: Word;
    FileVersionBuild: Word;
    ProductVersionMajor: Word;
    ProductVersionMinor: Word;
    ProductVersionRelease: Word;
    ProductVersionBuild: Word;
  end;
function GetFileVersionInfo(FileName: WideString; var VersionInfo: TVersionInfo): Boolean;
var
  Handle, Len, Size: Cardinal;
  Translation: WideString;
  Data: PWideChar;
  Buffer: Pointer;
  FixedFileInfo: PVSFixedFileInfo;
begin
  Result := False;
  Size := GetFileVersionInfoSizeW(PWideChar(FileName), Handle);
  if Size > 0 then
  begin
    try
      GetMem(Data, Size);
    except
      Exit;
    end;
    try
      if GetFileVersionInfow(PWideChar(FileName), Handle, Size, Data) then
      begin
        if VerQueryValue(Data, '\', Pointer(FixedFileInfo), Len) then
        begin
          VersionInfo.FileVersionMajor := HiWord(FixedFileInfo^.dwFileVersionMS);
          VersionInfo.FileVersionMinor := LoWord(FixedFileInfo^.dwFileVersionMS);
          VersionInfo.FileVersionRelease := HiWord(FixedFileInfo^.dwFileVersionLS);
          VersionInfo.FileVersionBuild := LoWord(FixedFileInfo^.dwFileVersionLS);
          VersionInfo.ProductVersionMajor := HiWord(FixedFileInfo^.dwProductVersionMS);
          VersionInfo.ProductVersionMinor := LoWord(FixedFileInfo^.dwProductVersionMS);
          VersionInfo.ProductVersionRelease := HiWord(FixedFileInfo^.dwProductVersionLS);
          VersionInfo.ProductVersionBuild := LoWord(FixedFileInfo^.dwProductVersionLS);
          VersionInfo.FileVersion := IntToStr(HiWord(FixedFileInfo^.dwFileVersionMS)) + '.' + IntToStr(LoWord(FixedFileInfo^.dwFileVersionMS)) + '.' +
            IntToStr(HiWord(FixedFileInfo^.dwFileVersionLS)) + '.' + IntToStr(LoWord(FixedFileInfo^.dwFileVersionLS))
        end;
        if VerQueryValueW(Data, '\VarFileInfo\Translation', Buffer, Len) then
        begin
          Translation := IntToHex(PDWORD(Buffer)^, 8);
          Translation := Copy(Translation, 5, 4) + Copy(Translation, 1, 4);
          VersionInfo.Translation := '$' + Copy(Translation, 1, 4);
          SetLength(VersionInfo.Language, 64);
          SetLength(VersionInfo.Language, VerLanguageNameW(StrToIntDef('$' + Copy(Translation, 1, 4), $0409), PWideChar(VersionInfo.Language), 64));
        end;
        
        if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\CompanyName'), Buffer, Len) then
          VersionInfo.CompanyName := PWideChar(Buffer);
        if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\FileDescription'), Buffer, Len) then
          VersionInfo.FileDescription := PWideChar(Buffer);
        if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\FileVersion'), Buffer, Len) then
          VersionInfo.FileVersion := PWideChar(Buffer);
        if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\InternalName'), Buffer, Len) then
          VersionInfo.InternalName := PWideChar(Buffer);
        if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\LegalCopyright'), Buffer, Len) then
          VersionInfo.LegalCopyright := PWideChar(Buffer);
        if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\LegalTradeMarks'), Buffer, Len) then
          VersionInfo.LegalTradeMarks := PWideChar(Buffer);
        if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\OriginalFilename'), Buffer, Len) then
          VersionInfo.OriginalFilename := PWideChar(Buffer);
        if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\ProductName'), Buffer, Len) then
          VersionInfo.ProductName := PWideChar(Buffer);
        if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\ProductVersion'), Buffer, Len) then
          VersionInfo.ProductVersion := PWideChar(Buffer);
        if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\Comments'), Buffer, Len) then
          VersionInfo.Comments := PWideChar(Buffer);
        Result := True;
      end;
    finally
      FreeMem(Data);
    end;
  end;
end;
function AdjustProcessPrivilege(PrivilegeName: WideString): Boolean;
var
  TokenHandle: Cardinal;
  TokenPrivileges: TTokenPrivileges;
  ReturnLength: Cardinal;
begin
  Result := False;
  try
    if Windows.OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle) then
    begin
      try
        LookupPrivilegeValueW(nil, PWideChar(PrivilegeName), TokenPrivileges.Privileges[0].Luid);
        TokenPrivileges.PrivilegeCount := 1;
        TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        if AdjustTokenPrivileges(TokenHandle, False, TokenPrivileges, 0, nil, ReturnLength) then
          Result := True;
      finally
        CloseHandle(TokenHandle);
      end;
    end;
  except
    Exit;
  end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
  VersionInfo: TVersionInfo;
begin
  AdjustProcessPrivilege('SeDebugPrivilege');
  GetFileVersionInfo('C:\Windows\Explorer.EXE', VersionInfo);
  Form1.Caption:= VersionInfo.CompanyName;
end;1) Использовать GetFileVersionInfo 2) Получить DebugPrivilege для своего процесса | 
| 
			 
			#8  
			
			
			
			
		 | |||
| 
 | |||
|   Операция с манифестом и ресурсами не помогла. | 
| 
			 
			#9  
			
			
			
			
		 | |||
| 
 | |||
|   Цитата: 
 | 
| 
			 
			#10  
			
			
			
			
		 | |||
| 
 | |||
|   На фига вот это вот GetExitCodeProcess(PH, EC); Просто TerminateProcess(PH, 0); | 
| 
			 
			#11  
			
			
			
			
		 | |||
| 
 | |||
|   Цитата: 
 Да, кстати, спасибо вам за код. Работает  Попробовал завершить csrss.exe -  синий экран | 
| 
			 
			#12  
			
			
			
			
		 | ||||
| 
 | ||||
|   Цитата: 
 |