ЖУРНАЛ «СТА» №2/2006
SERVICE_STOP (доступ на останов драйвера/сервиса); DELETE (доступ на удаление драйвера/сервиса из ба- зы SCM). dwServiceType Тип сервиса, в нашем случае SERVICE_KERNEL_DRIVER. Соответствует значению параметра TYPE в реестре. dwStartType Тип запуска, в нашем случае SERVICE_DEMAND_START. Соответствует значению параметра START в реестре. dwErrorControl Характер контроля ошибок, в нашем случае SERVICE_ERROR_IGNORE. Соответствует значению параметра ErrorControl в реестре. lpBinaryPathName Указатель на строку, завершающую- ся нулём, содержащую полный путь к файлу загружаемого драйвера. Со- ответствует значению параметра ImagePath в реестре. lpLoadOrderGroup Указатель на строку, завершающую- ся нулём, содержащую имя группы, в случае если загружаемый драйвер является членом группы. В против- ном случае значение NULL или ука- затель на пустую строку. lpdwTagId Указатель на переменную, содержа- щую уникальное значение тега, идентифицирующее группу. В про- тивном случае NULL. lpDependencies Указатель на массив имен драйверов или групп драйверов, загрузка кото- рых должна быть осуществлена до за- пуска текущего драйвера. Массив за- канчивается двумя нулями, имена драйверов или групп разделяются од- ним нулём. Если запуск драйвера не связан с предварительным запуском других драйверов, значение NULL. lpServiceStartName Указатель на строку, завершающую- ся нулём, содержащую имя учётной записи (account), с правами которой запускается текущий драйвер. В слу- чае типа сервиса SERVICE_KERNEL_DRIVER пара- метр содержит имя объекта драйве- ра. Если используется имя объекта драйвера, присвоенное подсистемой вводавывода, то NULL. lpPassword Указатель на строку, завершающуюся нулём, содержащую пароль учётной записи, с правами которой запуска- ется текущий драйвер. В случае SERVICE_KERNEL_DRIVER значе- ние этого параметра игнорируется. П Р О Г РАММНО Е ОБ Е С П Е Ч Е НИ Е / Д РАЙ В Е Р Ы 73 СТА 2/2006 www.cta.ru Листинг 1 ; Пример простой программы управления сервисом (SCP) .386 .model flat, stdcall option casemap:none include D:\masm32\INCLUDE\kernel32.inc include D:\masm32\INCLUDE\user32.inc include D:\masm32\INCLUDE\advapi32.inc include D:\masm32\INCLUDE\windows.inc includelib D:\masm32\LIB\kernel32.lib includelib D:\masm32\LIB\user32.lib includelib D:\masm32\LIB\advapi32.lib .data hSCManager dd 0 hService dd 0 ALIGN 4 CardUNIODriverPath db "D:\masm32\BIN\CardUNIO.sys",0 ALIGN 4 ErrMsg1 db "Attempt of connection with SCM has failed!",0 ALIGN 4 DrvName db "CardUNIO.sys",0 ALIGN 4 ErrMsg2 db "Attempt to register the driver has failed!",0 ALIGN 4 DrvName1 db "CardUNIO",0 ALIGN 4 DispNameDrv db "MyDriver",0 .code start proc ; Устанавливаем канал связи с SCM invoke OpenSCManager, NULL, NULL, SC_MANAGER_CREATE_SERVICE .if eax != NULL mov hSCManager, eax ; Регистрируем драйвер invoke CreateService, hSCManager, offset DrvName1, \ offset DispNameDrv, \ SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER, \ SERVICE_DEMAND_START, \ SERVICE_ERROR_IGNORE, addr CardUNIODriverPath, \ NULL, NULL, NULL, NULL, NULL .if eax != NULL mov hService, eax ; Запускаем драйвер invoke StartService, hService, 0, NULL ; Удаляем драйвер invoke DeleteService, hService ; Закрываем дескриптор драйвера invoke CloseServiceHandle, hService .else ; Если не удалось зарегистрировать сервис, выводим об этом сообщение invoke MessageBox, NULL, offset ErrMsg2, NULL, MB_ICONSTOP .endif ; Закрываем канал связи с SCM invoke CloseServiceHandle, hSCManager .else ; Сообщение в случае невозможности установить связь с SCM invoke MessageBox, NULL, offset ErrMsg1, NULL, MB_ICONSTOP .endif invoke ExitProcess, 0 start endp end start
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy