CreateFileMappingW-Funktion (memoryapi.h)

Erstellt oder öffnet ein benanntes oder unbenannte Dateizuordnungsobjekt für eine angegebene Datei.

Informationen zum Angeben des NUMA-Knotens für den physischen Arbeitsspeicher finden Sie unter CreateFileMappingNuma.

Syntax

HANDLE CreateFileMappingW(
  [in]           HANDLE                hFile,
  [in, optional] LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  [in]           DWORD                 flProtect,
  [in]           DWORD                 dwMaximumSizeHigh,
  [in]           DWORD                 dwMaximumSizeLow,
  [in, optional] LPCWSTR               lpName
);

Parameter

[in] hFile

Ein Handle für die Datei, aus der ein Dateizuordnungsobjekt erstellt werden soll.

Die Datei muss mit Zugriffsrechten geöffnet werden, die mit den Schutzflags kompatibel sind, die der flProtect-Parameter angibt. Es ist nicht erforderlich, aber es wird empfohlen, Dateien, die Sie zuordnen möchten, für den exklusiven Zugriff geöffnet zu werden. Weitere Informationen finden Sie unter Dateisicherheit und Zugriffsrechte.

Wenn hFileINVALID_HANDLE_VALUE ist, muss der aufrufende Prozess auch eine Größe für das Dateizuordnungsobjekt in den Parametern dwMaximumSizeHigh und dwMaximumSizeLow angeben. In diesem Szenario erstellt CreateFileMapping ein Dateizuordnungsobjekt mit einer angegebenen Größe, das durch die System pagingdatei und nicht durch eine Datei im Dateisystem unterstützt wird.

[in, optional] lpFileMappingAttributes

Ein Zeiger auf eine SECURITY_ATTRIBUTES-Struktur , die bestimmt, ob ein zurückgegebenes Handle von untergeordneten Prozessen geerbt werden kann. Das lpSecurityDescriptor-Element der SECURITY_ATTRIBUTES-Struktur gibt einen Sicherheitsdeskriptor für ein neues Dateizuordnungsobjekt an.

Wenn lpAttributesNULL ist, kann das Handle nicht geerbt werden, und das Dateizuordnungsobjekt erhält eine Standardsicherheitsbeschreibung. Die Zugriffssteuerungslisten (Access Control Lists, ACL) im Standardsicherheitsdeskriptor für ein Dateizuordnungsobjekt stammen aus dem primären Token oder identitätswechsel des Erstellers. Weitere Informationen finden Sie unter Sicherheit und Zugriffsrechte für die Dateizuordnung.

[in] flProtect

Gibt den Seitenschutz des Dateizuordnungsobjekts an. Alle zugeordneten Ansichten des Objekts müssen mit diesem Schutz kompatibel sein.

Dieser Parameter kann einen der folgenden Werte annehmen.

Wert Bedeutung
PAGE_EXECUTE_READ
0x20
Ermöglicht das Zuordnen von Ansichten für schreibgeschützten Zugriff, Kopieren beim Schreiben oder Ausführen des Zugriffs.

Das durch den hFile-Parameter angegebene Dateihandle muss mit dem GENERIC_READ und GENERIC_EXECUTE Zugriffsrechten erstellt werden.

Windows Server 2003 und Windows XP: Dieser Wert ist erst unter Windows XP mit SP2 und Windows Server 2003 mit SP1 verfügbar.

PAGE_EXECUTE_READWRITE
0x40
Ermöglicht die Zuordnung von Ansichten für schreibgeschützt, kopieren/schreiben, Lesen/Schreiben oder Ausführen des Zugriffs.

Das Dateihandle, das der hFile-Parameter angibt, muss mit den Zugriffsrechten GENERIC_READ, GENERIC_WRITE und GENERIC_EXECUTE erstellt werden.

Windows Server 2003 und Windows XP: Dieser Wert ist erst unter Windows XP mit SP2 und Windows Server 2003 mit SP1 verfügbar.

PAGE_EXECUTE_WRITECOPY
0x80
Ermöglicht das Zuordnen von Ansichten für schreibgeschützten Zugriff, Kopieren beim Schreiben oder Ausführen des Zugriffs. Dieser Wert entspricht PAGE_EXECUTE_READ.

Das Dateihandle, das der hFile-Parameter angibt, muss mit dem GENERIC_READ und GENERIC_EXECUTE Zugriffsrechten erstellt werden.

Windows Vista: Dieser Wert ist erst unter Windows Vista mit SP1 verfügbar.

Windows Server 2003 und Windows XP: Dieser Wert wird nicht unterstützt.

PAGE_READONLY
0x02
Ermöglicht das Zuordnen von Ansichten für den schreibgeschützten oder kopiergeschützten Zugriff. Ein Versuch, in eine bestimmte Region zu schreiben, führt zu einer Zugriffsverletzung.

Das Dateihandle, das der hFile-Parameter angibt, muss mit dem zugriffsrecht GENERIC_READ erstellt werden.

PAGE_READWRITE
0x04
Ermöglicht die Zuordnung von Ansichten für schreibgeschützten Zugriff, Kopierzugriff oder Lese-/Schreibzugriff.

Das Dateihandle, das der hFile-Parameter angibt, muss mit dem GENERIC_READ und GENERIC_WRITE Zugriffsrechten erstellt werden.

PAGE_WRITECOPY
0x08
Ermöglicht das Zuordnen von Ansichten für den schreibgeschützten oder kopiergeschützten Zugriff. Dieser Wert entspricht PAGE_READONLY.

Das Dateihandle, das der hFile-Parameter angibt, muss mit dem zugriffsrecht GENERIC_READ erstellt werden.

 

Eine Anwendung kann mindestens eins der folgenden Attribute für das Dateizuordnungsobjekt angeben, indem sie sie mit einem der vorherigen Seitenschutzwerte kombiniert.

Wert Bedeutung
SEC_COMMIT
0x8000000
Wenn das Dateizuordnungsobjekt durch die Auslagerungsdatei des Betriebssystems unterstützt wird (der hfile-Parameter ist INVALID_HANDLE_VALUE), gibt an, dass der gesamte Seitenbereich committet und nicht reserviert wird, wenn eine Ansicht der Datei einem Prozessadressraum zugeordnet wird. Das System muss über genügend commitfähige Seiten verfügen, um die gesamte Zuordnung zu enthalten. Andernfalls schlägt CreateFileMapping fehl.

Dieses Attribut hat keine Auswirkungen auf Dateizuordnungsobjekte, die durch ausführbare Bilddateien oder Datendateien gesichert werden (der hfile-Parameter ist ein Handle für eine Datei).

SEC_COMMIT können nicht mit SEC_RESERVE kombiniert werden.

Wenn kein Attribut angegeben wird, wird SEC_COMMIT angenommen. SEC_COMMIT muss jedoch explizit angegeben werden, wenn sie mit einem anderen SEC_-Attribut kombiniert wird, für das dies erforderlich ist.

SEC_IMAGE
0x1000000
Gibt an, dass die Datei, die der hFile-Parameter angibt, eine ausführbare Imagedatei ist.

Das attribut SEC_IMAGE muss mit einem Seitenschutzwert wie PAGE_READONLY kombiniert werden. Dieser Seitenschutzwert hat jedoch keine Auswirkungen auf die Ansichten der ausführbaren Imagedatei. Der Seitenschutz für Ansichten einer ausführbaren Imagedatei wird durch die ausführbare Datei selbst bestimmt.

Mit SEC_IMAGE sind keine anderen Attribute gültig.

SEC_IMAGE_NO_EXECUTE
0x11000000
Gibt an, dass die Datei, die der hFile-Parameter angibt, eine ausführbare Imagedatei ist, die nicht ausgeführt wird und die geladene Imagedatei keine erzwungenen Integritätsprüfungen ausgeführt wird. Darüber hinaus ruft das Zuordnen einer Ansicht eines Dateizuordnungsobjekts, das mit dem attribut SEC_IMAGE_NO_EXECUTE erstellt wurde, keine Treiberrückrufe auf, die mit der Kernel-API PsSetLoadImageNotifyRoutine registriert wurden.

Das attribut SEC_IMAGE_NO_EXECUTE muss mit dem PAGE_READONLY seitenschutzwert kombiniert werden. Mit SEC_IMAGE_NO_EXECUTE sind keine anderen Attribute gültig.

Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: Dieser Wert wird vor Windows Server 2012 und Windows 8 nicht unterstützt.

SEC_LARGE_PAGES
0x80000000
Ermöglicht die Verwendung großer Seiten für Dateizuordnungsobjekte, die von der Auslagerungsdatei des Betriebssystems unterstützt werden (der hfile-Parameter ist INVALID_HANDLE_VALUE). Dieses Attribut wird nicht für Dateizuordnungsobjekte unterstützt, die von ausführbaren Bilddateien oder Datendateien unterstützt werden (der hFile-Parameter ist ein Handle für ein ausführbares Image oder eine ausführbare Datendatei).

Die maximale Größe des Dateizuordnungsobjekts muss ein Vielfaches der Mindestgröße einer großen Seite sein, die von der GetLargePageMinimum-Funktion zurückgegeben wird. Andernfalls schlägt CreateFileMapping fehl. Beim Zuordnen einer Ansicht eines mit SEC_LARGE_PAGES erstellten Dateizuordnungsobjekts müssen die Basisadresse und die Ansichtsgröße auch ein Vielfaches der minimalen großen Seitengröße sein.

SEC_LARGE_PAGES erfordert die Aktivierung des SeLockMemoryPrivilege-Rechtes im Token des Aufrufers.

Wenn SEC_LARGE_PAGES angegeben ist, muss auch SEC_COMMIT angegeben werden.

Windows Server 2003: Dieser Wert wird erst unter Windows Server 2003 mit SP1 unterstützt.

Windows XP: Dieser Wert wird nicht unterstützt.

SEC_NOCACHE
0x10000000
Legt fest, dass alle Seiten nicht zwischengespeichert werden können.

Anwendungen sollten dieses Attribut nur verwenden, wenn sie für ein Gerät explizit erforderlich sind. Die Verwendung der verriegelten Funktionen mit Speicher, der SEC_NOCACHE zugeordnet ist, kann zu einer EXCEPTION_ILLEGAL_INSTRUCTION Ausnahme führen.

SEC_NOCACHE muss entweder das SEC_RESERVE - oder SEC_COMMIT-Attribut festgelegt werden.

SEC_RESERVE
0x4000000
Wenn das Dateizuordnungsobjekt von der Auslagerungsdatei des Betriebssystems unterstützt wird (der hfile-Parameter ist INVALID_HANDLE_VALUE), gibt an, dass, wenn eine Ansicht der Datei einem Prozessadressraum zugeordnet wird, der gesamte Seitenbereich für die spätere Verwendung durch den Prozess reserviert ist, anstatt committet zu werden.

Reservierte Seiten können in nachfolgenden Aufrufen der VirtualAlloc-Funktion committet werden. Nachdem die Seiten committet wurden, können sie nicht mit der VirtualFree-Funktion freigegeben oder decommittediert werden.

Dieses Attribut hat keine Auswirkungen auf Dateizuordnungsobjekte, die von ausführbaren Bilddateien oder Datendateien unterstützt werden (der hfile-Parameter ist ein Handle für eine Datei).

SEC_RESERVE können nicht mit SEC_COMMIT kombiniert werden.

SEC_WRITECOMBINE
0x40000000
Legt fest, dass alle Seiten kombiniert werden sollen.

Anwendungen sollten dieses Attribut nur verwenden, wenn sie explizit für ein Gerät erforderlich sind. Die Verwendung der verriegelten Funktionen mit Speicher, der SEC_WRITECOMBINE zugeordnet ist, kann zu einer EXCEPTION_ILLEGAL_INSTRUCTION Ausnahme führen.

SEC_WRITECOMBINE muss entweder das SEC_RESERVE - oder SEC_COMMIT-Attribut festgelegt werden.

Windows Server 2003 und Windows XP: Dieses Flag wird erst unter Windows Vista unterstützt.

[in] dwMaximumSizeHigh

Die hohe DWORD-Reihenfolge der maximalen Größe des Dateizuordnungsobjekts.

[in] dwMaximumSizeLow

Das DWORD mit niedriger Reihenfolge der maximalen Größe des Dateizuordnungsobjekts.

Wenn dieser Parameter und dwMaximumSizeHigh 0 (null) sind, entspricht die maximale Größe des Dateizuordnungsobjekts der aktuellen Größe der Datei, die hFile identifiziert.

Beim Versuch, eine Datei mit der Länge 0 (null) zuzuordnen, tritt der Fehlercode ERROR_FILE_INVALID auf. Anwendungen sollten auf Dateien mit einer Länge von 0 (null) testen und diese Dateien ablehnen.

[in, optional] lpName

Der Name des Dateizuordnungsobjekts.

Wenn dieser Parameter mit dem Namen eines vorhandenen Zuordnungsobjekts übereinstimmt, fordert die Funktion den Zugriff auf das Objekt mit dem von flProtect angegebenen Schutz an.

Wenn dieser Parameter NULL ist, wird das Dateizuordnungsobjekt ohne Namen erstellt.

Wenn lpName mit dem Namen eines vorhandenen Ereignisses, Semaphors, Mutex, wartebaren Timers oder Auftragsobjekts übereinstimmt, schlägt die Funktion fehl, und die GetLastError-Funktion gibt ERROR_INVALID_HANDLE zurück. Dies liegt daran, dass diese Objekte denselben Namespace verwenden.

Der Name kann ein Präfix "Global" oder "Local" aufweisen, um das Objekt explizit im globalen Oder Sitzungsnamespace zu erstellen. Der Rest des Namens kann ein beliebiges Zeichen mit Ausnahme des umgekehrten Schrägstrichs (\) enthalten. Das Erstellen eines Dateizuordnungsobjekts im globalen Namespace aus einer anderen Sitzung als Sitzung 0 erfordert die SeCreateGlobalPrivilege-Berechtigung . Weitere Informationen finden Sie unter Kernelobjektnamespaces.

Ein schneller Benutzerwechsel wird mithilfe von Terminaldienstesitzungen implementiert. Der erste Benutzer, der sich anmeldet, verwendet Sitzung 0 (null), der nächste Benutzer, der sich anmeldet, sitzung 1 (1) usw. Kernelobjektnamen müssen den Richtlinien entsprechen, die für Terminaldienste beschrieben sind, damit Anwendungen mehrere Benutzer unterstützen können.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ein Handle für das neu erstellte Dateizuordnungsobjekt.

Wenn das Objekt vor dem Funktionsaufruf vorhanden ist, gibt die Funktion ein Handle an das vorhandene Objekt zurück (mit seiner aktuellen Größe, nicht der angegebenen Größe), und GetLastError gibt ERROR_ALREADY_EXISTS zurück.

Wenn bei der Funktion ein Fehler auftritt, ist der Rückgabewert NULL. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.

Hinweise

Nachdem ein Dateizuordnungsobjekt erstellt wurde, darf die Größe der Datei die Größe des Dateizuordnungsobjekts nicht überschreiten. wenn dies der Fall ist, sind nicht alle Dateiinhalte für die Freigabe verfügbar.

Wenn eine Anwendung eine Größe für das Dateizuordnungsobjekt angibt, die größer als die Größe der tatsächlich benannten Datei auf dem Datenträger ist, und wenn der Seitenschutz Schreibzugriff zulässt (d. h. der flProtect-Parameter gibt PAGE_READWRITE oder PAGE_EXECUTE_READWRITE an), wird die Datei auf dem Datenträger so erhöht, dass sie der angegebenen Größe des Dateizuordnungsobjekts entspricht. Wenn die Datei erweitert wird, ist nicht garantiert, dass der Inhalt der Datei zwischen dem alten Ende der Datei und dem neuen Ende der Datei null ist. das Verhalten vom Dateisystem definiert wird. Wenn die Datei auf dem Datenträger nicht erhöht werden kann, schlägt CreateFileMapping fehl, und GetLastError gibt ERROR_DISK_FULL zurück.

Der anfängliche Inhalt der Seiten in einem Dateizuordnungsobjekt, das von der Auslagerungsdatei des Betriebssystems unterstützt wird, ist 0 (null).

Das von CreateFileMapping zurückgegebene Handle hat Vollzugriff auf ein neues Dateizuordnungsobjekt und kann mit jeder Funktion verwendet werden, die ein Handle für ein Dateizuordnungsobjekt erfordert.

Mehrere Prozesse können eine Ansicht derselben Datei gemeinsam nutzen, indem sie entweder ein einzelnes freigegebenes Dateizuordnungsobjekt verwenden oder separate Dateizuordnungsobjekte erstellen, die von derselben Datei unterstützt werden. Ein einzelnes Dateizuordnungsobjekt kann von mehreren Prozessen freigegeben werden, indem das Handle bei der Prozesserstellung geerbt, das Handle dupliziert oder das Dateizuordnungsobjekt anhand des Namens geöffnet wird. Weitere Informationen finden Sie unter den Funktionen CreateProcess, DuplicateHandle und OpenFileMapping .

Beim Erstellen eines Dateizuordnungsobjekts wird die Ansicht nicht tatsächlich einem Prozessadressraum zugeordnet. Die Funktionen MapViewOfFile und MapViewOfFileEx ordnen eine Ansicht einer Datei einem Prozessadressraum zu.

Mit einer wichtigen Ausnahme sind Dateiansichten, die von einem Dateizuordnungsobjekt abgeleitet werden, das von derselben Datei unterstützt wird, kohärent oder zu einem bestimmten Zeitpunkt identisch. Die Kohärenz wird für Ansichten innerhalb eines Prozesses und für Sichten garantiert, die von verschiedenen Prozessen zugeordnet werden.

Die Ausnahme bezieht sich auf Remotedateien. Obwohl CreateFileMapping mit Remotedateien funktioniert, bleibt es nicht kohärent. Wenn z. B. zwei Computer eine Datei als schreibbar zuordnen und beide dieselbe Seite ändern, sieht jeder Computer nur seine eigenen Schreibvorgänge auf der Seite. Wenn die Daten auf dem Datenträger aktualisiert werden, werden sie nicht zusammengeführt.

Eine zugeordnete Datei und eine Datei, auf die über die Eingabe- und Ausgabefunktionen (E/A) (ReadFile und WriteFile) zugegriffen wird, sind nicht unbedingt kohärent.

Zugeordnete Ansichten eines Dateizuordnungsobjekts behalten interne Verweise auf das Objekt bei, und ein Dateizuordnungsobjekt wird erst geschlossen, wenn alle Verweise auf das Objekt freigegeben wurden. Um ein Dateizuordnungsobjekt vollständig zu schließen, muss eine Anwendung daher die Zuordnung aller zugeordneten Ansichten des Dateizuordnungsobjekts aufheben, indem UnmapViewOfFile aufgerufen und das Dateizuordnungsobjekthandle durch Aufrufen von CloseHandle geschlossen wird. Diese Funktionen können in beliebiger Reihenfolge aufgerufen werden.

Wenn Sie eine Datei über eine zugeordnete Ansicht ändern, wird der Zeitstempel der letzten Änderung möglicherweise nicht automatisch aktualisiert. Bei Bedarf sollte der Aufrufer SetFileTime verwenden, um den Zeitstempel festzulegen.

Das Erstellen eines Dateizuordnungsobjekts im globalen Namespace aus einer anderen Sitzung als Sitzung 0 erfordert die SeCreateGlobalPrivilege-Berechtigung . Beachten Sie, dass diese Berechtigungsprüfung auf die Erstellung von Dateizuordnungsobjekten beschränkt ist und nicht für das Öffnen vorhandener Objekte gilt. Wenn beispielsweise ein Dienst oder das System ein Dateizuordnungsobjekt im globalen Namespace erstellt, kann jeder Prozess, der in einer Beliebigen Sitzung ausgeführt wird, auf dieses Dateizuordnungsobjekt zugreifen, sofern der Aufrufer über die erforderlichen Zugriffsrechte verfügt.

Windows XP: Die im vorherigen Absatz beschriebene Anforderung wurde mit Windows Server 2003 und Windows XP mit SP2 eingeführt.

Verwenden Sie die strukturierte Ausnahmebehandlung, um code zu schützen, der in eine Dateiansicht schreibt oder aus dieser liest. Weitere Informationen finden Sie unter Lesen und Schreiben aus einer Dateiansicht.

Um über eine Zuordnung mit ausführbaren Berechtigungen zu verfügen, muss eine Anwendung CreateFileMapping entweder mit PAGE_EXECUTE_READWRITE oder PAGE_EXECUTE_READ aufrufen und dann MapViewOfFile mit FILE_MAP_EXECUTE | FILE_MAP_WRITE oder FILE_MAP_EXECUTE | FILE_MAP_READaufrufen.

In Windows Server 2012 wird diese Funktion von den folgenden Technologien unterstützt.

Technologie Unterstützt
SMB 3.0-Protokoll (Server Message Block) Ja
SMB 3.0 Transparent Failover (TFO) Ja
SMB 3.0 mit Dateifreigaben mit horizontaler Skalierung (SO) Ja
Dateisystem mit freigegebenen Clustervolumes (CsvFS) Ja
Robustes Dateisystem (Resilient File System, ReFS) Ja
 

Beispiele

Ein Beispiel finden Sie unter Erstellen von benanntem freigegebenem Speicher oder Erstellen einer Dateizuordnung mithilfe großer Seiten.

Anforderungen

   
Unterstützte Mindestversion (Client) Windows XP [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile memoryapi.h (einschließlich Windows.h, Memoryapi.h)
Bibliothek onecore.lib
DLL Kernel32.dll

Siehe auch

CloseHandle

CreateFileMappingNuma

Erstellen eines Dateizuordnungsobjekts

DuplicateHandle

Dateizuordnungsfunktionen

MapViewOfFile

MapViewOfFileEx

Speicherverwaltungsfunktionen

OpenFileMapping

ReadFile

SECURITY_ATTRIBUTES

UnmapViewOfFile

VirtualAlloc

WriteFile