RpcGetAuthorizationContextForClient
関数シグネチャ
// 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
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| ClientBinding | void* | inoptional | クライアントへのバインドを表す、サーバー側のバインディング ハンドル。サーバーは、このハンドルが示すクライアントを偽装します。値に 0 を指定した場合、サーバーは、このサーバー スレッドが処理しているクライアントを偽装します。 |
| ImpersonateOnReturn | BOOL | in | リターン時にクライアントを偽装してから AUTHZ_CLIENT_CONTEXT_HANDLE 構造体を返すように、関数に指示します。クライアントを偽装するには、このパラメーターに 0 以外の値を設定します。「解説」を参照してください。 |
| Reserved1 | void* | inoptional | 予約されています。null でなければなりません。 |
| pExpirationTime | LONGLONG* | inoptional | トークンの有効期限の日時へのポインター。値を渡さない場合、トークンの有効期限は切れません。有効期限は現在のところ強制されません。 |
| Reserved2 | LUID | in | 予約されています。各メンバーを 0 に設定した LUID 構造体でなければなりません。 |
| Reserved3 | DWORD | in | 予約されています。0 でなければなりません。 |
| Reserved4 | void* | inoptional | 予約されています。null でなければなりません。 |
| pAuthzClientContext | void** | out | Authz 関数に直接渡すことができる AUTHZ_CLIENT_CONTEXT_HANDLE 構造体へのポインター。関数が失敗した場合、このパラメーターの内容は未定義です。 |
戻り値の型: RPC_STATUS
公式ドキュメント
RpcGetAuthorizationContextForClient 関数は、高パフォーマンスな認証のために Authz 関数と共に使用できる、RPC クライアント用の Authz コンテキストを返します。ncalrpc および ncacn_* プロトコル シーケンスでのみサポートされます。
戻り値
| 値 | 説明 |
|---|---|
| 呼び出しに成功しました。 | |
|
予約済みパラメーターの値が、規定された値と異なります。 |
| 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 に対して関数が呼び出される回数。
- その関数呼び出しで有効なプロトコル シーケンスと ID 追跡。
静的な ID 追跡を使用する ncalrpc 経由の呼び出しは、動的な ID 追跡を使用する ncalrpc 経由の呼び出しよりも RpcGetAuthorizationContextForClient 関数の実行が高速です。ncacn_* 経由の呼び出しは、ID 追跡が静的か動的かにかかわらず、特定のプロトコル シーケンスに対してほぼ同じ速度で実行されます。
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 方式にも切替可。#uselib "RPCRT4.dll" #cfunc global RpcGetAuthorizationContextForClient "RpcGetAuthorizationContextForClient" sptr, int, sptr, sptr, int, int, sptr, sptr ; res = RpcGetAuthorizationContextForClient(ClientBinding, ImpersonateOnReturn, Reserved1, varptr(pExpirationTime), Reserved2, Reserved3, Reserved4, pAuthzClientContext) ; ClientBinding : void* optional -> "sptr" ; ImpersonateOnReturn : BOOL -> "int" ; Reserved1 : void* optional -> "sptr" ; pExpirationTime : LONGLONG* optional -> "sptr" ; Reserved2 : LUID -> "int" ; Reserved3 : DWORD -> "int" ; Reserved4 : void* optional -> "sptr" ; pAuthzClientContext : void** out -> "sptr" ; ※値渡し構造体は直接渡せません。intにパック、または var で構造体変数を渡してください。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは 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 方式にも切替可。; 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, intptr, int, int, intptr, intptr ; res = RpcGetAuthorizationContextForClient(ClientBinding, ImpersonateOnReturn, Reserved1, varptr(pExpirationTime), Reserved2, Reserved3, Reserved4, pAuthzClientContext) ; ClientBinding : void* optional -> "intptr" ; ImpersonateOnReturn : BOOL -> "int" ; Reserved1 : void* optional -> "intptr" ; pExpirationTime : LONGLONG* optional -> "intptr" ; Reserved2 : LUID -> "int" ; Reserved3 : DWORD -> "int" ; Reserved4 : void* optional -> "intptr" ; pAuthzClientContext : void** out -> "intptr" ; ※値渡し構造体は直接渡せません。intにパック、または var で構造体変数を渡してください。 ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは 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_STATUSfunction 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 を使用。関連項目
- f RpcFreeAuthorizationContext — 取得した認可コンテキストを解放する。
- f RpcImpersonateClient — RPCクライアントのセキュリティ資格に偽装する。