Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 73

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 67 68 69 70 71 72 < 73 > 74 75 76 77 78 79 .. 166 >> Следующая

? разрегистрация сервиса:
• ОТКрЫТИе SCM-менеджера С ПОМОЩЬЮ ВЫЗОВа ФУНКЦИИ OpenSCM_ Manager С флаГОМ sc_MANAGER_all_ACCESS;
• открытие сервиса, соответствующего драйверу с помощью функции
OpenService с флагом service_all_access;
212
Часть III. Практика программирования
• удаление записи о драйвере с помощью функции DeleteService;
• закрытие дескриптора сервиса;
• закрытие дескриптора SCM-менеджера.
Листинг 9.20. Регистрация драйвера в реестре и старт сервиса
Const // имя драйвера
DriverName : PChar= 'giveioex'#0; Il юля файла драйвера
FileDriver : String = 'giveioex.sys'''#0;-Il Процедура регистрации драйвера
Function TGivelOEx.CreateService(SysPath : String) !.Boolean; var IpServiceArgVectors : PChar;
hSCMan, hService: SC_HANDLE;
DriverPath : String; Begin Result:= False;
{= Создание сервиса ==}
(Сервис регистрируется в ветке реестра}
{HKEY_I/XmiJMACHINE\SYSTF^\airrentControlSet\Services\grveioex} hSCMan:= WinSvc.OpenSCManager(
Nil, { локальный }
Nil, { SERVICES_ACTIVE_DATABASE }
SC_MANAGER_ALL_ACCESS
);
If hSCMan = 0 then- Exit;
{Получаем полное имя к файлу драйвера} DriverPath:= SysPath + FileDriver;
(Создаем сервис (регистрируем драйвер)}
hService:= WinSvc.CreateService(hSCMan, Drivername, DriverName, SERVICE_ALX_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, PChar(@DriverPath[l]), nil,nil,nil,nil,nil);
Гпава 9. Введение в WDM
213
(Файл не найден или сервис уже зарегистрирован} If hService - 0 then begin
MessageDlgdntToStr (GetLastError), mtError, [mbOK], 0);
CloseServiceHandle(hSCMan);
Exit; End;
(Регистрация успешна} WinSvc.CloseServiceHandle(hService); WinSvc.CloseServiceHandle(hSCMan); Result:= True; End;
Il Старт зарегистрированного сервиса Function TGivelOEx.StartService : Boolean; var IpServiceArgVectors : PChar; hSCMan, hService : SCJHANDLE; DriverPath : String; Begin Result:= False;
Il Старт сервиса hSCMan := WinSvc*.OpfenSCManager (Nil, Nil, SC_MANAGER_CONNECT) ; If hSCMan = 0 then Exit;
hService:= WinSvc.OpenService(hSCMan, DriverName, SERVICE_START); If hService = 0 then begin
CloseServiceHandle(hSCMan);
Exit; End;
IpServiceArgVectors:=nil;
WinSvc.StartService(hService, 0, IpServiceArgVectors); WinSvc.CloseServiceHandle(hService); WinSvc.CloseServiceHandle(hSCMan); Result:= True; End;
214
Часть III. Практика программирования
¦ Листинг 9.21. Останов сервиса и разрегистрация драйвера // Останов сервиса
Function TGivelOEx.StopService : Boolean; var serviceStatus : TServiceStatus;
hSCMan, hService : SC-HANDLE; Begin
Result:= False;
{= Остановка сервиса}
hSCMan:= WinSvc.OpenSCManager(Nil, Nil, SCJ4ANAGER_C0NNECT); If hSCMan = 0 then Exit;
hService:= WinSvc.OpenService(hSCMan, DriverName, SERVICE_STOP); If hService = 0 then begin
WinSvc.CloseServiceHandle(hSCMan);
Exit; End;
WinSvc. ControlService(hService, SERVICE_CONTROL_STOP, serviceStatus); WinSvc.CloseServiceHandle(hService); WinSvc.CloseServiceHandle(hSCMan); Result:= True; End;
Il Разрегистрация сервиса
Function TGivelOEx.RemoveService : Boolean;
var serviceStatus : TServiceStatus;
hSCMan, hService : SCJHANDLE; Begin Result:= False;
{= Удаление сервиса из реестра}
hSCMan:= WinSvc.OpenSCManager(Ni1,Nil,SC_MANAGER_ALL_ACCESS); If hSCMan .= 0 then Exit;
hService:= WinSvc.OpenService(hSCMan, DriverName, SERVIOE_ALL_ACCESS); {Ошибка открытия сервиса} If hService=0 then begin
CloseServiceHandle(hSCMan);
Exit; End;
Гпава 9. Введение в WDM
215
WinSvc.DeleteService(hService); WinSvc.CloseServiceHandle(hService); WinSvc. CloseServiceHandle (hSCMan);.. Result:= True; End;
ІІ" Registry Editor
Registry ?dit View« favorites Help
¦_J Enum ~i_J Security B-&3 Gpc S- •__ )3042pit л U IAS ft! bJ IdeBusDr 5' _] IdeChnDr
тШт
i:Name
®(Defaultl
SHDisplayblame
|ЩЕгіогСопііоі
ualmagePatli
Щ Start
І5Й Type
Type
REG_SZ
REG_SZ
REG_DWORD
RE6_EXPAND_SZ
REG-DWORD
REGJDWORD
Data ' _ _
(value not set)
giveioex
0x00000001 (1J
\??\E: VS ource\giveioex. sy s
0x00000003 (31
0x00000001 (1)
Ju
MyComputer\HKEY_L0CAL_MACHINE\SYSTEM\CijrtenControl5et\ServicesVgiveioex
Рис. 9.7. Драйвер зарегистрирован
Рисунок 9.7 показывает результат успешной регистрации драйвера, после которой обращение к драйверу выглядит довольно просто (листинг 9.22).
Параметры драйвера в реестре
При регистрации драйвера в реестре создаются несколько стандартных записей (рис. 9.7).
o DispiayName (тип reg__sz) — значение этого параметра описывает текст, используемый в служебных программах операционной системы, в частности, в программах панели управления. В случае если данный параметр не указан, используется имя драйвера;
o ErrorControi (тип reg_dword) — этот параметр описывает способ обработки ошибки при загрузке или инициализации драйвера. Возможные варианты приведены в табл. 9.3;
? imagePath (тип reg_expand_sz) — значение этого параметра описывает полный путь к файлу, содержащему исполняемый код драйвера. По умолчанию значение этого параметра равно %system%\Drivers\
Предыдущая << 1 .. 67 68 69 70 71 72 < 73 > 74 75 76 77 78 79 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100