IO_RESOURCE_REQUIREMENTS_LIST Struktur (wdm.h)
Die IO_RESOURCE_REQUIREMENTS_LIST-Struktur beschreibt Gruppen von Ressourcenkonfigurationen, die von einem Gerät verwendet werden können. Jede Konfiguration stellt eine Reihe von Rohressourcen dar, von verschiedenen Typen, die von einem Gerät verwendet werden können.
Syntax
typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
ULONG ListSize;
INTERFACE_TYPE InterfaceType;
ULONG BusNumber;
ULONG SlotNumber;
ULONG Reserved[3];
ULONG AlternativeLists;
IO_RESOURCE_LIST List[1];
} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
Angehörige
ListSize
Die Gesamtanzahl der Bytes, die die IO_RESOURCE_REQUIREMENTS_LIST Struktur, das IO_RESOURCE_LIST Array und das IO_RESOURCE_DESCRIPTOR Array bilden.
InterfaceType
Gibt einen Schnittstellentyp an. Dies muss einer der typen sein, die durch INTERFACE_TYPEdefiniert werden, in Wdm.h oder Ntddk.h. (Wird nicht von WDM-Treibern verwendet.)
BusNumber
Eine vom System zugewiesene, nullbasierte Busnummer. (Wird nicht von WDM-Treibern verwendet.)
SlotNumber
Eine Systemplatznummer. (Wird nicht von WDM-Treibern verwendet.)
Reserved[3]
Reserviert.
AlternativeLists
Die Anzahl der alternativen Listen (oder Konfigurationen) von Hardwareressourcen, die von dieser IO_RESOURCE_REQUIREMENTS_LIST Struktur beschrieben werden. Das Listenelement ist die Kopfzeile für die erste alternative Liste.
List[1]
Die IO_RESOURCE_LIST Struktur, die als Header für die erste alternative Liste der Hardwareressourcen dient. Wenn die IO_RESOURCE_REQUIREMENTS_LIST-Struktur mehrere alternative Listen beschreibt, folgt die zweite alternative Liste sofort der ersten alternativen Liste im Arbeitsspeicher usw. Die Größe jeder alternativen Liste hängt von der Länge des darin enthaltenen IO_RESOURCE_DESCRIPTOR Arrays ab. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".
Bemerkungen
Diese Struktur wird von den IRP_MN_FILTER_RESOURCE_REQUIREMENTS und IRP_MN_QUERY_RESOURCE_REQUIREMENTS IRPs verwendet, um eine oder mehrere alternative Konfigurationen von Hardwareressourcenzu beschreiben.
Die IO_RESOURCE_REQUIREMENTS_LIST Struktur ist eine Kopfzeile für eine größere Datenstruktur mit variabler Größe, die eine oder mehrere alternative Ressourcenlisten angibt. Alle Daten in dieser größeren Struktur belegen einen zusammenhängenden Speicherblock, dessen Größe durch das ListSize-Element angegeben wird. Jede alternative Liste belegt einen Teilblock innerhalb des größeren Blocks.
Jede alternative Liste beginnt mit einer IO_RESOURCE_LIST Struktur, die als Kopfzeile für ein Array von IO_RESOURCE_DESCRIPTOR Strukturen dient. Die Länge dieses Arrays bestimmt die Größe der Liste, die von einer alternativen Liste zum nächsten variieren kann. Der Treibercode kann Zeigerarithmetik verwenden, um von einer alternativen Liste zur nächsten zu wechseln. Wenn beispielsweise ein Parameter namens Liste ein Zeiger auf die IO_RESOURCE_LIST Struktur am Anfang einer alternativen Liste ist, kann Liste aktualisiert werden, um auf den Anfang der nächsten Liste wie folgt zu verweisen:
list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);
In diesem Beispiel ist list->Descriptors
ein Zeiger auf den Anfang des IO_RESOURCE_DESCRIPTOR Arrays, und list->Count
die Anzahl der Elemente im Array ist. Weitere Informationen zu den Deskriptoren und Count Member finden Sie unter IO_RESOURCE_LIST.
Beispiele
Wenn ein Treiber einen Handler für ein IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP enthält, führt der Handler in der Regel die Ressourcenliste durch, auf die das feld IoStatus.Information im IRP verweist. Das folgende Codebeispiel enthält eine Funktion namens "FilterResources", die im Handler aufgerufen wird, um die Liste zu durchlaufen. Diese Funktion überprüft entweder, ob eine bestimmte Ressource in der Liste angegeben ist, oder ändert die Ressourcenanforderungen in der Liste, ohne die Größe der Liste zu ändern. (Eine Funktion, die die Größe der Liste ändert, müsste einen Puffer für die aktualisierte Liste zuweisen, die Liste in diesen Puffer schreiben, das IoStatus.Information Feld im IRP aktualisieren, um auf die aktualisierte Liste zu verweisen, und geben Sie den Puffer frei, der die ursprüngliche Liste enthält.)
Die FilterResources-Funktion gibt TRUE zurück (wahrscheinlich aus der Switch-Anweisung, obwohl die Details ausgelassen werden, um das Codebeispiel zu vereinfachen), wenn die gesuchte Ressource in der Liste gefunden wird, oder wenn sie eine Änderung an der Liste vornimmt, die die Größe der Liste nicht ändert. Andernfalls wird FALSE-zurückgegeben.
/* Modify the resource list in place (without changing its size). */
BOOLEAN FilterResources(PIO_RESOURCE_REQUIREMENTS_LIST reqlist)
{
PIO_RESOURCE_LIST list;
list = reqlist->List;
for (int ix = 0; ix < reqlist->AlternativeLists; ++ix)
{
/* Process resources in IO_RESOURCE_LIST block number ix. */
for (int jx = 0; jx < list->Count; ++jx)
{
PIO_RESOURCE_DESCRIPTOR desc;
desc = list->Descriptors + jx;
switch (desc->Type)
{
/* Process element jx in Descriptors array. */
...
}
}
/* Advance to next IO_RESOURCE_LIST block in memory. */
list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);
}
return FALSE;
}
Anforderungen
Anforderung | Wert |
---|---|
Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h, Miniport.h) |