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 register/port access routinesは、カーネル モード ドライバーで使用される HAL ルーチンによく似ています。 ドライバーがFinding and Mapping Hardware Resources in a UMDF Driverの説明に従って、レジスターをマップした後、ドライバーは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 ディレクティブ UmdfRegisterAccessModeRegisterAccessUsingUserModeMappingに設定することによって、フレームワークにメモリ マップト レジスターをユーザー モードアドレス領域にマップさせることができます。 一部のドライバーは、パフォーマンス上の理由からこれを行う必要がある場合があります。 WDF INF ディレクティブの完全なリストについては、Specifying WDF Directives in INF Filesをご参照ください。

ドライバーは、レジスターをユーザー モードにマップした場合でも、READ/WRITE_REGISTER_Xxx ルーチンを使用する必要があります。 これらのルーチンは、ドライバーの入力を検証し、ドライバーが無効な場所へのアクセスを要求しないことを確認します。 まれに、ドライバーは、これらのルーチンを使用せずに、ユーザー モードのマップされたレジスターに直接アクセスする必要がある場合があります。 これを行うには、ドライバーは、マップされたベース アドレスでIWDFDevice3::GetHardwareRegisterMappedAddressを呼び出すことによって、ユーザー モードのマップされたアドレスを取り戻します。 UMDF は、この方法で実行される読み取りアクセスと書き込みアクセスを検証しないため、この方法はレジスターーアクセスには推奨されません。