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

RpcGetAuthorizationContextForClient

関数
クライアントの認可コンテキストを取得する。
DLLRPCRT4.dll呼出規約winapi対応OSWindows XP 以降

シグネチャ

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

RPC_STATUS RpcGetAuthorizationContextForClient(
    void* ClientBinding,   // optional
    BOOL ImpersonateOnReturn,
    void* Reserved1,   // optional
    LONGLONG* pExpirationTime,   // optional
    LUID Reserved2,
    DWORD Reserved3,
    void* Reserved4,   // optional
    void** pAuthzClientContext
);

パラメーター

名前方向説明
ClientBindingvoid*inoptionalクライアントへのバインドを表す、サーバー側のバインディング ハンドル。サーバーは、このハンドルが示すクライアントを偽装します。値に 0 を指定した場合、サーバーは、このサーバー スレッドが処理しているクライアントを偽装します。
ImpersonateOnReturnBOOLinリターン時にクライアントを偽装してから AUTHZ_CLIENT_CONTEXT_HANDLE 構造体を返すように、関数に指示します。クライアントを偽装するには、このパラメーターに 0 以外の値を設定します。「解説」を参照してください。
Reserved1void*inoptional予約されています。null でなければなりません。
pExpirationTimeLONGLONG*inoptionalトークンの有効期限の日時へのポインター。値を渡さない場合、トークンの有効期限は切れません。有効期限は現在のところ強制されません。
Reserved2LUIDin予約されています。各メンバーを 0 に設定した LUID 構造体でなければなりません。
Reserved3DWORDin予約されています。0 でなければなりません。
Reserved4void*inoptional予約されています。null でなければなりません。
pAuthzClientContextvoid**outAuthz 関数に直接渡すことができる AUTHZ_CLIENT_CONTEXT_HANDLE 構造体へのポインター。関数が失敗した場合、このパラメーターの内容は未定義です。

戻り値の型: RPC_STATUS

公式ドキュメント

RpcGetAuthorizationContextForClient 関数は、高パフォーマンスな認証のために Authz 関数と共に使用できる、RPC クライアント用の Authz コンテキストを返します。ncalrpc および ncacn_* プロトコル シーケンスでのみサポートされます。

戻り値

説明
RPC_S_OK
呼び出しに成功しました。
RERROR_INVALID_PARAMETER
予約済みパラメーターの値が、規定された値と異なります。
RPC_S_NO_CONTEXT_AVAILABLE
RPC クライアントの認証に成功していません。

失敗した場合は、RPC_S_* エラー コードまたは Windows エラー コードが返されます。拡張エラー情報は、標準的な RPC または Windows のエラー コード取得メカニズムを通じて取得できます。有効なエラー コードの一覧については、 RPC Return Values を参照してください。

解説(Remarks)

RpcGetAuthorizationContextForClient 関数は、 RpcImpersonateClient 関数と同じコンテキストで呼び出すことができます。偽装を行うすべての関数は、呼び出し元が SeImpersonatePrivilege 特権を持っているかどうかを確認します。呼び出し元が SeImpersonatePrivilege を持っている場合、または認証された ID が呼び出し元と同一である場合、要求された偽装が許可されます。それ以外の場合、偽装は Identify レベルでのみ成功します。

メモ SeImpersonatePrivilege 特権は、Windows XP Service Pack 2 (SP2) より前ではサポートされません。

RpcGetAuthorizationContextForClient 関数は ncalrpc および ncacn_* プロトコル シーケンスでのみサポートされ、トランスポート セキュリティのみを実装する名前付きパイプではサポートされません。

RpcGetAuthorizationContextForClient 関数はスレッド セーフであり、複数のスレッドから呼び出すことができます。pAuthzClientContext に返されるコンテキストは関数呼び出しから独立しており、呼び出しの完了後も使用できます。呼び出し元は、 RpcFreeAuthorizationContext 関数を呼び出してコンテキストを解放する責任があります。

従来の偽装、アクセス チェック、または自己への復帰の方法と比較した場合の、 RpcGetAuthorizationContextForClient 関数の使用によって得られるパフォーマンスの向上は、次の要素に依存します。

