Win32 API 日本語リファレンス
ホームSystem.Diagnostics.Debug › RtlInstallFunctionTableCallback

RtlInstallFunctionTableCallback

関数
関数テーブルを動的に提供するコールバックを登録する。
DLLKERNEL32.dll呼出規約winapi

シグネチャ

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

BOOLEAN RtlInstallFunctionTableCallback(
    ULONGLONG TableIdentifier,
    ULONGLONG BaseAddress,
    DWORD Length,
    PGET_RUNTIME_FUNCTION_CALLBACK Callback,
    void* Context,   // optional
    LPCWSTR OutOfProcessCallbackDll   // optional
);

パラメーター

名前方向説明
TableIdentifierULONGLONGin動的関数テーブルコールバックの識別子です。下位 2 ビットを設定する必要があります。たとえば、 BaseAddress|0x3 のように指定します。
BaseAddressULONGLONGinコールバック関数によって管理されるメモリ領域のベースアドレスです。
LengthDWORDinコールバック関数によって管理されるメモリ領域のサイズ(バイト単位)です。
CallbackPGET_RUNTIME_FUNCTION_CALLBACKin指定されたメモリ領域内の関数について、関数テーブルエントリを取得するために呼び出されるコールバック関数へのポインターです。 PGET_RUNTIME_FUNCTION_CALLBACK 型の定義については、WinNT.h を参照してください。
Contextvoid*inoptionalコールバック関数に渡されるユーザー定義データへのポインターです。
OutOfProcessCallbackDllLPCWSTRinoptional

プロセス外にある関数テーブルエントリを提供する DLL のパスを指定する文字列への、省略可能なポインターです。

デバッガーがコールバック関数によって管理されるアドレス範囲内の関数へアンワインドする際、この DLL を読み込み、OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME 関数を呼び出します。この関数の型は POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK です。詳細については、WinNT.h でのこれらの項目の定義を参照してください。

戻り値の型: BOOLEAN

公式ドキュメント

動的関数テーブルを動的関数テーブルリストに追加します。(RtlInstallFunctionTableCallback)

戻り値

関数が成功した場合、戻り値は TRUE です。関数が失敗した場合、戻り値は FALSE です。

解説(Remarks)

関数テーブルは、64 ビット版 Windows において、スタックをアンワインドまたはウォークする方法を判断するために使用されます。これらのテーブルは通常、コンパイラーによって生成され、イメージの一部として格納されます。ただし、アプリケーションは動的に生成されたコードに対する関数テーブルを提供する必要があります。関数テーブルの詳細については、ご使用のシステムのアーキテクチャガイドを参照してください。

この関数は、非常に動的なコードに役立ちます。アプリケーションは生成されたコードのメモリ範囲を指定しますが、アンワインド要求で必要になるまでテーブルを生成する必要はありません。必要になった時点で、システムは Context と制御アドレスを指定してコールバック関数を呼び出します。コールバック関数は、指定されたアドレスに対するランタイム関数エントリを返す必要があります。コールバック関数とコードジェネレーターの間でデッドロックが発生しないよう注意してください。

テンプレートから生成されるコードや、プロセスの存続期間中に一度だけ生成されるコードについては、RtlAddFunctionTable 関数を使用してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

