Порядок загрузки драйверов и сервисов в Windows. Управление драйверами устройства Обслуживание конфигурации драйверов во время создания образа Windows

Главная / Поломки

Поскольку Windows– многозадачная система, она исключает для прикладных программ такие вольности, как прямое обращение к портам ввода/вывода или обработка аппаратных прерываний. Взаимодействие с аппаратурой на низком уровне может выполняться только системными программами, работающими в привилегированном режиме. Основную роль здесь играют драйверы устройств.

В Windowsиспользуется многоуровневая структура драйверов, в которой высокоуровневые драйверы могут играть роль фильтров, выполняющих специальную обработку данных, полученных от драйвера низкого уровня или передаваемых такому драйверу. В качестве примера можно привести отделение драйвера, управляющего шиной, от драйверов конкретных устройств, подключенных к шине. Еще один пример – драйвер, выполняющий шифрацию/дешифрацию данных при работе с файловой системойNTFS. Структура драйверов всех уровней подчинена единым стандартам, известным какWDM(WindowsDiverModel), однако высокоуровневые драйверы, в отличие от низкоуровневых, не занимаются обработкой аппаратных прерываний.

Как ни странно, в WindowsNTнизкоуровневые драйверы – это еще не самый нижний уровень управления устройствами. Еще ближе к аппаратуре лежит так называемый уровеньHAL(HardwareAbstractionsLevel, уровень аппаратных абстракций). Его роль – скрыть от остальных модулей ОС, в том числе и от драйверов, некоторые детали работы с аппаратурой, зависящие от конкретных шин, типа материнской платы, способа подключения. Например, HALпредоставляет драйверам возможность обращаться к регистрам устройств по их логическим номерам, не зная при этом, подключен ли регистр к порту процессора или отображен на память.

Несмотря на стандартизацию структуры, можно выделить несколько специальных типов драйверов, отличающихся функциональным назначением.

    Драйверы GDI(GraphicDeviceInterface) представляют собой высокоуровневые драйверы графических устройств (мониторов, принтеров, плоттеров). Эти драйверы выполняют трансляцию графических вызововWindows(таких, как «провести линию», «залить область», «выдать текст», «выбрать текущий шрифт, текущее перо, текущую заливку») в команды, выполняющие соответствующие действия на конкретном устройстве. Выдача этих команд на устройство выполняется уже другим, низкоуровневым драйвером. Благодаря наличию драйверовGDIодна и та же программа может выдавать графическое изображение на разные устройства. Яркий пример этого – имеющийся в различных редакторах режим предварительного просмотра, который отображает страницы на экране точно в том виде, как они будут напечатаны.

    Драйверы клавиатуры и мыши, помимо стандартных для драйвера операций, выполняют дополнительную нагрузку. Они генерируют сообщения о событиях на соответствующем устройстве (нажатие и отпускание клавиши, перемещение мыши, нажатие и отпускание кнопок мыши) и помещают их в системную очередь сообщений. Затем система переправляет каждое сообщение процессу, которому оно было предназначено, для дальнейшей обработки.

    Драйверы виртуализации устройств (VxD-драйверы) служат для того, чтобы разделять устройства между процессами, создавая иллюзию, что процесс монопольно владеет устройством. На самом деле драйвер организует очередь заявок от процессов, переключает устройство в нужный для очередного процесса режим и т.п. Примером может служить драйвер виртуализации монитора. Консольное приложение (например, программаMS-DOS) работает со всем экраном в текстовом режиме. Но если такое приложение запущено в окнеWindows, тоVxD-драйвер имитирует текстовый режим в графике. Для этого драйвер должен перехватывать попытки программы обратиться напрямую к адресам видеопамяти и преобразовывать координаты знакомест текстового режима в координаты соответствующих позиций в окне.

