RemoteFX USB デバイス リダイレクトに対応する際の留意点

皆さん、こんにちは。Windows Driver Kit サポートチームの津田です。

 

今月、英語ではございますが、以下の技術情報を公開しました。スキャナをご利用の方やスキャナドライバの開発者のお役に立つと思いますので、その内容をご紹介します。

 

  RemoteFX USB redirected scanner doesn't start on Windows Server 2012 or Windows Server 2012 R2

  https://support.microsoft.com/en-us/kb/3125295

 

これは、「RemoteFX USB デバイス リダイレクト」で接続されたスキャナが Windows Server 2012 または Windows Server 2012 R2 においてスキャンの開始ができない、という現象についての技術情報です。

ちなみに、「RemoteFX USB デバイス リダイレクト」とは、リモートデスクトップ接続をしたときに、クライアント側の PC につながっている様々な USB デバイスを、リモートセッション上でも使えるようにする機能です。

 

  デバイスやリソースをリモート デスクトップ セッションで使用する方法

  https://windows.microsoft.com/ja-JP/windows7/How-can-I-use-my-devices-and-resources-in-a-Remote-Desktop-session

 

この現象は、例えば、以下のような環境で、以下の手順を実施した場合に発生します。

 

◆環境

- RDP クライアント : Windows 8.1 Pro x64 + USB スキャナを接続

- RDP サーバー : Windows Server 2012 R2 Datacenter + 該当するスキャナドライバをインストール

 

◆手順

1) Windows 8.1 で、ローカルグループポリシーにて

[ コンピューターの構成] – [管理テンプレート] - [Windows コンポーネント] - [リモート デスクトップサービス]

- [ リモート デスクトップ接続クライアント] - [RemoteFX USB デバイス リダイレクト] - [サポートされている他の RemoteFX USBデバイス]

     「このコンピューターからの RDP リダイレクトを許可する」を有効にする

2) Windows Server 2012 R2 で、「リモートデスクトップセッションホスト」と「デスクトップ エクスペリエンス」を有効にする

3) Windows 8.1 から Windows Server 2012 R2 にリモートデスクトップでログオンする

その際、「ローカルデバイスとリソース」で「その他のサポートされている RemoteFX USB デバイス」と該当デバイスにチェックを入れる

4) Windows Server 2012 R2 のセッションで [デバイスとプリンター] を開き、USB スキャナのアイコンを右クリックし「スキャンの開始」をクリック

5) スキャンの開始は行われず、画面上にメッセージが表示されません。

 

 

この問題の解決するためには、サーバーにインストールしたスキャナ用のドライバ内で行う、CreateFile 関数の引数 dwFlagsAndAttributes に FILE_FLAG_SESSION_AWARE フラグをセットする必要があります。

フラグをセットしていない場合、CreateFile は E_ACCESSDENIED (0x80070005) のエラーで失敗します。

 

ちなみに、スキャナドライバー内で E_ACCESSDENIED で失敗しているかどうかは、以下の WIA トレースログを採取することで、確認できます。

 

トレース採取手順

---------------------

Windows Server 2012 R2 で以下を実施します。

(1) すでに環境に %windir%\Debug\WIA\wiatrace*.log があれば削除します。

(2) 管理者権限のコマンドプロンプトで、以下を実行します。

 

net stop stisvc

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\StillImage\Trace\wiaservc.dll" /v "TraceFlags" /t REG_DWORD /d "0x00000407" /f

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\StillImage\Trace\wiarpc.dll" /v "TraceFlags" /t REG_DWORD /d "0x00000407" /f

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\StillImage\Trace\sti_ci.dll" /v "TraceFlags" /t REG_DWORD /d "0x00000407" /f

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\StillImage\Trace\sti.dll" /v "TraceFlags" /t REG_DWORD /d "0x00000407" /f

net start stisvc

 

(3) %windir%\Debug\WIA\wiatrace*.log で、エラー 0x80070005 が発生していることを確認します。( <driver name> の部分は実際のドライバー名に置き換えられます)

 

WIA: 2240.2176 38156 0 0 [wiaservc.dll] USDWrapper::STI_Initialize, ( <driver name> ) completed IStiUSD::Initialize returning hr 0x80070005

WIA: 2240.2176 38156 0 0 [wiaservc.dll] ERROR: USDWrapper::LoadDriver, Error loading driver for ( <driver name> ): IStiUSD::Initialize failed with hr = 0x80070005

WIA: 2240.2176 38156 0 0 [wiaservc.dll] ERROR: USDWrapper::LoadDriver, We encountered an error attempting to load driver for ( <driver name> ), error (0x80070005)

WIA: 2240.2176 38156 0 0 [wiaservc.dll] USDWrapper::UnloadDriver, The WIA service is preparing to unload the driver for ( <driver name> )

WIA: 2240.2176 38297 4 0 [wiaservc.dll] USDWrapper::UnloadDriver, Driver for ( <driver name> ) is now unloaded

 

 

◆補足: FILE_FLAG_SESSION_AWARE フラグが必要となった背景

RemoteFX USB デバイス リダイレクトは、以下のブログの通り、Windows Server 2008 R2 ではシングルセッションのみのサポートでしたが、Windows Server 2012 からマルチセッションのサポートが追加されました。また、それに伴って、セキュリティの観点から、セッション 0 で、ユーザー自身がサーバーにリダイレクションしたデバイス以外にアクセスすることを防ぐ必要が出てきました。

 

  RemoteFX USB Redirection in Windows Server 2012 and Windows 8

  https://blogs.msdn.com/b/rds/archive/2012/09/11/remotefx-usb-redirection-in-windows-server-2012-and-windows-8.aspx

 

USB Redirection for RD Session Host (Session Isolation)

 

While RemoteFX USB Redirection for Windows 7 SP1 was implemented for client SKUs with a single session,

RemoteFX USB Redirection for Windows 8 supports redirection from multiple clients and provides session

isolation for redirected devices. This means that users will only see USB devices that belong to them.

 

そのため、スキャナドライバーでも、CreateFile 関数でマルチセッションを前提とせず、FILE_FLAG_SESSION_AWARE フラグを指定していない場合には、無条件にデバイスのオープンに失敗するようになりました。

 

この理由から、上記フラグも Windows Server 2012 以降をサポートしています。

 

CreateFile function

  https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

 

    FILE_FLAG_SESSION_AWARE

    0x00800000

 

      Windows Server 2008 R2, Windows Server 2008, and Windows Server 2003: This flag is not supported before Windows Server 2012.

 

 

 

上記の内容がスキャナをご利用の方やスキャナドライバの開発者の方にお役に立てたら幸いです。