Partager via


structure VIDEO_ACCESS_RANGE (video.h)

La structure VIDEO_ACCESS_RANGE définit un port d’E/S d’appareil ou une plage de mémoire pour la carte vidéo. La fonction HwVidFindAdapter de chaque pilote miniport doit configurer un tableau d’éléments de type VIDEO_ACCESS_RANGE, appelé tableau de plages d’accès, pour chaque carte vidéo prise en charge par le pilote miniport.

Pour les pilotes miniport compatibles VGA, VIDEO_ACCESS_RANGE définit également un élément dans un tableau transmis à VideoPortSetTrappedEmulatorPorts pour activer ou désactiver l’accès direct aux ports d’E/S par les applications MS-DOS en plein écran.

Syntaxe

typedef struct _VIDEO_ACCESS_RANGE {
  PHYSICAL_ADDRESS RangeStart;
  ULONG            RangeLength;
  UCHAR            RangeInIoSpace;
  UCHAR            RangeVisible;
  UCHAR            RangeShareable;
  UCHAR            RangePassive;
} VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE;

Membres

RangeStart

Spécifie l’adresse de base relative du bus d’une plage de ports de mémoire ou d’E/S pour un élément du tableau de plages d’accès transmis à VideoPortVerifyAccessRanges ou retourné par VideoPortGetAccessRanges.

Spécifie l’adresse de base relative du bus d’une plage de ports d’E/S pour un tableau à passer à VideoPortSetTrappedEmulatorPorts.

RangeLength

Spécifie le nombre de ports d’E/S ou la taille en octets pour la plage.

RangeInIoSpace

Spécifie si la plage se trouve dans l’espace d’E/S ou dans l’espace mémoire. La valeur TRUE (1) indique que la plage se trouve dans l’espace d’E/S ; la valeur FALSE (0) indique que la plage se trouve dans l’espace mémoire.

RangeVisible

Est ignoré si la fonction HwVidFindAdapter du pilote miniport configure le tableau de plages d’accès.

Est défini sur TRUE par les pilotes miniport compatibles VGA et transmis à VideoPortSetTrappedEmulatorPorts pour permettre l’accès direct à la plage de ports d’E/S par une application MS-DOS en plein écran. Si la valeur est FALSE, les instructions émises par l’application continuent d’être piégées et transmises à la fonction SvgaHwIoXxx du pilote miniport pour validation.

RangeShareable

Est défini sur TRUE si la plage d’accès décrite par cet élément peut être partagée avec un autre pilote et/ou appareil ou sur FALSE si la plage ne peut pas être partagée.

Est ignoré par VideoPortSetTrappedEmulatorPorts.

RangePassive

Indique si l’appareil utilise réellement le port. Les valeurs de ce membre sont indiquées dans le tableau suivant.

Valeur Signification
VIDEO_RANGE_PASSIVE_DECODE L’appareil décode le port, mais le pilote ne l’utilise pas.
VIDEO_RANGE_10_BIT_DECODE L’appareil décode dix bits de l’adresse du port.

Remarques

Le pilote miniport doit revendiquer les ressources héritées dans sa fonction DriverEntry ou HwVidLegacyResources .

Sinon, la fonction HwVidFindAdapter d’un pilote miniport configure le tableau de plages d’accès pour les ressources PCI d’une carte. Il peut utiliser les informations retournées par VideoPortGetAccessRanges. En guise d’alternative, il peut utiliser les informations récupérées à partir du Registre en appelant VideoPortGetDeviceData avec une fonction HwVidQueryDeviceCallback fournie par un pilote miniport ou VideoPortGetRegistryParameters avec une fonction HwVidQueryNamedValueCallback fournie par un pilote miniport. Si l’appel de ces VideoPortXxx ne fournit pas les valeurs de plage d’accès relative au bus, HwVidFindAdapter peut configurer des éléments de plages d’accès à l’aide de valeurs par défaut de bus fournies par le pilote.

Revendication de plages d’accès dans le Registre

Le pilote miniport doit appeler VideoPortVerifyAccessRanges avec toutes les plages d’accès obtenues à partir de VideoPortGetDeviceData, VideoPortGetAccessRanges, ou fournies par défaut par le pilote miniport. Si VideoPortVerifyAccessRanges retourne NO_ERROR pour un tel tableau de plages d’accès, la fonction HwVidFindAdapter ou HwVidQueryDeviceCallback peut ensuite mapper les plages avec VideoPortGetDeviceBase et utiliser les adresses logiques mappées retournées pour accéder à l’adaptateur.

