次の方法で共有


IoSetDeviceInterfaceState 関数 (wdm.h)

IoSetDeviceInterfaceState ルーチンは、以前に登録されたデバイス インターフェイス クラスのインスタンスを有効または無効にします。

構文

NTSTATUS IoSetDeviceInterfaceState(
  [in] PUNICODE_STRING SymbolicLinkName,
  [in] BOOLEAN         Enable
);

パラメーター

[in] SymbolicLinkName

有効または無効になっているデバイス インターフェイス インスタンスを識別する文字列へのポインター。 この文字列は、IoRegisterDeviceInterface または IoGetDeviceInterfaces 以前の呼び出しから取得されました。

[in] Enable

TRUE は、デバイス インターフェイスが有効になっていることを示します。 FALSE は、デバイス インターフェイスが無効になっていることを示します。

戻り値

IoSetDeviceInterfaceState は、呼び出しが成功した場合にSTATUS_SUCCESSを返します。 このルーチンは、呼び出し元が既に有効になっているデバイス インターフェイスの有効化を要求した場合、STATUS_OBJECT_NAME_EXISTSの情報状態を返します。 考えられるエラー戻り値を次に示します。

リターン コード 形容
STATUS_OBJECT_NAME_NOT_FOUND
呼び出し元が、有効になっていないデバイス インターフェイスを無効にしようとしました。

備考

IoSetDeviceInterfaceState を使用すると、登録済みのデバイス インターフェイスのインスタンスをアプリケーションやその他のシステム コンポーネントで使用できます。 インターフェイス クラスは、IoRegisterDeviceInterface またはユーザー モードから既に登録されている必要があります。

アプリケーションとその他のシステム コンポーネントは、有効になっているインターフェイスのみを開くことができます。

通常、関数またはフィルター ドライバーは、IRP_MN_START_DEVICE IRP に応答してデバイスを正常に起動した後、TRUE に設定 有効にする を使用して、このルーチンを呼び出します。 このようなドライバーは、IRP_MN_REMOVE_DEVICE IRP または IRP_MN_SURPRISE_REMOVAL IRP に応答してデバイスを削除するときに、デバイス インターフェイス インスタンス (つまり、IoSetDeviceInterfaceState を呼び出し、を有効にして FALSE ) を 設定する必要があります。 ドライバーがこれらの削除 IRP を処理するときにデバイス インターフェイスを無効にしない場合、PnP マネージャーがデバイスを削除するときに PnP マネージャーがインターフェイスを無効にするため、ドライバーは、その後、これを試みないでください。

デバイスが突然削除された場合 (たとえば、突然の削除など)、有効なデバイス インターフェイス インスタンスがある場合は、デバイスが再アタッチされると問題が発生します。 この問題は、PnP マネージャーが新しく接続されたデバイスを列挙し、既存のデバイス インターフェイス インスタンスと同じレジストリ パスに存在するデバイス インターフェイス インスタンスを有効にすると発生します。

ドライバー IoSetDeviceInterfaceState を呼び出して、IRP_MN_SURPRISE_REMOVAL IRP に応答してデバイス インターフェイス インスタンスを無効にした場合、ドライバーは、IRP_MN_REMOVE_DEVICE IRP に応答して同じデバイス インターフェイス インスタンスを無効にしないでください。

IoSetDeviceInterfaceState 呼び出しによってデバイス インターフェイス インスタンスが正常に公開された場合、システムは PnP 通知に登録されたすべてのコンポーネントにデバイス クラスの変更を通知します。 同様に、このルーチンの呼び出しによって既存のデバイス インターフェイス インスタンスが無効にされた場合、システムは適切な通知を送信します。

PnP マネージャーは、デバイスのすべてのドライバーが開始操作を完了したことを示す、IRP_MN_START_DEVICE IRP が完了するまで、インターフェイス インスタンスの到着の通知を送信しません。 さらに、PnP マネージャーは、IRP_MN_START_DEVICE IRP が完了するまで、デバイスの作成要求を失敗します。

IoSetDeviceInterfaceState の呼び出し元は、システム スレッドのコンテキストで IRQL = PASSIVE_LEVELで実行されている必要があります。

必要条件

要件 価値
サポートされる最小クライアント Windows 2000 以降で使用できます。
ターゲット プラットフォーム 万国
ヘッダー wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL (「解説」セクションを参照)
DDI コンプライアンス規則 する HwStorPortProhibitedDDDIs(storport), IrqlIoPassive1(wdm), LowerDriverReturn(wdm), PowerIrpDDis(wdm)

関連項目

IRP_MN_REMOVE_DEVICE

IRP_MN_START_DEVICE

IRP_MN_SURPRISE_REMOVAL

IoGetDeviceInterfaces

IoRegisterDeviceInterface

IoRegisterPlugPlayNotification