BOOLEAN RtlInstallFunctionTableCallback(
    ULONGLONG TableIdentifier,
    ULONGLONG BaseAddress,
    DWORD Length,
    PGET_RUNTIME_FUNCTION_CALLBACK Callback,
    void* Context,   // optional
    LPCWSTR OutOfProcessCallbackDll   // optional
);
[return: MarshalAs(UnmanagedType.U1)]
[DllImport("KERNEL32.dll", ExactSpelling = true)]
static extern bool RtlInstallFunctionTableCallback(
    ulong TableIdentifier,   // ULONGLONG
    ulong BaseAddress,   // ULONGLONG
    uint Length,   // DWORD
    IntPtr Callback,   // PGET_RUNTIME_FUNCTION_CALLBACK
    IntPtr Context,   // void* optional
    [MarshalAs(UnmanagedType.LPWStr)] string OutOfProcessCallbackDll   // LPCWSTR optional
);
<DllImport("KERNEL32.dll", ExactSpelling:=True)>
Public Shared Function RtlInstallFunctionTableCallback(
    TableIdentifier As ULong,   ' ULONGLONG
    BaseAddress As ULong,   ' ULONGLONG
    Length As UInteger,   ' DWORD
    Callback As IntPtr,   ' PGET_RUNTIME_FUNCTION_CALLBACK
    Context As IntPtr,   ' void* optional
    <MarshalAs(UnmanagedType.LPWStr)> OutOfProcessCallbackDll As String   ' LPCWSTR optional
) As <MarshalAs(UnmanagedType.U1)> Boolean
End Function
' TableIdentifier : ULONGLONG
' BaseAddress : ULONGLONG
' Length : DWORD
' Callback : PGET_RUNTIME_FUNCTION_CALLBACK
' Context : void* optional
' OutOfProcessCallbackDll : LPCWSTR optional
Declare PtrSafe Function RtlInstallFunctionTableCallback Lib "kernel32" ( _
    ByVal TableIdentifier As LongLong, _
    ByVal BaseAddress As LongLong, _
    ByVal Length As Long, _
    ByVal Callback As LongPtr, _
    ByVal Context As LongPtr, _
    ByVal OutOfProcessCallbackDll As LongPtr) As Byte
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

RtlInstallFunctionTableCallback = ctypes.windll.kernel32.RtlInstallFunctionTableCallback
RtlInstallFunctionTableCallback.restype = wintypes.BOOLEAN
RtlInstallFunctionTableCallback.argtypes = [
    ctypes.c_ulonglong,  # TableIdentifier : ULONGLONG
    ctypes.c_ulonglong,  # BaseAddress : ULONGLONG
    wintypes.DWORD,  # Length : DWORD
    ctypes.c_void_p,  # Callback : PGET_RUNTIME_FUNCTION_CALLBACK
    ctypes.POINTER(None),  # Context : void* optional
    wintypes.LPCWSTR,  # OutOfProcessCallbackDll : LPCWSTR optional
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
RtlInstallFunctionTableCallback = Fiddle::Function.new(
  lib['RtlInstallFunctionTableCallback'],
  [
    -Fiddle::TYPE_LONG_LONG,  # TableIdentifier : ULONGLONG
    -Fiddle::TYPE_LONG_LONG,  # BaseAddress : ULONGLONG
    -Fiddle::TYPE_INT,  # Length : DWORD
    Fiddle::TYPE_VOIDP,  # Callback : PGET_RUNTIME_FUNCTION_CALLBACK
    Fiddle::TYPE_VOIDP,  # Context : void* optional
    Fiddle::TYPE_VOIDP,  # OutOfProcessCallbackDll : LPCWSTR optional
  ],
  Fiddle::TYPE_CHAR)
#[link(name = "kernel32")]
extern "system" {
    fn RtlInstallFunctionTableCallback(
        TableIdentifier: u64,  // ULONGLONG
        BaseAddress: u64,  // ULONGLONG
        Length: u32,  // DWORD
        Callback: *const core::ffi::c_void,  // PGET_RUNTIME_FUNCTION_CALLBACK
        Context: *mut (),  // void* optional
        OutOfProcessCallbackDll: *const u16  // LPCWSTR optional
    ) -> u8;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.U1)]
[DllImport("KERNEL32.dll")]
public static extern bool RtlInstallFunctionTableCallback(ulong TableIdentifier, ulong BaseAddress, uint Length, IntPtr Callback, IntPtr Context, [MarshalAs(UnmanagedType.LPWStr)] string OutOfProcessCallbackDll);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_RtlInstallFunctionTableCallback' -Namespace Win32 -PassThru
# $api::RtlInstallFunctionTableCallback(TableIdentifier, BaseAddress, Length, Callback, Context, OutOfProcessCallbackDll)
#uselib "KERNEL32.dll"
#func global RtlInstallFunctionTableCallback "RtlInstallFunctionTableCallback" sptr, sptr, sptr, sptr, sptr, sptr
; RtlInstallFunctionTableCallback TableIdentifier, BaseAddress, Length, Callback, Context, OutOfProcessCallbackDll   ; 戻り値は stat
; TableIdentifier : ULONGLONG -> "sptr"
; BaseAddress : ULONGLONG -> "sptr"
; Length : DWORD -> "sptr"
; Callback : PGET_RUNTIME_FUNCTION_CALLBACK -> "sptr"
; Context : void* optional -> "sptr"
; OutOfProcessCallbackDll : LPCWSTR optional -> "sptr"
; ※HSP3.7は int64 引数(64bit値渡し)に非対応です。
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "KERNEL32.dll"
#cfunc global RtlInstallFunctionTableCallback "RtlInstallFunctionTableCallback" int64, int64, int, sptr, sptr, wstr
; res = RtlInstallFunctionTableCallback(TableIdentifier, BaseAddress, Length, Callback, Context, OutOfProcessCallbackDll)
; TableIdentifier : ULONGLONG -> "int64"
; BaseAddress : ULONGLONG -> "int64"
; Length : DWORD -> "int"
; Callback : PGET_RUNTIME_FUNCTION_CALLBACK -> "sptr"
; Context : void* optional -> "sptr"
; OutOfProcessCallbackDll : LPCWSTR optional -> "wstr"
; ※int64 引数の DLL 値渡しは x64 ランタイム(hsp3_64)のみ対応(x86 は未対応)。
; BOOLEAN RtlInstallFunctionTableCallback(ULONGLONG TableIdentifier, ULONGLONG BaseAddress, DWORD Length, PGET_RUNTIME_FUNCTION_CALLBACK Callback, void* Context, LPCWSTR OutOfProcessCallbackDll)
#uselib "KERNEL32.dll"
#cfunc global RtlInstallFunctionTableCallback "RtlInstallFunctionTableCallback" int64, int64, int, intptr, intptr, wstr
; res = RtlInstallFunctionTableCallback(TableIdentifier, BaseAddress, Length, Callback, Context, OutOfProcessCallbackDll)
; TableIdentifier : ULONGLONG -> "int64"
; BaseAddress : ULONGLONG -> "int64"
; Length : DWORD -> "int"
; Callback : PGET_RUNTIME_FUNCTION_CALLBACK -> "intptr"
; Context : void* optional -> "intptr"
; OutOfProcessCallbackDll : LPCWSTR optional -> "wstr"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procRtlInstallFunctionTableCallback = kernel32.NewProc("RtlInstallFunctionTableCallback")
)

// TableIdentifier (ULONGLONG), BaseAddress (ULONGLONG), Length (DWORD), Callback (PGET_RUNTIME_FUNCTION_CALLBACK), Context (void* optional), OutOfProcessCallbackDll (LPCWSTR optional)
r1, _, err := procRtlInstallFunctionTableCallback.Call(
	uintptr(TableIdentifier),
	uintptr(BaseAddress),
	uintptr(Length),
	uintptr(Callback),
	uintptr(Context),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(OutOfProcessCallbackDll))),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOLEAN
function RtlInstallFunctionTableCallback(
  TableIdentifier: UInt64;   // ULONGLONG
  BaseAddress: UInt64;   // ULONGLONG
  Length: DWORD;   // DWORD
  Callback: Pointer;   // PGET_RUNTIME_FUNCTION_CALLBACK
  Context: Pointer;   // void* optional
  OutOfProcessCallbackDll: PWideChar   // LPCWSTR optional
): ByteBool; stdcall;
  external 'KERNEL32.dll' name 'RtlInstallFunctionTableCallback';
