CM_RESOURCE_LIST-Struktur (wdm.h)

Die CM_RESOURCE_LIST-Struktur gibt alle Systemhardwareressourcen an, die einem Gerät zugewiesen sind.

Syntax

typedef struct _CM_RESOURCE_LIST {
  ULONG                       Count;
  CM_FULL_RESOURCE_DESCRIPTOR List[1];
} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;

Member

Count

Die Anzahl der vollständigen Ressourcendeskriptoren, die von dieser CM_RESOURCE_LIST-Struktur angegeben werden. Das List-Element ist der Header für die erste vollständige Ressourcenbeschreibung. Bei WDM-Treibern ist Count immer 1.

List[1]

Die CM_FULL_RESOURCE_DESCRIPTOR Struktur, die als Header für die erste vollständige Ressourcenbeschreibung dient. Wenn die CM_RESOURCE_LIST-Struktur mehr als einen vollständigen Ressourcendeskriptor enthält, folgt der zweite vollständige Ressourcendeskriptor sofort dem ersten im Arbeitsspeicher usw. Die Größe der einzelnen vollständigen Ressourcendeskriptoren hängt von der Länge des CM_PARTIAL_RESOURCE_DESCRIPTOR Arrays ab, das darin enthalten ist. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".

Hinweise

Diese Struktur beschreibt die Zuweisung von Hardwareressourcen zu einem Gerät. Ein IRP_MN_START_DEVICE IRP verwendet diese Struktur, um die Ressourcen anzugeben, die der Plug & Play-Manager einem Gerät zuweist. Treiber für Legacygeräte verwenden diese Struktur, um ihre Ressourcenanforderungen an die IoReportResourceForDetection-Routine zu übergeben. Weitere Informationen zur Zuweisung von Hardwareressourcen finden Sie unter Hardwareressourcen.

Die CM_RESOURCE_LIST-Struktur ist ein Header für eine größere Datenstruktur mit variabler Größe, die mindestens einen vollständigen Ressourcendeskriptor enthält. Alle Daten in dieser größeren Struktur belegen einen zusammenhängenden Speicherblock. Jeder vollständige Ressourcendeskriptor belegt einen Teilblock innerhalb des größeren Blocks.

Ein vollständiger Ressourcendeskriptor beginnt mit einer CM_FULL_RESOURCE_DESCRIPTOR-Struktur , die als Header für ein Array von CM_PARTIAL_RESOURCE_DESCRIPTOR Strukturen dient. Die Länge dieses Arrays bestimmt die Größe des vollständigen Ressourcendeskriptors. Das letzte Element in der CM_FULL_RESOURCE_DESCRIPTOR-Struktur ist eine CM_PARTIAL_RESOURCE_LIST-Struktur , die als letztes Element das erste Element in diesem Array enthält. Wenn das Array mehr als ein Element enthält, folgen die restlichen Elemente sofort dem Ende der CM_PARTIAL_RESOURCE_LIST Struktur im Arbeitsspeicher, das auch das Ende der CM_FULL_RESOURCE_DESCRIPTOR-Struktur ist.

Treibercode kann die Zeigerarithmetik verwenden, um von einem vollständigen Ressourcendeskriptor zur nächsten zu wechseln. Wenn ein Parameter namens list beispielsweise ein Zeiger auf die CM_FULL_RESOURCE_DESCRIPTOR-Struktur am Anfang eines vollständigen Ressourcendeskriptors ist, kann die Liste wie folgt aktualisiert werden, um auf den Anfang der nächsten vollständigen Ressourcenbeschreibung zu verweisen:

list = (PCM_FULL_RESOURCE_DESCRIPTOR)(list->PartialResourceList.PartialDescriptors +
                                        list->PartialResourceList.Count);

In diesem Beispiel list->PartialResourceList.PartialDescriptors ist ein Zeiger auf den Anfang des CM_PARTIAL_RESOURCE_DESCRIPTOR Arrays und list->PartialResourceList.Count gibt die Anzahl der Elemente im Array an. Weitere Informationen zu den Membern PartialDescriptors und Count finden Sie unter CM_PARTIAL_RESOURCE_LIST.

Beispiele

Alle PnP-Treiber müssen IRP_MN_START_DEVICE IRPs verarbeiten. In der Regel führt der Handler eines Treibers für dieses IRP die Listen der zugewiesenen Ressourcen durch, auf die von den Parameters.StartDevice.AssignedResources - und Parameters.StartDevice.AssignedResourcesTranslated-Membern der IO_STACK_LOCATION-Struktur im IRP verwiesen werden. Das folgende Codebeispiel enthält eine Funktion namens GetAssignedResources, die im Handler aufgerufen wird, um jede Liste zu durchlaufen. Diese Funktion überprüft, ob die erforderlichen Ressourcen in der Liste angegeben sind, und konfiguriert das Gerät für die Verwendung der Ressourcen.

Die GetAssignedResources-Funktion gibt TRUE zurück, wenn sie erfolgreich ist. Andernfalls wird FALSE zurückgegeben (wahrscheinlich aus der switch-Anweisung , obwohl die Details zur Vereinfachung des Codebeispiels weggelassen werden).

/* 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;
}

Anforderungen

Anforderung Wert
Header wdm.h (include Wdm.h, Ntddk.h, Ntifs.h, Wudfwdm.h)

Weitere Informationen

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