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

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

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

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

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

Разработчик драйверов может использовать User-Mode Driver Framework (UMDF) или Kernel-Mode Driver Framework (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, см. в следующих разделах:

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

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