MapViewOfFileExNuma, fonction (winbase.h)

Mappe une vue d’un mappage de fichiers dans l’espace d’adressage d’un processus appelant et spécifie le nœud NUMA pour la mémoire physique.

Syntaxe

LPVOID MapViewOfFileExNuma(
  [in]           HANDLE hFileMappingObject,
  [in]           DWORD  dwDesiredAccess,
  [in]           DWORD  dwFileOffsetHigh,
  [in]           DWORD  dwFileOffsetLow,
  [in]           SIZE_T dwNumberOfBytesToMap,
  [in, optional] LPVOID lpBaseAddress,
  [in]           DWORD  nndPreferred
);

Paramètres

[in] hFileMappingObject

Handle vers un objet de mappage de fichiers. Les fonctions CreateFileMappingNuma et OpenFileMapping retournent ce handle.

[in] dwDesiredAccess

Type d’accès à un objet de mappage de fichiers, qui détermine la protection des pages. Ce paramètre peut être l’une des valeurs suivantes, ou une combinaison de plusieurs valeurs au niveau du bit OU, le cas échéant.

Valeur Signification
FILE_MAP_ALL_ACCESS
Une vue en lecture/écriture du fichier est mappée. L’objet de mappage de fichiers doit avoir été créé avec PAGE_READWRITE ou PAGE_EXECUTE_READWRITE protection.

Lorsqu’il est utilisé avec MapViewOfFileExNuma, FILE_MAP_ALL_ACCESS équivaut à FILE_MAP_WRITE.

FILE_MAP_READ
Une vue en lecture seule du fichier est mappée. Une tentative d’écriture dans la vue fichier entraîne une violation d’accès.

L’objet de mappage de fichiers doit avoir été créé avec une protection PAGE_READONLY, PAGE_READWRITE, PAGE_EXECUTE_READ ou PAGE_EXECUTE_READWRITE .

FILE_MAP_WRITE
Une vue en lecture/écriture du fichier est mappée. L’objet de mappage de fichiers doit avoir été créé avec PAGE_READWRITE ou PAGE_EXECUTE_READWRITE protection.

Lorsqu’il est utilisé avec MapViewOfFileExNuma, (FILE_MAP_WRITE | FILE_MAP_READ) équivaut à FILE_MAP_WRITE.

 

À l’aide du bit OR, vous pouvez combiner les valeurs ci-dessus avec ces valeurs.

Valeur Signification
FILE_MAP_COPY
Une vue de copie en écriture du fichier est mappée. L’objet de mappage de fichiers doit avoir été créé avec une protection PAGE_READONLY, PAGE_READ_EXECUTE, PAGE_WRITECOPY, PAGE_EXECUTE_WRITECOPY, PAGE_READWRITE ou PAGE_EXECUTE_READWRITE .

Lorsqu’un processus écrit dans une page de copie sur écriture, le système copie la page d’origine vers une nouvelle page privée au processus. La nouvelle page est sauvegardée par le fichier de pagination. La protection de la nouvelle page passe de la copie en écriture à la lecture/écriture.

Lorsque l’accès de copie en écriture est spécifié, les frais de validation du système et du processus pris concernent l’ensemble de l’affichage, car le processus appelant peut potentiellement écrire dans chaque page de l’affichage, ce qui rend toutes les pages privées. Le contenu de la nouvelle page n’est jamais réécrit dans le fichier d’origine et est perdu lorsque la vue n’est pas mappée.

FILE_MAP_EXECUTE
Une vue exécutable du fichier est mappée (la mémoire mappée peut être exécutée en tant que code). L’objet de mappage de fichiers doit avoir été créé avec PAGE_EXECUTE_READ, PAGE_EXECUTE_WRITECOPY ou PAGE_EXECUTE_READWRITE protection.
FILE_MAP_LARGE_PAGES
À compter de Windows 10, version 1703, cet indicateur spécifie que la vue doit être mappée à l’aide de la prise en charge des pages volumineuses. La taille de l’affichage doit être un multiple de la taille d’une grande page signalée par la fonction GetLargePageMinimum , et l’objet de mappage de fichiers doit avoir été créé à l’aide de l’option SEC_LARGE_PAGES . Si vous fournissez une valeur non null pour lpBaseAddress, la valeur doit être un multiple de GetLargePageMinimum.
FILE_MAP_TARGETS_INVALID
Définit tous les emplacements du fichier mappé en tant que cibles non valides pour Control Flow Guard (CFG). Cet indicateur est similaire à PAGE_TARGETS_INVALID. Utilisez cet indicateur en combinaison avec le droit d’accès d’exécution FILE_MAP_EXECUTE. Tout appel indirect à des emplacements dans ces pages échoue aux vérifications CFG et le processus est arrêté. Le comportement par défaut pour les pages exécutables allouées est d’être marqué comme cibles d’appel valides pour CFG.
 

