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

CreateFileMappingNumaW

関数
NUMAノードを指定してファイルマッピングオブジェクトを作成する(Unicode版)。
DLLKERNEL32.dll文字セットUnicode (-W)呼出規約winapiSetLastErrorあり対応OSWindows Vista 以降

シグネチャ

// KERNEL32.dll  (Unicode / -W)
#include <windows.h>

HANDLE CreateFileMappingNumaW(
    HANDLE hFile,
    SECURITY_ATTRIBUTES* lpFileMappingAttributes,   // optional
    PAGE_PROTECTION_FLAGS flProtect,
    DWORD dwMaximumSizeHigh,
    DWORD dwMaximumSizeLow,
    LPCWSTR lpName,   // optional
    DWORD nndPreferred
);

パラメーター

名前方向説明
hFileHANDLEin

ファイルマッピングオブジェクトの作成元となるファイルのハンドル。

ファイルは、flProtect パラメーターで指定する保護フラグと互換性のあるアクセス権で開く必要があります。マップする予定のファイルを排他アクセスで開くことは必須ではありませんが、推奨されます。詳細については、File Security and Access Rights を参照してください。

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

lpFileMappingAttributesSECURITY_ATTRIBUTES*inoptional

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

lpFileMappingAttributesNULL の場合、ハンドルは継承できず、ファイルマッピングオブジェクトには既定のセキュリティ記述子が割り当てられます。ファイルマッピングオブジェクトの既定のセキュリティ記述子内のアクセス制御リスト (ACL) は、作成者のプライマリトークンまたは偽装トークンに由来します。詳細については、File Mapping Security and Access Rights を参照してください。

flProtectPAGE_PROTECTION_FLAGSin

ファイルマッピングオブジェクトのページ保護を指定します。オブジェクトのすべてのマップされたビューは、この保護と互換性がある必要があります。

このパラメーターには、次のいずれかの値を指定できます。

意味
PAGE_EXECUTE_READ
0x20
ビューを読み取り専用、コピーオンライト、または実行アクセスでマップできるようにします。

hFile パラメーターで指定するファイルハンドルは、GENERIC_READ および GENERIC_EXECUTE アクセス権で作成する必要があります。

PAGE_EXECUTE_READWRITE
0x40
ビューを読み取り専用、コピーオンライト、読み取り/書き込み、または実行アクセスでマップできるようにします。

hFile パラメーターで指定するファイルハンドルは、GENERIC_READGENERIC_WRITE、および GENERIC_EXECUTE アクセス権で作成する必要があります。

PAGE_EXECUTE_WRITECOPY
0x80
ビューを読み取り専用、コピーオンライト、または実行アクセスでマップできるようにします。この値は PAGE_EXECUTE_READ と同等です。

hFile パラメーターで指定するファイルハンドルは、GENERIC_READ および GENERIC_EXECUTE アクセス権で作成する必要があります。

Windows Vista: この値は Windows Vista with SP1 まで使用できません。

PAGE_READONLY
0x02
ビューを読み取り専用またはコピーオンライトアクセスでマップできるようにします。特定の領域への書き込みを試みると、アクセス違反が発生します。

hFile パラメーターで指定するファイルハンドルは、GENERIC_READ アクセス権で作成する必要があります。

PAGE_READWRITE
0x04
ビューを読み取り専用、コピーオンライト、または読み取り/書き込みアクセスでマップできるようにします。

hFile パラメーターで指定するファイルハンドルは、GENERIC_READ および GENERIC_WRITE アクセス権で作成する必要があります。

PAGE_WRITECOPY
0x08
ビューを読み取り専用またはコピーオンライトアクセスでマップできるようにします。この値は PAGE_READONLY と同等です。

hFile パラメーターで指定するファイルハンドルは、GENERIC_READ アクセス権で作成する必要があります。

アプリケーションは、上記のページ保護値のいずれかと組み合わせることで、ファイルマッピングオブジェクトに対して次の属性を 1 つ以上指定できます。

意味
SEC_COMMIT
0x8000000
すべてのページに対して、メモリまたはページングファイル内に物理ストレージを割り当てます。

これが既定の設定です。

SEC_IMAGE
0x1000000
指定したファイルを実行可能イメージファイルとして設定します。

SEC_IMAGE 属性は、PAGE_READONLY などのページ保護値と組み合わせる必要があります。ただし、このページ保護値は実行可能イメージファイルのビューには影響しません。実行可能イメージファイルのビューのページ保護は、実行可能ファイル自体によって決定されます。

SEC_IMAGE と組み合わせて有効な属性は他にありません。

SEC_IMAGE_NO_EXECUTE
0x11000000
hFile パラメーターで指定したファイルが、実行されない実行可能イメージファイルであり、読み込まれたイメージファイルに対して強制整合性チェックが実行されないことを指定します。さらに、SEC_IMAGE_NO_EXECUTE 属性で作成されたファイルマッピングオブジェクトのビューをマップしても、PsSetLoadImageNotifyRoutine カーネル API を使用して登録されたドライバーコールバックは呼び出されません。

SEC_IMAGE_NO_EXECUTE 属性は、PAGE_READONLY ページ保護値と組み合わせる必要があります。SEC_IMAGE_NO_EXECUTE と組み合わせて有効な属性は他にありません。

Windows Server 2008 R2、Windows 7、Windows Server 2008、および Windows Vista: この値は Windows Server 2012 および Windows 8 より前ではサポートされていません。

SEC_LARGE_PAGES
0x80000000
イメージのマッピング時、またはページファイルからのバッキング時にラージページを使用できるようにしますが、通常のファイルのデータをマップする際には使用できません。ファイルマッピングオブジェクトの最大サイズを、GetLargePageMinimum 関数が報告するラージページの最小サイズとして指定し、SeLockMemoryPrivilege 特権を有効にしてください。
SEC_NOCACHE
0x10000000
すべてのページをキャッシュ不可に設定します。

アプリケーションは、デバイスのために明示的に必要な場合を除き、このフラグを使用すべきではありません。SEC_NOCACHE でマップされたメモリにインターロック関数を使用すると、EXCEPTION_ILLEGAL_INSTRUCTION 例外が発生する可能性があります。

SEC_NOCACHE には、SEC_RESERVE または SEC_COMMIT のいずれかの設定が必要です。

SEC_RESERVE
0x4000000
物理ストレージを割り当てずに、すべてのページを予約します。

予約されたページの範囲は、その範囲が解放されるまで、他の割り当て操作で使用することはできません。

予約されたページは、その後の VirtualAllocExNuma 関数の呼び出しで識別できます。この属性は、hFile パラメーターが INVALID_HANDLE_VALUE である場合 (つまり、システムのページングファイルによってバックアップされるファイルマッピングオブジェクトの場合) にのみ有効です。

SEC_WRITECOMBINE
0x40000000
すべてのページをライトコンバイン (書き込み結合) に設定します。

アプリケーションは、デバイスのために明示的に必要な場合を除き、この属性を使用すべきではありません。SEC_WRITECOMBINE でマップされたメモリにインターロック関数を使用すると、EXCEPTION_ILLEGAL_INSTRUCTION 例外が発生する可能性があります。

SEC_WRITECOMBINE には、SEC_RESERVE または SEC_COMMIT のいずれかの属性が設定されている必要があります。

dwMaximumSizeHighDWORDinファイルマッピングオブジェクトの最大サイズの上位 DWORD
dwMaximumSizeLowDWORDin

ファイルマッピングオブジェクトの最大サイズの下位 DWORD

このパラメーターと dwMaximumSizeHigh パラメーターがともに 0 (ゼロ) の場合、ファイルマッピングオブジェクトの最大サイズは、hFile パラメーターが識別するファイルの現在のサイズと等しくなります。

長さが 0 (ゼロ) のファイルをマップしようとすると、エラーコード ERROR_FILE_INVALID で失敗します。アプリケーションは、長さが 0 (ゼロ) のファイルをテストし、それらのファイルを拒否すべきです。

lpNameLPCWSTRinoptional

ファイルマッピングオブジェクトの名前。

このパラメーターが既存のファイルマッピングオブジェクトの名前と一致する場合、関数は flProtect パラメーターで指定された保護でそのオブジェクトへのアクセスを要求します。

このパラメーターが NULL の場合、ファイルマッピングオブジェクトは名前なしで作成されます。

lpName パラメーターが、既存のイベント、セマフォ、ミューテックス、待機可能タイマー、またはジョブオブジェクトの名前と一致する場合、関数は失敗し、GetLastError 関数は ERROR_INVALID_HANDLE を返します。これは、これらのオブジェクトが同じ名前空間を共有しているために発生します。

名前には、グローバル名前空間またはセッション名前空間に明示的にオブジェクトを作成するために、"Global" または "Local" のプレフィックスを付けることができます。名前の残りの部分には、バックスラッシュ文字 (\) を除く任意の文字を含めることができます。グローバル名前空間にファイルマッピングオブジェクトを作成するには、SeCreateGlobalPrivilege 特権が必要です。詳細については、Kernel Object Namespaces を参照してください。

ファストユーザースイッチは、ターミナルサービスのセッションを使用して実装されています。最初にログオンするユーザーはセッション 0 (ゼロ) を使用し、次にログオンするユーザーはセッション 1 (1) を使用する、というように続きます。アプリケーションが複数のユーザーをサポートできるように、カーネルオブジェクト名はガイドラインに従う必要があります。

nndPreferredDWORDin

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

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

戻り値の型: HANDLE

公式ドキュメント

指定したファイルに対して、名前付きまたは名前なしのファイルマッピングオブジェクトを作成または開き、物理メモリを配置する NUMA ノードを指定します。(CreateFileMappingNumaW)

戻り値

関数が成功すると、戻り値はファイルマッピングオブジェクトへのハンドルになります。

関数呼び出し前にオブジェクトが存在していた場合、関数は既存のオブジェクトへのハンドル (指定したサイズではなく現在のサイズを持つ) を返し、GetLastError 関数は ERROR_ALREADY_EXISTS を返します。

関数が失敗すると、戻り値は NULL になります。拡張エラー情報を取得するには、GetLastError 関数を呼び出してください。

解説(Remarks)

ファイルマッピングオブジェクトの作成後、ファイルのサイズがファイルマッピングオブジェクトのサイズを超えてはなりません。超えた場合、ファイルの内容のすべてが共有可能になるわけではありません。

ファイルマッピングオブジェクトは、複製、継承、または名前によって共有できます。ページファイルによってバックアップされるファイルマッピングオブジェクト内のページの初期内容は 0 (ゼロ) です。

アプリケーションが、ディスク上の実際の名前付きファイルのサイズより大きいサイズをファイルマッピングオブジェクトに指定し、かつページ保護が書き込みアクセスを許可している場合 (つまり、flProtect パラメーターが PAGE_READWRITE または PAGE_EXECUTE_READWRITE を指定している場合)、ディスク上のファイルはファイルマッピングオブジェクトの指定されたサイズに合わせて拡張されます。ファイルが拡張された場合、ファイルの古い末尾と新しい末尾の間の内容がゼロであることは保証されません。その動作はファイルシステムによって定義されます。

ファイルを拡張できない場合、ファイルマッピングオブジェクトの作成に失敗し、GetLastError 関数は ERROR_DISK_FULL を返します。

CreateFileMappingNuma 関数が返すハンドルは、新しいファイルマッピングオブジェクトへのフルアクセスを持ち、ファイルマッピングオブジェクトへのハンドルを必要とする任意の関数で使用できます。ファイルマッピングオブジェクトは、プロセスの作成、ハンドルの複製、または名前を通じて共有できます。詳細については、DuplicateHandle 関数および OpenFileMapping 関数を参照してください。

ファイルマッピングオブジェクトを作成すると、ファイルのビューをマップする可能性が生じますが、ビューがマップされるわけではありません。MapViewOfFileExNuma 関数が、ファイルのビューをプロセスのアドレス空間にマップします。

1 つの重要な例外を除き、単一のファイルマッピングオブジェクトから派生したファイルビューは、特定の時点でコヒーレント (整合) しており、同一です。複数のプロセスが同じファイルマッピングオブジェクトのハンドルを持っている場合、それらがファイルのビューをマップすると、データのコヒーレントなビューが見えます。

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

マップされたファイルと、入出力 (I/O) 関数 (ReadFile および WriteFile) を使用してアクセスされるファイルは、必ずしもコヒーレントではありません。

ファイルマッピングオブジェクトを完全に閉じるには、アプリケーションは UnmapViewOfFile 関数を呼び出してファイルマッピングオブジェクトのマップされたすべてのビューのマッピングを解除し、その後 CloseHandle 関数を呼び出してファイルマッピングオブジェクトのハンドルを閉じる必要があります。

これらの関数は任意の順序で呼び出すことができます。UnmapViewOfFile 関数の呼び出しが必要なのは、ファイルマッピングオブジェクトのマップされたビューがオブジェクトへの内部的な開いたハンドルを保持しており、ファイルマッピングオブジェクトは、それへのすべての開いたハンドルが閉じられるまで閉じないためです。

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

セッション 0 以外のセッションからファイルマッピングオブジェクトを作成するには、SeCreateGlobalPrivilege 特権が必要です。この特権チェックはファイルマッピングオブジェクトの作成に限定され、既存のオブジェクトを開く際には適用されないことに注意してください。たとえば、サービスまたはシステムがファイルマッピングオブジェクトを作成した場合、呼び出し側が必要なアクセス権を持っていれば、任意のセッションで実行されている任意のプロセスがそのファイルマッピングオブジェクトにアクセスできます。

メモリマップされたビューに対して書き込みまたは読み取りを行うコードは、構造化例外処理を使用して保護してください。詳細については、Reading and Writing From a File View を参照してください。

実行可能アクセス権を持つマッピングを行うには、アプリケーションは PAGE_EXECUTE_READWRITE または PAGE_EXECUTE_READ のいずれかを指定して CreateFileMappingNuma 関数を呼び出し、その後 FILE_MAP_EXECUTE | FILE_MAP_WRITE または FILE_MAP_EXECUTE | FILE_MAP_READ を指定して MapViewOfFileExNuma 関数を呼び出す必要があります。

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  (Unicode / -W)
#include <windows.h>

HANDLE CreateFileMappingNumaW(
    HANDLE hFile,
    SECURITY_ATTRIBUTES* lpFileMappingAttributes,   // optional
    PAGE_PROTECTION_FLAGS flProtect,
    DWORD dwMaximumSizeHigh,
    DWORD dwMaximumSizeLow,
    LPCWSTR lpName,   // optional
    DWORD nndPreferred
);
[DllImport("KERNEL32.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
static extern IntPtr CreateFileMappingNumaW(
    IntPtr hFile,   // HANDLE
    IntPtr lpFileMappingAttributes,   // SECURITY_ATTRIBUTES* optional
    uint flProtect,   // PAGE_PROTECTION_FLAGS
    uint dwMaximumSizeHigh,   // DWORD
    uint dwMaximumSizeLow,   // DWORD
    [MarshalAs(UnmanagedType.LPWStr)] string lpName,   // LPCWSTR optional
    uint nndPreferred   // DWORD
);
<DllImport("KERNEL32.dll", CharSet:=CharSet.Unicode, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function CreateFileMappingNumaW(
    hFile As IntPtr,   ' HANDLE
    lpFileMappingAttributes As IntPtr,   ' SECURITY_ATTRIBUTES* optional
    flProtect As UInteger,   ' PAGE_PROTECTION_FLAGS
    dwMaximumSizeHigh As UInteger,   ' DWORD
    dwMaximumSizeLow As UInteger,   ' DWORD
    <MarshalAs(UnmanagedType.LPWStr)> lpName As String,   ' LPCWSTR optional
    nndPreferred As UInteger   ' DWORD
) As IntPtr
End Function
' hFile : HANDLE
' lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional
' flProtect : PAGE_PROTECTION_FLAGS
' dwMaximumSizeHigh : DWORD
' dwMaximumSizeLow : DWORD
' lpName : LPCWSTR optional
' nndPreferred : DWORD
Declare PtrSafe Function CreateFileMappingNumaW Lib "kernel32" ( _
    ByVal hFile As LongPtr, _
    ByVal lpFileMappingAttributes As LongPtr, _
    ByVal flProtect As Long, _
    ByVal dwMaximumSizeHigh As Long, _
    ByVal dwMaximumSizeLow As Long, _
    ByVal lpName As LongPtr, _
    ByVal nndPreferred As Long) As LongPtr
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CreateFileMappingNumaW = ctypes.windll.kernel32.CreateFileMappingNumaW
CreateFileMappingNumaW.restype = ctypes.c_void_p
CreateFileMappingNumaW.argtypes = [
    wintypes.HANDLE,  # hFile : HANDLE
    ctypes.c_void_p,  # lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional
    wintypes.DWORD,  # flProtect : PAGE_PROTECTION_FLAGS
    wintypes.DWORD,  # dwMaximumSizeHigh : DWORD
    wintypes.DWORD,  # dwMaximumSizeLow : DWORD
    wintypes.LPCWSTR,  # lpName : LPCWSTR 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')
CreateFileMappingNumaW = Fiddle::Function.new(
  lib['CreateFileMappingNumaW'],
  [
    Fiddle::TYPE_VOIDP,  # hFile : HANDLE
    Fiddle::TYPE_VOIDP,  # lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional
    -Fiddle::TYPE_INT,  # flProtect : PAGE_PROTECTION_FLAGS
    -Fiddle::TYPE_INT,  # dwMaximumSizeHigh : DWORD
    -Fiddle::TYPE_INT,  # dwMaximumSizeLow : DWORD
    Fiddle::TYPE_VOIDP,  # lpName : LPCWSTR optional
    -Fiddle::TYPE_INT,  # nndPreferred : DWORD
  ],
  Fiddle::TYPE_VOIDP)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "kernel32")]
extern "system" {
    fn CreateFileMappingNumaW(
        hFile: *mut core::ffi::c_void,  // HANDLE
        lpFileMappingAttributes: *mut SECURITY_ATTRIBUTES,  // SECURITY_ATTRIBUTES* optional
        flProtect: u32,  // PAGE_PROTECTION_FLAGS
        dwMaximumSizeHigh: u32,  // DWORD
        dwMaximumSizeLow: u32,  // DWORD
        lpName: *const u16,  // LPCWSTR optional
        nndPreferred: u32  // DWORD
    ) -> *mut core::ffi::c_void;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("KERNEL32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr CreateFileMappingNumaW(IntPtr hFile, IntPtr lpFileMappingAttributes, uint flProtect, uint dwMaximumSizeHigh, uint dwMaximumSizeLow, [MarshalAs(UnmanagedType.LPWStr)] string lpName, uint nndPreferred);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_CreateFileMappingNumaW' -Namespace Win32 -PassThru
# $api::CreateFileMappingNumaW(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred)
#uselib "KERNEL32.dll"
#func global CreateFileMappingNumaW "CreateFileMappingNumaW" wptr, wptr, wptr, wptr, wptr, wptr, wptr
; CreateFileMappingNumaW hFile, varptr(lpFileMappingAttributes), flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred   ; 戻り値は stat
; hFile : HANDLE -> "wptr"
; lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> "wptr"
; flProtect : PAGE_PROTECTION_FLAGS -> "wptr"
; dwMaximumSizeHigh : DWORD -> "wptr"
; dwMaximumSizeLow : DWORD -> "wptr"
; lpName : LPCWSTR optional -> "wptr"
; nndPreferred : DWORD -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "KERNEL32.dll"
#cfunc global CreateFileMappingNumaW "CreateFileMappingNumaW" sptr, var, int, int, int, wstr, int
; res = CreateFileMappingNumaW(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred)
; hFile : HANDLE -> "sptr"
; lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> "var"
; flProtect : PAGE_PROTECTION_FLAGS -> "int"
; dwMaximumSizeHigh : DWORD -> "int"
; dwMaximumSizeLow : DWORD -> "int"
; lpName : LPCWSTR optional -> "wstr"
; nndPreferred : DWORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HANDLE CreateFileMappingNumaW(HANDLE hFile, SECURITY_ATTRIBUTES* lpFileMappingAttributes, PAGE_PROTECTION_FLAGS flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCWSTR lpName, DWORD nndPreferred)
#uselib "KERNEL32.dll"
#cfunc global CreateFileMappingNumaW "CreateFileMappingNumaW" intptr, var, int, int, int, wstr, int
; res = CreateFileMappingNumaW(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred)
; hFile : HANDLE -> "intptr"
; lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> "var"
; flProtect : PAGE_PROTECTION_FLAGS -> "int"
; dwMaximumSizeHigh : DWORD -> "int"
; dwMaximumSizeLow : DWORD -> "int"
; lpName : LPCWSTR optional -> "wstr"
; nndPreferred : DWORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procCreateFileMappingNumaW = kernel32.NewProc("CreateFileMappingNumaW")
)

// hFile (HANDLE), lpFileMappingAttributes (SECURITY_ATTRIBUTES* optional), flProtect (PAGE_PROTECTION_FLAGS), dwMaximumSizeHigh (DWORD), dwMaximumSizeLow (DWORD), lpName (LPCWSTR optional), nndPreferred (DWORD)
r1, _, err := procCreateFileMappingNumaW.Call(
	uintptr(hFile),
	uintptr(lpFileMappingAttributes),
	uintptr(flProtect),
	uintptr(dwMaximumSizeHigh),
	uintptr(dwMaximumSizeLow),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpName))),
	uintptr(nndPreferred),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HANDLE
function CreateFileMappingNumaW(
  hFile: THandle;   // HANDLE
  lpFileMappingAttributes: Pointer;   // SECURITY_ATTRIBUTES* optional
  flProtect: DWORD;   // PAGE_PROTECTION_FLAGS
  dwMaximumSizeHigh: DWORD;   // DWORD
  dwMaximumSizeLow: DWORD;   // DWORD
  lpName: PWideChar;   // LPCWSTR optional
  nndPreferred: DWORD   // DWORD
): THandle; stdcall;
  external 'KERNEL32.dll' name 'CreateFileMappingNumaW';
result := DllCall("KERNEL32\CreateFileMappingNumaW"
    , "Ptr", hFile   ; HANDLE
    , "Ptr", lpFileMappingAttributes   ; SECURITY_ATTRIBUTES* optional
    , "UInt", flProtect   ; PAGE_PROTECTION_FLAGS
    , "UInt", dwMaximumSizeHigh   ; DWORD
    , "UInt", dwMaximumSizeLow   ; DWORD
    , "WStr", lpName   ; LPCWSTR optional
    , "UInt", nndPreferred   ; DWORD
    , "Ptr")   ; return: HANDLE
●CreateFileMappingNumaW(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred) = DLL("KERNEL32.dll", "void* CreateFileMappingNumaW(void*, void*, dword, dword, dword, char*, dword)")
# 呼び出し: CreateFileMappingNumaW(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred)
# hFile : HANDLE -> "void*"
# lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> "void*"
# flProtect : PAGE_PROTECTION_FLAGS -> "dword"
# dwMaximumSizeHigh : DWORD -> "dword"
# dwMaximumSizeLow : DWORD -> "dword"
# lpName : LPCWSTR optional -> "char*"
# nndPreferred : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "kernel32" fn CreateFileMappingNumaW(
    hFile: ?*anyopaque, // HANDLE
    lpFileMappingAttributes: [*c]SECURITY_ATTRIBUTES, // SECURITY_ATTRIBUTES* optional
    flProtect: u32, // PAGE_PROTECTION_FLAGS
    dwMaximumSizeHigh: u32, // DWORD
    dwMaximumSizeLow: u32, // DWORD
    lpName: [*c]const u16, // LPCWSTR optional
    nndPreferred: u32 // DWORD
) callconv(std.os.windows.WINAPI) ?*anyopaque;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc CreateFileMappingNumaW(
    hFile: pointer,  # HANDLE
    lpFileMappingAttributes: ptr SECURITY_ATTRIBUTES,  # SECURITY_ATTRIBUTES* optional
    flProtect: uint32,  # PAGE_PROTECTION_FLAGS
    dwMaximumSizeHigh: uint32,  # DWORD
    dwMaximumSizeLow: uint32,  # DWORD
    lpName: WideCString,  # LPCWSTR optional
    nndPreferred: uint32  # DWORD
): pointer {.importc: "CreateFileMappingNumaW", stdcall, dynlib: "KERNEL32.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "kernel32");
extern(Windows)
void* CreateFileMappingNumaW(
    void* hFile,   // HANDLE
    SECURITY_ATTRIBUTES* lpFileMappingAttributes,   // SECURITY_ATTRIBUTES* optional
    uint flProtect,   // PAGE_PROTECTION_FLAGS
    uint dwMaximumSizeHigh,   // DWORD
    uint dwMaximumSizeLow,   // DWORD
    const(wchar)* lpName,   // LPCWSTR optional
    uint nndPreferred   // DWORD
);
ccall((:CreateFileMappingNumaW, "KERNEL32.dll"), stdcall, Ptr{Cvoid},
      (Ptr{Cvoid}, Ptr{SECURITY_ATTRIBUTES}, UInt32, UInt32, UInt32, Cwstring, UInt32),
      hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred)
# hFile : HANDLE -> Ptr{Cvoid}
# lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> Ptr{SECURITY_ATTRIBUTES}
# flProtect : PAGE_PROTECTION_FLAGS -> UInt32
# dwMaximumSizeHigh : DWORD -> UInt32
# dwMaximumSizeLow : DWORD -> UInt32
# lpName : LPCWSTR optional -> Cwstring
# nndPreferred : DWORD -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
void* CreateFileMappingNumaW(
    void* hFile,
    void* lpFileMappingAttributes,
    uint32_t flProtect,
    uint32_t dwMaximumSizeHigh,
    uint32_t dwMaximumSizeLow,
    const uint16_t* lpName,
    uint32_t nndPreferred);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.CreateFileMappingNumaW(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred)
-- hFile : HANDLE
-- lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional
-- flProtect : PAGE_PROTECTION_FLAGS
-- dwMaximumSizeHigh : DWORD
-- dwMaximumSizeLow : DWORD
-- lpName : LPCWSTR optional
-- nndPreferred : DWORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const CreateFileMappingNumaW = lib.func('__stdcall', 'CreateFileMappingNumaW', 'void *', ['void *', 'void *', 'uint32_t', 'uint32_t', 'uint32_t', 'str16', 'uint32_t']);
// CreateFileMappingNumaW(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred)
// hFile : HANDLE -> 'void *'
// lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> 'void *'
// flProtect : PAGE_PROTECTION_FLAGS -> 'uint32_t'
// dwMaximumSizeHigh : DWORD -> 'uint32_t'
// dwMaximumSizeLow : DWORD -> 'uint32_t'
// lpName : LPCWSTR optional -> 'str16'
// nndPreferred : DWORD -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  CreateFileMappingNumaW: { parameters: ["pointer", "pointer", "u32", "u32", "u32", "buffer", "u32"], result: "pointer" },
});
// lib.symbols.CreateFileMappingNumaW(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred)
// hFile : HANDLE -> "pointer"
// lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> "pointer"
// flProtect : PAGE_PROTECTION_FLAGS -> "u32"
// dwMaximumSizeHigh : DWORD -> "u32"
// dwMaximumSizeLow : DWORD -> "u32"
// lpName : LPCWSTR optional -> "buffer"
// nndPreferred : DWORD -> "u32"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void* CreateFileMappingNumaW(
    void* hFile,
    void* lpFileMappingAttributes,
    uint32_t flProtect,
    uint32_t dwMaximumSizeHigh,
    uint32_t dwMaximumSizeLow,
    const uint16_t* lpName,
    uint32_t nndPreferred);
C, "KERNEL32.dll");
// $ffi->CreateFileMappingNumaW(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred);
// hFile : HANDLE
// lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional
// flProtect : PAGE_PROTECTION_FLAGS
// dwMaximumSizeHigh : DWORD
// dwMaximumSizeLow : DWORD
// lpName : LPCWSTR 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, W32APIOptions.UNICODE_OPTIONS);
    Pointer CreateFileMappingNumaW(
        Pointer hFile,   // HANDLE
        Pointer lpFileMappingAttributes,   // SECURITY_ATTRIBUTES* optional
        int flProtect,   // PAGE_PROTECTION_FLAGS
        int dwMaximumSizeHigh,   // DWORD
        int dwMaximumSizeLow,   // DWORD
        WString lpName,   // LPCWSTR optional
        int nndPreferred   // DWORD
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("kernel32")]
lib LibKERNEL32
  fun CreateFileMappingNumaW = CreateFileMappingNumaW(
    hFile : Void*,   # HANDLE
    lpFileMappingAttributes : SECURITY_ATTRIBUTES*,   # SECURITY_ATTRIBUTES* optional
    flProtect : UInt32,   # PAGE_PROTECTION_FLAGS
    dwMaximumSizeHigh : UInt32,   # DWORD
    dwMaximumSizeLow : UInt32,   # DWORD
    lpName : UInt16*,   # LPCWSTR optional
    nndPreferred : UInt32   # DWORD
  ) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef CreateFileMappingNumaWNative = Pointer<Void> Function(Pointer<Void>, Pointer<Void>, Uint32, Uint32, Uint32, Pointer<Utf16>, Uint32);
