![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление драйвера [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;