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 が
[in, optional] SecurityAttributes
返されたハンドルを子プロセスによって継承できるかどうかを決定する SECURITY_ATTRIBUTES 構造体へのポインター。 SECURITY_ATTRIBUTES 構造体の lpSecurityDescriptor メンバーは、新しいファイル マッピング オブジェクトのセキュリティ記述子を指定します。
[in] PageProtection
ファイル マッピング オブジェクトのページ保護を指定します。 オブジェクトのすべてのマップされたビューは、この保護と互換性がある必要があります。
このパラメーターには、次のいずれかの値を指定できます。
アプリケーションは、ファイル マッピング オブジェクトに対して、上記のページ保護値のいずれかと組み合わせることにより、次の属性の 1 つ以上を指定できます。
価値 | 意味 |
---|---|
|
ファイル マッピング オブジェクトがオペレーティング システムページング ファイル (hfile パラメーターが INVALID_HANDLE_VALUE) によってサポートされている場合は、ファイルのビューがプロセス アドレス空間にマップされるときに、ページの範囲全体が予約ではなくコミットされることを指定します。 システムには、マッピング全体を保持するのに十分なコミット可能なページが必要です。 それ以外の場合、CreateFileMappingFromApp この属性は、実行可能イメージ ファイルまたはデータ ファイルによってサポートされるファイル マッピング オブジェクトには影響しません (hfile パラメーターはファイルへのハンドルです)。 SEC_COMMIT を SEC_RESERVEと組み合わせることはできません。 属性が指定されていない場合は、SEC_COMMIT が想定されます。 |
|
hFile パラメーターが指定するファイルが実行されない実行可能イメージ ファイルであり、読み込まれたイメージ ファイルで強制整合性チェックが実行されないことを指定します。
さらに、SEC_IMAGE_NO_EXECUTE 属性で作成されたファイル マッピング オブジェクトのビューをマッピングしても、PsSetLoadImageNotifyRoutine カーネル API を使用して登録されたドライバー コールバックは呼び出されません。
SEC_IMAGE_NO_EXECUTE 属性は、PAGE_READONLY ページ保護の値と組み合わせる必要があります。 SEC_IMAGE_NO_EXECUTEで有効なその他の属性はありません。 |
|
オペレーティング システムのページング ファイルによってサポートされるファイル マッピング オブジェクトに大きなページを使用できるようにします (hfile パラメーター ファイル マッピング オブジェクトの最大サイズは、GetLargePageMinimum 関数によって返される大きなページの最小サイズの倍数である必要があります。 そうでない場合は、CreateFileMappingFromApp SEC_LARGE_PAGES 呼び出し元のトークンで有効にするには、SeLockMemoryPrivilege 特権が必要です。 SEC_LARGE_PAGES を指定する場合は、SEC_COMMIT も指定する必要があります。 |
|
すべてのページをキャッシュ不可に設定します。
アプリケーションでは、デバイスに明示的に必要な場合を除き、この属性を使用しないでください。 SEC_NOCACHE にマップされたメモリでインターロックされた関数を使用すると、EXCEPTION_ILLEGAL_INSTRUCTION 例外が発生する可能性があります。 SEC_NOCACHE には、SEC_RESERVE または SEC_COMMIT 属性を設定する必要があります。 |
|
ファイル マッピング オブジェクトがオペレーティング システムページング ファイル (hfile パラメーターが INVALID_HANDLE_VALUE) によってサポートされている場合は、ファイルのビューがプロセス アドレス空間にマップされるときに、ページの範囲全体がコミットされるのではなく、後で使用するために予約されることを指定します。
予約済みページは、VirtualAlloc 関数の後続の呼び出しでコミットできます。 ページがコミットされた後は、VirtualFree 関数を使用してページを解放したり、コミットしたりすることはできません。 この属性は、実行可能イメージ ファイルまたはデータ ファイルによってサポートされるファイル マッピング オブジェクトには影響しません (hfile パラメーターはファイルへのハンドルです)。 SEC_RESERVE を SEC_COMMITと組み合わせることはできません。 |
|
すべてのページを書き込み結合に設定します。
アプリケーションでは、デバイスに明示的に必要な場合を除き、この属性を使用しないでください。 SEC_WRITECOMBINE にマップされたメモリでインターロックされた関数を使用すると、EXCEPTION_ILLEGAL_INSTRUCTION 例外が発生する可能性があります。 SEC_WRITECOMBINE には、SEC_RESERVE または SEC_COMMIT 属性を設定する必要があります。 |
[in] MaximumSize
ファイル マッピング オブジェクトの最大サイズ。
長さが 0 (ゼロ) のファイルをマップしようとすると、エラー コード ERROR_FILE_INVALIDで失敗します。 アプリケーションでは、長さが 0 (ゼロ) のファイルをテストし、それらのファイルを拒否する必要があります。
[in, optional] Name
ファイル マッピング オブジェクトの名前。
このパラメーターが既存のマッピング オブジェクトの名前と一致する場合、関数は flProtect が指定する保護
このパラメーターが NULL
lpName
名前には、グローバル名前空間またはセッション名前空間にオブジェクトを明示的に作成するための "Global" または "Local" プレフィックスを付けることができます。 名前の残りの部分には、円記号 (\) を除く任意の文字を含めることができます。 セッション 0 以外のセッションからグローバル名前空間にファイル マッピング オブジェクトを作成するには、SeCreateGlobalPrivilege 特権が必要です。 詳細については、「カーネル オブジェクト名前空間
高速ユーザー切り替えは、ターミナル サービス セッションを使用して実装されます。 ログオンする最初のユーザーはセッション 0 (ゼロ) を使用し、次にログオンするユーザーはセッション 1 (1) を使用します。 カーネル オブジェクト名は、アプリケーションが複数のユーザーをサポートできるように、ターミナル サービスに関して概説されているガイドラインに従う必要があります。
戻り値
関数が成功した場合、戻り値は新しく作成されたファイル マッピング オブジェクトへのハンドルです。
関数呼び出しの前にオブジェクトが存在する場合、関数は (指定したサイズではなく、現在のサイズを持つ) 既存のオブジェクトにハンドルを返し、GetLastError は ERROR_ALREADY_EXISTSを返します。
関数が失敗した場合、戻り値は NULL
備考
ファイル マッピング オブジェクトが作成された後、ファイルのサイズがファイル マッピング オブジェクトのサイズを超えないようにする必要があります。存在する場合は、すべてのファイル コンテンツを共有できるわけではありません。
アプリケーションで、ディスク上の実際の名前付きファイルのサイズよりも大きいファイル マッピング オブジェクトのサイズを指定し、ページ保護で書き込みアクセスが許可されている場合 (つまり、flProtect パラメーターで PAGE_READWRITEを指定した場合)、ディスク上のファイルは、ファイル マッピング オブジェクトの指定されたサイズに合わせて増やされます。 ファイルが拡張されている場合、ファイルの古い終わりとファイルの新しい終わりの間のファイルの内容がゼロになることは保証されません。動作はファイル システムによって定義されます。 ディスク上のファイルを増やすことができない場合、CreateFileMappingFromApp
オペレーティング システムのページング ファイルによってサポートされるファイル マッピング オブジェクト内のページの初期コンテンツは 0 (ゼロ) です。
CreateFileMappingFromApp
複数のプロセスで同じファイルのビューを共有するには、1 つの共有ファイル マッピング オブジェクトを使用するか、同じファイルでバックアップされた個別のファイル マッピング オブジェクトを作成します。 1 つのファイル マッピング オブジェクトは、プロセスの作成時にハンドルを継承したり、ハンドルを複製したり、名前でファイル マッピング オブジェクトを開いたりすることで、複数のプロセスで共有できます。 詳細については、
ファイル マッピング オブジェクトを作成しても、実際にはビューはプロセス アドレス空間にマップされません。 MapViewOfFileEx 関数は、ファイルのビューをプロセス アドレス空間にマップします。
1 つの重要な例外では、同じファイルによってサポートされるファイル マッピング オブジェクトから派生したファイル ビューは、特定の時点で一貫性または同一になります。 一貫性は、プロセス内のビューと、異なるプロセスによってマップされるビューに対して保証されます。
例外はリモート ファイルに関連しています。 CreateFileMappingFromApp
入出力 (I/O) 関数 (
ファイル マッピング オブジェクトのマップされたビューは、オブジェクトへの内部参照を保持し、ファイル マッピング オブジェクトは、そのオブジェクトへのすべての参照が解放されるまで閉じません。 したがって、ファイル マッピング オブジェクトを完全に閉じるには、UnmapViewOfFile を呼び出してファイル マッピング オブジェクトのすべてのマップされたビュー
マップされたビューを使用してファイルを変更する場合、最後の変更タイムスタンプが自動的に更新されない場合があります。 必要に応じて、呼び出し元 SetFileTime を使用してタイムスタンプを設定する必要があります。
構造化例外処理を使用して、ファイル ビューへの書き込みまたはファイル ビューからの読み取りを行うコードを保護します。 詳細については、「ファイル ビューからの読み取りと書き込みの
実行可能な保護を正常に要求できるのは、アプリに codeGeneration 機能がある場合のみです。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 8 [デスクトップ アプリ |UWP アプリ] |
サポートされる最小サーバー | Windows Server 2012 [デスクトップ アプリ |UWP アプリ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | memoryapi.h (Windows.h を含む) |
ライブラリ | onecore.lib |
DLL | Kernel32.dll |
関連項目
CloseHandle の
CreateFileMapping の
DuplicateHandle の
ファイル マッピング関数
MapViewOfFileEx の
ReadFile の
unmapViewOfFile の
VirtualAlloc の
WriteFile の