CM_Query_And_Remove_SubTreeW関数 (cfgmgr32.h)

CM_Query_And_Remove_SubTree関数は、デバイス インスタンスとその子を削除できるかどうかを確認し、削除できる場合は削除します。

構文

CMAPI CONFIGRET CM_Query_And_Remove_SubTreeW(
  [in]            DEVINST        dnAncestor,
  [out, optional] PPNP_VETO_TYPE pVetoType,
  [out, optional] LPWSTR         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