typedef CreateFileMappingNumaWDart = Pointer<Void> Function(Pointer<Void>, Pointer<Void>, int, int, int, Pointer<Utf16>, int);
final CreateFileMappingNumaW = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<CreateFileMappingNumaWNative, CreateFileMappingNumaWDart>('CreateFileMappingNumaW');
// hFile : HANDLE -> Pointer<Void>
// lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> Pointer<Void>
// flProtect : PAGE_PROTECTION_FLAGS -> Uint32
// dwMaximumSizeHigh : DWORD -> Uint32
// dwMaximumSizeLow : DWORD -> Uint32
// lpName : LPCWSTR optional -> Pointer<Utf16>
// nndPreferred : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CreateFileMappingNumaW(
  hFile: THandle;   // HANDLE
  lpFileMappingAttributes: Pointer;   // SECURITY_ATTRIBUTES* optional
  flProtect: DWORD;   // PAGE_PROTECTION_FLAGS
  dwMaximumSizeHigh: DWORD;   // DWORD
  dwMaximumSizeLow: DWORD;   // DWORD
  lpName: PWideChar;   // LPCWSTR optional
  nndPreferred: DWORD   // DWORD
): THandle; stdcall;
  external 'KERNEL32.dll' name 'CreateFileMappingNumaW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "CreateFileMappingNumaW"
  c_CreateFileMappingNumaW :: Ptr () -> Ptr () -> Word32 -> Word32 -> Word32 -> CWString -> Word32 -> IO (Ptr ())
