RPC_INTERFACE_TEMPLATEA
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Version | DWORD | 4 | +0 | +0 | このフィールドは予約済みであり、0 に設定しなければなりません。 |
| IfSpec | void* | 8/4 | +8 | +4 | 登録するインターフェイスを定義する、MIDL によって生成された構造体です。 |
| MgrTypeUuid | GUID* | 8/4 | +16 | +8 | MgrEpv に関連付ける UUID へのポインターです。NULL または nil UUID を指定すると、IfSpec は nil UUID で登録されます。 |
| MgrEpv | void* | 8/4 | +24 | +12 | マネージャールーチンのエントリポイントベクター (EPV) を格納する RPC_MGR_EPV 構造体へのポインターです。NULL の場合は、MIDL によって生成された既定の EPV が使用されます。 |
| Flags | DWORD | 4 | +32 | +16 | フラグです。フラグ値の一覧については、Interface Registration Flags を参照してください。インターフェイスグループのインターフェイスは、常に auto-listen として扱われます。 |
| MaxCalls | DWORD | 4 | +36 | +20 | このインターフェイスでサーバーが受け入れることができる、同時リモートプロシージャコール要求の最大数です。RPC ランタイムライブラリは、MaxCalls で指定された数を超える同時呼び出し要求をサーバーが許可しないように最大限の努力をします。ただし、実際の数は MaxCalls を超える場合があり、プロトコルシーケンスごとに異なることがあります。 他のインターフェイスに対する呼び出しは、RpcServerListen で指定されるプロセス全体の MaxCalls パラメーターの値によって制御されます。 同時呼び出し数が問題にならない場合は、RPC_C_LISTEN_MAX_CALLS_DEFAULT によって既定値を指定すると、サーバー側のパフォーマンスをわずかに向上させることができます。これにより、RPC ランタイム環境が不要な制限を課す必要がなくなります。 |
| MaxRpcSize | DWORD | 4 | +40 | +24 | 受信データブロックの最大サイズ (バイト単位) です。MaxRpcSize は、悪意のあるサービス拒否攻撃を防ぐために使用できます。リモートプロシージャコールのデータブロックが MaxRpcSize より大きい場合、RPC ランタイムライブラリはその呼び出しを拒否し、クライアントに RPC_S_ACCESS_DENIED エラーを送信します。MaxRpcSize に (unsigned int) –1 を指定すると、受信データブロックのサイズ制限が解除されます。このパラメーターは、ncalrpc プロトコル経由で行われる呼び出しには影響しません。 |
| IfCallback | RPC_IF_CALLBACK_FN | 8/4 | +48 | +28 | RPC_INTERFACE_GROUP_IDLE_CALLBACK_FN セキュリティコールバック関数へのポインターです。コールバックを使用しない場合は NULL を指定します。登録された各インターフェイスは、それぞれ異なるコールバック関数を持つことができます。 |
| UuidVector | UUID_VECTOR* | 8/4 | +56 | +32 | RPC エンドポイントマッパーに登録するためにサーバーが提供する、オブジェクト UUID のベクターへのポインターです。このベクターはサーバーアプリケーションが構築します。NULL は、登録するオブジェクト UUID がないことを示します。 |
| Annotation | LPSTR | 8/4 | +64 | +36 | エンドポイントマッパー登録用の注釈文字列。LPSTR型。 |
| SecurityDescriptor | void* | 8/4 | +72 | +40 | どのクライアントがインターフェイスへのアクセス権を持つかを記述する、省略可能なセキュリティ記述子です。 |
公式ドキュメント
RPC_INTERFACE_TEMPLATE 構造体は、RPC インターフェイスグループのサーバーインターフェイスを定義します。
解説(Remarks)
インターフェイスを登録するために、サーバーは次の情報を提供します。
- インターフェイス仕様 インターフェイス仕様は、MIDL コンパイラーが生成するデータ構造です。
- マネージャー型 UUID とマネージャー EPV マネージャー型 UUID とマネージャー EPV は、サーバーがクライアントからリモートプロシージャコール要求を受け取ったときに、どのマネージャールーチンが実行されるかを決定します。サーバーが提供するインターフェイスの実装ごとに、個別のマネージャー EPV を登録する必要があります。 nil でないマネージャー型 UUID を指定する場合、サーバーは RpcObjectSetType も呼び出して、この nil でない型のオブジェクトを登録しなければならないことに注意してください。
インターフェイスグループのインターフェイスは、すべて auto-listen として扱われます。ランタイムは、インターフェイスグループがアクティブ化されるとすぐに呼び出しの待機を開始します。RpcServerListen および RpcMgmtStopServerListening の呼び出しはこのインターフェイスに影響せず、IfSpec に NULL を指定した RpcServerUnregisterIf の呼び出しも影響しません。
IfCallback にセキュリティコールバック関数を指定すると、サーバーアプリケーションはクライアント単位でインターフェイスへのアクセスを制限できます。つまり、既定ではセキュリティは省略可能であり、サーバーが RpcServerRegisterAuthInfo を呼び出していても、サーバーのランタイムはセキュリティで保護されていない呼び出しをディスパッチします。認証されたクライアントだけを受け入れたい場合は、インターフェイスのコールバック関数で RpcBindingInqAuthClient、RpcGetAuthorizationContextForClient、または RpcServerInqCallAttributes を呼び出してセキュリティレベルを取得するか、RpcImpersonateClient でクライアントの偽装を試みる必要があります。また、Flags に RPC_IF_ALLOW_SECURE_ONLY フラグを指定して、認証されていない呼び出しを拒否することもできます。
サーバーアプリケーションが IfCallback にインターフェイス用のセキュリティコールバック関数を指定すると、RPC ランタイムは、そのインターフェイスに対する認証情報のない呼び出しを自動的に拒否します。さらにランタイムは、各クライアントが使用したインターフェイスを記録します。クライアントが現在の通信セッション中に使用していないインターフェイスに対して RPC を行うと、RPC ランタイムライブラリはそのインターフェイスのセキュリティコールバック関数を呼び出します。Flags に RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH を指定すると、認証されていないクライアントの自動的な拒否は行われなくなります。NULL セキュリティセッション上の呼び出しは、匿名クライアントからのものであっても認証情報を持つ場合があることに注意してください。したがって、コールバックが存在するだけでは匿名クライアントの接続を防ぐには不十分であり、セキュリティコールバック関数でそれを確認するか、RPC_IF_ALLOW_SECURE_ONLY フラグを使用する必要があります。RPC_IF_ALLOW_SECURE_ONLY が null セッションの呼び出しを拒否するのは、Windows XP 以降のバージョンの Windows のみです。
コールバック関数のシグネチャについては、RPC_IF_CALLBACK_FN を参照してください。
IfCallback のコールバック関数は、クライアントがこのインターフェイスのメソッドを呼び出すことを許可する場合に RPC_S_OK を返す必要があります。それ以外の戻りコードを返すと、クライアントは例外 RPC_S_ACCESS_DENIED を受け取ります。
場合によっては、RPC ランタイムがクライアントごと、インターフェイスごとにセキュリティコールバック関数を複数回呼び出すことがあります。コールバック関数はこの可能性に対応できなければなりません。
rpcdce.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして RPC_INTERFACE_TEMPLATE を定義しています。エンコーディング中立のエイリアスの使用と、エンコーディング中立でないコードを混在させると、不一致が生じてコンパイルエラーや実行時エラーの原因となる可能性があります。詳細については、関数プロトタイプの規則を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// RPC_INTERFACE_TEMPLATEA (x64 80 / x86 44 バイト)
typedef struct RPC_INTERFACE_TEMPLATEA {
DWORD Version;
void* IfSpec;
GUID* MgrTypeUuid;
void* MgrEpv;
DWORD Flags;
DWORD MaxCalls;
DWORD MaxRpcSize;
RPC_IF_CALLBACK_FN IfCallback;
UUID_VECTOR* UuidVector;
LPSTR Annotation;
void* SecurityDescriptor;
} RPC_INTERFACE_TEMPLATEA;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RPC_INTERFACE_TEMPLATEA
{
public uint Version;
public IntPtr IfSpec;
public IntPtr MgrTypeUuid;
public IntPtr MgrEpv;
public uint Flags;
public uint MaxCalls;
public uint MaxRpcSize;
public IntPtr IfCallback;
public IntPtr UuidVector;
public IntPtr Annotation;
public IntPtr SecurityDescriptor;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RPC_INTERFACE_TEMPLATEA
Public Version As UInteger
Public IfSpec As IntPtr
Public MgrTypeUuid As IntPtr
Public MgrEpv As IntPtr
Public Flags As UInteger
Public MaxCalls As UInteger
Public MaxRpcSize As UInteger
Public IfCallback As IntPtr
Public UuidVector As IntPtr
Public Annotation As IntPtr
Public SecurityDescriptor As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class RPC_INTERFACE_TEMPLATEA(ctypes.Structure):
_fields_ = [
("Version", wintypes.DWORD),
("IfSpec", ctypes.c_void_p),
("MgrTypeUuid", ctypes.c_void_p),
("MgrEpv", ctypes.c_void_p),
("Flags", wintypes.DWORD),
("MaxCalls", wintypes.DWORD),
("MaxRpcSize", wintypes.DWORD),
("IfCallback", ctypes.c_void_p),
("UuidVector", ctypes.c_void_p),
("Annotation", ctypes.c_void_p),
("SecurityDescriptor", ctypes.c_void_p),
]#[repr(C)]
pub struct RPC_INTERFACE_TEMPLATEA {
pub Version: u32,
pub IfSpec: *mut core::ffi::c_void,
pub MgrTypeUuid: *mut core::ffi::c_void,
pub MgrEpv: *mut core::ffi::c_void,
pub Flags: u32,
pub MaxCalls: u32,
pub MaxRpcSize: u32,
pub IfCallback: *mut core::ffi::c_void,
pub UuidVector: *mut core::ffi::c_void,
pub Annotation: *mut core::ffi::c_void,
pub SecurityDescriptor: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type RPC_INTERFACE_TEMPLATEA struct {
Version uint32
IfSpec uintptr
MgrTypeUuid uintptr
MgrEpv uintptr
Flags uint32
MaxCalls uint32
MaxRpcSize uint32
IfCallback uintptr
UuidVector uintptr
Annotation uintptr
SecurityDescriptor uintptr
}type
RPC_INTERFACE_TEMPLATEA = record
Version: DWORD;
IfSpec: Pointer;
MgrTypeUuid: Pointer;
MgrEpv: Pointer;
Flags: DWORD;
MaxCalls: DWORD;
MaxRpcSize: DWORD;
IfCallback: Pointer;
UuidVector: Pointer;
Annotation: Pointer;
SecurityDescriptor: Pointer;
end;const RPC_INTERFACE_TEMPLATEA = extern struct {
Version: u32,
IfSpec: ?*anyopaque,
MgrTypeUuid: ?*anyopaque,
MgrEpv: ?*anyopaque,
Flags: u32,
MaxCalls: u32,
MaxRpcSize: u32,
IfCallback: ?*anyopaque,
UuidVector: ?*anyopaque,
Annotation: ?*anyopaque,
SecurityDescriptor: ?*anyopaque,
};type
RPC_INTERFACE_TEMPLATEA {.bycopy.} = object
Version: uint32
IfSpec: pointer
MgrTypeUuid: pointer
MgrEpv: pointer
Flags: uint32
MaxCalls: uint32
MaxRpcSize: uint32
IfCallback: pointer
UuidVector: pointer
Annotation: pointer
SecurityDescriptor: pointerstruct RPC_INTERFACE_TEMPLATEA
{
uint Version;
void* IfSpec;
void* MgrTypeUuid;
void* MgrEpv;
uint Flags;
uint MaxCalls;
uint MaxRpcSize;
void* IfCallback;
void* UuidVector;
void* Annotation;
void* SecurityDescriptor;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; RPC_INTERFACE_TEMPLATEA サイズ: 44 バイト(x86)
dim st, 11 ; 4byte整数×11(構造体サイズ 44 / 4 切り上げ)
; Version : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; IfSpec : void* (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; MgrTypeUuid : GUID* (+8, 4byte) varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; MgrEpv : void* (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; Flags : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; MaxCalls : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; MaxRpcSize : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; IfCallback : RPC_IF_CALLBACK_FN (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; UuidVector : UUID_VECTOR* (+32, 4byte) varptr(st)+32 を基点に操作(4byte:入れ子/配列)
; Annotation : LPSTR (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; SecurityDescriptor : void* (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; RPC_INTERFACE_TEMPLATEA サイズ: 80 バイト(x64)
dim st, 20 ; 4byte整数×20(構造体サイズ 80 / 4 切り上げ)
; Version : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; IfSpec : void* (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; MgrTypeUuid : GUID* (+16, 8byte) varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; MgrEpv : void* (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; Flags : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; MaxCalls : DWORD (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; MaxRpcSize : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; IfCallback : RPC_IF_CALLBACK_FN (+48, 8byte) qpoke st,48,値 / qpeek(st,48) ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; UuidVector : UUID_VECTOR* (+56, 8byte) varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; Annotation : LPSTR (+64, 8byte) qpoke st,64,値 / qpeek(st,64) ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; SecurityDescriptor : void* (+72, 8byte) qpoke st,72,値 / qpeek(st,72) ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global RPC_INTERFACE_TEMPLATEA
#field int Version
#field intptr IfSpec
#field intptr MgrTypeUuid
#field intptr MgrEpv
#field int Flags
#field int MaxCalls
#field int MaxRpcSize
#field intptr IfCallback
#field intptr UuidVector
#field intptr Annotation
#field intptr SecurityDescriptor
#endstruct
stdim st, RPC_INTERFACE_TEMPLATEA ; NSTRUCT 変数を確保
st->Version = 100
mes "Version=" + st->Version