CM_RESOURCE_LIST 構造体 (wdm.h)
CM_RESOURCE_LIST構造体は、デバイスに割り当てられているすべてのシステム ハードウェア リソースを指定します。
構文
typedef struct _CM_RESOURCE_LIST {
ULONG Count;
CM_FULL_RESOURCE_DESCRIPTOR List[1];
} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
メンバー
Count
このCM_RESOURCE_LIST構造体で指定された完全なリソース記述子 の 数。 List メンバーは、最初の完全なリソース記述子のヘッダーです。 WDM ドライバーの場合、 Count は常に 1 です。
List[1]
最初の完全なリソース記述子のヘッダーとして機能する CM_FULL_RESOURCE_DESCRIPTOR 構造体。 CM_RESOURCE_LIST構造体に複数の完全なリソース記述子が含まれている場合、2 番目の完全なリソース記述子は、メモリ内の 1 つ目の直後に続きます。 各完全なリソース記述子のサイズは、含まれる CM_PARTIAL_RESOURCE_DESCRIPTOR 配列の長さによって異なります。 詳細については、「解説」を参照してください。
注釈
この構造では、デバイスへのハードウェア リソースの割り当てを説明します。 IRP_MN_START_DEVICE IRP は、この構造体を使用して、プラグ アンド プレイ マネージャーがデバイスに割り当てるリソースを指定します。 レガシ デバイスのドライバーは、この構造体を使用して、リソース要件を IoReportResourceForDetection ルーチンに渡します。 ハードウェア リソースの割り当ての詳細については、「 ハードウェア リソース」を参照してください。
CM_RESOURCE_LIST構造体は、1 つ以上の完全なリソース記述子を含む、変数サイズの大きなデータ構造のヘッダーです。 この大きな構造のすべてのデータは、連続するメモリ ブロックを占有します。 各完全なリソース記述子は、大きなブロック内のサブブロックを占有します。
完全なリソース記述子は 、CM_FULL_RESOURCE_DESCRIPTOR 構造体で始まります。これは、 CM_PARTIAL_RESOURCE_DESCRIPTOR 構造体の配列のヘッダーとして機能します。 この配列の長さは、リソース記述子全体のサイズを決定します。 CM_FULL_RESOURCE_DESCRIPTOR 構造体の最後のメンバーは、この配列の最初の要素を最後のメンバーとして含むCM_PARTIAL_RESOURCE_LIST構造体です。 配列に複数の要素が含まれている場合、残りの要素は、メモリ内の CM_PARTIAL_RESOURCE_LIST 構造体の末尾 ( CM_FULL_RESOURCE_DESCRIPTOR 構造体の末尾でもあります) の直後に続きます。
ドライバー コードでは、ポインターの算術演算を使用して、完全なリソース記述子から次のリソース記述子にステップ実行できます。 たとえば、 list という名前のパラメーターが、1 つの完全なリソース記述子の先頭にある CM_FULL_RESOURCE_DESCRIPTOR 構造体へのポインターである場合、 list は次のように次の完全なリソース記述子の先頭を指すように更新できます。
list = (PCM_FULL_RESOURCE_DESCRIPTOR)(list->PartialResourceList.PartialDescriptors +
list->PartialResourceList.Count);
この例では、 list->PartialResourceList.PartialDescriptors
は CM_PARTIAL_RESOURCE_DESCRIPTOR 配列の先頭へのポインターであり list->PartialResourceList.Count
、配列内の要素の数です。 PartialDescriptors メンバーと Count メンバーの詳細については、「CM_PARTIAL_RESOURCE_LIST」を参照してください。
例
すべての PnP ドライバーは 、IRP_MN_START_DEVICE IRP を処理する必要があります。 通常、この IRP のドライバーハンドラーは、IRP のIO_STACK_LOCATION構造体の Parameters.StartDevice.AllocatedResources メンバーと Parameters.StartDevice.AllocatedResourcesTranslated メンバーが指す割り当てられたリソースの一覧を示します。 次のコード例には、ハンドラーで呼び出される GetAssignedResources という名前の関数が含まれています。 この関数は、必要なリソースが一覧で指定されていることを確認し、リソースを使用するようにデバイスを構成します。
GetAssignedResources 関数は、成功した場合に TRUE を 返します。 それ以外の場合は FALSE を 返します (コード例を簡略化するために詳細は省略されていますが、 おそらく switch ステートメントから)。
/* Process the assigned hardware resources. */
BOOLEAN GetAssignedResources(PCM_RESOURCE_LIST reslist)
{
PCM_FULL_RESOURCE_DESCRIPTOR list;
list = reslist->List;
for (int ix = 0; ix < reslist->Count; ++ix)
{
/* Process resources in CM_FULL_RESOURCE_DESCRIPTOR block number ix. */
for (int jx = 0; jx < list->PartialResourceList.Count; ++jx)
{
PCM_PARTIAL_RESOURCE_DESCRIPTOR desc;
desc = list->PartialResourceList.PartialDescriptors + jx;
switch (desc->Type)
{
/* Process element jx in PartialDescriptors array. */
...
}
}
/* Advance to next CM_FULL_RESOURCE_DESCRIPTOR block in memory. */
list = (PCM_FULL_RESOURCE_DESCRIPTOR)(list->PartialResourceList.PartialDescriptors +
list->PartialResourceList.Count);
}
return TRUE;
}
要件
要件 | 値 |
---|---|
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h、Wudfwdm.h を含む) |