-- hFile : HANDLE -> Ptr ()
-- lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> Ptr ()
-- flProtect : PAGE_PROTECTION_FLAGS -> Word32
-- dwMaximumSizeHigh : DWORD -> Word32
-- dwMaximumSizeLow : DWORD -> Word32
-- lpName : LPCWSTR optional -> CWString
-- nndPreferred : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let createfilemappingnumaw =
  foreign "CreateFileMappingNumaW"
    ((ptr void) @-> (ptr void) @-> uint32_t @-> uint32_t @-> uint32_t @-> (ptr uint16_t) @-> uint32_t @-> returning (ptr void))
(* hFile : HANDLE -> (ptr void) *)
(* lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> (ptr void) *)
(* flProtect : PAGE_PROTECTION_FLAGS -> uint32_t *)
(* dwMaximumSizeHigh : DWORD -> uint32_t *)
(* dwMaximumSizeLow : DWORD -> uint32_t *)
(* lpName : LPCWSTR optional -> (ptr uint16_t) *)
(* 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 ("CreateFileMappingNumaW" create-file-mapping-numa-w :convention :stdcall) :pointer
  (h-file :pointer)   ; HANDLE
  (lp-file-mapping-attributes :pointer)   ; SECURITY_ATTRIBUTES* optional
  (fl-protect :uint32)   ; PAGE_PROTECTION_FLAGS
  (dw-maximum-size-high :uint32)   ; DWORD
  (dw-maximum-size-low :uint32)   ; DWORD
  (lp-name (:string :encoding :utf-16le))   ; LPCWSTR optional
  (nnd-preferred :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CreateFileMappingNumaW = Win32::API::More->new('KERNEL32',
    'HANDLE CreateFileMappingNumaW(HANDLE hFile, LPVOID lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCWSTR lpName, DWORD nndPreferred)');
# my $ret = $CreateFileMappingNumaW->Call($hFile, $lpFileMappingAttributes, $flProtect, $dwMaximumSizeHigh, $dwMaximumSizeLow, $lpName, $nndPreferred);
# hFile : HANDLE -> HANDLE
# lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> LPVOID
# flProtect : PAGE_PROTECTION_FLAGS -> DWORD
# dwMaximumSizeHigh : DWORD -> DWORD
# dwMaximumSizeLow : DWORD -> DWORD
# lpName : LPCWSTR optional -> LPCWSTR
# nndPreferred : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

文字セット違い
公式の関連項目
使用する型