同じクライアント ID に対する 2 回目以降の RpcGetAuthorizationContextForClient 関数の呼び出しは、コストが極めて低くなります。この効率は、以前の問い合わせの結果がキャッシュされ、可能な限りキャッシュから応答が返されることによって実現されています。

静的な ID 追跡を使用する ncalrpc 経由の呼び出しは、動的な ID 追跡を使用する ncalrpc 経由の呼び出しよりも RpcGetAuthorizationContextForClient 関数の実行が高速です。ncacn_* 経由の呼び出しは、ID 追跡が静的か動的かにかかわらず、特定のプロトコル シーケンスに対してほぼ同じ速度で実行されます。

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

各言語での呼び出し定義

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

RPC_STATUS RpcGetAuthorizationContextForClient(
    void* ClientBinding,   // optional
    BOOL ImpersonateOnReturn,
    void* Reserved1,   // optional
    LONGLONG* pExpirationTime,   // optional
    LUID Reserved2,
    DWORD Reserved3,
    void* Reserved4,   // optional
    void** pAuthzClientContext
);
[DllImport("RPCRT4.dll", ExactSpelling = true)]
static extern int RpcGetAuthorizationContextForClient(
    IntPtr ClientBinding,   // void* optional
    bool ImpersonateOnReturn,   // BOOL
    IntPtr Reserved1,   // void* optional
    IntPtr pExpirationTime,   // LONGLONG* optional
    LUID Reserved2,   // LUID
    uint Reserved3,   // DWORD
    IntPtr Reserved4,   // void* optional
    IntPtr pAuthzClientContext   // void** out
);
<DllImport("RPCRT4.dll", ExactSpelling:=True)>
Public Shared Function RpcGetAuthorizationContextForClient(
    ClientBinding As IntPtr,   ' void* optional
    ImpersonateOnReturn As Boolean,   ' BOOL
    Reserved1 As IntPtr,   ' void* optional
    pExpirationTime As IntPtr,   ' LONGLONG* optional
    Reserved2 As LUID,   ' LUID
    Reserved3 As UInteger,   ' DWORD
    Reserved4 As IntPtr,   ' void* optional
    pAuthzClientContext As IntPtr   ' void** out
) As Integer
End Function
' ClientBinding : void* optional
' ImpersonateOnReturn : BOOL
' Reserved1 : void* optional
' pExpirationTime : LONGLONG* optional
' Reserved2 : LUID
' Reserved3 : DWORD
' Reserved4 : void* optional
' pAuthzClientContext : void** out
Declare PtrSafe Function RpcGetAuthorizationContextForClient Lib "rpcrt4" ( _
    ByVal ClientBinding As LongPtr, _
    ByVal ImpersonateOnReturn As Long, _
    ByVal Reserved1 As LongPtr, _
    ByVal pExpirationTime As LongPtr, _
    ByVal Reserved2 As LongPtr, _
    ByVal Reserved3 As Long, _
    ByVal Reserved4 As LongPtr, _
    ByVal pAuthzClientContext As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

RpcGetAuthorizationContextForClient = ctypes.windll.rpcrt4.RpcGetAuthorizationContextForClient
RpcGetAuthorizationContextForClient.restype = ctypes.c_int
RpcGetAuthorizationContextForClient.argtypes = [
    ctypes.POINTER(None),  # ClientBinding : void* optional
    wintypes.BOOL,  # ImpersonateOnReturn : BOOL
    ctypes.POINTER(None),  # Reserved1 : void* optional
    ctypes.POINTER(ctypes.c_longlong),  # pExpirationTime : LONGLONG* optional
    LUID,  # Reserved2 : LUID
    wintypes.DWORD,  # Reserved3 : DWORD
    ctypes.POINTER(None),  # Reserved4 : void* optional
    ctypes.c_void_p,  # pAuthzClientContext : void** out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('RPCRT4.dll')
RpcGetAuthorizationContextForClient = Fiddle::Function.new(
  lib['RpcGetAuthorizationContextForClient'],
  [
    Fiddle::TYPE_VOIDP,  # ClientBinding : void* optional
    Fiddle::TYPE_INT,  # ImpersonateOnReturn : BOOL
    Fiddle::TYPE_VOIDP,  # Reserved1 : void* optional
    Fiddle::TYPE_VOIDP,  # pExpirationTime : LONGLONG* optional
    Fiddle::TYPE_VOIDP,  # Reserved2 : LUID
    -Fiddle::TYPE_INT,  # Reserved3 : DWORD
    Fiddle::TYPE_VOIDP,  # Reserved4 : void* optional
    Fiddle::TYPE_VOIDP,  # pAuthzClientContext : void** out
  ],
  Fiddle::TYPE_INT)
#[link(name = "rpcrt4")]
extern "system" {
    fn RpcGetAuthorizationContextForClient(
        ClientBinding: *mut (),  // void* optional
        ImpersonateOnReturn: i32,  // BOOL
        Reserved1: *mut (),  // void* optional
        pExpirationTime: *mut i64,  // LONGLONG* optional
        Reserved2: LUID,  // LUID
        Reserved3: u32,  // DWORD
        Reserved4: *mut (),  // void* optional
        pAuthzClientContext: *mut *mut ()  // void** out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("RPCRT4.dll")]
public static extern int RpcGetAuthorizationContextForClient(IntPtr ClientBinding, bool ImpersonateOnReturn, IntPtr Reserved1, IntPtr pExpirationTime, LUID Reserved2, uint Reserved3, IntPtr Reserved4, IntPtr pAuthzClientContext);
"@
$api = Add-Type -MemberDefinition $sig -Name 'RPCRT4_RpcGetAuthorizationContextForClient' -Namespace Win32 -PassThru
# $api::RpcGetAuthorizationContextForClient(ClientBinding, ImpersonateOnReturn, Reserved1, pExpirationTime, Reserved2, Reserved3, Reserved4, pAuthzClientContext)
#uselib "RPCRT4.dll"
#func global RpcGetAuthorizationContextForClient "RpcGetAuthorizationContextForClient" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; RpcGetAuthorizationContextForClient ClientBinding, ImpersonateOnReturn, Reserved1, varptr(pExpirationTime), Reserved2, Reserved3, Reserved4, pAuthzClientContext   ; 戻り値は stat
; ClientBinding : void* optional -> "sptr"
; ImpersonateOnReturn : BOOL -> "sptr"
; Reserved1 : void* optional -> "sptr"
; pExpirationTime : LONGLONG* optional -> "sptr"
; Reserved2 : LUID -> "sptr"
; Reserved3 : DWORD -> "sptr"
; Reserved4 : void* optional -> "sptr"
; pAuthzClientContext : void** out -> "sptr"
; ※値渡し構造体は直接渡せません。intにパック、または var で構造体変数を渡してください。
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "RPCRT4.dll"
#cfunc global RpcGetAuthorizationContextForClient "RpcGetAuthorizationContextForClient" sptr, int, sptr, var, int, int, sptr, sptr
; res = RpcGetAuthorizationContextForClient(ClientBinding, ImpersonateOnReturn, Reserved1, pExpirationTime, Reserved2, Reserved3, Reserved4, pAuthzClientContext)
; ClientBinding : void* optional -> "sptr"
; ImpersonateOnReturn : BOOL -> "int"
; Reserved1 : void* optional -> "sptr"
; pExpirationTime : LONGLONG* optional -> "var"
; Reserved2 : LUID -> "int"
; Reserved3 : DWORD -> "int"
; Reserved4 : void* optional -> "sptr"
; pAuthzClientContext : void** out -> "sptr"
; ※値渡し構造体は直接渡せません。intにパック、または var で構造体変数を渡してください。
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; RPC_STATUS RpcGetAuthorizationContextForClient(void* ClientBinding, BOOL ImpersonateOnReturn, void* Reserved1, LONGLONG* pExpirationTime, LUID Reserved2, DWORD Reserved3, void* Reserved4, void** pAuthzClientContext)
#uselib "RPCRT4.dll"
#cfunc global RpcGetAuthorizationContextForClient "RpcGetAuthorizationContextForClient" intptr, int, intptr, var, int, int, intptr, intptr
; res = RpcGetAuthorizationContextForClient(ClientBinding, ImpersonateOnReturn, Reserved1, pExpirationTime, Reserved2, Reserved3, Reserved4, pAuthzClientContext)
; ClientBinding : void* optional -> "intptr"
; ImpersonateOnReturn : BOOL -> "int"
; Reserved1 : void* optional -> "intptr"
; pExpirationTime : LONGLONG* optional -> "var"
; Reserved2 : LUID -> "int"
; Reserved3 : DWORD -> "int"
; Reserved4 : void* optional -> "intptr"
; pAuthzClientContext : void** out -> "intptr"
; ※値渡し構造体は直接渡せません。intにパック、または var で構造体変数を渡してください。
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	rpcrt4 = windows.NewLazySystemDLL("RPCRT4.dll")
	procRpcGetAuthorizationContextForClient = rpcrt4.NewProc("RpcGetAuthorizationContextForClient")
)

// ClientBinding (void* optional), ImpersonateOnReturn (BOOL), Reserved1 (void* optional), pExpirationTime (LONGLONG* optional), Reserved2 (LUID), Reserved3 (DWORD), Reserved4 (void* optional), pAuthzClientContext (void** out)
r1, _, err := procRpcGetAuthorizationContextForClient.Call(
	uintptr(ClientBinding),
	uintptr(ImpersonateOnReturn),
	uintptr(Reserved1),
	uintptr(pExpirationTime),
	uintptr(Reserved2),
	uintptr(Reserved3),
	uintptr(Reserved4),
	uintptr(pAuthzClientContext),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // RPC_STATUS
function RpcGetAuthorizationContextForClient(
  ClientBinding: Pointer;   // void* optional
  ImpersonateOnReturn: BOOL;   // BOOL
  Reserved1: Pointer;   // void* optional
  pExpirationTime: Pointer;   // LONGLONG* optional
  Reserved2: LUID;   // LUID
  Reserved3: DWORD;   // DWORD
  Reserved4: Pointer;   // void* optional
  pAuthzClientContext: Pointer   // void** out
): Integer; stdcall;
  external 'RPCRT4.dll' name 'RpcGetAuthorizationContextForClient';
result := DllCall("RPCRT4\RpcGetAuthorizationContextForClient"
    , "Ptr", ClientBinding   ; void* optional
    , "Int", ImpersonateOnReturn   ; BOOL
    , "Ptr", Reserved1   ; void* optional
    , "Ptr", pExpirationTime   ; LONGLONG* optional
    , "Ptr", Reserved2   ; LUID
    , "UInt", Reserved3   ; DWORD
    , "Ptr", Reserved4   ; void* optional
    , "Ptr", pAuthzClientContext   ; void** out
    , "Int")   ; return: RPC_STATUS
●RpcGetAuthorizationContextForClient(ClientBinding, ImpersonateOnReturn, Reserved1, pExpirationTime, Reserved2, Reserved3, Reserved4, pAuthzClientContext) = DLL("RPCRT4.dll", "int RpcGetAuthorizationContextForClient(void*, bool, void*, void*, void*, dword, void*, void*)")
# 呼び出し: RpcGetAuthorizationContextForClient(ClientBinding, ImpersonateOnReturn, Reserved1, pExpirationTime, Reserved2, Reserved3, Reserved4, pAuthzClientContext)
# ClientBinding : void* optional -> "void*"
# ImpersonateOnReturn : BOOL -> "bool"
# Reserved1 : void* optional -> "void*"
# pExpirationTime : LONGLONG* optional -> "void*"
# Reserved2 : LUID -> "void*"
# Reserved3 : DWORD -> "dword"
# Reserved4 : void* optional -> "void*"
# pAuthzClientContext : void** out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "rpcrt4" fn RpcGetAuthorizationContextForClient(
    ClientBinding: ?*anyopaque, // void* optional
    ImpersonateOnReturn: i32, // BOOL
    Reserved1: ?*anyopaque, // void* optional
    pExpirationTime: [*c]i64, // LONGLONG* optional
    Reserved2: LUID, // LUID
    Reserved3: u32, // DWORD
    Reserved4: ?*anyopaque, // void* optional
    pAuthzClientContext: ?*anyopaque // void** out
) callconv(std.os.windows.WINAPI) i32;
proc RpcGetAuthorizationContextForClient(
    ClientBinding: pointer,  # void* optional
    ImpersonateOnReturn: int32,  # BOOL
    Reserved1: pointer,  # void* optional
    pExpirationTime: ptr int64,  # LONGLONG* optional
    Reserved2: LUID,  # LUID
    Reserved3: uint32,  # DWORD
    Reserved4: pointer,  # void* optional
    pAuthzClientContext: pointer  # void** out
): int32 {.importc: "RpcGetAuthorizationContextForClient", stdcall, dynlib: "RPCRT4.dll".}
pragma(lib, "rpcrt4");
extern(Windows)
int RpcGetAuthorizationContextForClient(
    void* ClientBinding,   // void* optional
    int ImpersonateOnReturn,   // BOOL
    void* Reserved1,   // void* optional
    long* pExpirationTime,   // LONGLONG* optional
    LUID Reserved2,   // LUID
    uint Reserved3,   // DWORD
    void* Reserved4,   // void* optional
    void** pAuthzClientContext   // void** out
);
ccall((:RpcGetAuthorizationContextForClient, "RPCRT4.dll"), stdcall, Int32,
      (Ptr{Cvoid}, Int32, Ptr{Cvoid}, Ptr{Int64}, LUID, UInt32, Ptr{Cvoid}, Ptr{Cvoid}),
      ClientBinding, ImpersonateOnReturn, Reserved1, pExpirationTime, Reserved2, Reserved3, Reserved4, pAuthzClientContext)
# ClientBinding : void* optional -> Ptr{Cvoid}
# ImpersonateOnReturn : BOOL -> Int32
# Reserved1 : void* optional -> Ptr{Cvoid}
# pExpirationTime : LONGLONG* optional -> Ptr{Int64}
# Reserved2 : LUID -> LUID
# Reserved3 : DWORD -> UInt32
# Reserved4 : void* optional -> Ptr{Cvoid}
# pAuthzClientContext : void** out -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t RpcGetAuthorizationContextForClient(
    void* ClientBinding,
    int32_t ImpersonateOnReturn,
    void* Reserved1,
    int64_t* pExpirationTime,
    LUID Reserved2,
    uint32_t Reserved3,
    void* Reserved4,
    void** pAuthzClientContext);
]]
local rpcrt4 = ffi.load("rpcrt4")
-- rpcrt4.RpcGetAuthorizationContextForClient(ClientBinding, ImpersonateOnReturn, Reserved1, pExpirationTime, Reserved2, Reserved3, Reserved4, pAuthzClientContext)
-- ClientBinding : void* optional
-- ImpersonateOnReturn : BOOL
-- Reserved1 : void* optional
-- pExpirationTime : LONGLONG* optional
-- Reserved2 : LUID
-- Reserved3 : DWORD
-- Reserved4 : void* optional
-- pAuthzClientContext : void** out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('RPCRT4.dll');
const RpcGetAuthorizationContextForClient = lib.func('__stdcall', 'RpcGetAuthorizationContextForClient', 'int32_t', ['void *', 'int32_t', 'void *', 'int64_t *', 'LUID', 'uint32_t', 'void *', 'void *']);
// RpcGetAuthorizationContextForClient(ClientBinding, ImpersonateOnReturn, Reserved1, pExpirationTime, Reserved2, Reserved3, Reserved4, pAuthzClientContext)
// ClientBinding : void* optional -> 'void *'
// ImpersonateOnReturn : BOOL -> 'int32_t'
// Reserved1 : void* optional -> 'void *'
// pExpirationTime : LONGLONG* optional -> 'int64_t *'
// Reserved2 : LUID -> 'LUID'
// Reserved3 : DWORD -> 'uint32_t'
// Reserved4 : void* optional -> 'void *'
// pAuthzClientContext : void** out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("RPCRT4.dll", {
  RpcGetAuthorizationContextForClient: { parameters: ["pointer", "i32", "pointer", "pointer", "buffer", "u32", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.RpcGetAuthorizationContextForClient(ClientBinding, ImpersonateOnReturn, Reserved1, pExpirationTime, Reserved2, Reserved3, Reserved4, pAuthzClientContext)
// ClientBinding : void* optional -> "pointer"
// ImpersonateOnReturn : BOOL -> "i32"
// Reserved1 : void* optional -> "pointer"
// pExpirationTime : LONGLONG* optional -> "pointer"
// Reserved2 : LUID -> "buffer"
// Reserved3 : DWORD -> "u32"
// Reserved4 : void* optional -> "pointer"
// pAuthzClientContext : void** out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t RpcGetAuthorizationContextForClient(
    void* ClientBinding,
    int32_t ImpersonateOnReturn,
    void* Reserved1,
    int64_t* pExpirationTime,
    LUID Reserved2,
    uint32_t Reserved3,
    void* Reserved4,
    void** pAuthzClientContext);
C, "RPCRT4.dll");
// $ffi->RpcGetAuthorizationContextForClient(ClientBinding, ImpersonateOnReturn, Reserved1, pExpirationTime, Reserved2, Reserved3, Reserved4, pAuthzClientContext);
// ClientBinding : void* optional
// ImpersonateOnReturn : BOOL
// Reserved1 : void* optional
// pExpirationTime : LONGLONG* optional
// Reserved2 : LUID
// Reserved3 : DWORD
// Reserved4 : void* optional
// pAuthzClientContext : void** out
// 構造体/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 Rpcrt4 extends StdCallLibrary {
    Rpcrt4 INSTANCE = Native.load("rpcrt4", Rpcrt4.class);
    int RpcGetAuthorizationContextForClient(
        Pointer ClientBinding,   // void* optional
        boolean ImpersonateOnReturn,   // BOOL
        Pointer Reserved1,   // void* optional
        LongByReference pExpirationTime,   // LONGLONG* optional
        LUID /* extends Structure (by value) */ Reserved2,   // LUID
        int Reserved3,   // DWORD
        Pointer Reserved4,   // void* optional
        Pointer pAuthzClientContext   // void** out
    );
}
@[Link("rpcrt4")]
lib LibRPCRT4
  fun RpcGetAuthorizationContextForClient = RpcGetAuthorizationContextForClient(
    ClientBinding : Void*,   # void* optional
    ImpersonateOnReturn : Int32,   # BOOL
    Reserved1 : Void*,   # void* optional
    pExpirationTime : Int64*,   # LONGLONG* optional
    Reserved2 : LUID,   # LUID
    Reserved3 : UInt32,   # DWORD
    Reserved4 : Void*,   # void* optional
    pAuthzClientContext : Void**   # void** out
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef RpcGetAuthorizationContextForClientNative = Int32 Function(Pointer<Void>, Int32, Pointer<Void>, Pointer<Int64>, LUID, Uint32, Pointer<Void>, Pointer<Void>);
typedef RpcGetAuthorizationContextForClientDart = int Function(Pointer<Void>, int, Pointer<Void>, Pointer<Int64>, int, int, Pointer<Void>, Pointer<Void>);
final RpcGetAuthorizationContextForClient = DynamicLibrary.open('RPCRT4.dll')
    .lookupFunction<RpcGetAuthorizationContextForClientNative, RpcGetAuthorizationContextForClientDart>('RpcGetAuthorizationContextForClient');
// ClientBinding : void* optional -> Pointer<Void>
// ImpersonateOnReturn : BOOL -> Int32
// Reserved1 : void* optional -> Pointer<Void>
// pExpirationTime : LONGLONG* optional -> Pointer<Int64>
// Reserved2 : LUID -> LUID
// Reserved3 : DWORD -> Uint32
// Reserved4 : void* optional -> Pointer<Void>
// pAuthzClientContext : void** out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function RpcGetAuthorizationContextForClient(
  ClientBinding: Pointer;   // void* optional
  ImpersonateOnReturn: BOOL;   // BOOL
  Reserved1: Pointer;   // void* optional
  pExpirationTime: Pointer;   // LONGLONG* optional
  Reserved2: LUID;   // LUID
  Reserved3: DWORD;   // DWORD
  Reserved4: Pointer;   // void* optional
  pAuthzClientContext: Pointer   // void** out
): Integer; stdcall;
  external 'RPCRT4.dll' name 'RpcGetAuthorizationContextForClient';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "RpcGetAuthorizationContextForClient"
  c_RpcGetAuthorizationContextForClient :: Ptr () -> CInt -> Ptr () -> Ptr Int64 -> LUID -> Word32 -> Ptr () -> Ptr () -> IO Int32
