CreateFileMappingNumaW 関数 (memoryapi.h)

指定したファイルの名前付きまたは名前のないファイル マッピング オブジェクトを作成または開き、物理メモリの NUMA ノードを指定します。

構文

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

パラメーター

[in] hFile

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

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

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

[in, optional] lpFileMappingAttributes

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

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

[in] flProtect

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

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

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

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

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

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

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

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

Windows Vista: この値は、Windows Vista と SP1 の間は使用できません。

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
すべてのページのメモリまたはページング ファイルに物理ストレージを割り当てます。

これが既定の設定です。

SEC_IMAGE
0x1000000
実行可能イメージ ファイルとして指定されたファイルを設定します。

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 2012およびWindows 8前にはサポートされていません。

SEC_LARGE_PAGES
0x80000000
通常のファイルのデータをマッピングする場合ではなく、ページファイルからのイメージまたはバッキングのマッピング時に大きなページを使用できるようにします。 GetLargePageMinimum 関数によって報告される大きなページの最小サイズとして、ファイル マッピング オブジェクトの最大サイズを指定し、SeLockMemoryPrivilege 特権を有効にしてください。
SEC_NOCACHE
0x10000000
すべてのページを非表示に設定します。

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

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

SEC_RESERVE
0x4000000
物理記憶域を割り当てずにすべてのページを予約します。

ページの予約範囲は、ページの範囲が解放されるまで、他の割り当て操作では使用できません。

予約ページは、 VirtualAllocExNuma 関数の後続の呼び出しで識別できます。 この属性は、 hFile パラメーターが INVALID_HANDLE_VALUE (つまり、システム ページング ファイルによってサポートされるファイル マッピング オブジェクト) の場合にのみ有効です。

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

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

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

[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" プレフィックスを付けることができます。 名前の残りの部分には、円記号 (\) を除く任意の文字を含めることができます。 グローバル名前空間でファイル マッピング オブジェクトを作成するには、 SeCreateGlobalPrivilege 特権が必要です。 詳細については、「 カーネル オブジェクトの名前空間」を参照してください。

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

[in] nndPreferred

物理メモリが存在する必要がある NUMA ノード。

意味
NUMA_NO_PREFERRED_NODE
0xffffffff
NUMA ノードは推奨されません。 これは、 CreateFileMapping 関数の呼び出しと同じです。

戻り値

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

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

関数が失敗した場合は、返される値は NULL です。 エラーの詳細情報を得るには、GetLastError 関数を呼び出します。

注釈

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

ファイル マッピング オブジェクトは、重複、継承、または名前で共有できます。 ページ ファイルによってサポートされるファイル マッピング オブジェクト内のページの初期コンテンツは 0 (ゼロ) です。

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

ファイルを増やすことができない場合、結果はファイル マッピング オブジェクトの作成に失敗し、 GetLastError 関数は ERROR_DISK_FULLを返します。

CreateFileMappingNuma 関数が返すハンドルは、新しいファイル マッピング オブジェクトへのフル アクセス権を持ち、ファイル マッピング オブジェクトへのハンドルを必要とする任意の関数で使用できます。 ファイル マッピング オブジェクトは、プロセスの作成、重複の処理、または名前で共有できます。 詳細については、 DuplicateHandle 関数と OpenFileMapping 関数に関するページを参照してください。

ファイル マッピング オブジェクトを作成すると、ファイルのビューをマッピングできますが、ビューはマップされません。 MapViewOfFileExNuma 関数は、ファイルのビューをプロセス アドレス空間にマップします。

1 つの重要な例外では、1 つのファイル マッピング オブジェクトから派生したファイル ビューは、特定の時点で一貫しているか同一です。 複数のプロセスに同じファイル マッピング オブジェクトのハンドルがある場合、ファイルのビューをマップすると、データの一貫したビューが表示されます。

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

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

ファイル マッピング オブジェクトを完全に閉じるには、 UnmapViewOfFile 関数を呼び出してファイル マッピング オブジェクトのマップされたビューをすべてマップ解除し、 CloseHandle 関数を呼び出してファイル マッピング オブジェクト ハンドルを閉じる必要があります。

これらの関数は、任意の順序で呼び出すことができます。 UnmapViewOfFile 関数の呼び出しは必要です。これは、ファイル マッピング オブジェクトのマップされたビューがオブジェクトに対する内部オープン ハンドルを保持し、開いているすべてのハンドルが閉じられるまでファイル マッピング オブジェクトが閉じないためです。

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

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

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

実行可能なアクセス許可を持つマッピングを行うには、アプリケーションで CreateFileMappingNuma 関数を PAGE_EXECUTE_READWRITE または PAGE_EXECUTE_READで呼び出し、 または FILE_MAP_EXECUTE | FILE_MAP_READを使用して MapViewOfFileExNuma 関数FILE_MAP_EXECUTE | FILE_MAP_WRITEを呼び出す必要があります。

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

テクノロジ サポートされています
サーバー メッセージ ブロック (SMB) 3.0 プロトコル はい
SMB 3.0 Transparent Failover (TFO) はい
スケールアウト ファイル共有 (SO) を使う SMB 3.0 はい
クラスターの共有ボリューム ファイル システム (CsvFS) はい
Resilient File System (ReFS) はい

必要条件

要件
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー memoryapi.h (Windows.h、Memoryapi.h を含む)
Library onecore.lib
[DLL] Kernel32.dll

関連項目

CloseHandle

CreateFileMapping

DuplicateHandle

ファイル マッピング関数

MapViewOfFileExNuma

NUMA サポート

OpenFileMapping

ReadFile

SECURITY_ATTRIBUTES

UnmapViewOfFile

VirtualAllocExNuma

WriteFile