Condividi tramite


Funzione MapViewOfFileExNuma (winbase.h)

Esegue il mapping di una visualizzazione di un mapping di file nello spazio degli indirizzi di un processo chiamante e specifica il nodo NUMA per la memoria fisica.

Sintassi

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
);

Parametri

[in] hFileMappingObject

Handle per un oggetto di mapping di file. Le funzioni CreateFileMappingNuma e OpenFileMapping restituiscono questo handle.

[in] dwDesiredAccess

Tipo di accesso a un oggetto di mapping di file, che determina la protezione della pagina delle pagine. Questo parametro può essere uno dei valori seguenti o una combinazione OR bit per bit di più valori, se appropriato.

Valore Significato
FILE_MAP_ALL_ACCESS
Viene eseguito il mapping di una visualizzazione di lettura/scrittura del file. L'oggetto di mapping dei file deve essere stato creato con PAGE_READWRITE o PAGE_EXECUTE_READWRITE protezione.

Se usato con MapViewOfFileExNuma, FILE_MAP_ALL_ACCESS equivale a FILE_MAP_WRITE.

FILE_MAP_READ
Viene eseguito il mapping di una visualizzazione di sola lettura del file. Un tentativo di scrittura nella visualizzazione file comporta una violazione di accesso.

L'oggetto di mapping dei file deve essere stato creato con protezione PAGE_READONLY, PAGE_READWRITE, PAGE_EXECUTE_READ o PAGE_EXECUTE_READWRITE .

FILE_MAP_WRITE
Viene eseguito il mapping di una visualizzazione di lettura/scrittura del file. L'oggetto di mapping dei file deve essere stato creato con PAGE_READWRITE o PAGE_EXECUTE_READWRITE protezione.

Se usato con MapViewOfFileExNuma, (FILE_MAP_WRITE | FILE_MAP_READ) equivale a FILE_MAP_WRITE.

 

Usando OR bit per bit, è possibile combinare i valori precedenti con questi valori.

Valore Significato
FILE_MAP_COPY
Viene eseguito il mapping di una visualizzazione copia in scrittura del file. L'oggetto di mapping dei file deve essere stato creato con protezione PAGE_READONLY, PAGE_READ_EXECUTE, PAGE_WRITECOPY, PAGE_EXECUTE_WRITECOPY, PAGE_READWRITE o PAGE_EXECUTE_READWRITE .

Quando un processo scrive in una pagina di copia in scrittura, il sistema copia la pagina originale in una nuova pagina privata nel processo. La nuova pagina è supportata dal file di paging. La protezione della nuova pagina cambia da copia in scrittura a lettura/scrittura.

Quando si specifica l'accesso in scrittura di copia, l'addebito di commit del sistema e del processo viene addebitato per l'intera visualizzazione perché il processo chiamante può potenzialmente scrivere in ogni pagina della visualizzazione, rendendo tutte le pagine private. Il contenuto della nuova pagina non viene mai riscritto nel file originale e viene perso quando la visualizzazione non viene mappata.

FILE_MAP_EXECUTE
Viene eseguito il mapping di una visualizzazione eseguibile del file (la memoria mappata può essere eseguita come codice). L'oggetto di mapping dei file deve essere stato creato con protezione PAGE_EXECUTE_READ, PAGE_EXECUTE_WRITECOPY o PAGE_EXECUTE_READWRITE .
FILE_MAP_LARGE_PAGES
A partire da Windows 10 versione 1703, questo flag specifica che la visualizzazione deve essere mappata usando il supporto di pagine di grandi dimensioni. Le dimensioni della visualizzazione devono essere multiple delle dimensioni di una pagina di grandi dimensioni segnalate dalla funzione GetLargePageMinimum e l'oggetto di mapping dei file deve essere stato creato usando l'opzione SEC_LARGE_PAGES . Se si specifica un valore non Null per lpBaseAddress, il valore deve essere un multiplo di GetLargePageMinimum.
FILE_MAP_TARGETS_INVALID
Imposta tutte le posizioni nel file mappato come destinazioni non valide per Control Flow Guard (CFG). Questo flag è simile a PAGE_TARGETS_INVALID. Usare questo flag in combinazione con il diritto di accesso di esecuzione FILE_MAP_EXECUTE. Qualsiasi chiamata indiretta a posizioni in tali pagine non riuscirà a controllare il cfg e il processo verrà terminato. Il comportamento predefinito per le pagine eseguibili allocate deve essere contrassegnato come destinazioni di chiamata valide per cfg.
 