Un appel réussi à VideoPortGetAccessRanges revendique également les plages d’accès relatives au bus retournées dans le registre pour l’appelant. Si le pilote miniport modifie l’une des valeurs retournées, il doit appeler VideoPortVerifyAccessRanges avec la plage d’accès complète, y compris les éléments non modifiés. Chaque appel à VideoPortGetAccessRanges ou VideoPortVerifyAccessRanges pour une carte vidéo particulière remplace les ressources matérielles revendiquées de l’appelant dans le Registre.

Un pilote miniport ne doit pas tenter d’utiliser une plage pour laquelle VideoPortVerifyAccessRanges ou VideoPortGetAccessRanges ne retourne pas NO_ERROR.

Mappage de plages d’accès pour communiquer avec l’adaptateur

Une fois qu’un pilote miniport a revendiqué des ressources dans le Registre pour une carte, il ne peut pas utiliser d’adresses relatives au bus pour accéder ou configurer l’adaptateur, car hal peut remappper toutes les adresses d’appareil relatives au bus sur l’espace système.

La fonction HwVidFindAdapter du pilote miniport doit appeler VideoPortGetDeviceBase pour obtenir des adresses logiques mappées pour ses plages d’accès. Ce n’est qu’alors que le pilote miniport peut communiquer avec la carte vidéo en transmettant les adresses de plage logique mappées retournées à VideoPortRead/WritePortXxx pour accéder à la mémoire de l’appareil dans l’espace d’E/S et/ou VideoPortRead/WriteRegisterXxx pour accéder à la mémoire de l’appareil dans l’espace mémoire.

Déterminer si une plage d’accès est partageable

Suivez ces instructions pour déterminer si une plage d’accès peut être partagée :
  • Si la plage de ports de mémoire ou d’E/S doit être « détenue » par ce pilote et/ou si l’accès à cette plage par un autre pilote peut provoquer un problème, définissez RangeSharable sur FALSE.
  • Si la plage peut être partagée avec un pilote de périphérique coopérant, définissez RangeSharable surTRUE.
Les pilotes svgA miniport qui implémentent toutes les fonctionnalités VGA (déclarés dans le Registre comme VgaCompatible défini sur un) doivent revendiquer leurs plages d’accès comme non partageables afin que le pilote VGA système ne soit pas chargé. D’autre part, les pilotes miniport pour les adaptateurs tels que le S3 ou le XGA, qui définissent VgaCompatible sur zéro dans le Registre, doivent revendiquer toutes les ressources qu’ils partagent avec le pilote VGA système comme pouvant être partagées.

Toutefois, les pilotes miniport pour les cartes qui fonctionnent avec un iocTL direct et qui peuvent être connectés à n’importe quel carte VGA ou SVGA ne doivent pas utiliser de ports VGA système ou de plages de mémoire. Si c’est le cas, un tel pilote ne doit pas tenter de revendiquer les plages d’accès VGA dans le Registre. Les tentatives de revendication de ressources VGA par un tel pilote miniport sont susceptibles de provoquer un conflit de ressources, car le pilote d’un carte SVGA dans la machine aura revendiqué ces plages d’accès comme non partageables.

Passage d’éléments de plage de ports d’E/S à VideoPortSetTrappedEmulatorPorts

Tous les éléments de tableau de type VIDEO_ACCESS_RANGE décrivant les plages de ports d’E/S sont supposés invisibles, sauf si un pilote miniport compatible VGA dans une machine x86 réinitialise explicitement le ou les membres RangeVisible à TRUE et appelle VideoPortSetTrappedEmulatorPorts pour activer une ou plusieurs plages de ports d’E/S. VideoPortSetTrappedEmulatorPorts ignore les membres RangeSharable du tableau d’entrée.

Dans un tableau d’éléments de VIDEO_ACCESS_RANGE type transmis à VideoPortSetTrappedEmulatorPorts, la valeur du membre RangeVisible de chaque élément détermine si le ou les ports d’E/S donnés sont accessibles directement par le VDM (application MS-DOS s’exécutant en plein écran sur un ordinateur x86) ou si un flux d’E/S émis par l’application est bloqué et transféré vers une fonction SvgaHwIoPortXxx fournie par un miniport pour validation en premier.

Configuration requise

Condition requise Valeur
En-tête video.h (inclure Video.h)

Voir aussi

DriverEntry of Video Miniport Driver

EMULATOR_ACCESS_ENTRY

HwVidFindAdapter

HwVidQueryDeviceCallback

HwVidQueryNamedValueCallback

VIDEO_HW_INITIALIZATION_DATA

VideoPortGetAccessRanges

VideoPortGetDeviceBase

VideoPortGetDeviceData

VideoPortGetRegistryParameters

VideoPortInitialize

VideoPortSetTrappedEmulatorPorts

VideoPortVerifyAccessRanges