result := DllCall("KERNEL32\RtlInstallFunctionTableCallback"
    , "Int64", TableIdentifier   ; ULONGLONG
    , "Int64", BaseAddress   ; ULONGLONG
    , "UInt", Length   ; DWORD
    , "Ptr", Callback   ; PGET_RUNTIME_FUNCTION_CALLBACK
    , "Ptr", Context   ; void* optional
    , "WStr", OutOfProcessCallbackDll   ; LPCWSTR optional
    , "Char")   ; return: BOOLEAN
●RtlInstallFunctionTableCallback(TableIdentifier, BaseAddress, Length, Callback, Context, OutOfProcessCallbackDll) = DLL("KERNEL32.dll", "byte RtlInstallFunctionTableCallback(qword, qword, dword, void*, void*, char*)")
# 呼び出し: RtlInstallFunctionTableCallback(TableIdentifier, BaseAddress, Length, Callback, Context, OutOfProcessCallbackDll)
# TableIdentifier : ULONGLONG -> "qword"
# BaseAddress : ULONGLONG -> "qword"
# Length : DWORD -> "dword"
# Callback : PGET_RUNTIME_FUNCTION_CALLBACK -> "void*"
# Context : void* optional -> "void*"
# OutOfProcessCallbackDll : LPCWSTR optional -> "char*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "kernel32" fn RtlInstallFunctionTableCallback(
    TableIdentifier: u64, // ULONGLONG
    BaseAddress: u64, // ULONGLONG
    Length: u32, // DWORD
    Callback: ?*anyopaque, // PGET_RUNTIME_FUNCTION_CALLBACK
    Context: ?*anyopaque, // void* optional
    OutOfProcessCallbackDll: [*c]const u16 // LPCWSTR optional
) callconv(std.os.windows.WINAPI) u8;
proc RtlInstallFunctionTableCallback(
    TableIdentifier: uint64,  # ULONGLONG
    BaseAddress: uint64,  # ULONGLONG
    Length: uint32,  # DWORD
    Callback: pointer,  # PGET_RUNTIME_FUNCTION_CALLBACK
    Context: pointer,  # void* optional
    OutOfProcessCallbackDll: WideCString  # LPCWSTR optional
): uint8 {.importc: "RtlInstallFunctionTableCallback", stdcall, dynlib: "KERNEL32.dll".}
pragma(lib, "kernel32");
extern(Windows)
ubyte RtlInstallFunctionTableCallback(
    ulong TableIdentifier,   // ULONGLONG
    ulong BaseAddress,   // ULONGLONG
    uint Length,   // DWORD
    void* Callback,   // PGET_RUNTIME_FUNCTION_CALLBACK
    void* Context,   // void* optional
    const(wchar)* OutOfProcessCallbackDll   // LPCWSTR optional
);
ccall((:RtlInstallFunctionTableCallback, "KERNEL32.dll"), stdcall, UInt8,
      (UInt64, UInt64, UInt32, Ptr{Cvoid}, Ptr{Cvoid}, Cwstring),
      TableIdentifier, BaseAddress, Length, Callback, Context, OutOfProcessCallbackDll)
# TableIdentifier : ULONGLONG -> UInt64
# BaseAddress : ULONGLONG -> UInt64
# Length : DWORD -> UInt32
# Callback : PGET_RUNTIME_FUNCTION_CALLBACK -> Ptr{Cvoid}
# Context : void* optional -> Ptr{Cvoid}
# OutOfProcessCallbackDll : LPCWSTR optional -> Cwstring
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint8_t RtlInstallFunctionTableCallback(
    uint64_t TableIdentifier,
    uint64_t BaseAddress,
    uint32_t Length,
    void* Callback,
    void* Context,
    const uint16_t* OutOfProcessCallbackDll);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.RtlInstallFunctionTableCallback(TableIdentifier, BaseAddress, Length, Callback, Context, OutOfProcessCallbackDll)
