MmAllocateMdlForIoSpace, fonction (wdm.h)
La routine MmAllocateMdlForIoSpace alloue unMDLet initialise ce MDL pour décrire un ensemble de plages d’adresses physiques dans l’espace d’adressage d’E/S.
Syntaxe
NTSTATUS MmAllocateMdlForIoSpace(
[in] PMM_PHYSICAL_ADDRESS_LIST PhysicalAddressList,
[in] SIZE_T NumberOfEntries,
[out] PMDL *NewMdl
);
Paramètres
[in] PhysicalAddressList
Pointeur vers un tableau de structures MM_PHYSICAL_ADDRESS_LIST qui décrivent les plages d’adresses physiques à inclure dans le MDL alloué.
[in] NumberOfEntries
Nombre d’éléments dans le tableau MM_PHYSICAL_ADDRESS_LIST pointé par PhysicalAddressList.
[out] NewMdl
Pointeur vers un emplacement dans lequel la routine écrit un pointeur dans le MDL nouvellement alloué.
Valeur de retour
MmAllocateMdlForIoSpace retourne STATUS_SUCCESS si elle réussit. Les valeurs de retour d’erreur possibles incluent les codes d’état suivants.
Retourner le code | Description |
---|---|
STATUS_INVALID_PARAMETER_1 | Une adresse physique n’est pas alignée sur une limite de page ; ou une plage d’adresses physiques n’est pas un multiple de la taille de page ; ou une plage d’adresses physiques est utilisée par le système d’exploitation pour la RAM et n’est pas disponible en tant qu’espace d’E/S. |
STATUS_INSUFFICIENT_RESOURCES | Les ressources système insuffisantes sont disponibles pour effectuer l’opération demandée. |
Ne supposez pas que la liste précédente des codes de retour d’erreur est exhaustive. La routine peut retourner des codes d’erreur qui n’apparaissent pas dans la liste.
Remarques
Cette routine accepte, en tant que paramètre d’entrée, un tableau de structures MM_PHYSICAL_ADDRESS_LIST qui décrivent un ensemble de plages d’adresses physiques dans l’espace d’adressage d’E/S et alloue un MDL qui décrit ces plages. Les plages d’adresses physiques consécutives dans le tableau ne sont pas requises pour être contiguës.
Les plages d’adresses physiques dans le tableau PhysicalAddressList doivent satisfaire aux conditions suivantes :
L’adresse physique de base de chaque plage doit être alignée sur une limite de PAGE_SIZE en mémoire.
La taille, en octets, de chaque plage doit être un multiple entier de PAGE_SIZE.
Toutes les plages d’adresses physiques doivent être en mémoire qui sont disponibles pour être utilisées en tant qu’espace d’adressage d’E/S. Ils ne peuvent pas être dans l’espace mémoire utilisé par le système d’exploitation pour la RAM.
La taille totale de toutes les plages doit être inférieure à 4 gigaoctets. Plus précisément, la taille totale ne doit pas dépasser 2^32 - 1 octets.
L’appelant est chargé de libérer le MDL alloué lorsqu’il n’est plus nécessaire. Pour libérer le MDL, appelez la routine IoFreeMdl. Pour plus d’informations sur les DLL, consultez Utilisation de MDLs.
Le MDL créé par MmAllocateMdlForIoSpace n’est pas mappé à la mémoire virtuelle, mais peut être fourni à une routine telle que MapTransferEx pour lancer un transfert DMA vers ou à partir des plages de mémoire physiques décrites par mdL. Pour mapper ce MDL à une plage contiguë d’adresses virtuelles afin qu’elle soit accessible par le processeur, appelez la routine MmMapLockedPagesSpecifyCache.
Seules les plages de l’espace d’adressage physique qui ne sont pas réservés par le système d’exploitation pour une utilisation en tant que mémoire sont disponibles pour les pilotes à utiliser comme espace d’adressage d’E/S. Les pilotes utilisent l’espace d’adressage d’E/S pour accéder aux ressources matérielles mappées en mémoire, telles que les registres d’appareils. Quand un pilote démarre, il peut recevoir une ou plusieurs plages d’adresses physiques en tant que ressources matérielles traduites. Pour plus d’informations, consultez Mappage des adresses Bus-Relative aux adresses virtuelles.
Dans certaines architectures de processeur, telles que x86, les appareils peuvent être mappés en mémoire ou mappés aux adresses de port dans un espace d’adressage d’E/S spécial dédié aux appareils et séparé de l’espace d’adressage de la mémoire. Les pilotes peuvent utiliser MmAllocateMdlForIoSpace pour allouer des DLL uniquement pour les appareils mappés en mémoire.
Exemples
L’exemple de code suivant montre comment construire un tableau de structures MM_PHYSICAL_ADDRESS_LIST qui décrivent les plages d’adresses physiques à inclure dans le MDL alloué.
extern ULONG64 BasePhysicalAddress;
extern SIZE_T ChunkSize;
extern SIZE_T Stride;
#define ARRAYSIZE(x) (sizeof(x)/sizeof((x)[0]))
NTSTATUS Status;
PMDL Mdl;
MM_PHYSICAL_ADDRESS_LIST AddressList[3];
AddressList[0].PhysicalAddress.QuadPart = BasePhysicalAddress;
AddressList[0].NumberOfBytes = ChunkSize;
BasePhysicalAddress += Stride;
AddressList[1].PhysicalAddress.QuadPart = BasePhysicalAddress;
AddressList[1].NumberOfBytes = ChunkSize;
BasePhysicalAddress += Stride;
AddressList[2].PhysicalAddress.QuadPart = BasePhysicalAddress;
AddressList[2].NumberOfBytes = ChunkSize;
Status = MmAllocateMdlForIoSpace (AddressList, ARRAYSIZE(AddressList), &Mdl);
Dans cet exemple, l’adresse physique de départ est spécifiée par la variable BasePhysicalAddress
. Le nombre d’octets de chaque plage d’adresses physiques est spécifié par la variable ChunkSize
. Le décalage d’octet entre le début d’une plage physique et le début de la suivante est spécifié par la variable Stride
.
BasePhysicalAddress
doivent être alignés sur une limite de page en mémoire, et ChunkSize
et Stride
doivent être plusieurs de la taille de page.
Exigences
Exigence | Valeur |
---|---|
client minimum pris en charge | Disponible à partir de Windows 8. |
plateforme cible | Universel |
d’en-tête | wdm.h (include Wdm.h) |
bibliothèque | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |