デバイスの名前空間アクセスの制御

Windows ドライバー モデル (WDM) では、すべてのデバイス オブジェクトに関連付けられた 名前空間があります。 デバイスの名前空間の名前は、デバイスの名前で始まるパスです。 "\Device DeviceName\" という名前のデバイスの場合、その名前空間は "\Device\DeviceName\FileName" という形式の任意の名前で構成されます。 (ファイル システムの場合、 FileName はファイル システム上のファイルの実際の名前です)。

WDM ドライバーは、デバイスの名前空間内のすべての名前に対して開いている要求を受け取ります。 ドライバーは、"\Device DeviceName\" の開いている要求を、デバイス オブジェクト自体のオープンとして扱います。 ドライバーがデバイスの名前空間へのオープン要求のサポートを実装している場合、"\Device\DeviceName\FileName" のオープン要求は、デバイス オブジェクトの名前空間内の "ファイル" のオープンとして扱われます (デバイスの "ファイル" の概念はドライバーによって決定されます)。

ほとんどのドライバーは、デバイスの名前空間へのオープン操作のサポートを実装していませんが、すべてのドライバーは、デバイスの名前空間への不正アクセスを防ぐためにセキュリティ チェックを提供する必要があります。 既定では、デバイスの名前空間内でファイルを開く要求 ("\Device\DeviceName\FileName" など) のセキュリティ チェックはドライバーに完全に任されます。デバイス オブジェクト ACL はオペレーティング システムによってチェックされません。

デバイス オブジェクトのFILE_DEVICE_SECURE_OPEN特性が設定されている場合、システムは、デバイスの名前空間内のすべてのファイルを開く要求にデバイス オブジェクトのセキュリティ記述子を適用します。 ドライバーは、IoCreateDevice または IoCreateDeviceSecure を使用してデバイス オブジェクトを作成するときに、FILE_DEVICE_SECURE_OPENを設定できます。 WDM ドライバーの場合は、レジストリでFILE_DEVICE_SECURE_OPENを設定することもできます。 また、 IoCreateDeviceSecure によって作成された WDM 以外のドライバーのデバイス オブジェクトのレジストリで設定することもできます。 レジストリでのデバイスの特性など、デバイス オブジェクトのプロパティの設定の詳細については、「レジストリ でのデバイス オブジェクトのプロパティの設定」を参照してください。 デバイス特性の詳細については、「デバイス特性 の指定」を参照してください。

名前空間をサポートしていないデバイスのドライバーでは、次の 2 つのメソッドのいずれかを使用して、デバイスの名前空間内のファイルを開く要求が正しく処理されるようにする必要があります。

  • ドライバーのデバイス オブジェクトには、FILE_DEVICE_SECURE_OPENデバイスの特性が設定されています。 その後、ドライバーは、デバイスの名前空間への開いている要求を、デバイス オブジェクトのオープン要求として扱うことができます。

  • ドライバーは、長さが 0 以外の IrpSp-FileObject-FileName>> パラメーターを指定する任意のIRP_MJ_CREATE要求を失敗させることができます。 この場合、デバイスのオープン要求はシステムの ACL チェックの対象となりますが、デバイスの名前空間内のすべてのファイルを開く要求はドライバーによって失敗します。 (排他オープンをサポートするドライバーは、このオプションを使用する必要があります)。

名前空間をサポートするデバイスのドライバーは、2 つの方法を使用して、ファイルを開く要求をデバイスの名前空間にセキュリティで保護することもできます。

  • ドライバーのデバイス オブジェクトには、FILE_DEVICE_SECURE_OPENデバイスの特性が設定されています。 これにより、デバイスのセキュリティ設定がデバイスの名前空間に一様に適用されるようになります。 (ドライバーは、 そのDRIVER_DISPATCH コールバック関数で名前空間のサポートを実装する役割を担います。

  • ドライバーは、 DispatchCreate ルーチン内のファイル名の ACL を確認します。 (この場合でも、ドライバーは、デバイスの名前空間に開かない限り、FILE_DEVICE_SECURE_OPEN特性を設定する必要があります。デバイス オブジェクトよりも弱いセキュリティ設定を持つことができます)。

FILE_DEVICE_SECURE_OPEN特性はスタックの上部でチェックされるため、フィルター デバイス オブジェクトは、アタッチ後に次の下位デバイス オブジェクトの Characteristics メンバーをコピーする必要があります。