-- TableIdentifier : ULONGLONG
-- BaseAddress : ULONGLONG
-- Length : DWORD
-- Callback : PGET_RUNTIME_FUNCTION_CALLBACK
-- Context : void* optional
-- OutOfProcessCallbackDll : LPCWSTR optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const RtlInstallFunctionTableCallback = lib.func('__stdcall', 'RtlInstallFunctionTableCallback', 'uint8_t', ['uint64_t', 'uint64_t', 'uint32_t', 'void *', 'void *', 'str16']);
// RtlInstallFunctionTableCallback(TableIdentifier, BaseAddress, Length, Callback, Context, OutOfProcessCallbackDll)
// TableIdentifier : ULONGLONG -> 'uint64_t'
// BaseAddress : ULONGLONG -> 'uint64_t'
// Length : DWORD -> 'uint32_t'
// Callback : PGET_RUNTIME_FUNCTION_CALLBACK -> 'void *'
// Context : void* optional -> 'void *'
// OutOfProcessCallbackDll : LPCWSTR optional -> 'str16'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
// コールバック(関数ポインタ)は koffi.proto/koffi.register で型を定義して渡す(素の void* では JS 関数を渡せない)。
const lib = Deno.dlopen("KERNEL32.dll", {
  RtlInstallFunctionTableCallback: { parameters: ["u64", "u64", "u32", "pointer", "pointer", "buffer"], result: "u8" },
});
// lib.symbols.RtlInstallFunctionTableCallback(TableIdentifier, BaseAddress, Length, Callback, Context, OutOfProcessCallbackDll)
// TableIdentifier : ULONGLONG -> "u64"
// BaseAddress : ULONGLONG -> "u64"
// Length : DWORD -> "u32"
// Callback : PGET_RUNTIME_FUNCTION_CALLBACK -> "pointer"
// Context : void* optional -> "pointer"
// OutOfProcessCallbackDll : LPCWSTR optional -> "buffer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint8_t RtlInstallFunctionTableCallback(
    uint64_t TableIdentifier,
    uint64_t BaseAddress,
    uint32_t Length,
    void* Callback,
    void* Context,
    const uint16_t* OutOfProcessCallbackDll);
C, "KERNEL32.dll");
// $ffi->RtlInstallFunctionTableCallback(TableIdentifier, BaseAddress, Length, Callback, Context, OutOfProcessCallbackDll);
// TableIdentifier : ULONGLONG
// BaseAddress : ULONGLONG
// Length : DWORD
// Callback : PGET_RUNTIME_FUNCTION_CALLBACK
// Context : void* optional
// OutOfProcessCallbackDll : LPCWSTR 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);
    byte RtlInstallFunctionTableCallback(
        long TableIdentifier,   // ULONGLONG
        long BaseAddress,   // ULONGLONG
        int Length,   // DWORD
        Callback Callback,   // PGET_RUNTIME_FUNCTION_CALLBACK
        Pointer Context,   // void* optional
        WString OutOfProcessCallbackDll   // LPCWSTR optional
    );
}
@[Link("kernel32")]
lib LibKERNEL32
  fun RtlInstallFunctionTableCallback = RtlInstallFunctionTableCallback(
    TableIdentifier : UInt64,   # ULONGLONG
    BaseAddress : UInt64,   # ULONGLONG
    Length : UInt32,   # DWORD
    Callback : Void*,   # PGET_RUNTIME_FUNCTION_CALLBACK
    Context : Void*,   # void* optional
    OutOfProcessCallbackDll : UInt16*   # LPCWSTR optional
  ) : UInt8
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef RtlInstallFunctionTableCallbackNative = Uint8 Function(Uint64, Uint64, Uint32, Pointer<Void>, Pointer<Void>, Pointer<Utf16>);
typedef RtlInstallFunctionTableCallbackDart = int Function(int, int, int, Pointer<Void>, Pointer<Void>, Pointer<Utf16>);
final RtlInstallFunctionTableCallback = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<RtlInstallFunctionTableCallbackNative, RtlInstallFunctionTableCallbackDart>('RtlInstallFunctionTableCallback');
// TableIdentifier : ULONGLONG -> Uint64
// BaseAddress : ULONGLONG -> Uint64
// Length : DWORD -> Uint32
// Callback : PGET_RUNTIME_FUNCTION_CALLBACK -> Pointer<Void>
// Context : void* optional -> Pointer<Void>
// OutOfProcessCallbackDll : LPCWSTR optional -> Pointer<Utf16>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function RtlInstallFunctionTableCallback(
  TableIdentifier: UInt64;   // ULONGLONG
  BaseAddress: UInt64;   // ULONGLONG
  Length: DWORD;   // DWORD
  Callback: Pointer;   // PGET_RUNTIME_FUNCTION_CALLBACK
  Context: Pointer;   // void* optional
  OutOfProcessCallbackDll: PWideChar   // LPCWSTR optional
): ByteBool; stdcall;
  external 'KERNEL32.dll' name 'RtlInstallFunctionTableCallback';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "RtlInstallFunctionTableCallback"
  c_RtlInstallFunctionTableCallback :: Word64 -> Word64 -> Word32 -> Ptr () -> Ptr () -> CWString -> IO Word8
-- TableIdentifier : ULONGLONG -> Word64
-- BaseAddress : ULONGLONG -> Word64
-- Length : DWORD -> Word32
-- Callback : PGET_RUNTIME_FUNCTION_CALLBACK -> Ptr ()
-- Context : void* optional -> Ptr ()
-- OutOfProcessCallbackDll : LPCWSTR optional -> CWString
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let rtlinstallfunctiontablecallback =
  foreign "RtlInstallFunctionTableCallback"
    (uint64_t @-> uint64_t @-> uint32_t @-> (ptr void) @-> (ptr void) @-> (ptr uint16_t) @-> returning uint8_t)
(* TableIdentifier : ULONGLONG -> uint64_t *)
(* BaseAddress : ULONGLONG -> uint64_t *)
(* Length : DWORD -> uint32_t *)
(* Callback : PGET_RUNTIME_FUNCTION_CALLBACK -> (ptr void) *)
(* Context : void* optional -> (ptr void) *)
(* OutOfProcessCallbackDll : LPCWSTR optional -> (ptr uint16_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("RtlInstallFunctionTableCallback" rtl-install-function-table-callback :convention :stdcall) :uint8
  (table-identifier :uint64)   ; ULONGLONG
  (base-address :uint64)   ; ULONGLONG
  (length :uint32)   ; DWORD
  (callback :pointer)   ; PGET_RUNTIME_FUNCTION_CALLBACK
  (context :pointer)   ; void* optional
  (out-of-process-callback-dll (:string :encoding :utf-16le)))   ; LPCWSTR optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $RtlInstallFunctionTableCallback = Win32::API::More->new('KERNEL32',
    'BYTE RtlInstallFunctionTableCallback(UINT64 TableIdentifier, UINT64 BaseAddress, DWORD Length, LPVOID Callback, LPVOID Context, LPCWSTR OutOfProcessCallbackDll)');
# my $ret = $RtlInstallFunctionTableCallback->Call($TableIdentifier, $BaseAddress, $Length, $Callback, $Context, $OutOfProcessCallbackDll);
# TableIdentifier : ULONGLONG -> UINT64
# BaseAddress : ULONGLONG -> UINT64
# Length : DWORD -> DWORD
# Callback : PGET_RUNTIME_FUNCTION_CALLBACK -> LPVOID
# Context : void* optional -> LPVOID
# OutOfProcessCallbackDll : LPCWSTR optional -> LPCWSTR
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# コールバック(関数ポインタ)は Perl sub を直接渡せません。Win32::API::Callback を使用してください。

関連項目

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