Идентификаторы подключений для периферийных устройств SPB-Connected

Прежде чем драйвер сможет отправлять запросы ввода-вывода на периферийное устройство в простой периферийной шине (SPB), драйвер должен открыть логическое подключение к устройству. Через это подключение драйвер может отправлять запросы на чтение и запись для передачи данных на устройство и с устройства. Кроме того, драйвер может отправлять запросы на управление вводом-выводом (IOCTL) на устройство для выполнения операций, зависящих от SPB.

При запуске системы диспетчер Plug and Play (PnP) перечисляет как устройства PnP, так и устройства, отличные от PnP. Для периферийного устройства, отличного от PnP, которое имеет фиксированное подключение к SPB, диспетчер PnP запрашивает встроенное ПО ACPI аппаратной платформы, чтобы получить набор параметров подключения, описывающих способ доступа к устройству. Эти параметры подключения определяют контроллер SPB для шины, к которой подключено устройство, и включают в себя другие сведения, такие как адрес шины и частота шины, необходимые контроллеру для связи с устройством.

Диспетчер PnP назначает идентификатор , называемый идентификатором подключения, параметрам подключения для периферийного устройства, подключенного к SPB. Диспетчер PnP сохраняет этот идентификатор и параметры подключения вместе в системном хранилище данных, называемом концентратором ресурсов. (Концентратор ресурсов — это внутреннее хранилище данных, в котором диспетчер PnP хранит сведения о конфигурации периферийного устройства, подключенного к SPB.) Идентификатор подключения инкапсулирует эти параметры, поэтому драйверу не нужно явно предоставлять их.

Драйвер для периферийного устройства, подключенного к SPB, получает идентификатор подключения для устройства в составе назначенных драйвером аппаратных ресурсов. Когда драйвер для периферийного устройства вызывает системную функцию для открытия подключения к устройству, драйвер предоставляет идентификатор подключения, который функция использует для получения параметров подключения устройства из концентратора ресурсов.

Разработчик драйвера может использовать среда выполнения платформы драйвера режима пользователя (UMDF) или платформу драйвера в режиме ядра (KMDF) для сборки драйвера для периферийного устройства, подключенного к SPB. Драйвер UMDF получает свои ресурсы (включая идентификатор подключения), когда платформа вызывает метод IPnpCallbackHardware2::OnPrepareHardware драйвера. Драйвер KMDF получает аппаратные ресурсы во время обратного вызова EvtDevicePrepareHardware .

Чтобы разрешить драйверу периферийного устройства UMDF получать идентификаторы подключений в списке ресурсов, INF-файл, устанавливающий драйвер, должен включать следующую директиву в разделе DDInstall для WDF:

UmdfDirectHardwareAccess = AllowDirectHardwareAccess Дополнительные сведения об этой директиве см. в разделе Указание директив WDF в INF-файлах. Пример INX-файла (используемого для сборки соответствующего INF-файла), использующего эту директиву, см. в примере драйвера SpbAccelerometer .

Идентификатор подключения, который драйвер получает в качестве ресурса, является 64-разрядным целым числом, но драйвер должен включить этот идентификатор в имя пути устройства, которое можно использовать для получения параметров подключения из концентратора ресурсов. Чтобы создать путь к устройству, драйвер вызывает функцию RESOURCE_HUB_CREATE_PATH_FROM_ID , которая объявлена в файле заголовка Reshub.h.

Чтобы открыть логическое соединение с периферийным устройством, подключенным к SPB, драйвер UMDF вызывает метод IWDFRemoteTarget::OpenFileByName , а драйвер KMDF вызывает метод WdfIoTargetOpen . Для любого из этих методов в качестве входного параметра требуется имя пути устройства.

Примеры кода UMDF и KMDF, которые используют идентификаторы подключений для открытия логических подключений к периферийным устройствам, подключенным к SPB, см. в следующих разделах:

Аппаратные ресурсы для User-Mode периферийные драйверы SPB. Аппаратные ресурсы для Kernel-Mode драйверы периферийных устройств SPB Приложения в режиме пользователя не могут открывать логические подключения к периферийным устройствам, подключенным к SPB, и не могут отправлять запросы ввода-вывода непосредственно на эти устройства.

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