Win32 API 日本語リファレンス
ホームSystem.Memory › MapViewOfFileExNuma

MapViewOfFileExNuma

関数
ベースアドレスとNUMAノードを指定してビューをマップする。
DLLKERNEL32.dll呼出規約winapiSetLastErrorあり対応OSWindows Vista 以降

シグネチャ

// KERNEL32.dll
#include <windows.h>

MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileExNuma(
    HANDLE hFileMappingObject,
    FILE_MAP dwDesiredAccess,
    DWORD dwFileOffsetHigh,
    DWORD dwFileOffsetLow,
    UINT_PTR dwNumberOfBytesToMap,
    void* lpBaseAddress,   // optional
    DWORD nndPreferred
);

パラメーター

名前方向説明
hFileMappingObjectHANDLEinファイルマッピングオブジェクトへのハンドル。CreateFileMappingNuma 関数および OpenFileMapping 関数がこのハンドルを返します。
dwDesiredAccessFILE_MAPin

ファイルマッピングオブジェクトへのアクセスの種類で、ページの保護属性を決定します。このパラメーターには、次の値のいずれか、または適切な場合は複数の値のビット単位の OR 結合を指定できます。

意味
FILE_MAP_ALL_ACCESS
ファイルの読み取り/書き込みビューがマップされます。ファイルマッピングオブジェクトは PAGE_READWRITE または PAGE_EXECUTE_READWRITE 保護で作成されている必要があります。

MapViewOfFileExNuma で使用する場合、FILE_MAP_ALL_ACCESSFILE_MAP_WRITE と同等です。

FILE_MAP_READ
ファイルの読み取り専用ビューがマップされます。ファイルビューへの書き込みを試みるとアクセス違反が発生します。

ファイルマッピングオブジェクトは PAGE_READONLYPAGE_READWRITEPAGE_EXECUTE_READ、または PAGE_EXECUTE_READWRITE 保護で作成されている必要があります。

FILE_MAP_WRITE
ファイルの読み取り/書き込みビューがマップされます。ファイルマッピングオブジェクトは PAGE_READWRITE または PAGE_EXECUTE_READWRITE 保護で作成されている必要があります。

MapViewOfFileExNuma で使用する場合、(FILE_MAP_WRITE | FILE_MAP_READ)FILE_MAP_WRITE と同等です。

ビット単位の OR を使用して、上記の値を次の値と組み合わせることができます。

意味
FILE_MAP_COPY
ファイルのコピーオンライト (copy-on-write) ビューがマップされます。ファイルマッピングオブジェクトは PAGE_READONLYPAGE_EXECUTE_READPAGE_WRITECOPYPAGE_EXECUTE_WRITECOPYPAGE_READWRITE、または PAGE_EXECUTE_READWRITE 保護で作成されている必要があります。

プロセスがコピーオンライトページに書き込むと、システムは元のページをそのプロセス専用の新しいページにコピーします。新しいページはページファイルによってバックアップされます。新しいページの保護属性はコピーオンライトから読み取り/書き込みに変わります。

コピーオンライトアクセスを指定した場合、呼び出し元プロセスがビュー内のすべてのページに書き込んでそれらをプライベートにする可能性があるため、システムおよびプロセスのコミットチャージはビュー全体に対して確保されます。新しいページの内容が元のファイルに書き戻されることはなく、ビューのマップが解除されると失われます。

FILE_MAP_EXECUTE
ファイルの実行可能ビューがマップされます (マップされたメモリをコードとして実行できます)。ファイルマッピングオブジェクトは PAGE_EXECUTE_READPAGE_EXECUTE_WRITECOPY、または PAGE_EXECUTE_READWRITE 保護で作成されている必要があります。
FILE_MAP_LARGE_PAGES
Windows 10 バージョン 1703 以降では、このフラグはビューを ラージページサポート を使用してマップすることを指定します。ビューのサイズは GetLargePageMinimum 関数が報告するラージページのサイズの倍数である必要があり、ファイルマッピングオブジェクトは SEC_LARGE_PAGES オプションを使用して作成されている必要があります。lpBaseAddress に NULL 以外の値を指定する場合、その値は GetLargePageMinimum の倍数である必要があります。
FILE_MAP_TARGETS_INVALID
マップされたファイル内のすべての位置を、Control Flow Guard (CFG) の無効なターゲットとして設定します。このフラグは PAGE_TARGETS_INVALID に似ています。このフラグは実行アクセス権 FILE_MAP_EXECUTE と組み合わせて使用します。これらのページ内の位置への間接呼び出しはすべて CFG チェックに失敗し、プロセスは終了します。割り当てられた実行可能ページの既定の動作は、CFG の有効な呼び出しターゲットとしてマークされることです。

SEC_IMAGE 属性で作成されたファイルマッピングオブジェクトの場合、 dwDesiredAccess パラメーターは効果がなく、FILE_MAP_READ などの任意の有効な値に設定してください。

ファイルマッピングオブジェクトへのアクセスの詳細については、 File Mapping Security and Access Rights を参照してください。

dwFileOffsetHighDWORDinビューを開始するファイルオフセットの上位 DWORD
dwFileOffsetLowDWORDinビューを開始するファイルオフセットの下位 DWORD。上位オフセットと下位オフセットの 組み合わせは、ファイルマッピング内のオフセットを指定する必要があります。また、システムの メモリ割り当て粒度に一致する必要があります。すなわち、オフセットは割り当て 粒度の倍数である必要があります。システムのメモリ割り当て粒度を取得するには、 GetSystemInfo 関数を使用します。この関数は SYSTEM_INFO 構造体のメンバーを設定します。
dwNumberOfBytesToMapUINT_PTRinファイルマッピングのうちビューにマップするバイト数。すべてのバイトは CreateFileMapping で指定された最大サイズ内に収まっている必要があります。このパラメーターが 0 の場合、マッピングは指定されたオフセットからファイルマッピングの末尾まで拡張されます。
lpBaseAddressvoid*inoptional

マッピングを開始する、呼び出し元プロセスのアドレス空間内のメモリアドレスへのポインター。これは システムのメモリ割り当て粒度の倍数である必要があり、そうでない場合は関数が失敗します。システムのメモリ 割り当て粒度を確認するには、 GetSystemInfo 関数を使用します。指定されたアドレスに 十分なアドレス空間がない場合、関数は失敗します。

lpBaseAddress パラメーターが NULL の場合、オペレーティング システムがマッピングアドレスを選択します。

現時点で安全な (オペレーティングシステムによって使用されていない) アドレスを指定することは可能ですが、その アドレスが将来にわたって安全であり続ける保証はありません。したがって、オペレーティングシステムに アドレスを選択させる方が適切です。この場合、メモリマップトファイルにポインターを格納するのではなく、 任意のアドレスでマッピングを使用できるように、ファイルマッピングの基点からのオフセットを格納します。

nndPreferredDWORDin

物理メモリを配置すべき NUMA ノード。

意味
NUMA_NO_PREFERRED_NODE
0xffffffff
優先する NUMA ノードはありません。これは MapViewOfFileEx 関数を呼び出すのと同じです。

戻り値の型: MEMORY_MAPPED_VIEW_ADDRESS

公式ドキュメント

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

戻り値

関数が成功した場合、戻り値はマップされたビューの開始アドレスです。

関数が失敗した場合、戻り値は NULL です。拡張エラー情報を取得するには、 GetLastError 関数を呼び出します。

解説(Remarks)

ファイルをマップすると、ファイルの指定された部分が呼び出し元プロセスのアドレス空間内で可視になります。

アドレス空間より大きいファイルの場合、一度にマップできるのはファイルデータの小さな部分のみです。最初のビューが完了したら、それをアンマップして新しいビューをマップします。

ビューのサイズを取得するには、 VirtualQueryEx 関数を使用します。

ページファイルによってバックアップされるファイルマッピングオブジェクト内のページの初期内容は 0 です。

推奨マッピングアドレスを指定した場合、指定されたアドレスに十分なアドレス空間があれば、ファイルは指定されたアドレス (直近の 64 KB 境界に切り下げられる) にマップされます。十分なアドレス 空間がない場合、関数は失敗します。

通常、推奨アドレスは、複数のプロセスで同じアドレスにファイルをマップすることを指定するために使用します。これには、関係するすべてのプロセスでそのアドレス空間の領域が利用可能である必要があります。VirtualAllocExNuma 関数によるメモリ予約を含め、マッピングに使用される領域では他の メモリ割り当てを行うことはできません。

lpBaseAddress パラメーターが基準オフセットを指定する場合、指定された メモリ領域が呼び出し元プロセスでまだ使用されていなければ関数は成功します。システムは、同じ メモリ領域が他の 32 ビットプロセスでメモリマップトファイル用に利用可能であることを保証しません。

ファイル (またはファイルマッピングオブジェクトとそのマップされたファイル) の複数のビューは、指定された時点で同一のデータを含んでいる場合に コヒーレント (coherent) です。これは、ファイルビューが同じファイル マッピングオブジェクトから派生している場合に発生します。プロセスは DuplicateHandle 関数を使用してファイルマッピングオブジェクトのハンドルを別のプロセスに複製したり、別のプロセスが OpenFileMapping 関数を使用して名前でファイルマッピングオブジェクトを開いたりできます。

1 つの重要な例外を除き、同じファイルによってバックアップされる任意のファイルマッピングオブジェクトから派生したファイルビューは、特定の時点でコヒーレント、すなわち同一です。コヒーレンシは、プロセス内のビューおよび異なるプロセスによってマップされたビューについて保証されます。

例外はリモートファイルに関するものです。 MapViewOfFileExNuma はリモートファイルでも機能しますが、 それらをコヒーレントに保つことはしません。たとえば、2 台のコンピューターが両方ともファイルを書き込み可能としてマップし、両方が同じ ページを変更した場合、各コンピューターはそのページに対する自身の書き込みのみを認識します。データがディスク上で更新されても、それらは マージされません。

ファイルのマップされたビューは、ReadFile 関数または WriteFile 関数でアクセスされているファイルとコヒーレントである保証はありません。

EXCEPTION_IN_PAGE_ERROR 例外を防ぐには、構造化例外 処理を使用して、ページファイル以外のファイルのメモリマップトビューに書き込みまたは読み取りを行うコードを保護します。 詳細については、 Reading and Writing From a File View を参照してください。

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

ファイルに実行権限を持たせるには、アプリケーションは CreateFileMappingNuma 関数を PAGE_EXECUTE_READWRITE または PAGE_EXECUTE_READ のいずれかで呼び出し、その後 MapViewOfFileExNuma 関数を FILE_MAP_EXECUTE | FILE_MAP_WRITE または FILE_MAP_EXECUTE | FILE_MAP_READ で呼び出す必要があります。

Windows Server 2012 では、この関数は次のテクノロジでサポートされています。

テクノロジ サポート
Server Message Block (SMB) 3.0 プロトコル はい
SMB 3.0 トランスペアレントフェールオーバー (TFO) はい
SMB 3.0 スケールアウトファイル共有 (SO) はい
クラスター共有ボリュームファイルシステム (CsvFS) はい
回復ファイルシステム (ReFS) はい
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// KERNEL32.dll
#include <windows.h>

MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileExNuma(
    HANDLE hFileMappingObject,
    FILE_MAP dwDesiredAccess,
    DWORD dwFileOffsetHigh,
    DWORD dwFileOffsetLow,
    UINT_PTR dwNumberOfBytesToMap,
    void* lpBaseAddress,   // optional
    DWORD nndPreferred
);
[DllImport("KERNEL32.dll", SetLastError = true, ExactSpelling = true)]
static extern MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileExNuma(
    IntPtr hFileMappingObject,   // HANDLE
    uint dwDesiredAccess,   // FILE_MAP
    uint dwFileOffsetHigh,   // DWORD
    uint dwFileOffsetLow,   // DWORD
    UIntPtr dwNumberOfBytesToMap,   // UINT_PTR
    IntPtr lpBaseAddress,   // void* optional
    uint nndPreferred   // DWORD
);
<DllImport("KERNEL32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function MapViewOfFileExNuma(
    hFileMappingObject As IntPtr,   ' HANDLE
    dwDesiredAccess As UInteger,   ' FILE_MAP
    dwFileOffsetHigh As UInteger,   ' DWORD
    dwFileOffsetLow As UInteger,   ' DWORD
    dwNumberOfBytesToMap As UIntPtr,   ' UINT_PTR
    lpBaseAddress As IntPtr,   ' void* optional
    nndPreferred As UInteger   ' DWORD
) As MEMORY_MAPPED_VIEW_ADDRESS
End Function
' hFileMappingObject : HANDLE
' dwDesiredAccess : FILE_MAP
' dwFileOffsetHigh : DWORD
' dwFileOffsetLow : DWORD
' dwNumberOfBytesToMap : UINT_PTR
' lpBaseAddress : void* optional
' nndPreferred : DWORD
Declare PtrSafe Function MapViewOfFileExNuma Lib "kernel32" ( _
    ByVal hFileMappingObject As LongPtr, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwFileOffsetHigh As Long, _
    ByVal dwFileOffsetLow As Long, _
    ByVal dwNumberOfBytesToMap As LongPtr, _
    ByVal lpBaseAddress As LongPtr, _
    ByVal nndPreferred As Long) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

MapViewOfFileExNuma = ctypes.windll.kernel32.MapViewOfFileExNuma
MapViewOfFileExNuma.restype = ctypes.c_void_p
MapViewOfFileExNuma.argtypes = [
    wintypes.HANDLE,  # hFileMappingObject : HANDLE
    wintypes.DWORD,  # dwDesiredAccess : FILE_MAP
    wintypes.DWORD,  # dwFileOffsetHigh : DWORD
    wintypes.DWORD,  # dwFileOffsetLow : DWORD
    ctypes.c_size_t,  # dwNumberOfBytesToMap : UINT_PTR
    ctypes.POINTER(None),  # lpBaseAddress : void* optional
    wintypes.DWORD,  # nndPreferred : DWORD
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
MapViewOfFileExNuma = Fiddle::Function.new(
  lib['MapViewOfFileExNuma'],
  [
    Fiddle::TYPE_VOIDP,  # hFileMappingObject : HANDLE
    -Fiddle::TYPE_INT,  # dwDesiredAccess : FILE_MAP
    -Fiddle::TYPE_INT,  # dwFileOffsetHigh : DWORD
    -Fiddle::TYPE_INT,  # dwFileOffsetLow : DWORD
    Fiddle::TYPE_UINTPTR_T,  # dwNumberOfBytesToMap : UINT_PTR
    Fiddle::TYPE_VOIDP,  # lpBaseAddress : void* optional
    -Fiddle::TYPE_INT,  # nndPreferred : DWORD
  ],
  Fiddle::TYPE_VOIDP)
#[link(name = "kernel32")]
extern "system" {
    fn MapViewOfFileExNuma(
        hFileMappingObject: *mut core::ffi::c_void,  // HANDLE
        dwDesiredAccess: u32,  // FILE_MAP
        dwFileOffsetHigh: u32,  // DWORD
        dwFileOffsetLow: u32,  // DWORD
        dwNumberOfBytesToMap: usize,  // UINT_PTR
        lpBaseAddress: *mut (),  // void* optional
        nndPreferred: u32  // DWORD
    ) -> MEMORY_MAPPED_VIEW_ADDRESS;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("KERNEL32.dll", SetLastError = true)]
public static extern MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileExNuma(IntPtr hFileMappingObject, uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, UIntPtr dwNumberOfBytesToMap, IntPtr lpBaseAddress, uint nndPreferred);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_MapViewOfFileExNuma' -Namespace Win32 -PassThru
# $api::MapViewOfFileExNuma(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress, nndPreferred)
#uselib "KERNEL32.dll"
#func global MapViewOfFileExNuma "MapViewOfFileExNuma" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; MapViewOfFileExNuma hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress, nndPreferred   ; 戻り値は stat
; hFileMappingObject : HANDLE -> "sptr"
; dwDesiredAccess : FILE_MAP -> "sptr"
; dwFileOffsetHigh : DWORD -> "sptr"
; dwFileOffsetLow : DWORD -> "sptr"
; dwNumberOfBytesToMap : UINT_PTR -> "sptr"
; lpBaseAddress : void* optional -> "sptr"
; nndPreferred : DWORD -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "KERNEL32.dll"
#cfunc global MapViewOfFileExNuma "MapViewOfFileExNuma" sptr, int, int, int, sptr, sptr, int
; res = MapViewOfFileExNuma(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress, nndPreferred)
; hFileMappingObject : HANDLE -> "sptr"
; dwDesiredAccess : FILE_MAP -> "int"
; dwFileOffsetHigh : DWORD -> "int"
; dwFileOffsetLow : DWORD -> "int"
; dwNumberOfBytesToMap : UINT_PTR -> "sptr"
; lpBaseAddress : void* optional -> "sptr"
; nndPreferred : DWORD -> "int"
; MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileExNuma(HANDLE hFileMappingObject, FILE_MAP dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, UINT_PTR dwNumberOfBytesToMap, void* lpBaseAddress, DWORD nndPreferred)
#uselib "KERNEL32.dll"
#cfunc global MapViewOfFileExNuma "MapViewOfFileExNuma" intptr, int, int, int, intptr, intptr, int
; res = MapViewOfFileExNuma(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress, nndPreferred)
; hFileMappingObject : HANDLE -> "intptr"
; dwDesiredAccess : FILE_MAP -> "int"
; dwFileOffsetHigh : DWORD -> "int"
; dwFileOffsetLow : DWORD -> "int"
; dwNumberOfBytesToMap : UINT_PTR -> "intptr"
; lpBaseAddress : void* optional -> "intptr"
; nndPreferred : DWORD -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procMapViewOfFileExNuma = kernel32.NewProc("MapViewOfFileExNuma")
)

// hFileMappingObject (HANDLE), dwDesiredAccess (FILE_MAP), dwFileOffsetHigh (DWORD), dwFileOffsetLow (DWORD), dwNumberOfBytesToMap (UINT_PTR), lpBaseAddress (void* optional), nndPreferred (DWORD)
r1, _, err := procMapViewOfFileExNuma.Call(
	uintptr(hFileMappingObject),
	uintptr(dwDesiredAccess),
	uintptr(dwFileOffsetHigh),
	uintptr(dwFileOffsetLow),
	uintptr(dwNumberOfBytesToMap),
	uintptr(lpBaseAddress),
	uintptr(nndPreferred),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // MEMORY_MAPPED_VIEW_ADDRESS
function MapViewOfFileExNuma(
  hFileMappingObject: THandle;   // HANDLE
  dwDesiredAccess: DWORD;   // FILE_MAP
  dwFileOffsetHigh: DWORD;   // DWORD
  dwFileOffsetLow: DWORD;   // DWORD
  dwNumberOfBytesToMap: NativeUInt;   // UINT_PTR
  lpBaseAddress: Pointer;   // void* optional
  nndPreferred: DWORD   // DWORD
): MEMORY_MAPPED_VIEW_ADDRESS; stdcall;
  external 'KERNEL32.dll' name 'MapViewOfFileExNuma';
result := DllCall("KERNEL32\MapViewOfFileExNuma"
    , "Ptr", hFileMappingObject   ; HANDLE
    , "UInt", dwDesiredAccess   ; FILE_MAP
    , "UInt", dwFileOffsetHigh   ; DWORD
    , "UInt", dwFileOffsetLow   ; DWORD
    , "UPtr", dwNumberOfBytesToMap   ; UINT_PTR
    , "Ptr", lpBaseAddress   ; void* optional
    , "UInt", nndPreferred   ; DWORD
    , "Ptr")   ; return: MEMORY_MAPPED_VIEW_ADDRESS
●MapViewOfFileExNuma(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress, nndPreferred) = DLL("KERNEL32.dll", "void* MapViewOfFileExNuma(void*, dword, dword, dword, int, void*, dword)")
# 呼び出し: MapViewOfFileExNuma(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress, nndPreferred)
# hFileMappingObject : HANDLE -> "void*"
# dwDesiredAccess : FILE_MAP -> "dword"
# dwFileOffsetHigh : DWORD -> "dword"
# dwFileOffsetLow : DWORD -> "dword"
# dwNumberOfBytesToMap : UINT_PTR -> "int"
# lpBaseAddress : void* optional -> "void*"
# nndPreferred : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "kernel32" fn MapViewOfFileExNuma(
    hFileMappingObject: ?*anyopaque, // HANDLE
    dwDesiredAccess: u32, // FILE_MAP
    dwFileOffsetHigh: u32, // DWORD
    dwFileOffsetLow: u32, // DWORD
    dwNumberOfBytesToMap: usize, // UINT_PTR
    lpBaseAddress: ?*anyopaque, // void* optional
    nndPreferred: u32 // DWORD
) callconv(std.os.windows.WINAPI) MEMORY_MAPPED_VIEW_ADDRESS;
proc MapViewOfFileExNuma(
    hFileMappingObject: pointer,  # HANDLE
    dwDesiredAccess: uint32,  # FILE_MAP
    dwFileOffsetHigh: uint32,  # DWORD
    dwFileOffsetLow: uint32,  # DWORD
    dwNumberOfBytesToMap: uint,  # UINT_PTR
    lpBaseAddress: pointer,  # void* optional
    nndPreferred: uint32  # DWORD
): MEMORY_MAPPED_VIEW_ADDRESS {.importc: "MapViewOfFileExNuma", stdcall, dynlib: "KERNEL32.dll".}
pragma(lib, "kernel32");
extern(Windows)
MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileExNuma(
    void* hFileMappingObject,   // HANDLE
    uint dwDesiredAccess,   // FILE_MAP
    uint dwFileOffsetHigh,   // DWORD
    uint dwFileOffsetLow,   // DWORD
    size_t dwNumberOfBytesToMap,   // UINT_PTR
    void* lpBaseAddress,   // void* optional
    uint nndPreferred   // DWORD
);
ccall((:MapViewOfFileExNuma, "KERNEL32.dll"), stdcall, MEMORY_MAPPED_VIEW_ADDRESS,
      (Ptr{Cvoid}, UInt32, UInt32, UInt32, Csize_t, Ptr{Cvoid}, UInt32),
      hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress, nndPreferred)
# hFileMappingObject : HANDLE -> Ptr{Cvoid}
# dwDesiredAccess : FILE_MAP -> UInt32
# dwFileOffsetHigh : DWORD -> UInt32
# dwFileOffsetLow : DWORD -> UInt32
# dwNumberOfBytesToMap : UINT_PTR -> Csize_t
# lpBaseAddress : void* optional -> Ptr{Cvoid}
# nndPreferred : DWORD -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileExNuma(
    void* hFileMappingObject,
    uint32_t dwDesiredAccess,
    uint32_t dwFileOffsetHigh,
    uint32_t dwFileOffsetLow,
    uintptr_t dwNumberOfBytesToMap,
    void* lpBaseAddress,
    uint32_t nndPreferred);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.MapViewOfFileExNuma(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress, nndPreferred)