В предыдущей части этого цикла мы рассмотрели два подхода ("let Windows decide" и "let me decide"), которые можно использовать для управления внештатными драйверами при выполнении установки Lite Touch с помощью MDT 2010. В этой части мы завершим разговор о проблеме управления драйверами, здесь будут даны некоторые советы, хитрости и одна история. Первая история предоставлена мне одним из читателей, Тимом Лорсом (Tim Lors) и она является отличным наглядным примером тех проблем, с которыми вы можете столкнуться при попытках управления драйверами во время установки:

"Более года назад я написал программный сценарий, который устанавливает все драйверы на ПК WinXP. Проблема, с которой я столкнулся при выборе драйверов, не была связана с ОС. Это была неспособность производителя должным образом реализовать PnP между inf файлами их драйверов и самим аппаратным оборудованием. Если говорить точнее, inf файл указывал на то, что он является лучшим драйвером для определенного аппаратного устройства, когда, на самом деле, он не работает с таким устройством. Единственным способом подбора подходящего драйвера в такой непростой ситуации оказалось сравнение идентификационных номеров PnP аппаратного оборудования со списком известных проблемных драйверов, и если я находил совпадения, я вручную выбирал подходящий драйвер на основе дополнительных критериев " обычно номер модели ПК. Самым распространенным дополнительным критерием, необходимым для "let me decide" выбора, был номер модели ПК, но иногда включал версию BIOS и PnP subset ID, а в некоторых редких случаях это был способ проб и ошибок. Конечно, способ проб и ошибок довольно сложный, поскольку, когда Windows устанавливала тот драйвер, который считала самым подходящим, приходилось изолировать нерабочий драйвер от Windows, или система просто переустанавливала его. Обратите внимание, что такая ситуация возникала в среде, содержащей почти 10 000 ПК более чем 25 различных моделей".

Большинство ИТ специалистов, с которыми я разговаривал, говорили мне, что драйверы являются одной из основных головных болей, и вышеописанная история только служит тому подтверждением. Поэтому, посвятив последние четыре части этой теме, я хочу закончить обсуждение драйверов некоторыми советами и хитростями, которые помогут облегчить вам жизнь.

Поиск драйверов

Первой трудностью является поиск внештатных драйверов, которые могут потребоваться вашим системам. Некоторые производители облегчают эту задачу, другие – нет, и компания Dell является представителем первой группы, поскольку предоставляет драйверы для каждой настольной системы в виде.cab файла под каждую операционную систему. Для загрузки этих.cab файлов перейдите на сайт http://www.delltechcenter.com/ и в прокручивающемся меню слева выберите Home, Microsoft, Microsoft System Center, SCCM " System Center Configuration Manager, Dell Business Client Operating System Deployment, Dell Business Client Operating System Deployment " The .CAB Files и вы увидите страницу, показанную на рисунке 1:

Рисунок 1: Загрузка драйверов для клиентских систем Dell в виде.cab файлов

После загрузки.cab файла вы можете извлечь его в папку, затем сослаться на эту папку при импорте драйверов в свой установочный ресурс.

Другие производители также предоставляют инструменты для загрузки драйверов, но, на мой взгляд, эти инструменты не столь просты и удобны, как подход компании Dell. Вот несколько примеров таких инструментов и ссылок на них:

Извлечение INF файлов из EXE

Иногда производители систем поставляют драйверы устройств в форме.exe файлов, а не.cab файлов. В этом случае, отличным набором инструментов является WinRAR , который позволяет вам извлекать файлы драйверов из.exe файла в папку. Помните, для того чтобы импортировать драйвер, MDT требуется.inf файл и соответствующие файлы драйвера " невозможно импортировать.exe файл, как драйвер.

Предотвращение включения драйверов

Чтобы не позволить включение импортированного вами драйвера (например, если ваши проверки показали, что драйвер после установки вызывает проблемы), просто откройте свойства драйвера и очистите поле Enable This Driver (рисунок 2):

Рисунок 2: Можно запрещать или разрешать включение драйвера

Обратите внимание, что вышеуказанный драйвер был предназначен для 32- и 64-битной версии Windows. Если вы обнаружили, что он не работает под 64-bit Windows, вы можете оставить драйвер включенным, но убрать флажок с x64, что не позволит включить его во время установки 64-bit Windows.

