次の方法で共有


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

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

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

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

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

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

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

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

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

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

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

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