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驅動程式, 計數 一律為1。
List[1]
做為第一個完整資源描述元標頭的 CM_FULL_RESOURCE_DESCRIPTOR 結構。 如果 CM_RESOURCE_LIST 結構包含一個以上的完整資源描述元,則第二個完整資源描述元會緊接在記憶體中的第一個,依此類傳。 每個完整資源描述元的大小取決於其所包含 之CM_PARTIAL_RESOURCE_DESCRIPTOR 數位的長度。 如需詳細資訊,請參閱接下來的<備註>一節。
備註
此結構描述將硬體資源指派給裝置。 IRP_MN_START_DEVICE IRP 會使用此結構來指定 隨插即用 管理員指派給裝置的資源。 舊版裝置的驅動程式會使用此結構,將其資源需求傳遞至 IoReportResourceForDetection 例程。 如需硬體資源配置的詳細資訊,請參閱 硬體資源。
CM_RESOURCE_LIST 結構是較大數據結構的標頭,其大小為可變大小,其中包含一或多個完整的資源描述元。 這個較大結構中的所有數據都會佔用連續的記憶體區塊。 每個完整資源描述元都會佔用較大區塊內的子區塊。
完整的資源描述元會以 CM_FULL_RESOURCE_DESCRIPTOR 結構開頭,做為 CM_PARTIAL_RESOURCE_DESCRIPTOR 結構陣列的標頭。 此陣列的長度會決定完整資源描述元的大小。 CM_FULL_RESOURCE_DESCRIPTOR 結構中的最後一個成員是一個CM_PARTIAL_RESOURCE_LIST結構,其中包含此陣列中的第一個元素作為其最後一個成員。 如果陣列包含多個元素,則其餘元素會緊接著記憶體中的 CM_PARTIAL_RESOURCE_LIST 結構結尾,這也是 CM_FULL_RESOURCE_DESCRIPTOR 結構的結尾。
驅動程式程式代碼可以使用指標算術,從一個完整資源描述元逐步執行至下一個。 例如,如果具名 清單 的參數是一個完整資源描述元開頭 CM_FULL_RESOURCE_DESCRIPTOR 結構的指標,則可以更新 清單 以指向下一個完整資源描述元的開頭,如下所示:
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參數.StartDevice.AllocatedResources 和 Parameters.StartDevice.AllocatedResourcesTranslated 成員所指向的指派資源清單。 下列程式代碼範例包含名為 GetAssignedResources 的函式,該函式會在處理程式中呼叫,以逐步執行每個清單。 此函式會確認清單中已指定必要的資源,並設定裝置使用資源。
如果 GetAssignedResources 函式成功,則會傳回 TRUE 。 否則,它會從 switch 語句傳回 FALSE (,雖然省略詳細數據以簡化程式碼範例) 。
/* 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;
}
規格需求
需求 | 值 |
---|---|
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Wudfwdm.h) |