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

CreateFileMappingNumaA

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

シグネチャ

// KERNEL32.dll  (ANSI / -A)
#include <windows.h>

HANDLE CreateFileMappingNumaA(
    HANDLE hFile,
    SECURITY_ATTRIBUTES* lpFileMappingAttributes,   // optional
    PAGE_PROTECTION_FLAGS flProtect,
    DWORD dwMaximumSizeHigh,
    DWORD dwMaximumSizeLow,
    LPCSTR 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 (ゼロ) のファイルをテストし、そのようなファイルを拒否する必要があります。

lpNameLPCSTRinoptional

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

このパラメーターが既存のファイルマッピングオブジェクトの名前と一致する場合、関数は 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 ノードを指定します。(CreateFileMappingNumaA)

戻り値

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

関数呼び出しの前にオブジェクトが存在していた場合、関数は既存のオブジェクトへのハンドル (指定したサイズではなく現在のサイズのもの) を返し、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 を使用してタイムスタンプを設定してください。

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

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

実行可能なアクセス許可を持つマッピングを得るには、アプリケーションは 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  (ANSI / -A)
#include <windows.h>

HANDLE CreateFileMappingNumaA(
    HANDLE hFile,
    SECURITY_ATTRIBUTES* lpFileMappingAttributes,   // optional
    PAGE_PROTECTION_FLAGS flProtect,
    DWORD dwMaximumSizeHigh,
    DWORD dwMaximumSizeLow,
    LPCSTR lpName,   // optional
    DWORD nndPreferred
);
[DllImport("KERNEL32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
static extern IntPtr CreateFileMappingNumaA(
    IntPtr hFile,   // HANDLE
    IntPtr lpFileMappingAttributes,   // SECURITY_ATTRIBUTES* optional
    uint flProtect,   // PAGE_PROTECTION_FLAGS
    uint dwMaximumSizeHigh,   // DWORD
    uint dwMaximumSizeLow,   // DWORD
    [MarshalAs(UnmanagedType.LPStr)] string lpName,   // LPCSTR optional
    uint nndPreferred   // DWORD
);
<DllImport("KERNEL32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function CreateFileMappingNumaA(
    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.LPStr)> lpName As String,   ' LPCSTR optional
    nndPreferred As UInteger   ' DWORD
) As IntPtr
End Function
' hFile : HANDLE
' lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional
' flProtect : PAGE_PROTECTION_FLAGS
' dwMaximumSizeHigh : DWORD
' dwMaximumSizeLow : DWORD
' lpName : LPCSTR optional
' nndPreferred : DWORD
Declare PtrSafe Function CreateFileMappingNumaA 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 String, _
    ByVal nndPreferred As Long) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CreateFileMappingNumaA = ctypes.windll.kernel32.CreateFileMappingNumaA
CreateFileMappingNumaA.restype = ctypes.c_void_p
CreateFileMappingNumaA.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.LPCSTR,  # lpName : LPCSTR 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')
CreateFileMappingNumaA = Fiddle::Function.new(
  lib['CreateFileMappingNumaA'],
  [
    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 : LPCSTR optional
    -Fiddle::TYPE_INT,  # nndPreferred : DWORD
  ],
  Fiddle::TYPE_VOIDP)
#[link(name = "kernel32")]
extern "system" {
    fn CreateFileMappingNumaA(
        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 u8,  // LPCSTR 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.Ansi, SetLastError = true)]
public static extern IntPtr CreateFileMappingNumaA(IntPtr hFile, IntPtr lpFileMappingAttributes, uint flProtect, uint dwMaximumSizeHigh, uint dwMaximumSizeLow, [MarshalAs(UnmanagedType.LPStr)] string lpName, uint nndPreferred);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_CreateFileMappingNumaA' -Namespace Win32 -PassThru
# $api::CreateFileMappingNumaA(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred)
#uselib "KERNEL32.dll"
#func global CreateFileMappingNumaA "CreateFileMappingNumaA" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; CreateFileMappingNumaA hFile, varptr(lpFileMappingAttributes), flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred   ; 戻り値は stat
; hFile : HANDLE -> "sptr"
; lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> "sptr"
; flProtect : PAGE_PROTECTION_FLAGS -> "sptr"
; dwMaximumSizeHigh : DWORD -> "sptr"
; dwMaximumSizeLow : DWORD -> "sptr"
; lpName : LPCSTR optional -> "sptr"
; nndPreferred : DWORD -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "KERNEL32.dll"
#cfunc global CreateFileMappingNumaA "CreateFileMappingNumaA" sptr, var, int, int, int, str, int
; res = CreateFileMappingNumaA(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 : LPCSTR optional -> "str"
; nndPreferred : DWORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HANDLE CreateFileMappingNumaA(HANDLE hFile, SECURITY_ATTRIBUTES* lpFileMappingAttributes, PAGE_PROTECTION_FLAGS flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName, DWORD nndPreferred)
#uselib "KERNEL32.dll"
#cfunc global CreateFileMappingNumaA "CreateFileMappingNumaA" intptr, var, int, int, int, str, int
; res = CreateFileMappingNumaA(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 : LPCSTR optional -> "str"
; nndPreferred : DWORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procCreateFileMappingNumaA = kernel32.NewProc("CreateFileMappingNumaA")
)

// hFile (HANDLE), lpFileMappingAttributes (SECURITY_ATTRIBUTES* optional), flProtect (PAGE_PROTECTION_FLAGS), dwMaximumSizeHigh (DWORD), dwMaximumSizeLow (DWORD), lpName (LPCSTR optional), nndPreferred (DWORD)
r1, _, err := procCreateFileMappingNumaA.Call(
	uintptr(hFile),
	uintptr(lpFileMappingAttributes),
	uintptr(flProtect),
	uintptr(dwMaximumSizeHigh),
	uintptr(dwMaximumSizeLow),
	uintptr(unsafe.Pointer(windows.BytePtrFromString(lpName))),
	uintptr(nndPreferred),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HANDLE
function CreateFileMappingNumaA(
  hFile: THandle;   // HANDLE
  lpFileMappingAttributes: Pointer;   // SECURITY_ATTRIBUTES* optional
  flProtect: DWORD;   // PAGE_PROTECTION_FLAGS
  dwMaximumSizeHigh: DWORD;   // DWORD
  dwMaximumSizeLow: DWORD;   // DWORD
  lpName: PAnsiChar;   // LPCSTR optional
  nndPreferred: DWORD   // DWORD
): THandle; stdcall;
  external 'KERNEL32.dll' name 'CreateFileMappingNumaA';
result := DllCall("KERNEL32\CreateFileMappingNumaA"
    , "Ptr", hFile   ; HANDLE
    , "Ptr", lpFileMappingAttributes   ; SECURITY_ATTRIBUTES* optional
    , "UInt", flProtect   ; PAGE_PROTECTION_FLAGS
    , "UInt", dwMaximumSizeHigh   ; DWORD
    , "UInt", dwMaximumSizeLow   ; DWORD
    , "AStr", lpName   ; LPCSTR optional
    , "UInt", nndPreferred   ; DWORD
    , "Ptr")   ; return: HANDLE
●CreateFileMappingNumaA(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred) = DLL("KERNEL32.dll", "void* CreateFileMappingNumaA(void*, void*, dword, dword, dword, char*, dword)")
# 呼び出し: CreateFileMappingNumaA(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 : LPCSTR optional -> "char*"
# nndPreferred : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "kernel32" fn CreateFileMappingNumaA(
    hFile: ?*anyopaque, // HANDLE
    lpFileMappingAttributes: [*c]SECURITY_ATTRIBUTES, // SECURITY_ATTRIBUTES* optional
    flProtect: u32, // PAGE_PROTECTION_FLAGS
    dwMaximumSizeHigh: u32, // DWORD
    dwMaximumSizeLow: u32, // DWORD
    lpName: [*c]const u8, // LPCSTR optional
    nndPreferred: u32 // DWORD
) callconv(std.os.windows.WINAPI) ?*anyopaque;
proc CreateFileMappingNumaA(
    hFile: pointer,  # HANDLE
    lpFileMappingAttributes: ptr SECURITY_ATTRIBUTES,  # SECURITY_ATTRIBUTES* optional
    flProtect: uint32,  # PAGE_PROTECTION_FLAGS
    dwMaximumSizeHigh: uint32,  # DWORD
    dwMaximumSizeLow: uint32,  # DWORD
    lpName: cstring,  # LPCSTR optional
    nndPreferred: uint32  # DWORD
): pointer {.importc: "CreateFileMappingNumaA", stdcall, dynlib: "KERNEL32.dll".}
pragma(lib, "kernel32");
extern(Windows)
void* CreateFileMappingNumaA(
    void* hFile,   // HANDLE
    SECURITY_ATTRIBUTES* lpFileMappingAttributes,   // SECURITY_ATTRIBUTES* optional
    uint flProtect,   // PAGE_PROTECTION_FLAGS
    uint dwMaximumSizeHigh,   // DWORD
    uint dwMaximumSizeLow,   // DWORD
    const(char)* lpName,   // LPCSTR optional
    uint nndPreferred   // DWORD
);
ccall((:CreateFileMappingNumaA, "KERNEL32.dll"), stdcall, Ptr{Cvoid},
      (Ptr{Cvoid}, Ptr{SECURITY_ATTRIBUTES}, UInt32, UInt32, UInt32, Cstring, 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 : LPCSTR optional -> Cstring
# nndPreferred : DWORD -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
void* CreateFileMappingNumaA(
    void* hFile,
    void* lpFileMappingAttributes,
    uint32_t flProtect,
    uint32_t dwMaximumSizeHigh,
    uint32_t dwMaximumSizeLow,
    const char* lpName,
    uint32_t nndPreferred);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.CreateFileMappingNumaA(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred)
-- hFile : HANDLE
-- lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional
-- flProtect : PAGE_PROTECTION_FLAGS
-- dwMaximumSizeHigh : DWORD
-- dwMaximumSizeLow : DWORD
-- lpName : LPCSTR optional
-- nndPreferred : DWORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const CreateFileMappingNumaA = lib.func('__stdcall', 'CreateFileMappingNumaA', 'void *', ['void *', 'void *', 'uint32_t', 'uint32_t', 'uint32_t', 'str', 'uint32_t']);
// CreateFileMappingNumaA(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 : LPCSTR optional -> 'str'
// nndPreferred : DWORD -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  CreateFileMappingNumaA: { parameters: ["pointer", "pointer", "u32", "u32", "u32", "buffer", "u32"], result: "pointer" },
});
// lib.symbols.CreateFileMappingNumaA(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 : LPCSTR optional -> "buffer"
// nndPreferred : DWORD -> "u32"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void* CreateFileMappingNumaA(
    void* hFile,
    void* lpFileMappingAttributes,
    uint32_t flProtect,
    uint32_t dwMaximumSizeHigh,
    uint32_t dwMaximumSizeLow,
    const char* lpName,
    uint32_t nndPreferred);
C, "KERNEL32.dll");
// $ffi->CreateFileMappingNumaA(hFile, lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName, nndPreferred);
// hFile : HANDLE
// lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional
// flProtect : PAGE_PROTECTION_FLAGS
// dwMaximumSizeHigh : DWORD
// dwMaximumSizeLow : DWORD
// lpName : LPCSTR 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.ASCII_OPTIONS);
    Pointer CreateFileMappingNumaA(
        Pointer hFile,   // HANDLE
        Pointer lpFileMappingAttributes,   // SECURITY_ATTRIBUTES* optional
        int flProtect,   // PAGE_PROTECTION_FLAGS
        int dwMaximumSizeHigh,   // DWORD
        int dwMaximumSizeLow,   // DWORD
        String lpName,   // LPCSTR optional
        int nndPreferred   // DWORD
    );
}
@[Link("kernel32")]
lib LibKERNEL32
  fun CreateFileMappingNumaA = CreateFileMappingNumaA(
    hFile : Void*,   # HANDLE
    lpFileMappingAttributes : SECURITY_ATTRIBUTES*,   # SECURITY_ATTRIBUTES* optional
    flProtect : UInt32,   # PAGE_PROTECTION_FLAGS
    dwMaximumSizeHigh : UInt32,   # DWORD
    dwMaximumSizeLow : UInt32,   # DWORD
    lpName : UInt8*,   # LPCSTR 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 CreateFileMappingNumaANative = Pointer<Void> Function(Pointer<Void>, Pointer<Void>, Uint32, Uint32, Uint32, Pointer<Utf8>, Uint32);
typedef CreateFileMappingNumaADart = Pointer<Void> Function(Pointer<Void>, Pointer<Void>, int, int, int, Pointer<Utf8>, int);
final CreateFileMappingNumaA = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<CreateFileMappingNumaANative, CreateFileMappingNumaADart>('CreateFileMappingNumaA');
// hFile : HANDLE -> Pointer<Void>
// lpFileMappingAttributes : SECURITY_ATTRIBUTES* optional -> Pointer<Void>
// flProtect : PAGE_PROTECTION_FLAGS -> Uint32
// dwMaximumSizeHigh : DWORD -> Uint32
// dwMaximumSizeLow : DWORD -> Uint32
// lpName : LPCSTR optional -> Pointer<Utf8>
// nndPreferred : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CreateFileMappingNumaA(
  hFile: THandle;   // HANDLE
  lpFileMappingAttributes: Pointer;   // SECURITY_ATTRIBUTES* optional
  flProtect: DWORD;   // PAGE_PROTECTION_FLAGS
  dwMaximumSizeHigh: DWORD;   // DWORD
  dwMaximumSizeLow: DWORD;   // DWORD
  lpName: PAnsiChar;   // LPCSTR optional
  nndPreferred: DWORD   // DWORD
): THandle; stdcall;
  external 'KERNEL32.dll' name 'CreateFileMappingNumaA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

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

let createfilemappingnumaa =
  foreign "CreateFileMappingNumaA"
    ((ptr void) @-> (ptr void) @-> uint32_t @-> uint32_t @-> uint32_t @-> string @-> 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 : LPCSTR optional -> string *)
(* 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 ("CreateFileMappingNumaA" create-file-mapping-numa-a :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)   ; LPCSTR optional
  (nnd-preferred :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CreateFileMappingNumaA = Win32::API::More->new('KERNEL32',
    'HANDLE CreateFileMappingNumaA(HANDLE hFile, LPVOID lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName, DWORD nndPreferred)');
# my $ret = $CreateFileMappingNumaA->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 : LPCSTR optional -> LPCSTR
# nndPreferred : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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