-- ClientBinding : void* optional -> Ptr ()
-- ImpersonateOnReturn : BOOL -> CInt
-- Reserved1 : void* optional -> Ptr ()
-- pExpirationTime : LONGLONG* optional -> Ptr Int64
-- Reserved2 : LUID -> LUID
-- Reserved3 : DWORD -> Word32
-- Reserved4 : void* optional -> Ptr ()
-- pAuthzClientContext : void** out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
-- ※値渡し構造体は GHC FFI で直接渡せません。Ptr で渡すラッパ(C側)経由にしてください。
open Ctypes
open Foreign

let rpcgetauthorizationcontextforclient =
  foreign "RpcGetAuthorizationContextForClient"
    ((ptr void) @-> int32_t @-> (ptr void) @-> (ptr int64_t) @-> LUID @-> uint32_t @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* ClientBinding : void* optional -> (ptr void) *)
(* ImpersonateOnReturn : BOOL -> int32_t *)
(* Reserved1 : void* optional -> (ptr void) *)
(* pExpirationTime : LONGLONG* optional -> (ptr int64_t) *)
(* Reserved2 : LUID -> LUID *)
(* Reserved3 : DWORD -> uint32_t *)
(* Reserved4 : void* optional -> (ptr void) *)
(* pAuthzClientContext : void** out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library rpcrt4 (t "RPCRT4.dll"))
(cffi:use-foreign-library rpcrt4)