При желании вы даже можете отключать все драйверы в папке путем отключения папки (рисунок 3):

Рисунок 3: Можно отключать пользовательскую папку в установочном ресурсе

Управление загрузочными драйверами с помощью профилей выбора

Также можно использовать профили выбора для управления драйверами во время стадии загрузки Windows PE в установке LTI. Для этого откройте свойства вашего установочного ресурса и выберите закладку Windows PE x64 Components или Windows PE x86 Components для управления драйверами архитектуры той ОС, которую вы устанавливаете (рисунок 4):

По умолчанию выбран All Drivers And Packages профиль выбора, но только сетевые драйверы и драйверы устройств хранения из этого профиля выбора включены в образ загрузки Windows PE. При необходимости можно создавать собственный профиль выбора, который будет включать специфичные для аппаратных средств WinPE драйверы для ваших целевых систем.

Использование нескольких групп драйверов для установки по марке и модели

В предыдущей части мы посмотрели, как определять одну группу драйверов под названием DriverGroup001 и использовать ее для управления драйверами во время установки на основе марки и модели целевых компьютеров. Кит Гарнер (Keith Garner), специалист по развертыванию систем в Xtreme Consulting Group, выложил отличный пост , который дает дополнительную информацию по этой теме, и показывает вам, как можно организовать драйверы более эффективно, а затем использовать несколько групп драйверов для управления тем, как они включаются во время установки.

Еще одним полезным постом является этот пост об использовании псевдонимов моделей , написанный Майклом Мерголо, старшим консультантом в Microsoft Consulting Services.

Добавление драйверов в образ

Можно использовать DISM.exe команду для добавления драйверов в автономные образы, просто смонтируйте образ и используйте команду DISM с /add-driver опцией (смотрите для дополнительной информации об использовании DISM.exe).

Для добавления драйверов в хранилище драйверов (то есть, предварительное представление драйверов, чтобы они были доступны, когда Windows определяет устройства, нуждающиеся в драйверах), можно использовать PnPutil.exe команду. Эта команда может быть полезной, если вы, например, использовали Microsoft Update Catalog для загрузки.cab файла драйверов для принтера и хотите предварительно представить эти драйверы на своем эталонном компьютере, чтобы во время установки эти драйверы были доступны. Дополнительную информацию об этой команде можно найти и .

Обслуживание конфигурации драйверов во время создания образа Windows

Наконец, если вы создаете эталонный образ и устанавливаете его на идентичные аппаратные средства, вы можете обеспечить более быстрый способ первой загрузки для пользователей путем настройки PersistAllDeviceInstalls параметров в своем файле ответа для sysprepping подготовки своего эталонного компьютера. Подробности смотрите

Введение

Здесь описывается программирование служб
в ОС Windows (я также буду употреблять термин
"сервис",что равносильно термину "служба"),
приводится пример использования для
загрузки драйверов или руткитов.

Сервисы

При старте ОС запускается менеджер служб(SCM
Manager).Считывая данные из реестра (имя
сервиса, способ загрузки, тип драйвера и т.д.),
он составляет базу данных для управления
службами. Я опишу некоторые функции, с
помощью которых можно управлять сервисами.
Сначала требуется создать связь с этой
базой данных (SCM database), затем передать
указатель баз данных некоторым функциям,
управляющими сервисами.

Как я уже сказал, первым делом нужно
создать связь с базой данных SCM. Для этого
служит функция OpenSCManager.

SC_HANDLE OpenSCManager(LPCTSTR lpMachineName, LPCTSTR
lpDatabaseName, DWORD dwDesiredAccess);

LPCTSTR lpMachineName - указатель на строку,
завершающуюся нулём, указывающую на имя
локального компьютера. Этот параметр
можно установить в NULL.

LPCTSTR lpDatabaseName- указатель на строку,
завершающуюся нулём, содержащая в себе имя
открываемой базы данных.Этот параметр
также слудует установить в NULL.

