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 드라이버의 하드웨어 리소스 찾기 및 매핑 에서 설명한 대로 레지스터를 매핑한 후, 드라이버는 READ/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 지시문에서 UmdfRegisterAccessMode을 RegisterAccessUsingUserModeMapping으로 설정하여 메모리 매핑 레지스터를 사용자 모드 주소 공간으로 매핑하도록 프레임워크를 설정할 수 있습니다. 일부 드라이버는 성능상의 이유로 이 작업을 수행해야 할 수 있습니다. UMDF INF 지시문의 전체 목록은 INF 파일의 WDF 지시문 지정을 명시하는 섹션을 참조하세요.
드라이버는 사용자 모드로 레지스터를 매핑한 경우에도 읽기/WRITE_REGISTER_Xxx 루틴을 사용해야 합니다. 이러한 루틴은 드라이버 입력의 유효성을 검사하고 드라이버가 잘못된 위치에 대한 액세스를 요청하지 않는지 확인합니다. 드라이버가 이러한 루틴을 사용하지 않고 사용자 모드 매핑 레지스터에 직접 액세스해야 하는 경우는 거의 없습니다. 이렇게 하려면 드라이버는 매핑된 기본 주소에서 IWDFDevice3::GetHardwareRegisterMappedAddress 호출하여 사용자 모드 매핑된 주소를 검색합니다. UMDF는 이러한 방식으로 수행된 읽기 및 쓰기 액세스의 유효성을 검사하지 않으므로 이 기술은 등록 액세스에 권장되지 않습니다.