CM_Query_And_Remove_SubTreeA関数 (cfgmgr32.h)
CM_Query_And_Remove_SubTree関数は、デバイス インスタンスとその子を削除できるかどうかを確認し、削除できる場合は削除します。
構文
CMAPI CONFIGRET CM_Query_And_Remove_SubTreeA(
[in] DEVINST dnAncestor,
[out, optional] PPNP_VETO_TYPE pVetoType,
[out, optional] LPSTR pszVetoName,
[in] ULONG ulNameLength,
[in] ULONG ulFlags
);
パラメーター
[in] dnAncestor
削除するサブツリーのルートにあるデバイスへの呼び出し元指定のデバイス インスタンス ハンドル。 このデバイス インスタンス ハンドルは、ローカル コンピューターにバインドされます。
[out, optional] pVetoType
(省略可能)呼び出し元が NULL を 渡せず、削除要求が拒否された場合 (つまり、関数はCR_REMOVE_VETOEDを返します)、この戻り値は拒否の理由を示す PNP_VETO_TYPE型の値を指します。
[out, optional] pszVetoName
(省略可能)呼び出し元が NULL を 渡せず、削除要求が拒否された場合 (つまり、関数はCR_REMOVE_VETOEDを返します)、 では、この値は拒否型に関連付けられているテキスト文字列を指します。 この文字列が提供する情報の種類は、 pVetoType によって受け取られた値によって異なります。 これらの文字列の詳細については、「 PNP_VETO_TYPE」を参照してください。
[in] ulNameLength
pszVetoName によって提供される文字列バッファーの長さ (文字数) を表す呼び出し元指定の値。 これは MAX_PATH に設定する必要があります。
[in] ulFlags
「 解説 」セクションで説明されている呼び出し元が指定したフラグ定数のビットごとの OR。
戻り値
操作が成功した場合、関数は CR_SUCCESSを返します。 それ以外の場合は、 Cfgmgr32.h で定義されている他のCR_プレフィックス付きエラー コードのいずれかを返します。
注釈
CM_Query_And_Remove_SubTree関数の目的は、アプリケーションがローカル コンピューターから安全に取り外せるようにデバイスを準備できるようにすることです。 ドライバーが DEVICE_CAPABILITIES の SurpriseRemovalOK メンバーを設定していない場合にのみ、この関数を使用してデバイス を削除します。 ドライバーが SurpriseRemovalOK を設定している場合、アプリケーションはCM_Query_And_Remove_SubTreeではなくCM_Request_Device_Ejectを呼び出す必要があります。
CM_Query_And_Remove_SubTree では、次の 2 つのフラグのいずれかを使用した flags パラメーター ulFlags の設定がサポートされています。これらのフラグは、Windows またはインストーラーがデバイスの削除を拒否する場合にのみ適用されます。
フラグ | 説明 |
---|---|
CM_REMOVE_UI_OK | この関数を使用すると、拒否権の理由を示すユーザー ダイアログ ボックスを表示できます。 これは既定のフラグ設定です。 |
CM_REMOVE_UI_NOT_OK | この関数は、拒否権の理由を示すユーザー ダイアログ ボックスの表示を抑制します。 |
Windows XP 以降では、 CM_Query_And_Remove_SubTree では次の追加フラグの設定もサポートされています。このフラグは、関数がデバイス インスタンスを正常に削除した場合にのみ適用されます。
フラグ | 説明 |
---|---|
CM_REMOVE_NO_RESTART | このフラグを設定すると、デバイスの状態がリセットされるまでデバイスを再起動できないように、デバイスの状態が構成されます。 |
デバイスの状態は、次のいずれかによってリセットされます。
- デバイス のCM_Setup_DevNode を呼び出し、CM_SETUP_DEVNODE_RESETを指定します。 この方法でデバイスの状態がリセットされた後、デバイス インスタンスの CM_Reenumerate_DevNode を呼び出すことによって、デバイスを再起動できます。 デバイスの状態をリセットすると、デバイスを列挙する他の操作でも、デバイスが再起動されます (たとえば、デバイスの再有効化にデバイス マネージャーが使用されている場合)。
- デバイスがデタッチされて再アタッチされるか、コンピューターが再起動されます。 この場合、デバイスの状態がリセットされ、デバイスが再起動されます。
- このフラグが設定されていない場合、デバイスの状態をリセットする必要はありません。 削除されたデバイスを再起動するには、デバイスの呼び出し 元のCM_Setup_DevNode を使用し、CM_SETUP_DEVNODE_READYを指定します。 デバイスを再び有効にするその他の操作でも、デバイスが再起動されます。 デバイスを再有効化する操作の例として、デバイスの CM_Reenumerate_DevNode の呼び出し、デバイスのデタッチと再アタッチ、またはコンピューターの再起動があります。 |
低レベルの操作CM_Query_And_Remove_SubTreeを必要としない Windows アプリケーションでは、CM_Query_And_Remove_SubTreeを使用してデバイスを削除するのではなく、DIF_PROPERTYCHANGE要求を使用してデバイスを無効にする必要があります。 DIF_PROPERTYCHANGE要求は、デバイスのプロパティを有効、無効、再起動、停止、または変更するために使用できます。
この関数の呼び出し元には SeLoadDriverPrivilege が必要です。 (特権については、Microsoft Windows SDKドキュメントを参照してください)。
ローカル コンピューターにバインドされているデバイス インスタンス ハンドルの使用については、「 CM_Get_Child」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Microsoft Windows 2000 以降のバージョンの Windows で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | cfgmgr32.h (Cfgmgr32.h を含む) |
Library | Cfgmgr32.lib |
こちらもご覧ください
CM_Get_Child
CM_Query_And_Remove_SubTree_Ex
CM_Reenumerate_DevNode
CM_Request_Device_Eject
CM_Setup_DevNode
DIF_PROPERTYCHANGE