DWORD dwDesiredAccess - этот параметр содержит в себе
флаги, означащие права доступа к базе
данных.Я не буду перечислять все флаги, в
данной статье я рассматриваю только те
возможности программирования служб, нужные
для загрузки руткитов.

SC_MANAGER_ALL_ACCESS - стандартные права доступа к БД.
SC_MANAGER_CONNECT - разрешает соединяться с БД SCM.
SC_MANAGER_CREATE_SERVICE- разрешает создание новых
сервисов.

Создав связь с БД SCM,вы можете управлять
сервисами.

Функция OpenService служит для получения
описателя службы. Учтите, что эта функция не
создаёт службу, для создания службы служит
CreateService, а открывает уже созданную ранее
службу.

SC_HANDLE OpenService(SC_HANDLE hSCManager, LPCTSTR
lpServiceName, DWORD dwDesiredAccess);

SC_HANDLE hSCManager - указатель, возвращенный
функцией OpenSCManager.

LPCTSTR lpServiceName - имя открываемого сервиса.

DWORD dwDesiredAccess- права с которыми мы можем
открыть службу. Вот некоторые из них:

SERVICE_ALL_ACCESS- это стандартные права доступа.
SERVICE_START-разрешает запуск работы сервиса.
SERVICE_STOP-разрешает остановку работы сервиса.

Данная функция возвращает указатель
открываемой службы. Получив его мы можем
управлять службой в соответствии с
заданными правами.

Эта функция нужна для создания сервиса (службы).

SC_HANDLE CreateService(SC_HANDLE hSCManager, LPCTSTR
lpServiceName, LPCTSTR lpDisplayName, DWORD dwDesiredAccess, DWORD dwServiceType,
DWORD dwStartType, DWORD dwErrorControl, LPCTSTR lpBinaryPathName, LPCTSTR
lpLoadOrderGroup, LPDWORD lpdwTagId, LPCTSTR lpDependencies, LPCTSTR
lpServiceStartName, LPCTSTR lpPassword);

Первый параметр (hSCManager) указывает на
указатель, возвращенный функцией OpenSCManager.
Следующие два параметра указывают на
строки, содержащие имя создаваемой службы и
имя, которое будет использовано
пользовательским интерфейсом. Следующий
параметр содержит в себе флаги,
определяющие права доступа к службе. Здесь
используются те же флаги, что и в функции
OpenService. В большинстве случаев понадобится
установка этого флага в SERVICE_ALL_ACCESS. Параметр
dwServiceType определяет тип создаваемого
сервиса. В данном случае нужно установить
его в SERVICE_KERNEL_DRIVER, что в свою очередь
означает, что сервис будет управлять
драйвером уровня ядра. Другие же значения
означают, что это будет драйвер файловой
системы и т.д. Параметр dwStartType очень важен, т.к
определяет способ старта службы. В нашем
случае его следует установить в
SERVICE_BOOT_START или SERVICE_AUTO_START, что означает
практически одно и тоже - запуск службы во
время запуска самой операционной системы.
Параметр dwErrorControl указывает на способ
обработки возникающих ошибок, в нашем
случае его следует установить в SERVICE_ERROR_NORMAL.
Следующий параметр - lpBinaryPathName - указатель на
завершающуюся нулём строку, указывающую на
полный путь к драйверу (в нашем случае
руткиту), которым будет управлять служба.
Следующие пать параметров следует
установить в NULL, т.к. они не важны в данном
случае.

Для запуска службы существует функция
StartService.

BOOL StartService(SC_HANDLE hService, DWORD
dwNumServiceArgs, LPCTSTR *lpServiceArgVectors);

SC_HANDLE hService - указатель службы, возвращённый
функцией CreateService или OpenService. Параметр
dwNumServiceArgs содержит в себе число параметров,
указанных в масиве lpServiceArgVectors. В этом
массиве указываются параметры, которые
будут переданы службе. Учтите, что сервисы
драйверов не используют этот параметр,
поэтому два последних параметра в нашем
случае нужно установить в NULL. Если функция
выполнилась успешно, то она возвращает
ненулевое значение. Функции для остановки
службы нет, но ее можно легко написать с
использованием функции ControlService:

