次の方法で共有


CreateFileMappingA 関数 (winbase.h)

指定したファイルの名前付きまたは名前のないファイル マッピング オブジェクトを作成または開きます。

物理メモリの NUMA ノードを指定するには、「CreateFileMappingNumaを参照してください。

構文

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

パラメーター

[in] hFile

ファイル マッピング オブジェクトの作成元となるファイルへのハンドル。

ファイルは、flProtect パラメーターが指定する保護フラグと互換性のあるアクセス権で開く必要があります。 必須ではありませんが、マップする予定のファイルを排他的アクセス用に開くことをお勧めします。 詳細については、「ファイルのセキュリティとアクセス権の」を参照してください。

hFile が INVALID_HANDLE_VALUE場合、呼び出し元プロセスでは、dwMaximumSizeHigh 内のファイル マッピング オブジェクトのサイズを指定し、dwMaximumSizeLow パラメーターを する必要もあります。 このシナリオでは、CreateFileMapping 、ファイル システム内のファイルではなく、システム ページング ファイルによってサポートされる、指定したサイズのファイル マッピング オブジェクトを作成します。

[in, optional] lpFileMappingAttributes

返されたハンドルを子プロセスによって継承できるかどうかを決定する SECURITY_ATTRIBUTES 構造体へのポインター。 SECURITY_ATTRIBUTES 構造体の lpSecurityDescriptor メンバーは、新しいファイル マッピング オブジェクトのセキュリティ記述子を指定します。

lpFileMappingAttributes が NULL場合、ハンドルを継承できず、ファイル マッピング オブジェクトは既定のセキュリティ記述子を取得します。 ファイル マッピング オブジェクトの既定のセキュリティ記述子のアクセス制御リスト (ACL) は、作成者のプライマリ トークンまたは偽装トークンから取得されます。 詳細については、「ファイル マッピングのセキュリティとアクセス権の」を参照してください。

[in] flProtect

ファイル マッピング オブジェクトのページ保護を指定します。 オブジェクトのすべてのマップされたビューは、この保護と互換性がある必要があります。

このパラメーターには、次のいずれかの値を指定できます。

価値 意味
PAGE_EXECUTE_READ
0x20
読み取り専用、書き込み時のコピー、または実行アクセスに対してビューをマップできるようにします。

hFile パラメーターで指定されたファイル ハンドルは、GENERIC_READGENERIC_EXECUTE アクセス権を使用して作成する必要があります。

Windows Server 2003 および Windows XP: この値は、Windows XP SP2 および Windows Server 2003 SP1 まで使用できません。

PAGE_EXECUTE_READWRITE
0x40
読み取り専用、書き込み時のコピー、読み取り/書き込み、または実行アクセスに対してビューをマップできるようにします。

hFile パラメーターで指定するファイル ハンドルは、GENERIC_READGENERIC_WRITE、および GENERIC_EXECUTE アクセス権を使用して作成する必要があります。

Windows Server 2003 および Windows XP: この値は、Windows XP SP2 および Windows Server 2003 SP1 まで使用できません。

PAGE_EXECUTE_WRITECOPY
0x80
読み取り専用、書き込み時のコピー、または実行アクセスに対してビューをマップできるようにします。 この値は、PAGE_EXECUTE_READと同じです。

hFile パラメーターが指定するファイル ハンドルは、GENERIC_READGENERIC_EXECUTE アクセス権を使用して作成する必要があります。

Windows Vista: この値は、Windows Vista SP1 がインストールされるまで使用できません。

Windows Server 2003 および Windows XP: この値はサポートされていません。

PAGE_READONLY
0x02
読み取り専用または書き込み時のコピー アクセス用にビューをマップできるようにします。 特定のリージョンに書き込もうとすると、アクセス違反が発生します。

hFile パラメーターが指定するファイル ハンドルは、GENERIC_READ アクセス権を使用して作成する必要があります。

PAGE_READWRITE
0x04
読み取り専用、書き込み時のコピー、または読み取り/書き込みアクセスに対してビューをマップできるようにします。

hFile パラメーターが指定するファイル ハンドルは、GENERIC_READGENERIC_WRITE アクセス権を使用して作成する必要があります。

PAGE_WRITECOPY
0x08
読み取り専用または書き込み時のコピー アクセス用にビューをマップできるようにします。 この値は、PAGE_READONLYと同じです。

hFile パラメーターが指定するファイル ハンドルは、GENERIC_READ アクセス権を使用して作成する必要があります。

 

アプリケーションは、ファイル マッピング オブジェクトに対して、上記のページ保護値のいずれかと組み合わせることにより、次の属性の 1 つ以上を指定できます。

価値 意味
SEC_COMMIT
0x8000000
ファイル マッピング オブジェクトがオペレーティング システムページング ファイル (hfile パラメーターが INVALID_HANDLE_VALUE) によってサポートされている場合は、ファイルのビューがプロセス アドレス空間にマップされるときに、ページの範囲全体が予約ではなくコミットされることを指定します。 システムには、マッピング全体を保持するのに十分なコミット可能なページが必要です。 それ以外の場合、CreateFileMapping 失敗します。

この属性は、実行可能イメージ ファイルまたはデータ ファイルによってサポートされるファイル マッピング オブジェクトには影響しません (hfile パラメーターはファイルへのハンドルです)。

SEC_COMMITSEC_RESERVEと組み合わせることはできません。

属性が指定されていない場合は、SEC_COMMIT が想定されます。

SEC_IMAGE
0x1000000
hFile パラメーターが指定するファイルが実行可能イメージ ファイルであることを指定します。

SEC_IMAGE 属性は、PAGE_READONLYなどのページ保護値と組み合わせる必要があります。 ただし、このページ保護値は、実行可能イメージ ファイルのビューには影響しません。 実行可能イメージ ファイルのビューのページ保護は、実行可能ファイル自体によって決まります。

SEC_IMAGEで有効なその他の属性はありません。

SEC_IMAGE_NO_EXECUTE
0x11000000
hFile パラメーターが指定するファイルが実行されない実行可能イメージ ファイルであり、読み込まれたイメージ ファイルで強制整合性チェックが実行されないことを指定します。 さらに、SEC_IMAGE_NO_EXECUTE 属性で作成されたファイル マッピング オブジェクトのビューをマッピングしても、PsSetLoadImageNotifyRoutine カーネル API を使用して登録されたドライバー コールバックは呼び出されません。

SEC_IMAGE_NO_EXECUTE 属性は、PAGE_READONLY ページ保護の値と組み合わせる必要があります。 SEC_IMAGE_NO_EXECUTEで有効なその他の属性はありません。

Windows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: この値は、Windows Server 2012 および Windows 8 より前はサポートされていません。

SEC_LARGE_PAGES
0x80000000
オペレーティング システムのページング ファイルによってサポートされるファイル マッピング オブジェクトに大きなページを使用できるようにします (hfile パラメーター INVALID_HANDLE_VALUE)。 この属性は、実行可能イメージ ファイルまたはデータ ファイルによってサポートされるファイル マッピング オブジェクトではサポートされていません (hFile パラメーターは、実行可能イメージまたはデータ ファイルへのハンドルです)。

ファイル マッピング オブジェクトの最大サイズは、GetLargePageMinimum 関数によって返される大きなページの最小サイズの倍数である必要があります。 そうでない場合は、CreateFileMapping 失敗します。 SEC_LARGE_PAGESを使用して作成されたファイル マッピング オブジェクトのビューをマッピングする場合、ベース アドレスとビュー サイズも、最小サイズの大きいページ サイズの倍数である必要があります。

SEC_LARGE_PAGES 呼び出し元のトークンで有効にするには、SeLockMemoryPrivilege 特権が必要です。

SEC_LARGE_PAGES を指定する場合は、SEC_COMMIT も指定する必要があります。

Windows Server 2003: この値は、Windows Server 2003 SP1 までサポートされていません。

Windows XP: この値はサポートされていません。

SEC_NOCACHE
0x10000000
すべてのページをキャッシュ不可に設定します。

アプリケーションでは、デバイスに明示的に必要な場合を除き、この属性を使用しないでください。 SEC_NOCACHE にマップされたメモリでインターロックされた関数を使用すると、EXCEPTION_ILLEGAL_INSTRUCTION 例外が発生する可能性があります。

SEC_NOCACHE には、SEC_RESERVE または SEC_COMMIT 属性を設定する必要があります。

SEC_RESERVE
0x4000000
ファイル マッピング オブジェクトがオペレーティング システムページング ファイル (hfile パラメーターが INVALID_HANDLE_VALUE) によってサポートされている場合は、ファイルのビューがプロセス アドレス空間にマップされるときに、ページの範囲全体がコミットされるのではなく、後で使用するために予約されることを指定します。

予約済みページは、VirtualAlloc 関数の後続の呼び出しでコミットできます。 ページがコミットされた後は、VirtualFree 関数を使用してページを解放したり、コミットしたりすることはできません。

この属性は、実行可能イメージ ファイルまたはデータ ファイルによってサポートされるファイル マッピング オブジェクトには影響しません (hfile パラメーターはファイルへのハンドルです)。

SEC_RESERVESEC_COMMITと組み合わせることはできません。

SEC_WRITECOMBINE
0x40000000
すべてのページを書き込み結合に設定します。

アプリケーションでは、デバイスに明示的に必要な場合を除き、この属性を使用しないでください。 SEC_WRITECOMBINE にマップされたメモリでインターロックされた関数を使用すると、EXCEPTION_ILLEGAL_INSTRUCTION 例外が発生する可能性があります。

SEC_WRITECOMBINE には、SEC_RESERVE または SEC_COMMIT 属性を設定する必要があります。

Windows Server 2003 および Windows XP: このフラグは、Windows Vista までサポートされていません。

[in] dwMaximumSizeHigh

ファイル マッピング オブジェクトの最大サイズの高次 DWORD

[in] dwMaximumSizeLow

ファイル マッピング オブジェクトの最大サイズの下位 DWORD

このパラメーターと dwMaximumSizeHigh が 0 (ゼロ) の場合、ファイル マッピング オブジェクトの最大サイズは、hFile が識別するファイルの現在のサイズ 等しくなります。

長さが 0 (ゼロ) のファイルをマップしようとすると、エラー コード ERROR_FILE_INVALIDで失敗します。 アプリケーションでは、長さが 0 (ゼロ) のファイルをテストし、それらのファイルを拒否する必要があります。

[in, optional] lpName

ファイル マッピング オブジェクトの名前。

このパラメーターが既存のマッピング オブジェクトの名前と一致する場合、関数は flProtect が指定する保護 オブジェクトへのアクセスを要求します。

このパラメーターが NULL場合、ファイル マッピング オブジェクトは名前なしで作成されます。

lpName が既存のイベント、セマフォ、ミューテックス、待機可能タイマー、またはジョブ オブジェクトの名前と一致する場合、関数は失敗し、GetLastError 関数は ERROR_INVALID_HANDLEを返します。 これは、これらのオブジェクトが同じ名前空間を共有しているために発生します。

名前には、グローバル名前空間またはセッション名前空間にオブジェクトを明示的に作成するための "Global" または "Local" プレフィックスを付けることができます。 名前の残りの部分には、円記号 (\) を除く任意の文字を含めることができます。 セッション 0 以外のセッションからグローバル名前空間にファイル マッピング オブジェクトを作成するには、SeCreateGlobalPrivilege 特権が必要です。 詳細については、「カーネル オブジェクト名前空間を参照してください。

高速ユーザー切り替えは、ターミナル サービス セッションを使用して実装されます。 ログオンする最初のユーザーはセッション 0 (ゼロ) を使用し、次にログオンするユーザーはセッション 1 (1) を使用します。 カーネル オブジェクト名は、アプリケーションが複数のユーザーをサポートできるように、ターミナル サービスに関して概説されているガイドラインに従う必要があります。

戻り値

関数が成功した場合、戻り値は新しく作成されたファイル マッピング オブジェクトへのハンドルです。

関数呼び出しの前にオブジェクトが存在する場合、関数は (指定したサイズではなく、現在のサイズを持つ) 既存のオブジェクトにハンドルを返し、GetLastError ERROR_ALREADY_EXISTSを返します。

関数が失敗した場合、戻り値は NULL。 拡張エラー情報を取得するには、GetLastError呼び出します。

備考

ファイル マッピング オブジェクトが作成された後、ファイルのサイズがファイル マッピング オブジェクトのサイズを超えないようにする必要があります。存在する場合は、すべてのファイル コンテンツを共有できるわけではありません。

アプリケーションで、ディスク上の実際の名前付きファイルのサイズよりも大きいファイル マッピング オブジェクトのサイズを指定し、ページ保護で書き込みアクセスが許可されている場合 (つまり、flProtect パラメーターで PAGE_READWRITE または PAGE_EXECUTE_READWRITEを指定した場合)、ディスク上のファイルは、ファイル マッピング オブジェクトの指定されたサイズに合わせて増やされます。 ファイルが拡張されている場合、ファイルの古い終わりとファイルの新しい終わりの間のファイルの内容がゼロになることは保証されません。動作はファイル システムによって定義されます。 ディスク上のファイルを増やすことができない場合は、CreateFileMapping が失敗し、GetLastError ERROR_DISK_FULLを返します。

オペレーティング システムのページング ファイルによってサポートされるファイル マッピング オブジェクト内のページの初期コンテンツは 0 (ゼロ) です。

CreateFileMapping が返 ハンドルは、新しいファイル マッピング オブジェクトへのフル アクセス権を持ち、ファイル マッピング オブジェクトへのハンドルを必要とする任意の関数で使用できます。

複数のプロセスで同じファイルのビューを共有するには、1 つの共有ファイル マッピング オブジェクトを使用するか、同じファイルでバックアップされた個別のファイル マッピング オブジェクトを作成します。 1 つのファイル マッピング オブジェクトは、プロセスの作成時にハンドルを継承したり、ハンドルを複製したり、名前でファイル マッピング オブジェクトを開いたりすることで、複数のプロセスで共有できます。 詳細については、CreateProcess、DuplicateHandle 、および OpenFileMapping 関数 参照してください。

ファイル マッピング オブジェクトを作成しても、実際にはビューはプロセス アドレス空間にマップされません。 MapViewOfFile および mapViewOfFileEx 関数 は、ファイルのビューをプロセス アドレス空間にマップします。

1 つの重要な例外では、同じファイルによってサポートされるファイル マッピング オブジェクトから派生したファイル ビューは、特定の時点で一貫性または同一になります。 一貫性は、プロセス内のビューと、異なるプロセスによってマップされるビューに対して保証されます。

例外はリモート ファイルに関連しています。 CreateFileMapping リモート ファイルで動作しますが、一貫性を保つことはありません。 たとえば、2 台のコンピューターが両方ともファイルを書き込み可能としてマップし、両方とも同じページを変更した場合、各コンピューターにはページへの独自の書き込みのみが表示されます。 ディスク上のデータが更新されると、マージされません。

入出力 (I/O) 関数 (ReadFile および writeFile) を使用してアクセスされるマップされたファイルとファイルは、必ずしも一貫性があるとは限りません。

ファイル マッピング オブジェクトのマップされたビューは、オブジェクトへの内部参照を保持し、ファイル マッピング オブジェクトは、そのオブジェクトへのすべての参照が解放されるまで閉じません。 したがって、ファイル マッピング オブジェクトを完全に閉じるには、UnmapViewOfFile を呼び出してファイル マッピング オブジェクトのすべてのマップされたビュー マップ解除し、CloseHandleを呼び出してファイル マッピング オブジェクト ハンドル 閉じる必要があります。 これらの関数は、任意の順序で呼び出すことができます。

マップされたビューを使用してファイルを変更する場合、最後の変更タイムスタンプが自動的に更新されない場合があります。 必要に応じて、呼び出し元 SetFileTime を使用してタイムスタンプを設定する必要があります。

セッション 0 以外のセッションからグローバル名前空間にファイル マッピング オブジェクトを作成するには、SeCreateGlobalPrivilege 特権が必要です。 この特権チェックは、ファイル マッピング オブジェクトの作成に限定され、既存のオブジェクトを開く場合には適用されないことに注意してください。 たとえば、サービスまたはシステムがグローバル名前空間にファイル マッピング オブジェクトを作成する場合、呼び出し元が必要なアクセス権を持っていれば、任意のセッションで実行されているプロセスは、そのファイル マッピング オブジェクトにアクセスできます。

Windows XP: 前の段落で説明した要件は、Windows Server 2003 と Windows XP SP2 で導入されました

構造化例外処理を使用して、ファイル ビューへの書き込みまたはファイル ビューからの読み取りを行うコードを保護します。 詳細については、「ファイル ビューからの読み取りと書き込みの を参照してください。

実行可能なアクセス許可を持つマッピングを行うには、アプリケーションで PAGE_EXECUTE_READWRITE または PAGE_EXECUTE_READCreateFileMapping を呼び出し、 または で MapViewOfFile 呼び出す必要があります。

Windows Server 2012 では、この関数は次のテクノロジでサポートされています。

テクノロジー サポート
サーバー メッセージ ブロック (SMB) 3.0 プロトコル はい
SMB 3.0 透過的フェールオーバー (TFO) はい
SMB 3.0 とスケールアウト ファイル共有 (SO) はい
クラスター共有ボリューム ファイル システム (CsvFS) はい
回復性のあるファイル システム (ReFS) はい
 

例については、「名前付き共有メモリ の作成」または「大きなページを使用したファイル マッピングの作成」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows XP [デスクトップ アプリのみ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリのみ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー winbase.h (Windows.h、Memoryapi.h を含む)
ライブラリ Kernel32.lib
DLL Kernel32.dll

関連項目

CloseHandle の

CreateFileMappingNuma の

ファイル マッピング オブジェクト の作成

DuplicateHandle の

ファイル マッピング関数

MapViewOfFile

MapViewOfFileEx の

メモリ管理機能の

OpenFileMapping

ReadFile の

SECURITY_ATTRIBUTES

unmapViewOfFile の

VirtualAlloc の

WriteFile の