MapViewOfFileExNuma

ファイルマッピングのビューを呼び出し側プロセスのアドレス空間にマップし、物理メモリの NUMA ノードを指定する。

MapViewOfFileExNuma hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress, nndPreferred

hFileMappingObject : [intptr] ファイルマッピングオブジェクトのハンドル。CreateFileMappingNuma および OpenFileMapping 関数がこのハンドルを返す。
dwDesiredAccess : [int] ファイルマッピングオブジェクトへのアクセスの種類。これはページのページ保護を決定する。
dwFileOffsetHigh : [int] ビューの開始位置となるファイルオフセットの上位 DWORD。
dwFileOffsetLow : [int] ビューの開始位置となるファイルオフセットの下位 DWORD。上位と下位のオフセットの組み合わせは、ファイルマッピング内のオフセットを指定しなければならない。また、システムのメモリ確保粒度と一致しなければならない。すなわちオフセットは確保粒度の倍数でなければならない。システムのメモリ確保粒度を得るには、SYSTEM_INFO 構造体のメンバを埋める GetSystemInfo 関数を使う。
dwNumberOfBytesToMap : [int] ビューにマップするファイルマッピングのバイト数。すべてのバイトは CreateFileMapping で指定された最大サイズ以内でなければならない。この引数が 0 の場合、マッピングは指定オフセットからファイルマッピングの末尾まで広がる。
lpBaseAddress : [intptr] マッピングを開始する呼び出し側プロセスのアドレス空間内のメモリアドレスへのポインタ。これはシステムのメモリ確保粒度の倍数でなければならず、そうでなければ関数は失敗する。システムのメモリ確保粒度を調べるには GetSystemInfo 関数を使う。指定したアドレスに十分なアドレス空間がない場合、関数は失敗する。lpBaseAddress 引数が NULL の場合、オペレーティングシステムがマッピングアドレスを選択する。現時点で安全(オペレーティングシステムが使用していない)なアドレスを指定することは可能だが、そのアドレスが時間の経過にわたって安全であり続ける保証はない。したがって、アドレスはオペレーティングシステムに選ばせる方がよい。その場合、メモリマップファイルにポインタを格納するのではなく、任意のアドレスでマッピングを使えるようにファイルマッピングの基底からのオフセットを格納する。
nndPreferred : [int] 物理メモリが配置されるべき NUMA ノード。

(プラグイン / モジュール : kernel32.dll)

解説

ファイルマッピングのビューを呼び出し側プロセスのアドレス空間にマップし、物理メモリの NUMA ノードを指定する。

[戻り値]
関数が成功した場合、戻り値はマップされたビューの先頭アドレスである。関数が失敗した場合、戻り値は NULL
である。拡張エラー情報を取得するには GetLastError 関数を呼ぶ。

[備考]

ファイルをマップすると、ファイルの指定された部分が呼び出し側プロセスのアドレス空間内に見えるようになる。アドレス空間より大きなファイルの場合、ファイルデータの一部分ずつしか同時にマップできない。最初のビューを使い終えたら、マップ解除して新しいビューをマップする。ビューのサイズを得るには
VirtualQueryEx 関数を使う。ページファイルに裏付けられたファイルマッピングオブジェクト内のページの初期内容は 0
である。推奨マッピングアドレスが指定されている場合、そのアドレス(直近の 64 KB
境界に切り下げられる)に十分なアドレス空間があれば、ファイルはその指定アドレスにマップされる。十分なアドレス空間がなければ関数は失敗する。通常、推奨アドレスは、複数のプロセスで同じアドレスにファイルをマップするよう指定するために使われる。これには、関与するすべてのプロセスでそのアドレス空間領域が利用可能である必要がある。マッピングに使用する領域では、VirtualAllocExNuma
関数によるメモリ予約を含め、他のメモリ確保は行えない。lpBaseAddress
引数で基底オフセットを指定した場合、指定されたメモリ領域が呼び出し側プロセスで既に使用されていなければ関数は成功する。システムは、他の
32
ビットプロセスでも同じメモリ領域がメモリマップファイル用に利用可能であることを保証しない。ファイルの複数のビュー(またはファイルマッピングオブジェクトとそのマップされたファイル)は、指定時点で同じデータを含むなら整合している。これは、同じファイルマッピングオブジェクトからビューが派生する場合に発生する。プロセスは
DuplicateHandle 関数を使ってファイルマッピングオブジェクトのハンドルを他のプロセスへ複製できるし、別のプロセスは
OpenFileMapping 関数を使って名前でファイルマッピングオブジェクトを開くこともできる。1
つの重要な例外を除き、同じファイルに裏付けられた任意のファイルマッピングオブジェクトから派生したファイルビューは、特定時点で整合もしくは同一である。プロセス内のビュー間でも、異なるプロセスがマップしたビュー間でも、整合性は保証される。例外はリモートファイルに関するものである。MapViewOfFileExNuma
はリモートファイルでも動作するが、それらの整合性は保たない。例えば、2
台のコンピュータがファイルを書き込み可能としてマップし、両方が同じページを変更した場合、各コンピュータは自身のそのページへの書き込みしか見えない。ディスク上でデータが更新されても、マージはされない。ファイルのマップされたビューは、ReadFileWriteFile 関数でアクセスしているファイルとの整合性は保証されない。EXCEPTION_IN_PAGE_ERROR
例外に備えるため、ページファイル以外のメモリマップファイルビューへ書き込んだり読み込んだりするコードは構造化例外処理で保護すること。詳細は「ファイルビューからの読み書き」を参照。マップされたビューを介してファイルを変更する場合、最終更新タイムスタンプが自動的には更新されないことがある。必要であれば、呼び出し側は
SetFileTime を使ってタイムスタンプを設定すべきである。実行権限付きのファイルを持つためには、アプリケーションは
PAGE_EXECUTE_READWRITE または PAGE_EXECUTE_READ で CreateFileMappingNuma
関数を呼び、その後 FILE_MAP_EXECUTE | FILE_MAP_WRITE または FILE_MAP_EXECUTE |
FILE_MAP_READ で MapViewOfFileExNuma 関数を呼ばなければならない。Windows Server 2012
では、この関数は次のテクノロジによってサポートされる。
(以下省略)

情報

プラグイン / モジュールkernel32.dll
バージョン1.0
作成日2026/04/16
著作者IronHSP / CsWin32 bridge
URLhttps://github.com/inovia/IronHSP
備考Win32 API の kernel32.dll 関数群。CsWin32 + win32metadata から自動生成。
hsp3net 専用 (intptr / NSTRUCT / wstr を使用)。
タイプ拡張命令
グループWin32API
対応環境
  • Windows 版 HSP
hs ファイルhsphelp\win32_kernel32_gen2.hs