Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.20;
Скачать: CL | DM;

Вниз

Удаление драйвера   Найти похожие ветки 

 
Виктор007   (2007-10-20 16:39) [0]

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

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

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

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


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

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;


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

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

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2008.07.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
15-1212613751
oldman (RO)
2008-06-05 01:09
2008.07.20
Что-то связь действительно никуда...


1-1195656625
GIo
2007-11-21 17:50
2008.07.20
Помогите разобраться


2-1213871716
koss
2008-06-19 14:35
2008.07.20
Currency


1-1195565883
Максим
2007-11-20 16:38
2008.07.20
как накладывать фильтр на строки Combobox`а нестандартн. маской?


4-1192817632
NiGGa
2007-10-19 22:13
2008.07.20
USB