Чтение и запись в регистры устройств в драйверах UMDF 1.x

Предупреждение

UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. В UMDF 1 новые функции не добавляются, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2.

Архивные примеры UMDF 1 можно найти в Windows 11 версии 22H2 — обновление примеров драйверов за май 2022 г.

Дополнительные сведения см. в разделе начало работы с помощью UMDF.

Начиная с UMDF версии 1.11, платформа предоставляет набор процедур для доступа к регистрам в пространстве памяти и пространстве портов ввода-вывода. Процедуры регистрации и доступа к портам UMDF очень похожи на процедуры HAL, используемые драйверами режима ядра. После того как драйвер сопоставил регистры, как описано в разделе Поиск и сопоставление аппаратных ресурсов в драйвере UMDF, драйвер использует подпрограммы READ/WRITE_REGISTER_Xxx для чтения и записи в отдельные регистры. Для портов ввода-вывода драйвер вызывает подпрограммы READ/WRITE_PORT_Xxx.

В этом примере показано, как выполнить запись в регистр, сопоставленный в памяти.

VOID
CMyQueue::WriteToDevice(
    __in IWDFDevice3* pWdfDevice,
    __in UCHAR Value
    )
{
    //
    // Write the UCHAR value at offset 2 from register base
    //
    WRITE_REGISTER_UCHAR(pWdfDevice, 
                      (m_MyDevice->m_RegBase)+2, 
                       Value);
}

По умолчанию UMDF использует системные вызовы для доступа к регистрам, сопоставленным либо в памяти, либо в пространстве порта ввода-вывода. Регистр в пространстве портов ввода-вывода всегда осуществляется через системный вызов. Однако при доступе к регистрам, сопоставленным в памяти, драйвер UMDF может привести к тому, что платформа сопоставляет регистры, сопоставленные с памятью, в адресное пространство пользовательского режима, задав директиве INF UmdfRegisterAccessAccessModeзначение RegisterAccessUsingUserModeMapping. Некоторые драйверы могут потребоваться сделать это из соображений производительности. Полный список директив INF UMDF см. в разделе Указание директив WDF в INF-файлах .

Драйвер должен использовать подпрограммы READ/WRITE_REGISTER_Xxx, даже если регистры сопоставлены с пользовательским режимом. Эти подпрограммы проверяют входные данные драйвера и гарантируют, что драйвер не запрашивает доступ к недопустимым расположениям. В редких случаях драйверу может потребоваться прямой доступ к регистрам, сопоставленным в пользовательском режиме, без использования этих подпрограмм. Для этого драйвер получает сопоставленный адрес в пользовательском режиме, вызывая IWDFDevice3::GetHardwareRegisterMappedAddress для сопоставленного базового адреса. Так как UMDF не проверяет доступы на чтение и запись, выполняемые таким образом, этот метод не рекомендуется для регистрации доступа.