CreateFileMappingFromApp 関数 (memoryapi.h)

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

構文

HANDLE CreateFileMappingFromApp(
  [in]           HANDLE               hFile,
  [in, optional] PSECURITY_ATTRIBUTES SecurityAttributes,
  [in]           ULONG                PageProtection,
  [in]           ULONG64              MaximumSize,
  [in, optional] PCWSTR               Name
);

パラメーター

[in] hFile

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

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

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

[in, optional] SecurityAttributes

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

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

[in] PageProtection

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

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

説明
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)、ファイルのビューがプロセス アドレス空間にマップされるときに、ページの範囲全体が予約ではなくコミットされることを指定します。 システムには、マッピング全体を保持するのに十分なコミット可能なページが必要です。 それ以外の場合、 CreateFileMappingFromApp は失敗します。

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

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

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

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

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

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

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

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

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

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 属性を設定する必要があります。

[in] MaximumSize

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

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

[in, optional] Name

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

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

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

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

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

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

戻り値

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

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

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

解説

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

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

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

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

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

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

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

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

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

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

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

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

実行可能な保護は、アプリに codeGeneration 機能がある場合にのみ正常に要求できます。

要件

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

関連項目

CloseHandle

CreateFileMapping

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

DuplicateHandle

ファイル マッピング関数

MapViewOfFile

MapViewOfFileEx

メモリ管理関数

OpenFileMapping

ReadFile

SECURITY_ATTRIBUTES

UnmapViewOfFile

VirtualAlloc

WriteFile