ЖУРНАЛ «СТА» №2/2006
глашением к регистрации) запускает SCM, который в созданной внутрен- ней базе данных сервисов SCM ищет записи драйверов и сервисов с пара- метром Start, имеющим значение SERVICE_AUTO_START, и запускает их. Далее рассмотрим пример реализа- ции SCP на языке ассемблера (листинг 1). Минимально необходимый материал, позволяющий понять прави- ла и нотацию для оформления про- грамм на этом языке, можно найти в [3]. Действия программы заключаются в следующем. Устанавливается канал связи с SCM. Если при установлении канала связи происходит ошибка, вы- водится сообщение “Attempt of connection with SCM has failed!” и про- грамма завершается. В случае уста- новления канала регистрируем драй- вер. Если происходит ошибка регист- рации, выводим соответствующее со- общение “Attempt to register the driver has failed!” и, закрыв дескриптор SCM, завершаем программу. В случае успеха регистрации драйвера запуска- ем драйвер, удаляем его, закрываем дескриптор драйвера, закрываем дескриптор SCM, завершаем про- грамму. В этой программе драйвер за- пускается один раз, и поэтому его действия носят характер, только под- тверждающий факт его работы. Те- перь более подробно. Для вызова SCMфункций SCP дол- жна установить канал связи с SCM, ис- пользуя функцию OpenSCManager. Прототип функции выглядит следую- щим образом: OpenSCManager proto lpMachineName :LPSTR, lpDatabaseName :LPSTR, wDesiredAccess :DWORD lpMachineName Указатель на строку, завершающую- ся нулём, содержащую имя компью- тера. Устанавливая этот параметр в NULL, мы устанавливаем связь с локальным SCM (на этом компью- тере). lpDatabaseName Указатель на строку, завершающую- ся нулём, содержащую имя откры- ваемой базы. Устанавливая этот па- раметр в NULL, мы устанавливаем связь с локальной, активной в теку- щий момент базой данных – SERV- ICES_ACTIVE_DATABASE. dwDesiredAccess Права доступа, запрашиваемые при открытии канала. Могут быть сле- дующие значения: SC_MANAGER_CONNECT (уста- навливаются по умолчанию, пара- метр 0); SC_MANAGER_CREATE_SERVICE (доступ для внесения в базу данных записи о новом драйвере); SC_MANAGER_ALL_ACCESS (полный доступ). Если эта функция возвращает не NULL (NULL говорит об ошибке), то мы получаем дескриптор активной базы данных. Следующий шаг — это регистрация нашего драйвера путём вызова функции CreateService, прото- тип функции выглядит так: CreateService proto hSCManager :HANDLE, lpServiceName :LPSTR, lpDisplayName :LPSTR, dwDesiredAcces :DWORD, dwServiceType :DWORD, dwStartType :DWORD, dwErrorControl :DWORD, lpBinaryPathName :LPSTR, lpLoadOrderGroup :LPSTR, lpdwTagId :LPDWORD, lpDependencies :LPSTR, lpServiceStartName :LPSTR, lpPassword :LPSTR hSCManager Дескриптор базы данных SCM. lpServiceName Указатель на строку, завершающую- ся нулём, содержащую имя драйве- ра/сервиса. Длина до 256 символов. Соответствует имени подраздела в реестре. lpDisplayName Указатель на строку, завершающуюся нулём, содержащую экранное имя драйвера/сервиса. Длина до 256 сим- волов. Соответствует значению пара- метра DisplayName в реестре. dwDesiredAcces Запрашиваемый тип доступа. Могут быть значения: SERVICE_ALL_ACCESS (полный доступ); SERVICE_START (доступ на запуск драйвера/сервиса); 72 СТА 2/2006 П Р О Г РАММНО Е ОБ Е С П Е Ч Е НИ Е / Д РАЙ В Е Р Ы www.cta.ru Таблица 1 Основные параметры при регистрации сервиса/драйвера и их возможные значения Параметр Значение Описание Start SERVICE_BOOT_START (0) Драйвер загружается Ntldr или Osloader, то есть в период загрузки самой ОС SERVICE_SYSTEM_START (1) Драйвер загружается после загрузки и инициализации драйверов со значением SERVICE_AUTO_START (2) Драйвер или сервис запускается SCM автоматически после запуска SCM-процесса (Services.exe) SERVICE_DEMAND_START (3) Драйвер или сервис запускается SCM по требованию SERVICE_DISABLED (4) Драйвер или сервис не загружается и не инициализируется ErrorControl SERVICE_ERROR_IGNORE (0) Код ошибки, возвращаемый драйвером или сервисом, игнорируется SERVICE_ERROR_NORMAL (1) Если драйвер или сервис возвращает код ошибки, выводится предупреждение SERVICE_ERROR_SEVERE (2) Если драйвер или сервис возвращает ошибку и ещё не использовалась последняя удачная конфигурация, то используется последняя удачная конфигурация. Если используется именно она, то загрузка продолжается. SERVICE_ERROR_CRITICAL (3) Если драйвер или сервис возвращает ошибку и ещё не использовалась последняя удачная конфигурация , то используется последняя удачная конфигурация. Если используется именно она, то выводится BSOD «Синий экран смерти». Type SERVICE_KERNEL_DRIVER (1) Драйвер устройства режима ядра SERVICE_FILE_SISTEM_DRIVER (2) Драйвер файловой системы ImagePath Путь к исполняемому файлу Путь к исполняемому файлу драйвера или сервиса. По умолчанию файл ищется в папке %SystemRoot%\System32\Drivers DisplayName Имя сервиса Имя сервиса. По умолчанию имя его раздела в реестре.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy