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

MapViewOfFileEx

関数
ベースアドレスを指定してファイルマッピングのビューをマップする。
DLLKERNEL32.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

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

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

パラメーター

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

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

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

MapViewOfFileEx 関数とともに使用する場合、 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 の保護属性で作成されている必要があります。

MapViewOfFileEx とともに使用する場合、 (FILE_MAP_WRITE | FILE_MAP_READ) および FILE_MAP_ALL_ACCESSFILE_MAP_WRITE と同等です。

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

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

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

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

FILE_MAP_LARGE_PAGES
Windows 10 バージョン 1703 以降、このフラグはビューを ラージページサポートを使用してマップすることを指定します。ビューのサイズは、 GetLargePageMinimum 関数が報告するラージページのサイズの倍数である必要があり、ファイルマッピングオブジェクトは SEC_LARGE_PAGES オプションを使用して作成されている必要があります。lpBaseAddress に NULL 以外の値を指定する場合、その値は GetLargePageMinimum の倍数である必要があります。
FILE_MAP_EXECUTE
ファイルの実行可能ビューがマップされます (マップされたメモリをコードとして実行できます)。ファイルマッピングオブジェクトは、 PAGE_EXECUTE_READPAGE_EXECUTE_WRITECOPY、または PAGE_EXECUTE_READWRITE の保護属性で作成されている必要があります。

Windows Server 2003 および Windows XP: この値は、Windows XP with SP2 および Windows Server 2003 with SP1 以降で使用できます。

FILE_MAP_TARGETS_INVALID
マップされたファイル内のすべての位置を、Control Flow Guard (CFG) の無効なターゲットとして設定します。このフラグは PAGE_TARGETS_INVALID に似ています。このフラグは実行アクセス権 FILE_MAP_EXECUTE と組み合わせて使用します。これらのページ内の位置への間接呼び出しはすべて CFG チェックに失敗し、プロセスは終了します。割り当てられた実行可能ページの既定の動作は、CFG の有効な呼び出しターゲットとしてマークされることです。

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

ファイルマッピングオブジェクトへのアクセスの詳細については、 ファイルマッピングのセキュリティとアクセス権を参照してください。

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

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

lpBaseAddressNULL の場合、オペレーティングシステムがマッピングアドレスを選択します。この場合、関数は MapViewOfFile 関数と同等です。

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

戻り値の型: MEMORY_MAPPED_VIEW_ADDRESS

公式ドキュメント

ファイルマッピングのビューを、呼び出し元プロセスのアドレス空間にマップします。呼び出し元は、ビューの基準メモリアドレスの候補を任意で指定できます。

戻り値

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

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

解説(Remarks)

ファイルをマップすると、ファイルの指定した部分が呼び出し元プロセスのアドレス空間で参照できるようになります。

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

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

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

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

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

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

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

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

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

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

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

実行権限を持つファイルを使用するには、アプリケーションは CreateFileMappingPAGE_EXECUTE_READWRITE または PAGE_EXECUTE_READ のいずれかで呼び出し、その後 MapViewOfFileExFILE_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 MapViewOfFileEx(
    HANDLE hFileMappingObject,
    FILE_MAP dwDesiredAccess,
    DWORD dwFileOffsetHigh,
    DWORD dwFileOffsetLow,
    UINT_PTR dwNumberOfBytesToMap,
    void* lpBaseAddress   // optional
);
[DllImport("KERNEL32.dll", SetLastError = true, ExactSpelling = true)]
static extern MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileEx(
    IntPtr hFileMappingObject,   // HANDLE
    uint dwDesiredAccess,   // FILE_MAP
    uint dwFileOffsetHigh,   // DWORD
    uint dwFileOffsetLow,   // DWORD
    UIntPtr dwNumberOfBytesToMap,   // UINT_PTR
    IntPtr lpBaseAddress   // void* optional
);
<DllImport("KERNEL32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function MapViewOfFileEx(
    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
) As MEMORY_MAPPED_VIEW_ADDRESS
End Function
' hFileMappingObject : HANDLE
' dwDesiredAccess : FILE_MAP
' dwFileOffsetHigh : DWORD
' dwFileOffsetLow : DWORD
' dwNumberOfBytesToMap : UINT_PTR
' lpBaseAddress : void* optional
Declare PtrSafe Function MapViewOfFileEx 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) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

MapViewOfFileEx = ctypes.windll.kernel32.MapViewOfFileEx
MapViewOfFileEx.restype = ctypes.c_void_p
MapViewOfFileEx.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
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
MapViewOfFileEx = Fiddle::Function.new(
  lib['MapViewOfFileEx'],
  [
    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_VOIDP)
#[link(name = "kernel32")]
extern "system" {
    fn MapViewOfFileEx(
        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
    ) -> 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 MapViewOfFileEx(IntPtr hFileMappingObject, uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, UIntPtr dwNumberOfBytesToMap, IntPtr lpBaseAddress);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_MapViewOfFileEx' -Namespace Win32 -PassThru
# $api::MapViewOfFileEx(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress)
#uselib "KERNEL32.dll"
#func global MapViewOfFileEx "MapViewOfFileEx" sptr, sptr, sptr, sptr, sptr, sptr
; MapViewOfFileEx hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress   ; 戻り値は stat
; hFileMappingObject : HANDLE -> "sptr"
; dwDesiredAccess : FILE_MAP -> "sptr"
; dwFileOffsetHigh : DWORD -> "sptr"
; dwFileOffsetLow : DWORD -> "sptr"
; dwNumberOfBytesToMap : UINT_PTR -> "sptr"
; lpBaseAddress : void* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "KERNEL32.dll"
#cfunc global MapViewOfFileEx "MapViewOfFileEx" sptr, int, int, int, sptr, sptr
; res = MapViewOfFileEx(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress)
; hFileMappingObject : HANDLE -> "sptr"
; dwDesiredAccess : FILE_MAP -> "int"
; dwFileOffsetHigh : DWORD -> "int"
; dwFileOffsetLow : DWORD -> "int"
; dwNumberOfBytesToMap : UINT_PTR -> "sptr"
; lpBaseAddress : void* optional -> "sptr"
; MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileEx(HANDLE hFileMappingObject, FILE_MAP dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, UINT_PTR dwNumberOfBytesToMap, void* lpBaseAddress)
#uselib "KERNEL32.dll"
#cfunc global MapViewOfFileEx "MapViewOfFileEx" intptr, int, int, int, intptr, intptr
; res = MapViewOfFileEx(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress)
; hFileMappingObject : HANDLE -> "intptr"
; dwDesiredAccess : FILE_MAP -> "int"
; dwFileOffsetHigh : DWORD -> "int"
; dwFileOffsetLow : DWORD -> "int"
; dwNumberOfBytesToMap : UINT_PTR -> "intptr"
; lpBaseAddress : void* optional -> "intptr"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procMapViewOfFileEx = kernel32.NewProc("MapViewOfFileEx")
)

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

extern "kernel32" fn MapViewOfFileEx(
    hFileMappingObject: ?*anyopaque, // HANDLE
    dwDesiredAccess: u32, // FILE_MAP
    dwFileOffsetHigh: u32, // DWORD
    dwFileOffsetLow: u32, // DWORD
    dwNumberOfBytesToMap: usize, // UINT_PTR
    lpBaseAddress: ?*anyopaque // void* optional
) callconv(std.os.windows.WINAPI) MEMORY_MAPPED_VIEW_ADDRESS;
proc MapViewOfFileEx(
    hFileMappingObject: pointer,  # HANDLE
    dwDesiredAccess: uint32,  # FILE_MAP
    dwFileOffsetHigh: uint32,  # DWORD
    dwFileOffsetLow: uint32,  # DWORD
    dwNumberOfBytesToMap: uint,  # UINT_PTR
    lpBaseAddress: pointer  # void* optional
): MEMORY_MAPPED_VIEW_ADDRESS {.importc: "MapViewOfFileEx", stdcall, dynlib: "KERNEL32.dll".}
pragma(lib, "kernel32");
extern(Windows)
MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileEx(
    void* hFileMappingObject,   // HANDLE
    uint dwDesiredAccess,   // FILE_MAP
    uint dwFileOffsetHigh,   // DWORD
    uint dwFileOffsetLow,   // DWORD
    size_t dwNumberOfBytesToMap,   // UINT_PTR
    void* lpBaseAddress   // void* optional
);
ccall((:MapViewOfFileEx, "KERNEL32.dll"), stdcall, MEMORY_MAPPED_VIEW_ADDRESS,
      (Ptr{Cvoid}, UInt32, UInt32, UInt32, Csize_t, Ptr{Cvoid}),
      hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress)
# hFileMappingObject : HANDLE -> Ptr{Cvoid}
# dwDesiredAccess : FILE_MAP -> UInt32
# dwFileOffsetHigh : DWORD -> UInt32
# dwFileOffsetLow : DWORD -> UInt32
# dwNumberOfBytesToMap : UINT_PTR -> Csize_t
# lpBaseAddress : void* optional -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileEx(
    void* hFileMappingObject,
    uint32_t dwDesiredAccess,
    uint32_t dwFileOffsetHigh,
    uint32_t dwFileOffsetLow,
    uintptr_t dwNumberOfBytesToMap,
    void* lpBaseAddress);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.MapViewOfFileEx(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress)
-- hFileMappingObject : HANDLE
-- dwDesiredAccess : FILE_MAP
-- dwFileOffsetHigh : DWORD
-- dwFileOffsetLow : DWORD
-- dwNumberOfBytesToMap : UINT_PTR
-- lpBaseAddress : void* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const MapViewOfFileEx = lib.func('__stdcall', 'MapViewOfFileEx', 'MEMORY_MAPPED_VIEW_ADDRESS', ['void *', 'uint32_t', 'uint32_t', 'uint32_t', 'uintptr_t', 'void *']);
// MapViewOfFileEx(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress)
// 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 *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  MapViewOfFileEx: { parameters: ["pointer", "u32", "u32", "u32", "usize", "pointer"], result: "pointer" },
});
// lib.symbols.MapViewOfFileEx(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress)
// hFileMappingObject : HANDLE -> "pointer"
// dwDesiredAccess : FILE_MAP -> "u32"
// dwFileOffsetHigh : DWORD -> "u32"
// dwFileOffsetLow : DWORD -> "u32"
// dwNumberOfBytesToMap : UINT_PTR -> "usize"
// lpBaseAddress : void* optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
MEMORY_MAPPED_VIEW_ADDRESS MapViewOfFileEx(
    void* hFileMappingObject,
    uint32_t dwDesiredAccess,
    uint32_t dwFileOffsetHigh,
    uint32_t dwFileOffsetLow,
    size_t dwNumberOfBytesToMap,
    void* lpBaseAddress);
C, "KERNEL32.dll");
// $ffi->MapViewOfFileEx(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress);
// hFileMappingObject : HANDLE
// dwDesiredAccess : FILE_MAP
// dwFileOffsetHigh : DWORD
// dwFileOffsetLow : DWORD
// dwNumberOfBytesToMap : UINT_PTR
// lpBaseAddress : void* optional
// 構造体/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 MapViewOfFileEx(
        Pointer hFileMappingObject,   // HANDLE
        int dwDesiredAccess,   // FILE_MAP
        int dwFileOffsetHigh,   // DWORD
        int dwFileOffsetLow,   // DWORD
        long dwNumberOfBytesToMap,   // UINT_PTR
        Pointer lpBaseAddress   // void* optional
    );
}
@[Link("kernel32")]
lib LibKERNEL32
  fun MapViewOfFileEx = MapViewOfFileEx(
    hFileMappingObject : Void*,   # HANDLE
    dwDesiredAccess : UInt32,   # FILE_MAP
    dwFileOffsetHigh : UInt32,   # DWORD
    dwFileOffsetLow : UInt32,   # DWORD
    dwNumberOfBytesToMap : LibC::SizeT,   # UINT_PTR
    lpBaseAddress : Void*   # void* optional
  ) : 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 MapViewOfFileExNative = MEMORY_MAPPED_VIEW_ADDRESS Function(Pointer<Void>, Uint32, Uint32, Uint32, UintPtr, Pointer<Void>);
typedef MapViewOfFileExDart = int Function(Pointer<Void>, int, int, int, int, Pointer<Void>);
final MapViewOfFileEx = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<MapViewOfFileExNative, MapViewOfFileExDart>('MapViewOfFileEx');
// hFileMappingObject : HANDLE -> Pointer<Void>
// dwDesiredAccess : FILE_MAP -> Uint32
// dwFileOffsetHigh : DWORD -> Uint32
// dwFileOffsetLow : DWORD -> Uint32
// dwNumberOfBytesToMap : UINT_PTR -> UintPtr
// lpBaseAddress : void* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function MapViewOfFileEx(
  hFileMappingObject: THandle;   // HANDLE
  dwDesiredAccess: DWORD;   // FILE_MAP
  dwFileOffsetHigh: DWORD;   // DWORD
  dwFileOffsetLow: DWORD;   // DWORD
  dwNumberOfBytesToMap: NativeUInt;   // UINT_PTR
  lpBaseAddress: Pointer   // void* optional
): MEMORY_MAPPED_VIEW_ADDRESS; stdcall;
  external 'KERNEL32.dll' name 'MapViewOfFileEx';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "MapViewOfFileEx"
  c_MapViewOfFileEx :: Ptr () -> Word32 -> Word32 -> Word32 -> CUIntPtr -> Ptr () -> 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 ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
-- ※値渡し構造体は GHC FFI で直接渡せません。Ptr で渡すラッパ(C側)経由にしてください。
open Ctypes
open Foreign

let mapviewoffileex =
  foreign "MapViewOfFileEx"
    ((ptr void) @-> uint32_t @-> uint32_t @-> uint32_t @-> size_t @-> (ptr void) @-> 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) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("MapViewOfFileEx" map-view-of-file-ex :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
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $MapViewOfFileEx = Win32::API::More->new('KERNEL32',
    'LPVOID MapViewOfFileEx(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, WPARAM dwNumberOfBytesToMap, LPVOID lpBaseAddress)');
# my $ret = $MapViewOfFileEx->Call($hFileMappingObject, $dwDesiredAccess, $dwFileOffsetHigh, $dwFileOffsetLow, $dwNumberOfBytesToMap, $lpBaseAddress);
# hFileMappingObject : HANDLE -> HANDLE
# dwDesiredAccess : FILE_MAP -> DWORD
# dwFileOffsetHigh : DWORD -> DWORD
# dwFileOffsetLow : DWORD -> DWORD
# dwNumberOfBytesToMap : UINT_PTR -> WPARAM
# lpBaseAddress : void* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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