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

Простейший WDM-драйвер

В данной статье описан процесс написания простейшего драйвера, который выводит скан-коды нажатых клавиш.
Также в данной статье описан процесс настройки рабочего места для написания драйверов.
Если Вам интересно, прошу под кат.

Подготовка стенда

Установка необходимого ПО для написания простейшего драйвера

Необходимое ПО:

  1. Windows DDK (Driver Development Kit);
  2. VMware Workstation или Virtual Box;
  3. Windows XP;
  4. Visual Studio 2005;
  5. DDKWizard;
  6. KmdManager
  7. DebugView;

Я использую две виртуальные машины, пишу драйверы на одной, а запускаю на другой. Если вы тоже решите так делать то для той машины, на которой вы будете запускать драйверы, хватит 4 Гбайтового жесткого диска и 256 Мбайт оперативной памяти.

Настройка рабочего места
Установка DDK

Установка предельно проста. Единственное на что необходимо обратить внимание — это диалог, в котором Вам предлагается выбрать компоненты, которые будут установлены. Настоятельно рекомендую отметить всю документацию и примеры.

Установка и настройка Microsoft® Visual Studio 2005

Установка Microsoft® Visual Studio 2005 ничем не сложнее установки DDK. Если Вы будете использовать её только для написания драйверов, то когда инсталлятор спросит какие компоненты необходимо установить, выберите только Visual C++.
Далее можно установить Visual Assist X. С помощью этой программы (аддона) можно будет легко настроить подсказки для удобного написания драйверов.
После установки Visual Assist X в Visual Studio 2005 появится новое меню VAssistX. Далее в этом меню: Visual Assist X Options -> Projects -> C/C++ Directories -> Platform: Custom, Show Directories for: Stable include files . Нажимаем Ins или на иконку добавить новую директорию и в появившейся строке, если у вас Windows XP вписываем %WXPBASE%\inc\ddk\wxp .

Установка и настройка DDKWizard

Для того чтобы в Visual Studio можно было компилировать драйверы нужно установить DDKWizard. Его можно скачать с сайта ddkwizard.assarbad.net. Также с этого сайта скачайте скрипт ddkbuild.cmd.
После того как мастер установится необходимо выполнить следующие шаги:

  • Создать системные (рекомендуется) или пользовательские переменные со следующими именами и значением, которое соответствует пути к DDK
    Версия DDK Имя переменной Путь по умолчанию
    Windows XP DDK WXPBASE C:\WINDDK\2600
    Windows 2003 Server DDK WNETBASE C:\WINDDK\3790.1830
    Windows Vista/Windows 2008 Server WDK WLHBASE
    Windows 7/Windows 2008 Server R2 WDK W7BASE

    Например, если я использую Windows XP DDK, то я должен создать переменную WXPBASE со значением, которое соответствует пути к DDK. Так как я не изменял путь установки, то значение у меня будет C:\WINDDK\2600.

  • Скопируйте скачанный скрипт ddkbuild.cmd, например, в папку с DDK. У меня это C:\WINDDK\.
  • Добавьте в конец системной переменной Path путь к скрипту ddkbuild.cmd.

Всё, машина, на которой будем запускать драйверы, готова.

Установка необходимого ПО для запуска драйверов

Теперь настроим машину, на которой будем запускать написанные драйверы.
Нам потребуются следющие программы:

  • DebugView (link) — это утилитка, которая позволяет просматривать отладочный вывод как режима пользователя так и режима ядра.
  • KmdManager (link) — утилита динамической загрузки/выгрузки драйверов

Всё, машина готова для запуска драйверов.

Постановка задачи

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

Немного теории

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

  • драйверы классов;
  • минидрайверы;
  • функциональные драйверы;
  • фильтрующие драйверы.

Драйверы классов — это драйверы, котрые пишет Microsoft. Это общие драйвера для определенного класса (неужели!) устройств.
Минидрайверы — драйверы, которые используеют драйвер класса для управления устройством.
Функциональные драйверы — это драйверы, которые работают самостоятельно и определяет все что связано с устройством.
Фильтрующие драйверы — драйверы, которые используются для мониторинга или изменения логики другого драйвера путем изменения данных, которые идут к нему.

Необязательно определять все возожные функции в своем драйвере, но он обязательно должен содержать DriverEntry и AddDevice .

IRP — это структура, которая используется драйверами для обмена данными.

Итак, для того чтобы выводить скан-коды (что это?) в дебаг, будем использовать фильтрующий драйвер.
Существует два типа фильтрующих драйверов:

  • верхние фильтрующие драйверы;
  • нижние фильтрующие драйверы.

То, к какому типу относится ваш драйвер, зависит от того где этот драйвер находится в стеке драйверов устройств. Если Ваш драйвер находится выше функционального драйвера, то его называют верхним фильтрующим драйвером, если ниже, то, нижним фильтрующим драйвером.

Отличия между верхними и нижними фильтрующими драйверами

Через верхние фильтрующие драйверы проходят все запросы, а это значит, что они могут изменять и/или фильтровать информацию, идущую к функциональному драйверу, ну и далее, возможно, к устройству.
Пример использования верхних фильтрующих драйверов:
Фильтр-хук драйвер, который устанавливает свою хук-функцию для системного драйвера IpFilterDirver, для отслеживания и фильтрации траффика. Такие драйверы используются в брандмауэрах.

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

Проблемы синхронизации

В драйвере, который мы будем писать, есть несколько «проблемных» секций. Для нашего драйвера вполне достаточно использования ассемблерных вставок:

Префикс lock позволяет безопасно выполнить идущую за ним команду. Она блокирует остальные процессоры, пока выполняется команда.

Экшен

Для начала необходимо включить заголовочные файлы «ntddk.h», «ntddkbd.h»

Также необходимо описать структуру DEVICE_EXTENSION

Объект pLowerDO это объект устройства, который находится ниже нас в стеке. Он нужен нам для того чтобы знать кому дальше отправлять IRP-пакеты.
Еще для работы нашего драйвера нам нужна переменная, в которой будет храниться количество не завершенных запросов.

Начнем с функции, которая является главной точкой входа нашего драйвера.

theDriverObject – объект драйвера, содержит указатели на все необходимые операционной системе функции, которые мы должны будем инициализировать.
ustrRegistryPath – имя раздела в реестре, где хранится информация о данном драйвере.
Для начала необходимо объявить и обнулить переменные:

Далее, как я и писал выше, нужно инициализировать указатели на функции

Функция DispatchRead будет обрабатывать запросы на чтение. Она будет вызываться, когда нажата или отпущена клавиша клавиатуры.
Функция DriverUnload вызывается, когда драйвер уже не нужен и его можно выгрузить из памяти, или когда пользователь сам выгружает драйвер. В данной функции должна производиться «зачистка», т.е. освобождаться ресурсы, которые использовались драйвером, завершаться все незавершенные запросы и т.д.
Функция DispatchThru это функция-заглушка. Все что она делает это передача IRP-пакета следующему драйверу (драйверу который находится под нашим в стеке, т.е. pLowerDO из DEVICE_EXTENSION ).
Далее мы вызываем нашу функцию, для создания и установки нашего устройства в стек устройств:

Эту функцию я опишу чуть ниже.
Возвращаем status , в котором, если функция InstallFilter завершилась удачей, хранится значение STATUS_SUCCESS .
Переходим к функции InstallFilter . Вот её прототип:

Эта функция создает объект устройства, настраивает его и включает в стек устройств поверх \\Device\\KeyboardClass0

pKeyboardDevice – это объект устройсва, которое мы должны создать.
Вызываем IoCreateDevice для создания нового устройства

Разберем подробнее параметры:

  • Первый аргумент это объект драйвера, который мы получили как параметр функции InstallFilter. Он передается в IoCreateDevice для того чтобы установить связь между нашим драйвером и новым устройством.
  • Третий параметр это имя устройства
  • Четвертый параметр это тип устройства
  • Пятый параметр это флаги, которые обычно устанавливаются для запоминающих устройств.
  • Шестой параметр описывает можно ли открывать манипуляторы устройства в количестве больше одного. Если FALSE можно открыть только один манипулятор. Иначе можно открыть любое количество манипуляторов.
  • Седьмой параметр это память, в которой будем сохранен созданный объект устройства.

Далее устанавливаем флаги устройства.

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

Функция IoAttachDevice внедряет наше устройство в стек. В pdx->pLowerDO будет храниться объект следующего (нижнего) устройства.

Далее разберем функцию DispatchRead с прототипом:

Данная функция будет вызываться операционной системой при нажатии или отпускании клавиши клавиатуры
Увеличиваем счетчик незавершенных запросов

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

где ReadCompletionRoutine наша функция.
Передаем IRP следующему драйверу:

Теперь разберем функцию, которая будет вызываться каждый раз при завершении IRP . Прототип:

Структура PKEYBOARD_INPUT_DATA используется для описания нажатой клавиши.

Проверяем, удачно завершен запрос или нет

Чтобы достать структуру KEYBOARD_INPUT_DATA нужно обратиться к системному буферу IRP -пакета.

Узнаем количество клавиш

И выводим каждую клавишу:

И не забываем уменьшать количество не обработанных запросов

Возвращаем статус запроса

Разберем функцию завершения работы. Прототип:

Извлекаем устройство из стека:

Проверяем есть незавершенные запросы или нет. Если мы выгрузим драйвер без этой проверки, при первом нажатии на клавишу после выгрузки будет БСоД.

Как запустить драйвер и просмотреть отладочную информацию

Для запуска драйвера я использовал утилиту KmdManager. Для просмотра отладочной информации использовалась утилита DbgView.

P. S. Статью писал давно, ещё на третьем курсе, сейчас уже почти ничего не помню. Но если есть вопросы, постараюсь ответить.
P. P. S. Прошу обратить внимание на комментарии, в частности на этот

Источник

WDS (Windows Deployment Services). Быстрое развертывание клиентских машин с сервера. Создание образа развертывания WIM

Начало и конец

Добрый день всем читающим!
Много статей было об этом, много блогов, но статья HowTo, без напильника, найдена не была, и это крайне печально.
Для небольших развертываний эта вещь, из коробки просто незаменима.

Для тех кто не знает: WDS (центр развертывания) это специальное средство, которое есть в серверной ОС Microsoft, с помощью него можно установить систему на большое количество компьютер одновременно, с помощью сети, используя PXE.
Также тут будет информация о препарировании wim, и немножко о DHCP.
Итак начнем под катом.

Часть 1. Установка

Эту часть можно пропустить тем, кто хоть раз делал установку служб\компонентов в Server 2012R2. Из этого блока нужен только пункт 1.3.

Идеалом для WDS является, если DHCP сервером является эта же машина. Тогда он может корректно передать информацию о PXE Boot.

1.1 Включение WDS

Установка WDS в картинках. Все просто.


Раз


Два


Три

Дальше начинается то, что потребует чуть больше, чем просто Nextnextnext)/

1.2 Включение роли

После установки выбираем в списке консоли наш сервер WDS.

Так как по умолчанию предлагается загрузочные и установочные образы хранить на системном диске (что не рекомендуется), то создадим на разделе E: папку RemoteInstall, которая и была указана мастеру настройки сервера.


Тут на ваш выбор

1.3 Образы

На установочном диске с любой системой, начиная с Vista, есть папка source, там лежат два файла boot.wim и install.wim
Boot.wim — это образ для запуска, предзагрузочный.
install.wim — это образ самой системы.

Если boot.wim ещё надо будет подготовить, для работы, то install.wim сразу готов для установки.

В диспетчере сервера boot — образы загрузки, install — образы установки.

Часть 2. Препарирование Boot.wim

Очень часто возникает одна большая пролема:

Сразу интегрируем необходимые драйвера в этот образ, дабы избежать этой проблемы.
Она возникает, из-за отсутствия в образе драйверов для сетевой карты, которая интегрирована \ установлена в компьютер, на котором будет происходить установка ОС.

2.1 Утилиты

По умолчанию в 2012 сервере, после установки WDS, утилита dism может работать с образами wim в полной мере.
Для 2008/R2 или 7 вам понадобится Windows Automated Installation Kit (WAIK) и у вас появится инструмент dism.

Создаем структуру папок: c:\drivers\mount — папка монтирования WIM образа; c:\drivers\lan_drivers — папка с драйверами для сетевой карты.
Копируем boot.wim от ОС в папку c:\drivers
Предостерегаю! Чем больше драйверов, тем больше универсальности, но и размер образа сильно увеличивается, это необходимо учитывать. Образ целиком заливается в RAM.

2.2 Препарирование

Для 2008\7 запускаем Deployment Tools Command Prompt из меню пуск с правами администратора.
Для 2012 — запускаем командную строку с правами администратора.

Смотрим содержимое загрузочного образа boot.wim:

dism /get-wiminfo /wimfile:c:\drivers\boot.wim

По идее там должно быть так:

Как видно из скриншота boot.wim содержит два образа — Windows PE (Индекс 1) и Windows Setup (Индекс 2). Драйвера для сетевой карты надо добавлять в Windows Setup, поэтому будем работать с образом 2 (Индекс 2).

Но не так всё просто. Компания добра Microsoft заблокировала для изменения этот образ, для его редактирования его надо «перезалить».
Выполняем:

Dism /Export-Image /SourceImageFile:c:\drivers\boot.wim /SourceIndex:1 /DestinationImageFile:c:\drivers\boot1.wim
Dism /Export-Image /SourceImageFile:c:\drivers\boot.wim /SourceIndex:2 /DestinationImageFile:c:\drivers\boot1.wim

dism /get-wiminfo /wimfile:c:\drivers\boot.wim

Должна выдать те же два раздела, с index 1 & 2.

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

dism /Mount-Wim /WimFile:c:\drivers\boot.wim /index:2 /MountDir:c:\drivers\mount

Добавляем драйвера в образ. Драйвера можно добавлять по одному, либо сразу все из определенной директории.
Для добавления драйвера указываем полный путь к файлу .INF:

dism /image:c:\drivers\mount /add-driver /driver:«C:\drivers\lan_drivers\E1C5232.INF»

dism /image:c:\drivers\mount /add-driver /driver:«C:\drivers\lan_drivers» /recurse /forceunsigned

dism /unmount-wim /mountdir:c:\drivers\mount /commit

параметр /commit указывает, что нужно сохранять все изменения в образе, без него все изменения будут потеряны.

2.4 Образ в хранилище

Теперь перекопируем его в любую директорию, где у вас будут хранится образы.
И установим на сервер WDS.

Теперь необходимо указать имя. Имя образа — это то, что будете видеть вы, при выборе загрузчиков, если у вас их несколько.

2.5 Безопастность

Security — Чтобы добавить разрешения для учетной записи пользователя на группу образов, щелкните правой кнопкой мыши группу оразов и нажмите security. Добавьте учетную запись пользователя из AD и настройте полный контроль. Если вы используете учетную запись администратора домена во время установки WDS, то это можно не делать.

Часть 3. Образ системы. Кастомный вариант

Для начала устанавливаем ОС. Ставим всё что надо.
Далее препарируем её. По ссылке создание настроенного образа операционной системы

Хорошая статья по IMAGEX + WINPE созданию образа там же есть ссылки вначале статьи для создания WIN7 & WIN8. Либо находим на просторах интернета WindowsPE, по вашему желанию)
Для дальшейшего нам нужен образ WinPe с утилитой ImageX правильной битности.

3.1 Создание образа и его копирование на сетевой ресурс с помощью Windows PE и программы ImageX

NET USE y: \\nmp\oem\ /USER:AD\ *
И ввести свой пароль.
! надо понять какой диск является каким, для этого с помощью команды DIR C: (D,E,F & etc), перебираем диски, если их несколько
Далее необходимо записать образ основной установки с помощью программы ImageX, расположенной в среде Windows PE, или на другом диске, на сетевой ресурс. Для этого необходимо ввести следующую команду:

e:\imagex.exe /capture d: y:\ .wim » » /compress fast /verify

Где e:\ — RAM Disk, D: — OS Disc, Y: — сетевой диск. После этого пойдёт процесс создания и копирования образа на указанный сетевой ресурс.
По завершении создания образа и его копирования на сетевой ресурс необходимо ввести команду exit и приложение закроется и компьютер начнёт перегружаться.

3.1.1 Ручное развертывание

Битность системы должна быть той же, что и у системы, которую мы распаковываем.
После создания образа, можно развернуть его на новое оборудование с помощью программы ImageX и среды Windows PE.
Форматируем диск, для распаковки на него WMI.
Для этого надо ввести следующие команды:

diskpart
select disk 0
clean
create partition primary size=100
select partition 1
format fs=ntfs label=«system»
assign letter=c
active
create partition primary
select partition 2
format fs=ntfs QUICK
assign letter=e
exit

Можно создать сценарий для данной процедуры, сохранив приведенную информацию в текстовый файл в папке с образом. Чтобы выполнить сценарий из командной строки среды Windows PE, необходимо ввести команду: diskpart /s .txt

Форматирование следует проводить ТОЛЬКО в среде Windows PE. Если отформатировать жёсткий диск на другом компьютере средствами Windows, а затем вставить этот жёсткий диск в конечный компьютер, то образ с вероятностью 80% НЕ РАЗВЕРНЁТСЯ.

Подключаемся к сетевому ресурсу для развёртывания образа, введя следующую команду:

NET USE y: \\nmp\oem\ /USER:AD\ *
Вводим пароль.
! надо понять какой диск является каким, для этого с помощью команды DIR C: (D,E,F & etc), перебираем диски, если их несколько
Разворачиваем образ на жесткий диск с помощью программы ImageX, с сетевого ресурса, введя следующую команду:

После этого пойдёт процесс развёртывания образа на указанный жёсткий диск с сетевого ресурса.

Далее, с помощью средства BCDboot необходимо инициализировать хранилище данных конфигурации загрузки (BCD) и скопировать файлы среды загрузки в системный раздел, введя в командной строке следующую команду:

По завершении создания образа и его копирования на сетевой ресурс необходимо ввести команду exit и приложение закроется и компьютер начнёт перегружаться.
Настроенный образ развернут на конечный компьютер.

3.2 Сервер

Настроим сервер, для работы с образами.

Добавим наш готовый образ в «Образы установки»:

Как в случае с загрузочным образом указываем мастеру путь к файлу wim, который мы создали:

В оригинальном файле install.wim может содержаться несколько редакций:

Но в созданном должна быть только одна.

Часть 4. Великий и ужасный DHCP

1) WDS и DHCP установлены на одном сервере.

WDS и DHCP не могут занимать порт UDP 67 одновременно. Запретив службе WDS прослушивать порт UDP 67, можно предоставить порт для DHCP-трафика и присвоить DHCP-параметру 60 (параметр области или сервера) значение PXEClient, устранив конфликт.
Если служба WDS устанавливается на DHCP-сервере, в ходе настройки появляется страница DHCP Option 60. Установите флажки Do not listen on port 67 и Configure DHCP option 60 to PXEClient. В сообщении, получаемом клиентом от сервера DHCP, содержится IP-адрес, маска подсети и параметр 60.
В результате клиенту становится ясно, что сервер DHCP является одновременно и сервером WDS. Если позднее добавить DHCP к серверу WDS, можно настроить этот параметр, щелкнув правой кнопкой мыши на имени сервера в оснастке WDS и выбрав пункт Properties. На вкладке DHCP имеются аналогичные флажки.

2) WDS и DHCP находятся на различных серверах, в одной подсети с клиентами.

Дополнительной настройки не требуется, так как WDS и DHCP расположены на разных серверах. Обе службы могут прослушивать порт UDP 67, а клиенты находятся в одной подсети с серверами WDS и DHCP, поэтому широковещательный трафик доступен для всех.

3) WDS и DHCP устанавливаются на различных серверах, в разных подсетях.

Службы WDS и DHCP, установленные на разных серверах, не мешают друг другу прослушивать порт UDP 67.

Вы должны настроить маршрутизатор на отправку широковещательных пакетов, потому что чаще всего мы видим, что широковещательные пакеты не могут идти в другие подсети. Кроме того, весь трафик на UDP порт 4011 от клиентских компьютеров к серверу служб развертывания Windows должен быть направлен соответствующим образом.

Чтобы помочь клиенту WDS найти сервер WDS мы должны настроить DHCP опцию 66 и DHCP опцию 67.
Настройка параметров DHCP в сети IPv4 выполняется из оснастки DHCP, доступной из раздела Administrative Tools меню Start.

В оснастке DHCP разверните IPv4, а затем щелкните правой кнопкой мыши Server Options (или параметры области) и выберите пункт Configure Options. Прокрутите список до элемента 066 Boot Server Host Name, установите флажок и введите имя узла сервера WDS в текстовом поле (можно использовать имя, но желательно IP).

Затем установите флажок 067 Bootfile Name. В текстовом поле введите путь и имя файла Preboot Execution Environment (PXE) для загрузки на клиенте. Текстовое значение для параметра 67:

boot\x86\wdsnbp.com — 32 bit
ИЛИ
boot\x64\wdsnbp.com — 64 bit

Также есть рекомендации с иностранных сайтов:

Configure DHCP option 67 with the right boot image file.

For 32-bits systems \boot\x86\wdsnbp.com
For 64-bits systems \boot\x64\wdsnbp.com

4.1 CNP

Client Naming Policy — в настройках сервера WDS, выберите AD DS. В Client Naming Policy указать формат, на основании которого компьютерам будет задаваться имя.
Шаблон по умолчанию именования %61Username% #, это означает, WDS создаст имя компьютера, используя имя пользователя, вошедшего на удаленный при выполнении процесса установки и # это число 1,2,3… до 999 будет добавлен после имени пользователя.

4.2 Cisco DHCP MODE

BU# ip dhcp pool DATA
BU# option 66 ascii «1.2.3.4»
BU# option 67 ascii «bootfile.pxe»

Часть 5. немного послесловия

Собственно всё. Это небольшая статья, и кажется она закончена.
Кто-бы что не говорил, но для небольших сеток это очень нужная вещь.
Для тех, кто захочет расширить функционал, есть просто отличная статья на Geektimes: «Добавляем WDS универсальности».

На этому спешу откланяться, спасибо всем кто заинтересовался этой статьёй.

Если есть оЧепятки в тексте пиши в личных сообщениях, флудить и троллить не спортивно! Если можете что-то важное добавить, добавлю в статью.

Существует MDT (Microsoft Delpoyment Toolkit).
С помощью него можно сразу добавить ключ в образ и установить продукты с quiet установкой.
Также настроить имя пользователя администратора и его пароль.
Требует отдельного компьютера и установленных зависимостей.

darthslider
В первую очередь MDT — это поддежка Task Seqence, то есть это любые скрипты и настройки на любом этапе установки.
Так же это удобный редактор unattend.xml
Ну и в придачу установка ПО, постнастройка, ввод в домен и тд, а так же поддержка сценариев обновления ОС (захват по и настроек, установка новой ос, восстановление), миграции пользователя на новый пк (схоже с предыдущим сценарием). Но последние 2 пунтка это довольно сильное шаманство.

(О настройке и поднятии видео ТУТ.)

Источник

READ  Как вывести смартфон на экран ноутбука windows 7