Pour les objets de mappage de fichiers créés avec l’attribut SEC_IMAGE , le paramètre dwDesiredAccess n’a aucun effet et doit être défini sur une valeur valide telle que FILE_MAP_READ.

Pour plus d’informations sur l’accès aux objets de mappage de fichiers, consultez Sécurité et droits d’accès du mappage de fichiers.

[in] dwFileOffsetHigh

DWORD d’ordre élevé du décalage de fichier où la vue doit commencer.

[in] dwFileOffsetLow

DWORD de bas ordre du décalage de fichier où la vue doit commencer. La combinaison des décalages élevé et faible doit spécifier un décalage dans le mappage de fichiers. Ils doivent également correspondre à la granularité d’allocation de mémoire du système. Autrement dit, le décalage doit être un multiple de la granularité d’allocation. Pour obtenir la granularité d’allocation de mémoire du système, utilisez la fonction GetSystemInfo , qui remplit les membres d’une structure SYSTEM_INFO .

[in] dwNumberOfBytesToMap

Nombre d’octets d’un mappage de fichier à mapper à une vue. Tous les octets doivent être dans la taille maximale spécifiée par CreateFileMapping. Si ce paramètre est égal à 0 (zéro), le mappage s’étend du décalage spécifié jusqu’à la fin du mappage de fichiers.

[in, optional] lpBaseAddress

Pointeur vers l’adresse mémoire dans l’espace d’adressage du processus appelant où le mappage commence. Il doit s’agir d’un multiple de la granularité d’allocation de mémoire du système, sinon la fonction échoue. Pour déterminer la granularité de l’allocation de mémoire du système, utilisez la fonction GetSystemInfo . S’il n’y a pas suffisamment d’espace d’adressage à l’adresse spécifiée, la fonction échoue.

Si le paramètre lpBaseAddress a la valeur NULL, le système d’exploitation choisit l’adresse de mappage.

Bien qu’il soit possible de spécifier une adresse qui est maintenant sécurisée (non utilisée par le système d’exploitation), il n’y a aucune garantie que l’adresse restera sécurisée au fil du temps. Par conséquent, il est préférable de laisser le système d’exploitation choisir l’adresse. Dans ce cas, vous ne devez pas stocker de pointeurs dans le fichier mappé en mémoire ; Vous stockez les décalages à partir de la base du mappage de fichiers afin que le mappage puisse être utilisé à n’importe quelle adresse.

[in] nndPreferred

Nœud NUMA dans lequel la mémoire physique doit résider.

Valeur Signification
NUMA_NO_PREFERRED_NODE
0xffffffff
Aucun nœud NUMA n’est préféré. Cela revient à appeler la fonction MapViewOfFileEx .

Valeur retournée

Si la fonction réussit, la valeur de retour est l’adresse de départ de la vue mappée.

Si la fonction échoue, la valeur de retour est NULL. Pour obtenir des informations détaillées sur l’erreur, appelez la fonction GetLastError.

Remarques

Le mappage d’un fichier rend la partie spécifiée du fichier visible dans l’espace d’adressage du processus appelant.

Pour les fichiers dont la taille est supérieure à l’espace d’adressage, vous ne pouvez mapper qu’une petite partie des données du fichier à la fois. Une fois la première vue terminée, vous la démassez et vous mapperez une nouvelle vue.

Pour obtenir la taille d’une vue, utilisez la fonction VirtualQueryEx .

Le contenu initial des pages d’un objet de mappage de fichiers soutenu par le fichier de page est égal à 0 (zéro).

