Главная страница
    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.043 c
15-1212616327
alex-drob
2008-06-05 01:52
2008.07.20
есть ли в делфи компанент для разложения RFC-822


2-1214215947
Alex_C
2008-06-23 14:12
2008.07.20
Отменить и востановить OnResise формы.


2-1213696529
JS
2008-06-17 13:55
2008.07.20
Округление


15-1212588461
data
2008-06-04 18:07
2008.07.20
Подскажите, как работать с битами в Оракле?


2-1213811159
leonidus
2008-06-18 21:45
2008.07.20
Как скрыть гоавную форму приложения при старте





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский