UMDF 1.x 드라이버에서 디바이스 레지스터 읽기 및 쓰기

경고

UMDF 2는 UMDF의 최신 버전이며 UMDF 1을 대체합니다. 모든 새 UMDF 드라이버는 UMDF 2를 사용하여 작성해야 합니다. UMDF 1에 새 기능이 추가되지 않으며 최신 버전의 Windows 10 UMDF 1에 대한 지원이 제한되어 있습니다. 유니버설 Windows 드라이버는 UMDF 2를 사용해야 합니다.

보관된 UMDF 1 샘플은 Windows 11 버전 22H2 - 2022년 5월 드라이버 샘플 업데이트에서 찾을 수 있습니다.

자세한 내용은 UMDF를 사용하여 시작 참조하세요.

UMDF 버전 1.11부터 프레임워크는 메모리 공간 및 I/O 포트 공간의 레지스터에 액세스하는 루틴 집합을 제공합니다. UMDF 레지스터/포트 액세스 루틴은 커널 모드 드라이버에서 사용하는 HAL 루틴과 매우 유사합니다. 드라이버가 UMDF 드라이버에서 하드웨어 리소스 찾기 및 매핑에 설명된 대로 레지스터를 매핑한 후 드라이버는 읽기/WRITE_REGISTER_Xxx 루틴을 사용하여 개별 레지스터를 읽고 씁니다. I/O 포트의 경우 드라이버는 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는 내부적으로 시스템 호출을 사용하여 메모리 공간 또는 I/O 포트 공간에서 매핑된 레지스터에 액세스합니다. I/O 포트 공간의 레지스터는 항상 시스템 호출을 통해 액세스됩니다. 그러나 메모리 매핑 레지스터에 액세스할 때 UMDF 드라이버로 인해 INF 지시문 UmdfRegisterAccessModeRegisterAccessUsingUserModeMapping으로 설정하여 메모리 매핑 레지스터를 사용자 모드 주소 공간에 매핑할 수 있습니다. 일부 드라이버는 성능상의 이유로 이 작업을 수행해야 할 수 있습니다. UMDF INF 지시문의 전체 목록은 INF 파일에서 WDF 지시문 지정을 참조하세요.

드라이버는 사용자 모드로 레지스터를 매핑한 경우에도 READ/WRITE_REGISTER_Xxx 루틴을 사용해야 합니다. 이러한 루틴은 드라이버 입력의 유효성을 검사하고 드라이버가 잘못된 위치에 대한 액세스를 요청하지 않는지 확인합니다. 드라이버가 이러한 루틴을 사용하지 않고 직접 사용자 모드 매핑 레지스터에 액세스해야 하는 경우는 거의 없습니다. 이렇게 하려면 드라이버는 매핑된 기본 주소에서 IWDFDevice3::GetHardwareRegisterMappedAddress 를 호출하여 사용자 모드 매핑된 주소를 검색합니다. UMDF는 이러한 방식으로 수행된 읽기 및 쓰기 액세스의 유효성을 검사하지 않으므로 등록 액세스에는 이 기술을 사용하지 않는 것이 좋습니다.