Форум: "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