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


Чтение и запись в регистры устройств в драйверах 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.

Начиная с версии 1.11 UMDF платформа предоставляет набор подпрограмм для доступа к регистрам в пространстве памяти и пространстве портов ввода-вывода. Рутины доступа к регистрам/портам UMDF очень похожи на процедуры HAL, используемые драйверами режима ядра. После сопоставления регистров, как описано в разделе #B0 Поиск и сопоставление аппаратных ресурсов в #A1 драйвера 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 UmdfRegisterAccessMode в значение RegisterAccessUsingUserModeMapping. Некоторым драйверам может потребоваться сделать это по соображениям производительности. Полный список директив UMDF INF см. в Указания о WDF директнивах в INF файлах.

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