Поделиться через


Рекомендации по написанию подпрограмм AddDevice

При написании подпрограммы AddDevice следует учитывать следующие рекомендации по проектированию:

  • Если драйвер фильтра определяет, что его подпрограмма AddDevice вызвана для устройства, которое не требует обслуживания, драйвер фильтра должен вернуть STATUS_SUCCESS, чтобы разрешить загрузку оставшейся части стека устройств. Драйвер фильтра не создает объект устройства и не присоединяет его к стеку устройств; Драйвер фильтра просто возвращает успех и позволяет добавлять остальные драйверы в стек.

  • Драйвер должен предоставлять хранилище, обычно в расширении объекта устройства, для любых объектов, определённых ядром, и исполнительных блокировок, которые он использует. Драйвер также должен предоставлять хранилище для указателей на определенные объекты, полученные от диспетчера ввода-вывода или других системных компонентов.

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

    ExAllocatePoolWithTag для страницы или непагрегированного системного пространства памяти

    ExInitializePagedLookasideList или ExInitializeNPagedLookasideList для инициализации списка страничных или непагированных lookaside

  • Если драйвер имеет выделенный устройством поток или ожидает любых объектов диспетчера, определенных ядром, подпрограмма AddDevice может инициализировать объекты диспетчера ядра.

  • Если драйвер использует какие-либо исполнительные спин-блокировки или предоставляет хранилище для спин-блокировки прерывания, подпрограмма AddDevice может инициализировать эти спин-блокировки. Дополнительные сведения см. в разделе Спин-блокировки.

  • Усильте безопасность открытия файлов при вызове IoCreateDevice.

    Укажите характеристику FILE_DEVICE_SECURE_OPEN при вызове IoCreateDevice. Эта характеристика поддерживается в Windows NT 4.0 с пакетом обновления 5 (SP5) и более поздних версий. Он поручает диспетчеру ввода-вывода выполнять проверки безопасности объекта устройства для всех открытых запросов. Поставщики должны указать эту характеристику при вызовах IoCreateDevice, если характеристика FILE_DEVICE_SECURE_OPEN не установлена в INF-установщике класса устройства или INF устройства, а драйверы не выполняют собственную проверку безопасности при открытии. (Дополнительные сведения см. в разделе "Управление доступом к пространству имен устройств".)

    Если драйвер устанавливает характеристику FILE_DEVICE_SECURE_OPEN при вызове IoCreateDevice, диспетчер операций ввода-вывода применяет дескриптор безопасности для объекта устройства к любому относительному открытию или открытиям с хвостовой части имени файла. Например, если FILE_DEVICE_SECURE_OPEN задано для \Device\foo, а если \Device\foo можно открыть только администратором, то \Device\foo\abc также можно открыть администратором. Однако диспетчер ввода-вывода запрещает обычному пользователю открывать \Device\foo и \Device\foo\abc.

    Если один из драйверов устройства задает эту характеристику, диспетчер PnP распространяет её на все объекты устройства.

Это важно

DDIs ExAllocatePool, изложенные в этом разделе, были признаны устаревшими в Windows 10 версии 2004 и были заменены ExAllocatePool2 и ExAllocatePool3. Дополнительные сведения см. в разделе Обновление устаревших вызовов ExAllocatePool к ExAllocatePool2 и ExAllocatePool3.