CreateFileMappingNumaA 関数 (winbase.h)
指定したファイルの名前付きまたは名前のないファイル マッピング オブジェクトを作成または開き、物理メモリの NUMA ノードを指定します。
構文
HANDLE CreateFileMappingNumaA(
[in] HANDLE hFile,
[in, optional] LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
[in] DWORD flProtect,
[in] DWORD dwMaximumSizeHigh,
[in] DWORD dwMaximumSizeLow,
[in, optional] LPCSTR lpName,
[in] DWORD nndPreferred
);
パラメーター
[in] hFile
ファイル マッピング オブジェクトの作成元となるファイルへのハンドル。
ファイルは、 flProtect パラメーターが指定する保護フラグと互換性のあるアクセス権で開く必要があります。 必須ではありませんが、マップするファイルを排他的アクセス用に開くことをお勧めします。 詳細については、「 ファイル のセキュリティとアクセス権」を参照してください。
hFile がINVALID_HANDLE_VALUEの場合、呼び出し元のプロセスでは、dwMaximumSizeHigh パラメーターと dwMaximumSizeLow パラメーターのファイル マッピング オブジェクトのサイズも指定する必要があります。 このシナリオでは、 CreateFileMappingNuma は、ファイル システム内のファイルではなく、システム ページング ファイルによってサポートされる、指定されたサイズのファイル マッピング オブジェクトを作成します。
[in, optional] lpFileMappingAttributes
返された ハンドルを子 プロセスによって継承できるかどうかを決定するSECURITY_ATTRIBUTES構造体へのポインター。 の lpSecurityDescriptor メンバー
SECURITY_ATTRIBUTES 構造体は、新しいファイル マッピング オブジェクトのセキュリティ記述子を指定します。
lpFileMappingAttributes が NULL の場合、ハンドルを継承できず、ファイル マッピング オブジェクトは既定のセキュリティ記述子を取得します。 ファイル マッピング オブジェクトの既定のセキュリティ記述子のアクセス制御リスト (ACL) は、作成者のプライマリ トークンまたは偽装トークンから取得されます。 詳細については、「 ファイル マッピングのセキュリティとアクセス権」を参照してください。
[in] flProtect
ファイル マッピング オブジェクトのページ保護を指定します。 オブジェクトのすべてのマップされたビューは、この保護と互換性がある必要があります。
このパラメーターには、次の値のいずれかを指定できます。
アプリケーションでは、ファイル マッピング オブジェクトに対して次の属性のうち 1 つ以上を指定できます。これらの属性は、上記のページ保護値のいずれかと組み合わせることによって指定できます。
値 | 説明 |
---|---|
|
すべてのページのメモリまたはページング ファイルに物理ストレージを割り当てます。
これが既定の設定です。 |
|
実行可能イメージ ファイルとして指定されたファイルを設定します。
SEC_IMAGE属性は、PAGE_READONLYなどのページ保護値と組み合わせる必要があります。 ただし、このページ保護値は、実行可能イメージ ファイルのビューには影響しません。 実行可能イメージ ファイルのビューのページ保護は、実行可能ファイル自体によって決まります。 その他の属性は 、SEC_IMAGEで有効ではありません。 |
|
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 より前ではサポートされていません。 |
|
イメージのマッピング時やページファイルからのバッキング時には大きなページを使用できますが、通常のファイルのデータをマッピングする場合は使用できません。 GetLargePageMinimum 関数によって報告される大きなページの最小サイズとして、ファイル マッピング オブジェクトの最大サイズを指定し、SeLockMemoryPrivilege 特権を有効にしてください。 |
|
すべてのページを非対応に設定します。
アプリケーションでは、デバイスに明示的に必要な場合を除き、このフラグを使用しないでください。 SEC_NOCACHEにマップされたメモリでインターロックされた関数 を 使用すると、 EXCEPTION_ILLEGAL_INSTRUCTION 例外が発生する可能性があります。 SEC_NOCACHE には 、SEC_RESERVE または SEC_COMMIT を設定する必要があります。 |
|
物理ストレージを割り当てずにすべてのページを予約します。
ページの予約範囲は、ページの範囲が解放されるまで、他の割り当て操作では使用できません。 予約済みページは、 VirtualAllocExNuma 関数の後続の呼び出しで識別できます。 この属性は、 hFile パラメーターが INVALID_HANDLE_VALUE (つまり、システム ページング ファイルによってサポートされるファイル マッピング オブジェクト) である場合にのみ有効です。 |
|
すべてのページを書き込み結合するように設定します。
アプリケーションでは、デバイスに明示的に必要な場合を除き、この属性を使用しないでください。 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 ノードは推奨されません。 これは、 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 |
ヘッダー | winbase.h (Windows.h、Memoryapi.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |