Zugreifen auf den PCI-Gerätekonfigurationsbereich
Einige Vorgänge auf einem PCI-Gerät (Peripheral Component Interconnect) sind für den Funktionstreiber des Geräts reserviert. Zu diesen Vorgängen gehören beispielsweise der Zugriff auf den gerätespezifischen Konfigurationsraum eines Busses und das Programmieren eines DMA-Controllers (Direct Memory Access). Microsoft bietet Systemunterstützung für den Zugriff auf den Konfigurationsraum von PCI-Geräten mit zwei Methoden:
Die BUS_INTERFACE_STANDARD Busschnittstelle
Die Konfigurations-E/A-Anforderungspakete (IRPs), IRP_MN_READ_CONFIG und IRP_MN_WRITE_CONFIG
Hinweis
Ab Windows 10 Version 2004 werden einschränkungen für nicht unterstützte Methoden für den Zugriff auf den PCI-Gerätekonfigurationsbereich festgelegt, wenn auf einem Gerät eine ACPI-Tabelle für sichere Geräte (SDEV) und virtualisierungsbasierte Sicherheit aktiviert ist. Wenn ein Treiber oder Prozess versucht, den PCI-Gerätekonfigurationsbereich mit einer Methode zu lesen oder zu bearbeiten, die oben nicht aufgeführt ist, wird der Zugriff blockiert und führt zu einer Systemfehlerüberprüfung.
Die Betriebssysteme Windows XP und Windows Server 2003 und höher haben die exklusive Kontrolle über den Konfigurationsbereichsheader, wie in der Pci Local Bus-Spezifikation definiert, sowie über alle Funktionen in der Liste der verknüpften Funktionen. Treiber dürfen nicht versuchen, diese Register zu ändern.
Treiber können jedoch mithilfe der IRP_MN_WRITE_CONFIG-Anforderung oder der SetBusData-Methode von BUS_INTERFACE_STANDARD in den Konfigurationsbereich schreiben, der nicht zum Header oder zur Vom Anbieter definierten Funktionsliste gehört. Treiber können auch die Funktionen eines Geräts mithilfe der IRP_MN_READ_CONFIG-Anforderung oder der GetBusData-Methode von BUS_INTERFACE_STANDARD lesen. Um IRP_MN_READ_CONFIG oder IRP_MN_WRITE_CONFIG verwenden zu können, müssen Treiber auf PASSIVE_LEVEL ausgeführt werden. Eine Liste der Funktionen und der entsprechenden Strukturen, die Treiber abfragen können, finden Sie im Abschnitt PCI-Strukturen .
Treiber können mithilfe der IRP_MN_READ_CONFIG-Anforderung oder der GetBusData-Methode von BUS_INTERFACE_STANDARD aus dem erweiterten PCI-Gerätekonfigurationsbereich (d. h. mehr als 256 Byte an Konfigurationsdaten) lesen. Ebenso können Treiber mithilfe der IRP_MN_WRITE_CONFIG-Anforderung oder der SetBusData-Methode von BUS_INTERFACE_STANDARD in den erweiterten PCI-Gerätekonfigurationsbereich schreiben. Wenn ein Gerät nicht über einen erweiterten Konfigurationsraum verfügt oder die Plattform keinen Pfad für einen erweiterten Konfigurationsbereich auf einem Gerät definiert, geben die Leseanforderungen 0xFFFF zurück, und die Schreibanforderungen haben keine Auswirkungen. Um festzustellen, ob der Vorgang erfolgreich war, können Treiber die Anzahl der gelesenen oder geschriebenen Bytes untersuchen.
PCI Express und PCI-X Modus 2 unterstützen einen erweiterten PCI-Gerätekonfigurationsbereich von mehr als 256 Byte. Treiber können diesen Konfigurationsraum lesen und schreiben, jedoch nur mit der entsprechenden Hardware und BIOS-Unterstützung. Innerhalb des ACPI-BIOS muss der Stammbus über eine PNP-ID von PNP0A08 oder PNP0A03 verfügen. Bei Stammbussen mit der PNP-ID von PNP0A03 sollte die _DSM-Methode mit Funktion 4 angeben, dass der aktuelle Modus PCI-X-Modus 2 ist. Alle Brücken und Geräte sollten entweder PCI-Express sein oder im PCI-X-Modus 2 betrieben werden.
Darüber hinaus sollte das System speicherabbildete Konfigurationsraumzugriffe unterstützen. Dies erfolgt durch Definieren einer MCFG-Tabelle im System-BIOS/der -Firmware. Windows Vista und Windows Server 2008 und höher unterstützen automatisch speicherabbildete Konfigurationsraumzugriffe.
Warnung
HalGetBusDataByOffset und HalSetBusDataByOffset werden aus Gründen der Abwärtskompatibilität bereitgestellt, sollten jedoch nur verwendet werden, wenn die verwendung der beiden oben genannten Methoden nicht möglich ist.