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.PartialDescriptorsCM_PARTIAL_RESOURCE_DESCRIPTOR 陣列開頭的指標,而且 list->PartialResourceList.Count 是陣列中的元素數目。 如需 PartialDescriptorsCount 成員的詳細資訊,請參閱 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)

另請參閱

CM_FLOPPY_DEVICE_DATA

CM_FULL_RESOURCE_DESCRIPTOR

CM_KEYBOARD_DEVICE_DATA

CM_PARTIAL_RESOURCE_LIST

CM_RESOURCE_LIST

CM_SCSI_DEVICE_DATA

CM_SERIAL_DEVICE_DATA

IRP_MN_START_DEVICE

IoConnectInterrupt

IoGetDeviceProperty

IoReportResourceForDetection