-- hFileMappingObject : HANDLE
-- dwDesiredAccess : FILE_MAP
-- dwFileOffsetHigh : DWORD
-- dwFileOffsetLow : DWORD
-- dwNumberOfBytesToMap : UINT_PTR
-- lpBaseAddress : void* optional
-- nndPreferred : DWORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const MapViewOfFileExNuma = lib.func('__stdcall', 'MapViewOfFileExNuma', 'MEMORY_MAPPED_VIEW_ADDRESS', ['void *', 'uint32_t', 'uint32_t', 'uint32_t', 'uintptr_t', 'void *', 'uint32_t']);
// MapViewOfFileExNuma(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress, nndPreferred)
// hFileMappingObject : HANDLE -> 'void *'
// dwDesiredAccess : FILE_MAP -> 'uint32_t'
// dwFileOffsetHigh : DWORD -> 'uint32_t'
// dwFileOffsetLow : DWORD -> 'uint32_t'
// dwNumberOfBytesToMap : UINT_PTR -> 'uintptr_t'
// lpBaseAddress : void* optional -> 'void *'
// nndPreferred : DWORD -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  MapViewOfFileExNuma: { parameters: ["pointer", "u32", "u32", "u32", "usize", "pointer", "u32"], result: "pointer" },
});
// lib.symbols.MapViewOfFileExNuma(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress, nndPreferred)
// hFileMappingObject : HANDLE -> "pointer"
// dwDesiredAccess : FILE_MAP -> "u32"
// dwFileOffsetHigh : DWORD -> "u32"
// dwFileOffsetLow : DWORD -> "u32"
// dwNumberOfBytesToMap : UINT_PTR -> "usize"
// lpBaseAddress : void* optional -> "pointer"
// nndPreferred : DWORD -> "u32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileExNuma(
    void* hFileMappingObject,
    uint32_t dwDesiredAccess,
    uint32_t dwFileOffsetHigh,
    uint32_t dwFileOffsetLow,
    size_t dwNumberOfBytesToMap,
    void* lpBaseAddress,
    uint32_t nndPreferred);
C, "KERNEL32.dll");
// $ffi->MapViewOfFileExNuma(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress, nndPreferred);
// hFileMappingObject : HANDLE
// dwDesiredAccess : FILE_MAP
// dwFileOffsetHigh : DWORD
// dwFileOffsetLow : DWORD
// dwNumberOfBytesToMap : UINT_PTR
// lpBaseAddress : void* optional
// nndPreferred : DWORD
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Kernel32 extends StdCallLibrary {
    Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class);
    MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileExNuma(
        Pointer hFileMappingObject,   // HANDLE
        int dwDesiredAccess,   // FILE_MAP
        int dwFileOffsetHigh,   // DWORD
        int dwFileOffsetLow,   // DWORD
        long dwNumberOfBytesToMap,   // UINT_PTR
        Pointer lpBaseAddress,   // void* optional
        int nndPreferred   // DWORD
    );
}
@[Link("kernel32")]
lib LibKERNEL32
  fun MapViewOfFileExNuma = MapViewOfFileExNuma(
    hFileMappingObject : Void*,   # HANDLE
    dwDesiredAccess : UInt32,   # FILE_MAP
    dwFileOffsetHigh : UInt32,   # DWORD
    dwFileOffsetLow : UInt32,   # DWORD
    dwNumberOfBytesToMap : LibC::SizeT,   # UINT_PTR
    lpBaseAddress : Void*,   # void* optional
    nndPreferred : UInt32   # DWORD
  ) : MEMORY_MAPPED_VIEW_ADDRESS
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef MapViewOfFileExNumaNative = MEMORY_MAPPED_VIEW_ADDRESS Function(Pointer<Void>, Uint32, Uint32, Uint32, UintPtr, Pointer<Void>, Uint32);
typedef MapViewOfFileExNumaDart = int Function(Pointer<Void>, int, int, int, int, Pointer<Void>, int);
final MapViewOfFileExNuma = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<MapViewOfFileExNumaNative, MapViewOfFileExNumaDart>('MapViewOfFileExNuma');
// hFileMappingObject : HANDLE -> Pointer<Void>
// dwDesiredAccess : FILE_MAP -> Uint32
// dwFileOffsetHigh : DWORD -> Uint32
// dwFileOffsetLow : DWORD -> Uint32
// dwNumberOfBytesToMap : UINT_PTR -> UintPtr
// lpBaseAddress : void* optional -> Pointer<Void>
// nndPreferred : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function MapViewOfFileExNuma(
  hFileMappingObject: THandle;   // HANDLE
  dwDesiredAccess: DWORD;   // FILE_MAP
  dwFileOffsetHigh: DWORD;   // DWORD
  dwFileOffsetLow: DWORD;   // DWORD
  dwNumberOfBytesToMap: NativeUInt;   // UINT_PTR
  lpBaseAddress: Pointer;   // void* optional
  nndPreferred: DWORD   // DWORD
): MEMORY_MAPPED_VIEW_ADDRESS; stdcall;
  external 'KERNEL32.dll' name 'MapViewOfFileExNuma';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "MapViewOfFileExNuma"
  c_MapViewOfFileExNuma :: Ptr () -> Word32 -> Word32 -> Word32 -> CUIntPtr -> Ptr () -> Word32 -> IO MEMORY_MAPPED_VIEW_ADDRESS
