Доступ к пространству конфигурации устройства PCI
Некоторые операции с устройством взаимодействия между периферийными компонентами (PCI) зарезервированы для драйвера функции устройства. К таким операциям относятся, например, получение доступа к конфигурационному пространству устройства шины и программирование контроллера прямого доступа к памяти (DMA). Корпорация Майкрософт предоставляет системную поддержку доступа к пространству конфигурации устройств PCI двумя способами:
Интерфейс шины BUS_INTERFACE_STANDARD
Пакеты запросов ввода-вывода конфигурации (IRPs), IRP_MN_READ_CONFIG и IRP_MN_WRITE_CONFIG
Заметка
Начиная с Windows 10 версии 2004, если устройство имеет таблицу ACPI безопасных устройств (SDEV) и включена безопасность на основе виртуализации, то накладываются ограничения на неподдерживаемые методы доступа к пространству конфигурации устройств PCI. Если драйвер или процесс пытается считывать или манипулировать пространством конфигурации устройства PCI с помощью метода, который не указан выше, доступ будет заблокирован и приведет к проверке системной ошибки.
Операционные системы Windows XP и Windows Server 2003 и более поздних версий имеют монопольный контроль над заголовком пространства конфигурации, как определено спецификацией локальной шины PCI, а также все возможности в связанном списке возможностей. Драйверы не должны пытаться изменить эти регистры.
Однако драйверы могут записывать данные в пространство конфигурации, которое не принадлежит заголовку или списку возможностей, определенному поставщиком, с помощью запроса IRP_MN_WRITE_CONFIG или метода SetBusData BUS_INTERFACE_STANDARD. Драйверы также могут считывать возможности устройства, используя либо запрос IRP_MN_READ_CONFIG, либо метод GetBusData интерфейса BUS_INTERFACE_STANDARD. Чтобы использовать IRP_MN_READ_CONFIG или IRP_MN_WRITE_CONFIG, драйверы должны работать на уровне PASSIVE_LEVEL. Список возможностей и соответствующих структур, которые могут запрашивать драйверы, см. в разделе структуры PCI.
Драйверы могут считывать данные из расширенного пространства конфигурации устройства PCI (то есть более 256 байт конфигурационных данных) с помощью запроса IRP_MN_READ_CONFIG или метода GetBusData, предоставляемого BUS_INTERFACE_STANDARD. Водители также могут записывать данные в расширенное пространство конфигурации устройства PCI, используя запрос IRP_MN_WRITE_CONFIG или метод SetBusData из BUS_INTERFACE_STANDARD. Если устройство не имеет расширенного пространства конфигурации или платформа не определяет путь к расширенному пространству конфигурации на устройстве, запросы на чтение будут возвращать значение 0xFFFF, а запросы на запись не будут иметь эффекта. Чтобы определить, выполнена ли операция успешно, драйверы могут проверить количество байтов, прочитанных или записанных.
PCI Express и режим PCI-X 2 поддерживают расширенное пространство конфигурации устройства PCI размером более 256 байт. Драйверы могут читать и записывать данные в это пространство конфигурации, но только с соответствующей поддержкой оборудования и BIOS. В BIOS ACPI корневой шине должен быть идентификатор PNP PNP0A08 или PNP0A03. Для корневых автобусов с идентификатором PNP0A03 метод _DSM с функцией 4 должен указывать, что текущий режим - это режим PCI-X, режим 2. Все мосты и устройства должны быть либо PCI Express, либо работать в режиме PCI-X 2.
Кроме того, система должна поддерживать доступ к конфигурационному пространству, сопоставляемому с памятью. Это происходит путем определения таблицы MCFG в системе BIOS/встроенного ПО.
Предупреждение
HalGetBusDataByOffset и HalSetBusDataByOffset предоставляются для обратной совместимости, но их следует использовать только в том случае, если использование приведенных выше двух методов невозможно.