Скачать 77.87 Kb.
|
Сервисы Сервисы и драйверы — наиболее практическая часть всего материала. Сервисы Windows — примерно как демоны в UNIX. Отличаются от обычных программ некоторыми свойствами: в первую очередь, сервисы взаимодействуют не с пользователем, а с другими программами. Главный смысл сервиса в том, что они выступают как расширение функциональности ОС. Например, существуют сервисы для веб-сервера, файлового сервера и т. д. Сервисы могут запускаться без явного волеизъявления пользователя. Например, при старте системы. Сервисы работают не от имени пользователя, а от имени системы или специального псевдопользователя. Сервисы рассматриваются как доверенная часть ОС, их полномочия почти ничем не ограничены. Иногда службы сами ограничивают свои полномочия, например веб-сервер запускается от имени бесправного пользователя. Далее только о Windows. В реестре есть ветка, которая называется база сервисов. Там хранится информация обо всех сервисах, установленных в системе. HKLM\system\CurrentControlSet\Services CurrentControlSet указывает на ControlSet###. ControlSet002 — бекап, создается при выключении. (В regedit папочки = ключи, файлы справа = значения, имя+данные) Обязательные значения в описании сервисов:
Устройство ФС (справедливо для win2000):
Управление сервисами.Изначально в Windows была утилита net: net start net stop Начиная с XP (а может и раньше) появилась утилита sc. Она сложна, поэтому при написании софта часто используются специальные загрузчики. Кратко перечислим основные функции, которые используются для управления сервисами программно. OpenSСManager() Возвращается SC_HANDLE или NULL. Закрывается функцией CloseServiceHandle() Необходимо указать доступ. Обычно указывают доступ SC_MANAGER_ALL_ACCESS Создается новый сервис функцией CreateService() Открыть существующий сервис с помощь этой функции нельзя, открывается он функцией OpenService() Удаляются сервисы функцией DeleteService() Функция примечательна тем, что нужен handle для удаления, т. е. нужно открыть сервис. Но открытый сервис удалить нельзя. Поэтому сервис всего лишь помечается для удаления, а удалится только тогда, когда на него закроется последний handle. ControlService() позволяет остановить, обновить конфигурацию и т. д. srvany — программа позволяет запускать в качестве сервиса любую программу. Сервис должен сообщать системе о том, что функционирует он нормально, обычная программа будет закрыта секунд через 20. Как писать свой сервис.В сервисе должен быть обработчик запросов. Эта функция в ходе инициализации сервиса должна быть зарегистрирована в системе. Сервис должен иметь функцию ServiceMain() (Функция main() или winMain() все равно должна быть) Эта функция делает 2 вещи. Во-первых, она регистрирует обработчик управляющих сигналов, во-вторых, она вызывается функцию SetServiceStatus() в которой сообщает ОС, что сервис стартован (а также говорит, какие сигналы готов обрабатывать сервис — например, никакие). И третье, самое важное, вызывается функция StartServiceCtrlDispatcher(), которая никогда не возвращает управления. В вечном цикле внутри она вызывает ServiceMain(), а затем ждет сигнала, чтобы вызывать обработчик. Отладка
Драйверы Драйвер — особый вид сервиса. Драйвер работает в нулевом кольце защиты. Начиная с 256-го процессора, существуют функции защиты памяти. Главная идея в том, что не каждая программа имеет доступ ко всей памяти, ко всем портам, т. е. ко всем аппаратным ресурсам. Имеется 2 кольца защиты. Кольцо защиты привилегированных программ и непривилегированных программ. Непривилегированные программы (user mode) не могут обращаться к портам аппаратуры, не могут узнавать и модифицировать таблицы прерываний, они не могут управлять распределением памяти и могут обращаться только к той памяти, которая им явно позволена. Kernel mode — обычно в нем работает только ядро ОС. Программы в kernel mode делают все, что хотят. В процессорах Intel — 4 кольца защиты. Два кольца между kernel и user mode — сейчас не используются (используется в OS/2). «Драйвер принтера» не является драйвером, он является библиотекой. Драйвер принтера не работает в kernel mode, а драйвером называется по чисто исторической причине. Зачем нужны драйверы? Во-первых, чтобы управлять нестандартным железом. Чтобы управлять «железкой», необходимо соответствующим образом реагировать на сигналы, посылать сигналы, понимать формат данных и т. д. Есть где-то около пятидесяти стандартных операций. Для некоторых видов железок существуют соглашения, для таких устройств не нужны драйвера (приводы, мыши и т. д.). Иногда рассматривать некую виртуальную сущность, будто бы это была железка (разделы жесткого диска, большинство сетевых протоколов). Отсюда возникла концепция драйвер логического устройства. Также, в Windows есть понятия физической и логической клавиатуры. Смысл физически различных клавиатур инкапсулируется в понятия логической клавиатуры. В современных ОС логических устройств обычно больше чем физических. Драйверы могут образовывать цепочки. В цепочке более низкие драйверы обслуживают запросы более высоких. Ниже самого низкого драйвера лежит железо. Пример:
Существует множество видов драйверов. Есть два интерфейса для работы с драйверами. Первый — интерфейс сервисов. Поддерживает команды «инсталлировать», «стартовать», «остановить» и т. д. Каждый драйвер обязан поддерживать хотя бы одно устройство. CreateFile() Можно вместо файла указать устройство и оно откроется (создавать устройства таким образом нельзя). FILE_SHARE_READ | FILE_SHARE_WRITE Позволить другим программа использовать устройство. SetFilePointer() Эта функция перемещает указатель текущей позиции в файле. (Не все устройства это поддерживают, только накопительные.) DeviceIoControl() Всё, что не чтение и не запись — управление (извлечь диск, отформатировать хард, прочитать геометрию жесткого диска). Как писать драйвер.Физически драйвер представляет собой извращенный вид библиотеки. Он загружается в адресное пространство ядра. Структура адресного пространства процесса Win32:
Всего 4 ГБ. 64 КБ после и до NULL — запрещены. У всех процессов вторая половина (kernel memory) — одинакова. Ядру не нужно думать, в адресном пространстве какого процесса оно сейчас находится. Драйвер грузится во вторую половину. Драйверы имеет некоторые отличия от стандартных библиотек:
WDK (DDK) —продукт для создания драйверов (маны, примеры и т .д.). Есть build, утилита для компиляции драйверов. Главный заголовочный файл — ntddk.h. Отлаживать драйвер следует на виртуальной машине. Фатальная ошибка — смерть всей системы целиком (синий экран). Windbg (из пакета Debugging tools) — для отладки. В виртуальной машине создается COM-порт. В boot.ini дописывается /debugport=com1 и /baudrate=115200 к записи соответствующей операционной системы. Для драйверов есть функция для вывод информации на консоль отладчика: DbgPrint(); Начиная с Vista — только DbgPrintEx(). (Старая функция не работает.) Все драйверы начинаются с: NTSTATUS DriverEntry(PDRIVER_OBJEACT pDriverObject, PUNICODE_STRING RegistryPath); ntstatus.h — коды ошибок. PUNICODE_STRING:
Не обязана заканчивать нулевым символом, более того, может содержать нулевой символ в середине. \Registry\Machine\System\ — конфигурации драйверов. Каждый драйвер должен иметь хотя бы одно устройство. Усройство создается с помощью IoCreateDevice() Параметры:
Следует делать IoDeleteDevice(). Чтобы обращаться к устройство через WinAPI нужно создать линк \??\link. IoCreateSymbolicLink() Delete() Запросы, которые все драйверы обязаны обрабатывать:
Часто, эти обработчики пустые. Еще:
Прототип: NTSTATUS XDispatchY (PDEVICE_OBJECT pDeviceObject, PIRP pirp) IRP — пакет. IoStatus.Status.Information следует возвращать ноль. IoCompleteRequest завершает обработку запроса. Есть такое понятие — IRP stack. Необходим, когда в обработке запроса участвуют несколько драйверов. Перехват информационных потоков. mov eax, номер mov edx, p call edc ret число1 ... p: sysenter/syscall/int 2E ret число2 Для sysenter и syscall используется регистр STAR MSR. Указывает на KiSystemService. Фрагмент: mov rax, a sub rax, длина кадра стека jmp rax ... mov rax, [rsi+4] mov [rdi+4], rax mov rax, [esi] mov [rdi], rax Код для копирования N байт сам занимает N байт. KeServiceDescriptorTable — экспортируемая переменная ядрая. Содержит указатель на SST (System Service Table). SST
ServiceTable
(HiCall+1 штука) Для всех функций в NT API существует два имени: NT... и Zw... В пользовательском режиме NT=Zw. Однако в режиме ядра NT — функция-сервер, Zw — функция клиент. Когда приходит управление из прикладной программы, вызывается функция-сервер, но для своих нужд вызывается функция-клиент. Zw включает в себя NT. Вызывать надо Zw, перехватывать — NT. Если драйвер запишет в нужный индекс SST свою функцию, то система вызовет ее. Способы поиска функции в SST:
|
Драйверы Guardant x86 (версия 20. 65 от 15. 11. 2007) Драйверы электронного ключа требуются для нормальной работы защищенного приложения. Они выступают своего рода «проводником» между... |
Программа кружка «практическая риторика» Кружок «Практическая риторика» формирует у учащихся прежде всего культуру устного общения |
||
Теоретические основы организации учета затрат на производство продукции (теоретическая часть) Действующая система учета затрат на производство на ООО «Хлебозавод «Гулькевичский» (практическая часть) |
Проект «Восток и Запад: великое противостояние или единство противоположностей?» Практическая часть |
||
Проект «Восток и Запад: великое противостояние или единство противоположностей?» Практическая часть |
Методическая часть программы Планирование материала учебного курса Приложение 1 Программа элективного курса предназначена для предпрофильной подготовки учащихся 9-х классов с ориентацией на химико-биологический... |
||
Любознательному читателю Я. Я. Логвинович вопросы и ответы Эта книга представляют собой вторую часть книги "Вопросы и ответы", являющуюся логическим продолжением первой части. Она содержит... |
Инструкция по выполнению заданий гиа по математике Всего в работе 26 заданий, из которых 20 заданий базового уровня (часть I) и 6 заданий повышенного уровня (часть II) |
||
Инструкция по выполнению работы Общее время Характеристика работы. Всего в работе 16 заданий, из которых 13 заданий базового уровня (часть 1) и 3 задания повышенного уровня... |
Инструкция по выполнению работы Общее время Характеристика работы. Всего в работе 16 заданий, из которых 13 заданий базового уровня (часть 1) и 3 задания повышенного уровня... |
||
Практическая работа №12 72 Изучение холодильных шкафов 72 Практическая... Ознакомление с оборудованием системы автоматизации ресторанной деятельности (r- keeper) 22 |
Экстралингвистические параметры текста. Текст и культура Любой текст... Наиболее полнокровное и конкретное восприятие нами прошлого происходит через искусство и больше всего через литературу. Но и литература... |
||
Интернет-зависимость у детей и подростков Интернет сам по себе – ни добро, ни зло. Это всего лишь неотъемлемая часть окружающего мира, который становится все более и более... |
Методические рекомендации для учителей и учащихся по подготовке к... При изучении материала по содержательным разделам хотелось бы обратить внимание на наиболее трудные вопросы |
||
Геологическое задание на выполнение работы по теме: «Подсчет запасов... Сбор, систематизация, верификация и анализ всего имеющегося фактического геолого-промыслового материала |
«Информатика 1 часть» ... |
Поиск |