Si une adresse de mappage suggérée est fournie, le fichier est mappé à l’adresse spécifiée (arrondi à la limite de 64 Ko la plus proche) s’il y a suffisamment d’espace d’adressage à l’adresse spécifiée. Si l’espace d’adressage est insuffisant, la fonction échoue.

En règle générale, l’adresse suggérée est utilisée pour spécifier qu’un fichier doit être mappé à la même adresse dans plusieurs processus. Cela nécessite que la région de l’espace d’adressage soit disponible dans tous les processus impliqués. Aucune autre allocation de mémoire ne peut avoir lieu dans la région utilisée pour le mappage, y compris l’utilisation de la fonction VirtualAllocExNuma pour réserver de la mémoire.

Si le paramètre lpBaseAddress spécifie un décalage de base, la fonction réussit si la région de mémoire spécifiée n’est pas déjà utilisée par le processus appelant. Le système ne garantit pas que la même région de mémoire est disponible pour le fichier mappé en mémoire dans d’autres processus 32 bits.

Plusieurs vues d’un fichier (ou d’un objet de mappage de fichiers et son fichier mappé) sont cohérentes si elles contiennent des données identiques à un moment spécifié. Cela se produit si les vues de fichiers sont dérivées du même objet de mappage de fichiers. Un processus peut dupliquer un handle d’objet de mappage de fichiers dans un autre processus à l’aide de la fonction DuplicateHandle , ou un autre processus peut ouvrir un objet de mappage de fichiers par son nom à l’aide de la fonction OpenFileMapping .

À une exception importante, les vues de fichiers dérivées de n’importe quel objet de mappage de fichiers qui est adossé au même fichier sont cohérentes ou identiques à un moment spécifique. La cohérence est garantie pour les vues au sein d’un processus et pour les vues qui sont mappées par différents processus.

L’exception est liée aux fichiers distants. Bien que MapViewOfFileExNuma fonctionne avec les fichiers distants, il ne les maintient pas cohérents. Par exemple, si deux ordinateurs mappent un fichier en tant que fichier accessible en écriture et modifient tous les deux la même page, chaque ordinateur ne voit que ses propres écritures dans la page. Lorsque les données sont mises à jour sur le disque, elles ne sont pas fusionnées.

Il n’est pas garanti qu’une vue mappée d’un fichier soit cohérente avec un fichier accessible par la fonction ReadFile ou WriteFile .

Pour vous protéger contre les exceptions EXCEPTION_IN_PAGE_ERROR , utilisez la gestion structurée des exceptions pour protéger tout code qui écrit ou lit dans une vue mappée en mémoire d’un fichier autre que le fichier de page. Pour plus d’informations, consultez Lecture et écriture à partir d’un mode Fichier.

Lors de la modification d’un fichier via une vue mappée, l’horodatage de la dernière modification peut ne pas être mis à jour automatiquement. Si nécessaire, l’appelant doit utiliser SetFileTime pour définir l’horodatage.

Pour disposer d’autorisations exécutables d’un fichier, une application doit appeler la fonction CreateFileMappingNuma avec PAGE_EXECUTE_READWRITE ou PAGE_EXECUTE_READ , puis appeler la fonction MapViewOfFileExNuma avec FILE_MAP_EXECUTE | FILE_MAP_WRITE ou FILE_MAP_EXECUTE | FILE_MAP_READ.

Dans Windows Server 2012, cette fonction est prise en charge par les technologies suivantes.

Technologie Prise en charge
Protocole Server Message Block (SMB) 3.0 Oui
Basculement transparent SMB 3.0 (TFO) Oui
SMB 3.0 avec partages de fichiers avec montée en puissance parallèle (SO) Oui
Système de fichiers du volume partagé de cluster (CsvFS) Oui
Système de fichiers résilient (ReFS) Oui

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2008 [applications de bureau uniquement]
Plateforme cible Windows
En-tête winbase.h (inclure Windows.h)
Bibliothèque Kernel32.lib
DLL Kernel32.dll

Voir aussi

CreateFileMappingNuma

DuplicateHandle

Fonctions de mappage de fichiers

GetSystemInfo

MapViewOfFileEx

Prise en charge de NUMA

OpenFileMapping

ReadFile

SYSTEM_INFO

UnmapViewOfFile

VirtualAlloc

WriteFile