次の方法で共有


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

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

[in, optional] SecurityAttributes

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

SecurityAttributes が NULL場合、ハンドルを継承できず、ファイル マッピング オブジェクトは既定のセキュリティ記述子を取得します。 ファイル マッピング オブジェクトの既定のセキュリティ記述子のアクセス制御リスト (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を指定した場合)、ディスク上のファイルは、ファイル マッピング オブジェクトの指定されたサイズに合わせて増やされます。 ファイルが拡張されている場合、ファイルの古い終わりとファイルの新しい終わりの間のファイルの内容がゼロになることは保証されません。動作はファイル システムによって定義されます。 ディスク上のファイルを増やすことができない場合、CreateFileMappingFromApp 失敗し、GetLastError ERROR_DISK_FULLを返します。

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

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

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

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

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

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

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

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

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

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

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

必要条件

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

関連項目

CloseHandle の

CreateFileMapping の

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

DuplicateHandle の

ファイル マッピング関数

MapViewOfFile

MapViewOfFileEx の

メモリ管理機能の

OpenFileMapping

ReadFile の

SECURITY_ATTRIBUTES

unmapViewOfFile の

VirtualAlloc の

WriteFile の