-- hFileMappingObject : HANDLE -> Ptr ()
-- dwDesiredAccess : FILE_MAP -> Word32
-- dwFileOffsetHigh : DWORD -> Word32
-- dwFileOffsetLow : DWORD -> Word32
-- dwNumberOfBytesToMap : UINT_PTR -> CUIntPtr
-- lpBaseAddress : void* optional -> Ptr ()
-- nndPreferred : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
-- ※値渡し構造体は GHC FFI で直接渡せません。Ptr で渡すラッパ(C側)経由にしてください。
open Ctypes
open Foreign

let mapviewoffileexnuma =
  foreign "MapViewOfFileExNuma"
    ((ptr void) @-> uint32_t @-> uint32_t @-> uint32_t @-> size_t @-> (ptr void) @-> uint32_t @-> returning MEMORY_MAPPED_VIEW_ADDRESS)
(* hFileMappingObject : HANDLE -> (ptr void) *)
(* dwDesiredAccess : FILE_MAP -> uint32_t *)
(* dwFileOffsetHigh : DWORD -> uint32_t *)
(* dwFileOffsetLow : DWORD -> uint32_t *)
(* dwNumberOfBytesToMap : UINT_PTR -> size_t *)
(* lpBaseAddress : void* optional -> (ptr void) *)
(* nndPreferred : DWORD -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("MapViewOfFileExNuma" map-view-of-file-ex-numa :convention :stdcall) (:struct memory-mapped-view-address)
  (h-file-mapping-object :pointer)   ; HANDLE
  (dw-desired-access :uint32)   ; FILE_MAP
  (dw-file-offset-high :uint32)   ; DWORD
  (dw-file-offset-low :uint32)   ; DWORD
  (dw-number-of-bytes-to-map :uint64)   ; UINT_PTR
  (lp-base-address :pointer)   ; void* optional
  (nnd-preferred :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $MapViewOfFileExNuma = Win32::API::More->new('KERNEL32',
    'LPVOID MapViewOfFileExNuma(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, WPARAM dwNumberOfBytesToMap, LPVOID lpBaseAddress, DWORD nndPreferred)');
# my $ret = $MapViewOfFileExNuma->Call($hFileMappingObject, $dwDesiredAccess, $dwFileOffsetHigh, $dwFileOffsetLow, $dwNumberOfBytesToMap, $lpBaseAddress, $nndPreferred);
# hFileMappingObject : HANDLE -> HANDLE
# dwDesiredAccess : FILE_MAP -> DWORD
# dwFileOffsetHigh : DWORD -> DWORD
# dwFileOffsetLow : DWORD -> DWORD
# dwNumberOfBytesToMap : UINT_PTR -> WPARAM
# lpBaseAddress : void* optional -> LPVOID
# nndPreferred : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型