Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как программно удалить драйвер из операционной сис, Как программно удалить драйвер из операц 
:(
    Опции темы
Pcrepair
Дата 18.8.2016, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Добрый день. Есть код, который должен удалять драйвер из ОС :

Код

//------------------------------------------------
procedure TMain.Button2Click(Sender: TObject);
begin
  if not ConnectSCM then
  begin
    ShowMessage(FLastError);
  end
  else
  begin
    ShowMessage('Connected SCM');
    if not DriverStop(Edit1.Text) then
    begin
      ShowMessage(FLastError);
      pDisconnectSCM
    end
    else
    begin
      ShowMessage('Driver Stopped');
      if not DriverRemove(Edit1.Text) then
      begin
        ShowMessage(FLastError);
        pDisconnectSCM
      end
      else
      begin
        ShowMessage('Driver Remuved');
        if not DisconnectSCM then
        begin
          ShowMessage(FLastError);
          pDisconnectSCM
        end
        else
        begin
          ShowMessage('DisConnected SCM');
        end;
      end;
    end;
  end;
//--------------------------------------

//--------------------------------------
uses
  Classes,SysUtils,Dialogs,StrUtils,Windows,WinSvc;
.....

var
  FLastError : String;
  hSCMan : SC_HANDLE;

implementation

(*Connects to the WinNT Service Control Manager *)
function ConnectSCM : Boolean;
const
  SC_MANAGER_CONNECT           = $0001;
  SC_MANAGER_QUERY_LOCK_STATUS = $0010;
  SC_MANAGER_ENUMERATE_SERVICE = $0004;
  SC_MANAGER_CREATE_SERVICE    = $0002;
  ERROR_ACCESS_DENIED          = $0005;
var
  dwStatus : DWORD;
  scAccess : DWORD;
begin
  dwStatus := 0;                                 (*Assume success, until we prove otherwise*)

  scAccess := SC_MANAGER_CONNECT or
              SC_MANAGER_QUERY_LOCK_STATUS or
              SC_MANAGER_ENUMERATE_SERVICE or
              SC_MANAGER_CREATE_SERVICE;         (*Try and connect as administrator*)

  hSCMan := OpenSCManager(nil, nil, scAccess);   (*Connect to the SCM*)

  if ((hSCMan=0) and (GetLastError=ERROR_ACCESS_DENIED)) then
  begin
    scAccess := SC_MANAGER_CONNECT or
                SC_MANAGER_QUERY_LOCK_STATUS or
                SC_MANAGER_ENUMERATE_SERVICE;     (*If we're not in administrator mode, try and reconnect*)

    hSCMan := OpenSCManager(nil, nil, scAccess);  (*Connect to the SCM*)
  end;

  if (hSCMan=0) then
  begin
      // Failed, save error information
    dwStatus:=GetLastError;
    FLastError:='ConnectSCM: Error #'+IntToStr(dwStatus);
  end;                                             (*Did it succeed?*)

  Result := (dwStatus=0);                          (*Success == 0 *)
end;
(*---------------------------------------------------*)

(*Disconnects from the WinNT Service Control Manager *)
function DisconnectSCM: Boolean;
begin
  Result:=False;
  if (hSCMan<>0) then
  begin
    CloseServiceHandle(hSCMan);
    hSCMan:=0;
    Result:=True;
  end;
end;
(*---------------------------------------------------*)

(**)
function DriverStop(const DrvName:string) : Boolean;
const
  SERVICE_QUERY_STATUS   = $00004;
  SERVICE_STOP           = $00020;
  SERVICE_CONTROL_STOP   = $00001;
var
  hService      : SC_HANDLE;                     (*Handle to the new service*)
  dwStatus      : DWORD;
  Temp          : LongBool;
  ServiceStatus : TServiceStatus;
begin
  dwStatus := 0;                                 (*Assume success, until we prove otherwise*)

  hService := OpenService(hSCMan,
                          PChar(DrvName),
                          SERVICE_STOP or
                          SERVICE_QUERY_STATUS);  (*Get a handle to the service to stop *)

  if (hService<>0) then
  begin
    Temp := ControlService(hService,
                           SERVICE_CONTROL_STOP,
                           ServiceStatus);        (*Stop the driver, then close the service*)

    if (not Temp) then dwStatus := GetLastError();
    CloseServiceHandle(hService);                 (*Close the service *)
  end
  else  dwStatus := GetLastError;

  if (dwStatus<>0) then
     FLastError:='DriverStop: Error #'+IntToStr(dwStatus);

  Result := (dwStatus=0);                         (*Success == 0 *)
end;
(*------------------------------------------------------------*)

(**)
function DriverRemove(const DrvName:string) : Boolean;
const
  DELETE = $10000;
var
  hService      : SC_HANDLE;                      (*Handle to the new service *)
  dwStatus      : DWORD;
  Temp          : LongBool;
begin
  dwStatus := 0; (*Assume success, until we prove otherwise*)

  hService := OpenService(hSCMan,
                          //PChar(DRIVER_NAME),
                          PChar(DrvName),
                          DELETE);                (*Get a handle to the service to stop *)

  if (hService<>0) then
  begin
    Temp := DeleteService(hService);              (*Remove the driver then close the service again *)
    if (not Temp) then
      dwStatus := GetLastError;
      CloseServiceHandle(hService);               (*Close the service *)
  end else dwStatus := GetLastError;

  if (dwStatus<>0) then
    FLastError:='DriverRemove: Error #'+IntToStr(dwStatus);

  Result := (dwStatus=0);                         (* Success == 0 *)
end;
(*------------------------------------------*)

(*Disconnect from our local Service Control Manager*)
procedure pDisconnectSCM;
begin
  if (hSCMan<>0) then
  begin
    CloseServiceHandle(hSCMan);
    hSCMan:=0;
  end;
end;
(*----------------------------------------------*)

end.
//------------------------------------------------------------


для "левого" драйвера  DLPORTIO.sys все работает, удаляет драйвер, правда непонятно откуда, в диспетчере устройств (ВЫНьХР) его не видно, в реестре DLPORTIO записывается, некоторые программы(самопальные) видят этот драйвер в куче еще таких же невидимок.
(DLPORTIO.sys - древний код для доступа к чипу проца для снятия данных по температуре проца и прочему но на ВЫНьХР работает. И вообще весь код из PortIO.pas, немного модифицированный под задачу - удалить указанный драйвер программно)

Проблема в том что этот код не удаляет драйвера имеющие вид записи типа: имя драйвера = {4D36E966-E325-11CE-BFC1-08002BE10318}\0000 - (реестр), реально это "вторичный канал IDE" имя драйвера atapi.sys (в диспетчере устройств)

При этом к SCM подключение есть, затем выходит ошибка (при попытке остановить драйвер, перед удалением, впрочем если сразу попробовать удалить то та же ошибка с кодом 1066 или еще каким нибуть).

Вручную через диспетчер задач, драйвера удаляются без вопросов, но надо программно

Подскажите, если кто знает, как все таки программно удалить драйвер с использованием DELPHI 
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1420 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.