BOOL ControlService(SC_HANDLE hService, DWORD dwControl,
LPSERVICE_STATUS lpServiceStatus);

Параметр dwControl содержит флаги, с помощью
которых вы задаёте, что нужно сделать со
службой. Если вам нужно остановить работу
службы, то можете установить её в
SERVICE_CONTROL_STOP. С помощью этой функции можно и
более удобно останавливать и запускать
службу. Например для паузы работы сервиса,
установите параметр dwControl в SERVICE_CONTROL_PAUSE, а
для продолжения работы в SERVICE_CONTROL_CONTINUE.
Параметр lpServiceStatus - указатель на структуру
SERVICE_STATUS, куда заносится текущий статус
службы. Установите его в NULL, если вам не
важен текущий статус работы службы. Эта
функция возвращает ненулевое значение при
успешном выполнении.

Я перечислил все необходимые функции для
загрузки руткитов (драйверов).Для закрытия
структуры DT SCM используйте функцию
CloseServiceHandle. Она принимает единственный
параметр - DT SCM, т.е. описание, возвращённое
функцией OpenSCManager.

Всех этих функций вполне достаточно для
загрузки и исполнения руткитов. Ниже я
приведу пример использования этих функций.

#define rootkitname "myrootkit" //
задаём имя нашего руткита

BOOL StopRootkit(SC_HANDLE hService) //
Объявляем
функции остановки и старта работы службы

BOOL StartRootkit(SC_HANDLE hService)//
int main()
{
SC_HANDLE hManager,hService; //
описатели
SCM базы и службы

LPVTSTR rootkpath="C:\myrootkit.sys"; //

полный путь к нашему руткиту

hManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); //
создаём
связь с БД SCM

if (hManager) // если всё в порядке
{

hService=CreateService(hManager, rootkitname,rootkitname,SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER, SERVICE_BOOT_START,SERVICE_ERROR_NORMAL, \rootkpath,
NULL,NULL,NULL, NULL,NULL,NULL); // создаём
службу, управляющую нашим руткитом

if (hService) // всё в порядке?
{
StartService(hService,NULL,NULL); //
запускаем
созданную службу, тем самым запуская наш
руткит

}

if (StopRootkit(hService)) // если
остановка прошла успешно,

{
StartRootkit(hService);//
то заново
запускаем её

};
CloseServiceHandle(hManager); //
закрываем
DT SCM (БД SCM).

}
BOOL StopRootkit(SC_HANDLE hService)
{
BOOL ok=true;
if (hService)
{
ok=ControlService(hService,SERVICE_CONROL_STOP,NULL); //
вызываем
функцию ControlService с флагом SERVCE_CONTROL_STOP, тем

if (!ok) // самым останавливая
работу сервиса

{
ok=false;
};
};
return ok;
}

BOOL StartRootkit(SC_HANDLE hService)
{
BOOL ok=true;
if (hService)
{
ok=ControlService(hService,SERVICE_CONTROL_START,NULL); // вызываем
функцию ControlService с флагом SERVCE_CONTROL_START, тем

if (!ok) //с амым запуская службу
{
ok=false;
};
};
return ok;
}

Этот пример просто демонстрирует то, о чём я
писал выше. Вы можете добавить
дополнительные проверки для
предотвращения возможных ошибок.

