Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
Виктор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 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.058 c
2-1213894982
DJ_UZer
2008-06-19 21:03
2008.07.20
Ускорение запуска программы


2-1213879626
abhtr
2008-06-19 16:47
2008.07.20
Как отобразить нули, после запятой (в цене) в DBGride


4-1193159147
Delll
2007-10-23 21:05
2008.07.20
ClipCursor


2-1213594331
Zonder2008
2008-06-16 09:32
2008.07.20
Как програмно сделать ПринтСкрин?


15-1212673804
Mystic
2008-06-05 17:50
2008.07.20
Футбол, ЧМ-2008, турнир прогнозов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский