Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Подпрограмма AddDevice в функции или драйвере фильтра должна выполнить следующие действия:
Вызовите IoCreateDevice , чтобы создать функциональный или фильтровый объект устройства (FDO или фильтр DO) для добавляемого устройства.
Не указывайте имя устройства для объекта устройства, так как это обходит безопасность менеджера PnP. Если для компонента пользовательского режима требуется символьная ссылка на устройство, зарегистрируйте интерфейс устройства (см. следующий шаг ниже). Если для компонента режима ядра требуется устаревшее имя устройства, драйвер должен назвать объект устройства, но именование не рекомендуется.
Включите FILE_DEVICE_SECURE_OPEN в параметр DeviceCharacteristics . Эта характеристика направляет диспетчер ввода-вывода для выполнения проверок безопасности объекта устройства для всех открытых запросов, включая относительные открытия и открытия по имени файла в конце.
[необязательно] Создайте одну или несколько символьных ссылок на устройство.
Вызовите IoRegisterDeviceInterface, чтобы зарегистрировать функциональные возможности устройства и создать символьную ссылку, которую могут использовать приложения или системные компоненты для открытия устройства. Драйвер должен включить интерфейс, вызвав IoSetDeviceInterfaceState при обработке запроса IRP_MN_START_DEVICE . Дополнительные сведения см. в разделе "Классы интерфейса устройства".
Сохраните указатель PDO устройства в расширении устройства.
Диспетчер PnP предоставляет указатель на PDO в качестве параметра PhysicalDeviceObject для AddDevice. Драйверы используют указатель PDO в вызовах подпрограмм, таких как IoGetDeviceProperty.
Определите флаги в расширении устройства для отслеживания определенных состояний PnP устройства, таких как приостановка устройства, удаление и неожиданное удаление.
Например, определите один флаг, чтобы указать, что входящие IRP должны храниться, пока устройство находится в приостановленном состоянии. Создайте очередь для хранения IRPs, если в драйвере еще нет механизма для постановки IRPs в очередь. Дополнительные сведения см. в разделе «Очередь и удаление IRP из очереди».
Кроме того, выделите IO_REMOVE_LOCK структуру в расширении устройства и вызовите IoInitializeRemoveLock , чтобы инициализировать эту структуру. Дополнительные сведения см. в разделе Using Remove Locks.
Задайте бит DO_BUFFERED_IO или DO_DIRECT_IO флага в объекте устройства, чтобы указать тип буферизации, используемый диспетчером ввода-вывода для запросов ввода-вывода, отправляемых в стек устройств. Драйверы более высокого уровня ИЛИ этот член с тем же значением, что и следующий драйвер в стеке, за исключением драйверов верхнего уровня. Дополнительные сведения см. в инициализации объекта устройства.
При необходимости задайте флаг DO_POWER_INRUSH или DO_POWER_PAGABLE для управления питанием. Драйверы, поддерживающие разбиение на страницы, должны устанавливать флаг DO_POWER_PAGABLE. Флаги объектов устройства обычно задаются драйвером шины при создании PDO для устройства. Однако иногда драйверам более высокого уровня может потребоваться изменить значения этих флагов в подпрограммах AddDevice при создании FDO или фильтра DO. Дополнительные сведения см. в разделе "Настройка флагов объектов устройства" для управления питанием .
Создайте и/или инициализировать любые другие ресурсы программного обеспечения, которые драйвер использует для управления этим устройством, например событиями, спин-блокировками или другими объектами. (Аппаратные ресурсы, такие как порты ввода-вывода, настраиваются позже в ответ на запрос IRP_MN_START_DEVICE .)
Так как подпрограмма AddDevice выполняется в контексте системного потока в IRQL = PASSIVE_LEVEL, любая память, выделенная с exAllocatePoolWithTag для использования исключительно во время инициализации, может быть из пула страниц, если драйвер не контролирует устройство, в котором хранится системный файл страницы. Такое выделение памяти должно быть освобождено вызовом ExFreePool прежде чем AddDevice возвращает управление.
Подключите объект устройства к стеку устройств (IoAttachDeviceToDeviceStack).
Укажите указатель на PDO устройства в параметре TargetDevice .
Сохраните указатель, возвращенный IoAttachDeviceToDeviceStack. Этот указатель, который указывает на объект устройства драйвера, находящегося уровнем ниже для устройства, является обязательным параметром для IoCallDriver и PoCallDriver при передаче IRPs вниз по стеку устройств.
Снимите флаг DO_DEVICE_INITIALIZING в FDO или фильтре DO с помощью инструкции, как показано ниже:
FunctionalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;Будьте готовы обрабатывать PnP IRP для устройства (например IRP_MN_QUERY_RESOURCE_REQUIREMENTS и IRP_MN_START_DEVICE).
Драйвер не должен управлять устройством, пока он не получит IRP_MN_START_DEVICE , содержащий список аппаратных ресурсов, назначенных устройству диспетчером PnP.