Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление драйвера [D7]


Виктор007 ©   (2007-10-20 16:39:00) 

Здравствуйте Мастера!
У меня такой вопрос. Начал разбираться с программированием драйверов. Взял пример из книжки Солдатова http://www.soldatov.net/download/ExampleDriver.zip

Работает все прекрасно. Встала задача проинсталлировать этот драйвер программно - сделал используя функции setupapi, все работает. А теперь споткнулся на вопросе как удалить его.
Смотрел исходники devcon - разобраться не смог.

И еще один вопрос. Почему когда я устанавливаю этот драйвер Мастером установки оборудования, а потом удаляю его через Диспетчер Устройств. Драйвер удаляется, но devicetree показывает что устройство осталось. Чтобы его удалить окончательно необходимо русками удалять эту ветку:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Example

Почему этого не делает Диспетчер Устройств?


ter   (2007-10-22 19:33:00) [1]

т.е. нужно тупо написать .inf файл для установки?


Игорь Шевченко   (2007-10-22 09:46:00) [2]

"Лаксианский ключ" Шекли. Читать :)


Виктор007   (2007-10-20 20:57:00) [3]

Нет, это не то. У меня в программе два режима: как вы показали, загрузка драйвера в runtime, и хочется сделать второй - с установкой драйвера, чтобы программу можно было использовать в режиме гостя предварительно установив драйвер под администратором.

Просто прописывать драйвер в реестре а затем удалять его не хочется. Желательно именно средствами Windows, т.к. она при установке и удалении сама заботится о контрольных точках и всем в этом духе...


ter   (2007-10-20 19:52:00) [4]

var
 hDriver: THandle = INVALID_HANDLE_VALUE;

Const
 WIN32_ROOT_PREFIX = '\\.\testdriver';
 DRIVER_NAME  = 'testdriver';

function DriverLoad: Integer;
var hManager, hService: SC_HANDLE;
driverPath: array[0..MAX_PATH*2-1]of char;
res: Bool;
p: PChar;
begin
 driverPath := #0;
 GetModuleFileName (0, driverPath, sizeof (driverPath));
 StrPCopy(driverPath,ExtractFilePath(driverPath)+DRIVER_NAME+'.sys');
if not FileExists(driverPath) then begin
 MessageDlg('Драйвер не найден!', mtError,[mbOK], 0);
 Result := 1;
   Exit;
end;
hManager := OpenSCManager (nil, nil, SC_MANAGER_ALL_ACCESS);
if (hManager = 0)then begin
 if (GetLastError () = ERROR_ACCESS_DENIED) then begin
   MessageDlg('Требуются привилегии Администратора!', mtError,[mbOK], 0);
  Result := 1;
     Exit;
   end;
 Result := 2;
   Exit;
 end;
hService := OpenService (hManager, DRIVER_NAME, SERVICE_ALL_ACCESS);
if (hService <> 0) then begin
 DeleteService (hService);
 CloseServiceHandle (hService);
 Sleep (500);
end;
hService := CreateService (hManager, DRIVER_NAME, DRIVER_NAME,
 SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
 driverPath, nil, nil, nil, nil, nil);
if (hService = 0) then begin
 CloseServiceHandle (hManager);
  Result := 3;
   Exit;
end;
res := StartService (hService, 0, p);
DeleteService (hService);
CloseServiceHandle (hManager);
CloseServiceHandle (hService);
Result := 1-Integer(res);
end;

function DriverUnload: Integer;
var
dwResult: DWord;
bResult: Bool;
hManager, hService: SC_HANDLE;
bRet: Bool;
status: SERVICE_STATUS;
x: Integer;
 label error;
begin
 Result := 0;
 if (hDriver = INVALID_HANDLE_VALUE) then
   Exit; //драйвер не был загружен
 CloseHandle (hDriver);
 hDriver := INVALID_HANDLE_VALUE;
 hManager := OpenSCManager (nil, nil, SC_MANAGER_ALL_ACCESS);
 if (hManager = 0) then
goto error;
 hService := OpenService (hManager, DRIVER_NAME, SERVICE_ALL_ACCESS);
if (hService = 0) then
 goto error;
bRet := QueryServiceStatus (hService, status);
if (not bRet) then
 goto error;
if (status.dwCurrentState <> SERVICE_STOPPED) then begin
 ControlService (hService, SERVICE_CONTROL_STOP, status);
 for x := 0 to 4 do begin
  bRet := QueryServiceStatus (hService, status);
  if (not bRet) then
   goto error;
  if (status.dwCurrentState = SERVICE_STOPPED) then
   break;
  Sleep (200);
   end;
 end;

error:
if (hService <> 0) then
 CloseServiceHandle (hService);
if (hManager <> 0) then
 CloseServiceHandle (hManager);
if (status.dwCurrentState = SERVICE_STOPPED) then begin
 hDriver := INVALID_HANDLE_VALUE;
  Result := 0; //драйвер выгружен
   Exit;
 end;
Result := 3; // драйвер не остановлен
end;

function DriverAttach: Integer;
var res: integer;
 bResult: Bool;
 dwResult: DWORD;
label load;
begin
 hDriver := CreateFile (WIN32_ROOT_PREFIX, 0, 0, nil, OPEN_EXISTING, 0, 0);
if (hDriver = INVALID_HANDLE_VALUE) then begin
load:
   res := DriverLoad;
   if (res<>0) then begin
     Result := res;
     Exit;
   end;
   hDriver := CreateFile (WIN32_ROOT_PREFIX, 0, 0, nil, OPEN_EXISTING, 0, 0);
   if (hDriver = INVALID_HANDLE_VALUE) then begin
     Result :=  2;
     Exit;
   end;
 end;
 Result :=  0;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо