次の方法で共有


EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE コールバック関数 (wdfchildlist.h)

[KMDF にのみ適用]

ドライバーの EvtChildListAddressDescriptionDuplicate イベント コールバック関数は、子アドレスの説明を複製します。

構文

EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE EvtWdfChildListAddressDescriptionDuplicate;

NTSTATUS EvtWdfChildListAddressDescriptionDuplicate(
  [in]  WDFCHILDLIST ChildList,
  [in]  PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER SourceAddressDescription,
  [out] PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER DestinationAddressDescription
)
{...}

パラメーター

[in] ChildList

フレームワークの子リスト オブジェクトへのハンドル。

[in] SourceAddressDescription

子アドレスの 説明のソース の場所を識別するWDF_CHILD_ADDRESS_DESCRIPTION_HEADER構造体へのポインター。

[out] DestinationAddressDescription

子アドレス記述の宛先の場所を識別するWDF_CHILD_ADDRESS_DESCRIPTION_HEADER構造体へのポインター。

戻り値

EvtChildListAddressDescriptionDuplicate コールバック関数は、STATUS_SUCCESS、または操作が成功した場合にNT_SUCCESS(status) が TRUE に等しい別の状態値を返す必要があります。 それ以外の場合、この関数は、NT_SUCCESS(status) が FALSE である状態値を返す必要があります。

注釈

バス ドライバーが動的列挙を使用している場合は、WdfFdoInitSetDefaultChildListConfig または WdfChildListCreate を呼び出すことによって、EvtChildListAddressDescriptionDuplicate コールバック関数を登録できます。

フレームワークは、ドライバーが提供するアドレスの説明を複製して、説明の内部コピーを作成できるようにします。

EvtChildListAddressDescriptionDuplicate コールバック関数は、アドレスの説明の複製コピーを作成する必要があります。 ドライバーは、子デバイスでアドレスの説明が必要な場合、およびフレームワークが RtlCopyMemory を呼び出してアドレスの説明を複製できない場合は、このコールバック関数を指定する必要があります。 (説明に追加のメモリへのポインターが含まれている場合、フレームワークは RtlCopyMemory を呼び出すことができません)。

ドライバーがアドレスの説明を提供するが 、EvtChildListAddressDescriptionDuplicate コールバック関数を提供しない場合、フレームワークは RtlCopyMemory を呼び出すことによってアドレスの説明を複製します。

次の手順では、一般的なシナリオについて説明します。

  1. ドライバーは、子デバイスが存在することを判断します。
  2. ドライバーは、 WDF_CHILD_ADDRESS_DESCRIPTION_HEADER 構造体を含むドライバー定義の構造体を入力し、場合によってはデバイス固有のサイズのアドレス情報を格納するために追加のメモリを動的に割り当てることによって、アドレスの説明を作成します。
  3. ドライバーは WdfChildListAddOrUpdateChildDescriptionAsPresent を呼び出して子デバイスを報告し、アドレスの説明へのポインターを指定します。
  4. フレームワークは 、EvtChildListAddressDescriptionDuplicate コールバック関数 (存在する場合) または RtlCopyMemory を呼び出してアドレスの説明を複製し、説明の内部コピーを作成できるようにします。
説明が、WDF_CHILD_ADDRESS_DESCRIPTION_HEADER構造体の AddressDescriptionSize メンバーによって指定された事前に定義されたサイズの 1 つの構造体で構成されている場合、フレームワークは RtlCopyMemory を使用してアドレスの説明を複製できます。 ただし、場合によっては、説明に、動的に割り当てられたメモリに格納される追加情報も含まれている必要があります。 この場合は、通常、メンバーが動的に割り当てられたメモリを指すように説明構造を定義します。ドライバーは EvtChildListAddressDescriptionDuplicate コールバック関数を提供する必要があります。 コールバック関数では、次の操作を行う必要があります。
  1. 通常は ExAllocatePool を呼び出して、追加のメモリを割り当てます。
  2. 割り当てられたメモリのアドレスをドライバー定義のアドレス記述構造体 (つまり、コールバック関数の DestinationAddressDescription 構造体) に格納します。
  3. コールバック関数の SourceAddressDescription 構造体からコールバック関数の DestinationAddressDescription 構造体に他の構造体メンバーをコピーします。
ドライバーの EvtChildListAddressDescriptionDuplicate コールバック関数が呼び出すことができるフレームワークの子リスト オブジェクト メソッド、WdfChildListGetDevice のみです。

フレームワークは、 EvtChildListAddressDescriptionDuplicate コールバック関数を呼び出す前に、内部の子リスト オブジェクト ロックを取得します。 コールバック関数は、フレームワーク メモリ オブジェクト メソッドの呼び出しやオブジェクト コンテキスト空間へのアクセスなど、記述された重複操作に関連する操作のみを実行する必要があります。 他のドライバーにアクセスするメソッドを呼び出してはなりません。

ドライバーが EvtChildListAddressDescriptionDuplicate コールバック関数を提供する場合は、 EvtChildListAddressDescriptionCopyEvtChildListAddressDescriptionCleanup コールバック関数も必要になる場合があります。

動的列挙の詳細については、「バス上のデバイスの列挙」を参照してください

要件

要件
対象プラットフォーム ユニバーサル
最小 KMDF バージョン 1.0
Header wdfchildlist.h (Wdf.h を含む)
IRQL <= DISPATCH_LEVEL

こちらもご覧ください

EvtChildListAddressDescriptionCleanup

ExAllocatePool

RtlCopyMemory

WDF_CHILD_ADDRESS_DESCRIPTION_HEADER

WdfChildListAddOrUpdateChildDescriptionAsPresent

WdfChildListCreate

WdfChildListGetDevice

WdfFdoInitSetDefaultChildListConfig