Советую вам прочитать в книге Свена
Шрайбера ("Недокументированные
возможности Windows 2000") раздел, посвящённый
программированию драйверов. Также
рекомендую цикл статей от Four-F, посвященный
созданию драйверов в Windows NT. Посмотрите
статью от Ms-Rem,"Перехват API функций в Windows NT
(часть 3).Нулевое кольцо". И не проходите
мимо rootkit.com .

Для управления устройствами и связанными с ними драйверами существует несколько инструментов: "Диспетчер устройств", "Устройства и принтеры", " Device Stage™" и инструмент Pnputil, который запускается из командной строки с повышенными привилегиями.

Диспетчер устройств доступен во всех категориях элементов панели управления и помогает установить и обновить драйверы для аппаратных устройств, изменять параметры оборудования для этих устройств и устранять неполадки.
В диспетчере устройств можно выполнять следующие задачи:

  • Просмотреть список установленных устройств
  • Удалить устройство
  • Включить и отключить устройство
  • Устранить неполадки устройства
  • Обновить драйвер устройства
  • Откатить драйвер.

Состояние устройства показывает, имеет ли оно установленные драйверы и может ли Windows взаимодействовать с этим устройством. Чтобы просмотреть состояние устройства:

  1. Щелкните правой кнопкой мыши на устройстве и выберите команду "Свойства".
  2. Перейдите на вкладку "Общие" и в области состояния, просмотрите описание текущего состояния устройства.

С помощью "Диспетчера устройств" можно управлять устройствами только на локальном компьютере.

Устройства и принтеры.

Категория "Устройства и принтеры" в панели управления так же предоставляет дополнительную возможность для управления устройствами. Для облегчения сложной конфигурации задачи, через весь процесс установки вас проведет Мастер конфигурации. Windows 7 распознает новые устройства и пытается автоматически загрузить и установить все, необходимые для этого устройства драйверы.

Устройства, которые отображаются в "Устройствах и принтерах", обычно являются внешними устройствами, которые вы подключаете или отключаете от компьютера через порт или сетевое подключение.

В разделе "Устройства и принтеры", отображается многофункциональный принтер, который вместо индивидуального принтера может управляться как одно устройство, сканер или Факс-устройство. Каждый отдельный компонент многофункционального принтера в диспетчере устройств отображается и управляется отдельно.

Device Stage

Device Stage предоставляет пользователям новый способ для доступа к устройствам и дополнительные опции для управления ими. Устройства отображаются на панели задач как фото-иконка. Этот значок на панели задач может предоставить быстрый доступ к общим задачам устройства; Индикаторы состояния, которые позволяют пользователям быстро понять состояние батареи, состояние синхронизации устройства, оставшиеся емкость, ссылки на руководство пользователя, дополнительные приложения, информационное сообщество и помощь, или дополнительные продукты и услуги.

    Для управления службами в Windows используются следующие средства:
  • Оснастка services.msc - самое удобное средство управления службами;
  • Программа msconfig.exe - кроме управления службами позволяет еще управлять запуском Windows (смотри главу Полезные служебные программы Windows 7);
  • Команды net и sc - используются для управления службами из командной строки. Щелкните на кнопке Пуск, введите services.msc и нажмите клавишу Enter. Вы увидите оснастку управления службами.

Разберемся, как управлять службами. Дважды щелкните на какой-нибудь службе - выберите любую, нас сейчас не интересует какая-то конкретная служба. Вы увидите окно свойств службы.


Вкладка Общие содержит имя службы, описание службы, имя выполняемого файла службы, кнопки управления службой. Здесь вы можете изменить тип запуска. Из списка Тип запуска можно выбрать один из типов запуска службы.

    В поле Состояние выводится текущее состояние службы:
  • Работает - служба запущена и работает в данный момент;
  • Остановлена - служба не запущена;
  • Приостановлена - служба запущена, но приостановлена в данный момент.
    Кнопки управления службами:
  • Запустить - запускает остановленную (или еще не запущенную) службу;
  • Остановить - остановить службу;
  • Приостановить - приостановить выполнение службы (не все службы поддерживают приостановку); для продолжения выполнения службы используется кнопка Продолжить;
  • Продолжить - продолжить выполнение службы.

Пока ничего изменять не нужно, чтобы это отрицательным образом не отразилось на вашей системе. Перейдите лучше на вкладку Зависимости: на ней вы узнаете, от каких других служб зависит данная служба и какие другие службы зависят от нее.
Учтите, что если от службы зависят другие службы и вы останавливаете службу, то все зависимые службы тоже не будут работать.

© 2024 ermake.ru -- Про ремонт ПК - Информационный портал