Leitura e gravação em registros de dispositivo em drivers UMDF 1.x

Aviso

O UMDF 2 é a versão mais recente do UMDF e substitui o UMDF 1. Todos os novos drivers UMDF devem ser gravados usando UMDF 2. Nenhum novo recurso está sendo adicionado ao UMDF 1 e há suporte limitado para UMDF 1 em versões mais recentes do Windows 10. Drivers universais do Windows devem usar UMDF 2.

Os exemplos umdf 1 arquivados podem ser encontrados no Windows 11, versão 22H2 – Atualização de exemplos de driver de maio de 2022.

Para obter mais informações, consulte Introdução com UMDF.

A partir do UMDF versão 1.11, a estrutura fornece um conjunto de rotinas para acessar registros no espaço de memória e no espaço da porta de E/S. As rotinas de registro/acesso à porta umDF são muito semelhantes às rotinas HAL usadas pelos drivers de modo kernel. Depois que um driver mapeia registros conforme descrito em Localizando e mapeando recursos de hardware em um driver UMDF, o driver usa as rotinas READ/WRITE_REGISTER_Xxx para ler e gravar em registros individuais. Para portas de E/S, o driver chama as rotinas DE LEITURA/WRITE_PORT_Xxx.

Este exemplo mostra como gravar em um registro mapeado em memória.

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);
}

Por padrão, o UMDF usa internamente chamadas do sistema para acessar os registros mapeados no espaço de memória ou no espaço da porta de E/S. Um registro no espaço da porta de E/S é sempre acessado por meio de uma chamada do sistema. No entanto, ao acessar registros mapeados em memória, um driver UMDF pode fazer com que a estrutura mapeie os registros mapeados na memória para o espaço de endereço do modo de usuário definindo a diretiva INF UmdfRegisterAccessMode como RegisterAccessUsingUserModeMapping. Alguns drivers podem precisar fazer isso por motivos de desempenho. Consulte Especificando diretivas WDF em arquivos INF para obter uma lista completa de diretivas INF UMDF.

O driver deve usar as rotinas read/WRITE_REGISTER_Xxx mesmo que tenha mapeado registros no modo de usuário. Essas rotinas validam a entrada do driver e garantem que o driver não solicite acesso a locais inválidos. Raramente, um driver pode precisar acessar registros mapeados no modo de usuário diretamente, sem usar essas rotinas. Para fazer isso, um driver recupera o endereço mapeado no modo de usuário chamando IWDFDevice3::GetHardwareRegisterMappedAddress no endereço base mapeado. Como o UMDF não valida os acessos de leitura e gravação executados dessa forma, essa técnica não é recomendada para registrar o acesso.