Per gli oggetti di mapping di file creati con l'attributo SEC_IMAGE , il parametro dwDesiredAccess non ha alcun effetto e deve essere impostato su qualsiasi valore valido, ad esempio FILE_MAP_READ.

Per altre informazioni sull'accesso agli oggetti di mapping dei file, vedere Sicurezza mapping file e diritti di accesso.

[in] dwFileOffsetHigh

DWORD di ordine elevato dell'offset del file in cui iniziare la visualizzazione.

[in] dwFileOffsetLow

DWORD in ordine basso dell'offset del file in cui deve iniziare la visualizzazione. La combinazione degli offset alti e bassi deve specificare un offset all'interno del mapping di file. Devono anche corrispondere alla granularità dell'allocazione di memoria del sistema. Ovvero, l'offset deve essere un multiplo della granularità di allocazione. Per ottenere la granularità di allocazione della memoria del sistema, usare la funzione GetSystemInfo , che inserisce i membri di una struttura di SYSTEM_INFO .

[in] dwNumberOfBytesToMap

Numero di byte di un mapping di file da mappare a una vista. Tutti i byte devono essere entro le dimensioni massime specificate da CreateFileMapping. Se questo parametro è 0 (zero), il mapping si estende dall'offset specificato alla fine del mapping di file.

[in, optional] lpBaseAddress

Puntatore all'indirizzo di memoria nello spazio indirizzi del processo chiamante in cui inizia il mapping. Deve trattarsi di un multiplo della granularità di allocazione della memoria del sistema oppure la funzione ha esito negativo. Per determinare la granularità dell'allocazione di memoria del sistema, usare la funzione GetSystemInfo . Se lo spazio indirizzi specificato non è sufficiente, la funzione ha esito negativo.

Se il parametro lpBaseAddress è NULL, il sistema operativo sceglie l'indirizzo di mapping.

Anche se è possibile specificare un indirizzo sicuro ora (non usato dal sistema operativo), non esiste alcuna garanzia che l'indirizzo rimanga sicuro nel tempo. Pertanto, è preferibile consentire al sistema operativo di scegliere l'indirizzo. In questo caso, non archiviare i puntatori nel file mappato alla memoria; è possibile archiviare gli offset dalla base del mapping dei file in modo che il mapping possa essere usato in qualsiasi indirizzo.

[in] nndPreferred

Nodo NUMA in cui deve risiedere la memoria fisica.

Valore Significato
NUMA_NO_PREFERRED_NODE
0xffffffff
Non è preferibile alcun nodo NUMA. Equivale a chiamare la funzione MapViewOfFileEx .

Valore restituito

Se la funzione ha esito positivo, il valore restituito è l'indirizzo iniziale della visualizzazione mappata.

Se la funzione ha esito negativo, il valore restituito è NULL. Per ottenere informazioni sull'errore estese, chiamare la funzione GetLastError .

Commenti

Il mapping di un file rende visibile la parte specificata del file nello spazio degli indirizzi del processo chiamante.

Per i file più grandi dello spazio indirizzi, è possibile eseguire il mapping di una piccola parte dei dati del file contemporaneamente. Al termine della prima visualizzazione, si annulla il mapping e si esegue il mapping di una nuova visualizzazione.

Per ottenere le dimensioni di una visualizzazione, usare la funzione VirtualQueryEx .

Il contenuto iniziale delle pagine in un oggetto di mapping di file supportato dal file di pagina è 0 (zero).

Se viene fornito un indirizzo di mapping suggerito, il file viene mappato all'indirizzo specificato (arrotondato per difetto al limite di 64 KB più vicino) se è presente spazio indirizzi sufficiente nell'indirizzo specificato. Se lo spazio indirizzi non è sufficiente, la funzione ha esito negativo.

In genere, l'indirizzo suggerito viene usato per specificare che un file deve essere mappato allo stesso indirizzo in più processi. Ciò richiede che l'area dello spazio indirizzi sia disponibile in tutti i processi coinvolti. Nessun'altra allocazione di memoria può essere eseguita nell'area usata per il mapping, incluso l'uso della funzione VirtualAllocExNuma per riservare la memoria.

Se il parametro lpBaseAddress specifica un offset di base, la funzione ha esito positivo se l'area di memoria specificata non è già in uso dal processo chiamante. Il sistema non garantisce che la stessa area di memoria sia disponibile per il file mappato alla memoria in altri processi a 32 bit.

Più visualizzazioni di un file (o di un oggetto di mapping di file e del relativo file mappato) sono coerenti se contengono dati identici in un determinato momento. Ciò si verifica se le visualizzazioni file sono derivate dallo stesso oggetto di mapping di file. Un processo può duplicare un handle di oggetto di mapping di file in un altro processo usando la funzione DuplicateHandle oppure un altro processo può aprire un oggetto di mapping di file in base al nome usando la funzione OpenFileMapping .

Con un'eccezione importante, le visualizzazioni file derivate da qualsiasi oggetto di mapping di file supportato dallo stesso file sono coerenti o identici in un momento specifico. La coerenza è garantita per le visualizzazioni all'interno di un processo e per le visualizzazioni mappate da processi diversi.

L'eccezione è correlata ai file remoti. Anche se MapViewOfFileExNuma funziona con file remoti, non li mantiene coerenti. Ad esempio, se due computer eseguono il mapping di un file come scrivibile e entrambi modificano la stessa pagina, ogni computer vede solo le proprie scritture nella pagina. Quando i dati vengono aggiornati sul disco, non vengono uniti.

Una visualizzazione mappata di un file non è garantita coerenza con un file a cui si accede dalla funzione ReadFile o WriteFile .

Per proteggere le eccezioni EXCEPTION_IN_PAGE_ERROR , usare la gestione delle eccezioni strutturate per proteggere qualsiasi codice che scrive o legge da una visualizzazione mappata di memoria di un file diverso dal file di pagina. Per altre informazioni, vedere Lettura e scrittura da una visualizzazione file.

Quando si modifica un file tramite una visualizzazione mappata, l'ultimo timestamp di modifica potrebbe non essere aggiornato automaticamente. Se necessario, il chiamante deve usare SetFileTime per impostare il timestamp.

Per avere un file con autorizzazioni eseguibili, un'applicazione deve chiamare la funzione CreateFileMappingNuma con PAGE_EXECUTE_READWRITE o PAGE_EXECUTE_READ e quindi chiamare la funzione MapViewOfFileExNuma con FILE_MAP_EXECUTE | FILE_MAP_WRITEo | FILE_MAP_EXECUTEFILE_MAP_READ.

In Windows Server 2012 questa funzione è supportata dalle tecnologie seguenti.

Tecnologia Supportato
Protocollo SMB (Server Message Block) 3.0
Failover trasparente SMB 3.0 (TFO)
SMB 3.0 con condivisioni file con scalabilità orizzontale (SO)
File system del volume condiviso del cluster (CsvFS)
File system resiliente (ReFS)

Requisiti

Requisito Valore
Client minimo supportato Windows Vista [solo app desktop]
Server minimo supportato Windows Server 2008 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione winbase.h (include Windows.h)
Libreria Kernel32.lib
DLL Kernel32.dll

Vedere anche

CreateFileMappingNuma

DuplicateHandle

Funzioni di mapping dei file

GetSystemInfo

MapViewOfFileEx

Supporto NUMA

OpenFileMapping

ReadFile

SYSTEM_INFO

UnmapViewOfFile

Virtualalloc

WriteFile