(cffi:defcfun ("RpcGetAuthorizationContextForClient" rpc-get-authorization-context-for-client :convention :stdcall) :int32
  (client-binding :pointer)   ; void* optional
  (impersonate-on-return :int32)   ; BOOL
  (reserved1 :pointer)   ; void* optional
  (p-expiration-time :pointer)   ; LONGLONG* optional
  (reserved2 (:struct luid))   ; LUID
  (reserved3 :uint32)   ; DWORD
  (reserved4 :pointer)   ; void* optional
  (p-authz-client-context :pointer))   ; void** out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $RpcGetAuthorizationContextForClient = Win32::API::More->new('RPCRT4',
    'int RpcGetAuthorizationContextForClient(LPVOID ClientBinding, BOOL ImpersonateOnReturn, LPVOID Reserved1, LPVOID pExpirationTime, LPVOID Reserved2, DWORD Reserved3, LPVOID Reserved4, LPVOID pAuthzClientContext)');
# my $ret = $RpcGetAuthorizationContextForClient->Call($ClientBinding, $ImpersonateOnReturn, $Reserved1, $pExpirationTime, $Reserved2, $Reserved3, $Reserved4, $pAuthzClientContext);
# ClientBinding : void* optional -> LPVOID
# ImpersonateOnReturn : BOOL -> BOOL
# Reserved1 : void* optional -> LPVOID
# pExpirationTime : LONGLONG* optional -> LPVOID
# Reserved2 : LUID -> LPVOID
# Reserved3 : DWORD -> DWORD
# Reserved4 : void* optional -> LPVOID
# pAuthzClientContext : void** out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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