RPC_INTERFACE_TEMPLATEW
構造体サイズ=各フィールドのバイト数(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 | LPWSTR | 8/4 | +64 | +36 | エンドポイントマッパー登録用の注釈文字列。LPWSTR型。 |
| 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 を定義します。エンコードに依存しないエイリアスの使用を、エンコードに依存するコードと混在させると、不一致が生じてコンパイル エラーや実行時エラーの原因となる可能性があります。詳細については、Conventions for Function Prototypes を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// RPC_INTERFACE_TEMPLATEW (x64 80 / x86 44 バイト)
typedef struct RPC_INTERFACE_TEMPLATEW {
DWORD Version;
void* IfSpec;
GUID* MgrTypeUuid;
void* MgrEpv;
DWORD Flags;
DWORD MaxCalls;
DWORD MaxRpcSize;
RPC_IF_CALLBACK_FN IfCallback;
UUID_VECTOR* UuidVector;
LPWSTR Annotation;
void* SecurityDescriptor;
} RPC_INTERFACE_TEMPLATEW;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RPC_INTERFACE_TEMPLATEW
{
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_TEMPLATEW
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_TEMPLATEW(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_TEMPLATEW {
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_TEMPLATEW 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_TEMPLATEW = 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_TEMPLATEW = 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_TEMPLATEW {.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_TEMPLATEW
{
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_TEMPLATEW サイズ: 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 : LPWSTR (+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_TEMPLATEW サイズ: 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 : LPWSTR (+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_TEMPLATEW
#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_TEMPLATEW ; NSTRUCT 変数を確保
st->Version = 100
mes "Version=" + st->Version