Funzione CreateFileMappingFromApp (memoryapi.h)
Crea o apre un oggetto di mapping di file denominato o senza nome per un file specificato da un'app di Windows Store.
Sintassi
HANDLE CreateFileMappingFromApp(
[in] HANDLE hFile,
[in, optional] PSECURITY_ATTRIBUTES SecurityAttributes,
[in] ULONG PageProtection,
[in] ULONG64 MaximumSize,
[in, optional] PCWSTR Name
);
Parametri
[in] hFile
Handle del file da cui creare un oggetto di mapping di file.
Il file deve essere aperto con diritti di accesso compatibili con i flag di protezione specificati dal parametro flProtect
Se hFile è INVALID_HANDLE_VALUE, il processo chiamante deve inoltre specificare una dimensione per l'oggetto mapping di file nei parametri dwMaximumSizeHighHigh e dwMaximumSizeLow. In questo scenario, CreateFileMappingFromApp crea un oggetto di mapping di file di una dimensione specificata supportata dal file di paging di sistema anziché da un file nel file system.
[in, optional] SecurityAttributes
Puntatore a una struttura SECURITY_ATTRIBUTES che determina se un handle restituito può essere ereditato dai processi figlio. Il lpSecurityDescriptor membro della struttura SECURITY_ATTRIBUTES specifica un descrittore di sicurezza per un nuovo oggetto di mapping di file.
Se SecurityAttributes è NULL, l'handle non può essere ereditato e l'oggetto di mapping dei file ottiene un descrittore di sicurezza predefinito. Gli elenchi di controllo di accesso (ACL) nel descrittore di sicurezza predefinito per un oggetto di mapping dei file provengono dal token primario o di rappresentazione dell'autore. Per altre informazioni, vedere File Mapping Security and Access Rights.
[in] PageProtection
Specifica la protezione della pagina dell'oggetto di mapping file. Tutte le viste mappate dell'oggetto devono essere compatibili con questa protezione.
Questo parametro può essere uno dei valori seguenti.
Un'applicazione può specificare uno o più degli attributi seguenti per l'oggetto di mapping dei file combinandoli con uno dei valori di protezione della pagina precedenti.
Valore | Significato |
---|---|
|
Se l'oggetto di mapping dei file è supportato dal file di paging del sistema operativo (il parametro hfile è INVALID_HANDLE_VALUE), specifica che quando viene eseguito il mapping di una visualizzazione del file in uno spazio indirizzi del processo, viene eseguito il commit dell'intero intervallo di pagine anziché riservato. Il sistema deve disporre di pagine commit sufficienti per contenere l'intero mapping. In caso contrario, l' CreateFileMappingFromApp ha esito negativo.
Questo attributo non ha alcun effetto per gli oggetti di mapping di file supportati da file di immagine eseguibili o file di dati (il parametro hfile SEC_COMMIT non può essere combinato con SEC_RESERVE. Se non viene specificato alcun attributo, si presuppone SEC_COMMIT. |
|
Specifica che il file specificato dal parametro hFile è un file di immagine eseguibile che non verrà eseguito e che il file di immagine caricato non avrà alcun controllo di integrità forzato.
Inoltre, il mapping di una visualizzazione di un oggetto di mapping di file creato con l'attributo SEC_IMAGE_NO_EXECUTE non richiamerà i callback del driver registrati usando l'API del kernel PsSetLoadImageNotifyRou tine.
L'attributo SEC_IMAGE_NO_EXECUTE deve essere combinato con il valore di protezione della pagina PAGE_READONLY. Nessun altro attributo è valido con SEC_IMAGE_NO_EXECUTE. |
|
Consente l'uso di pagine di grandi dimensioni per gli oggetti di mapping di file supportati dal file di paging del sistema operativo (il parametro hfile Le dimensioni massime dell'oggetto di mapping file devono essere multiple delle dimensioni minime di una pagina di grandi dimensioni restituite dalla funzione GetLargePageMinimum. In caso contrario, l' CreateFileMappingFromApp ha esito negativo. Quando si esegue il mapping di una visualizzazione di un oggetto di mapping di file creato con SEC_LARGE_PAGES, anche l'indirizzo di base e le dimensioni della vista devono essere multipli delle dimensioni minime della pagina. Se si specifica SEC_LARGE_PAGES, è necessario specificare anche SEC_COMMIT. |
|
Imposta tutte le pagine in modo che non siano memorizzabili nella cache.
Le applicazioni non devono usare questo attributo tranne quando sono esplicitamente necessarie per un dispositivo. L'uso delle funzioni interlock con memoria mappata a SEC_NOCACHE può comportare un'eccezione EXCEPTION_ILLEGAL_INSTRUCTION. SEC_NOCACHE richiede che sia impostato l'attributo SEC_RESERVE o SEC_COMMIT. |
|
Se l'oggetto di mapping dei file è supportato dal file di paging del sistema operativo (il parametro hfile è INVALID_HANDLE_VALUE), specifica che quando viene eseguito il mapping di una visualizzazione del file in uno spazio indirizzi del processo, l'intero intervallo di pagine viene riservato per un uso successivo da parte del processo anziché del commit.
È possibile eseguire il commit delle pagine riservate nelle chiamate successive alla funzione VirtualAlloc Questo attributo non ha alcun effetto per gli oggetti di mapping di file supportati da file di immagine eseguibili o file di dati (il parametro hfile SEC_RESERVE non può essere combinato con SEC_COMMIT. |
|
Imposta tutte le pagine da combinare in scrittura.
Le applicazioni non devono usare questo attributo tranne quando sono esplicitamente necessarie per un dispositivo. L'uso delle funzioni interlocked con memoria mappata a SEC_WRITECOMBINE può comportare un'eccezione EXCEPTION_ILLEGAL_INSTRUCTION. SEC_WRITECOMBINE deve essere impostato l'attributo SEC_RESERVE o SEC_COMMIT. |
[in] MaximumSize
Dimensione massima dell'oggetto di mapping del file.
Un tentativo di eseguire il mapping di un file con una lunghezza pari a 0 (zero) ha esito negativo con un codice di errore di ERROR_FILE_INVALID. Le applicazioni devono verificare la disponibilità di file con una lunghezza pari a 0 (zero) e rifiutare tali file.
[in, optional] Name
Nome dell'oggetto di mapping del file.
Se questo parametro corrisponde al nome di un oggetto di mapping esistente, la funzione richiede l'accesso all'oggetto con la protezione specificata flProtect.
Se questo parametro è NULL, l'oggetto di mapping file viene creato senza un nome.
Se lpName corrisponde al nome di un evento esistente, semaforo, mutex, timer in attesa o oggetto processo, la funzione ha esito negativo e la funzione GetLastError restituisce ERROR_INVALID_HANDLE. Ciò si verifica perché questi oggetti condividono lo stesso spazio dei nomi.
Il nome può avere un prefisso "Global" o "Local" per creare in modo esplicito l'oggetto nello spazio dei nomi globale o sessione. Il resto del nome può contenere qualsiasi carattere, ad eccezione del carattere barra rovesciata (\). La creazione di un oggetto di mapping di file nello spazio dei nomi globale da una sessione diversa da session zero richiede il privilegio SeCreateGlobalPrivilege. Per altre informazioni, vedere spazi dei nomi dell'oggetto kernel .
Il passaggio rapido degli utenti viene implementato tramite sessioni di Servizi terminal. Il primo utente a eseguire l'accesso usa la sessione 0 (zero), l'utente successivo per accedere usa la sessione 1 (uno) e così via. I nomi degli oggetti del kernel devono seguire le linee guida descritte per Servizi terminal in modo che le applicazioni possano supportare più utenti.
Valore restituito
Se la funzione ha esito positivo, il valore restituito è un handle per l'oggetto di mapping di file appena creato.
Se l'oggetto esiste prima della chiamata di funzione, la funzione restituisce un handle all'oggetto esistente (con le dimensioni correnti, non le dimensioni specificate) e GetLastError restituisce ERROR_ALREADY_EXISTS.
Se la funzione ha esito negativo, il valore restituito è NULL. Per ottenere informazioni estese sull'errore, chiamare GetLastError.
Osservazioni
Dopo aver creato un oggetto di mapping dei file, le dimensioni del file non devono superare le dimensioni dell'oggetto di mapping dei file; in caso contrario, non tutti i contenuti del file sono disponibili per la condivisione.
Se un'applicazione specifica una dimensione per l'oggetto di mapping di file maggiore delle dimensioni del file denominato effettivo su disco e se la protezione della pagina consente l'accesso in scrittura , ovvero il parametro flProtect specifica PAGE_READWRITE), il file sul disco viene aumentato in modo da corrispondere alle dimensioni specificate dell'oggetto di mapping del file. Se il file viene esteso, il contenuto del file tra la fine precedente del file e la nuova fine del file non è garantito che sia zero; il comportamento è definito dal file system. Se il file su disco non può essere aumentato, CreateFileMappingFromApp ha esito negativo e GetLastError restituisce ERROR_DISK_FULL.
Il contenuto iniziale delle pagine in un oggetto di mapping di file supportato dal file di paging del sistema operativo è 0 (zero).
L'handle che CreateFileMappingFromApp restituisce ha accesso completo a un nuovo oggetto di mapping di file e può essere usato con qualsiasi funzione che richiede un handle per un oggetto di mapping di file.
Più processi possono condividere una visualizzazione dello stesso file usando un singolo oggetto di mapping di file condiviso o creando oggetti di mapping di file separati supportati dallo stesso file. Un singolo oggetto di mapping di file può essere condiviso da più processi tramite l'ereditarietà dell'handle durante la creazione del processo, la duplicazione dell'handle o l'apertura dell'oggetto di mapping del file in base al nome. Per altre informazioni, vedere le funzioni CreateProcess, DuplicateHandle e OpenFileMapping.
La creazione di un oggetto di mapping di file non esegue effettivamente il mapping della visualizzazione in uno spazio indirizzi del processo. La funzione MapViewOfFileEx mappare una visualizzazione di un file in uno spazio indirizzi del processo.
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 CreateFileMappingFromApp funziona con i file remoti, non li mantiene coerenti. Ad esempio, se due computer eseguono il mapping di un file come scrivibili e entrambi modificano la stessa pagina, ogni computer visualizza solo le proprie scritture nella pagina. Quando i dati vengono aggiornati sul disco, non vengono uniti.
Un file mappato e un file a cui si accede usando le funzioni di input e output (I/O) (ReadFile e WriteFile) non sono necessariamente coerenti.
Le visualizzazioni mappate di un oggetto di mapping di file mantengono riferimenti interni all'oggetto e un oggetto di mapping di file non si chiude finché non vengono rilasciati tutti i riferimenti. Pertanto, per chiudere completamente un oggetto di mapping di file, un'applicazione deve rimuovere il mapping di tutte le viste mappate dell'oggetto di mapping file chiamando UnmapViewOfFile e chiudere l'handle dell'oggetto di mapping file chiamando CloseHandle. Queste funzioni possono essere chiamate in qualsiasi ordine.
Quando si modifica un file tramite una visualizzazione mappata, il timestamp dell'ultima modifica potrebbe non essere aggiornato automaticamente. Se necessario, il chiamante deve usare SetFileTime per impostare il timestamp.
Usare la gestione strutturata delle eccezioni per proteggere qualsiasi codice che scrive o legge da una visualizzazione file. Per altre informazioni, vedere Lettura e scrittura da una visualizzazione file.
È possibile richiedere correttamente la protezione eseguibile solo se l'app ha la funzionalità di codeGeneration
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Windows 8 [app desktop | App UWP] |
server minimo supportato | Windows Server 2012 [app desktop | App UWP] |
piattaforma di destinazione | Finestre |
intestazione |
memoryapi.h (include Windows.h) |
libreria |
onecore.lib |
dll | Kernel32.dll |
Vedere anche
Creazione di un oggetto mapping file
Funzioni di mapping dei file
funzioni di gestione della memoria