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


Рекомендации по написанию процедур 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.