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

RPC_INTERFACE_TEMPLATEA

構造体
サイズx64: 80 バイト / x86: 44 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
VersionDWORD4+0+0このフィールドは予約済みであり、0 に設定しなければなりません。
IfSpecvoid*8/4+8+4登録するインターフェイスを定義する、MIDL によって生成された構造体です。
MgrTypeUuidGUID*8/4+16+8MgrEpv に関連付ける UUID へのポインターです。NULL または nil UUID を指定すると、IfSpec は nil UUID で登録されます。
MgrEpvvoid*8/4+24+12マネージャールーチンのエントリポイントベクター (EPV) を格納する RPC_MGR_EPV 構造体へのポインターです。NULL の場合は、MIDL によって生成された既定の EPV が使用されます。
FlagsDWORD4+32+16フラグです。フラグ値の一覧については、Interface Registration Flags を参照してください。インターフェイスグループのインターフェイスは、常に auto-listen として扱われます。
MaxCallsDWORD4+36+20

このインターフェイスでサーバーが受け入れることができる、同時リモートプロシージャコール要求の最大数です。RPC ランタイムライブラリは、MaxCalls で指定された数を超える同時呼び出し要求をサーバーが許可しないように最大限の努力をします。ただし、実際の数は MaxCalls を超える場合があり、プロトコルシーケンスごとに異なることがあります。

他のインターフェイスに対する呼び出しは、RpcServerListen で指定されるプロセス全体の MaxCalls パラメーターの値によって制御されます。

同時呼び出し数が問題にならない場合は、RPC_C_LISTEN_MAX_CALLS_DEFAULT によって既定値を指定すると、サーバー側のパフォーマンスをわずかに向上させることができます。これにより、RPC ランタイム環境が不要な制限を課す必要がなくなります。

MaxRpcSizeDWORD4+40+24受信データブロックの最大サイズ (バイト単位) です。MaxRpcSize は、悪意のあるサービス拒否攻撃を防ぐために使用できます。リモートプロシージャコールのデータブロックが MaxRpcSize より大きい場合、RPC ランタイムライブラリはその呼び出しを拒否し、クライアントに RPC_S_ACCESS_DENIED エラーを送信します。MaxRpcSize に (unsigned int) –1 を指定すると、受信データブロックのサイズ制限が解除されます。このパラメーターは、ncalrpc プロトコル経由で行われる呼び出しには影響しません。
IfCallbackRPC_IF_CALLBACK_FN8/4+48+28RPC_INTERFACE_GROUP_IDLE_CALLBACK_FN セキュリティコールバック関数へのポインターです。コールバックを使用しない場合は NULL を指定します。登録された各インターフェイスは、それぞれ異なるコールバック関数を持つことができます。
UuidVectorUUID_VECTOR*8/4+56+32RPC エンドポイントマッパーに登録するためにサーバーが提供する、オブジェクト UUID のベクターへのポインターです。このベクターはサーバーアプリケーションが構築します。NULL は、登録するオブジェクト UUID がないことを示します。
AnnotationLPSTR8/4+64+36エンドポイントマッパー登録用の注釈文字列。LPSTR型。
SecurityDescriptorvoid*8/4+72+40どのクライアントがインターフェイスへのアクセス権を持つかを記述する、省略可能なセキュリティ記述子です。

公式ドキュメント

RPC_INTERFACE_TEMPLATE 構造体は、RPC インターフェイスグループのサーバーインターフェイスを定義します。

解説(Remarks)

インターフェイスを登録するために、サーバーは次の情報を提供します。

インターフェイスグループのインターフェイスは、すべて auto-listen として扱われます。ランタイムは、インターフェイスグループがアクティブ化されるとすぐに呼び出しの待機を開始します。RpcServerListen および RpcMgmtStopServerListening の呼び出しはこのインターフェイスに影響せず、IfSpecNULL を指定した RpcServerUnregisterIf の呼び出しも影響しません。

IfCallback にセキュリティコールバック関数を指定すると、サーバーアプリケーションはクライアント単位でインターフェイスへのアクセスを制限できます。つまり、既定ではセキュリティは省略可能であり、サーバーが RpcServerRegisterAuthInfo を呼び出していても、サーバーのランタイムはセキュリティで保護されていない呼び出しをディスパッチします。認証されたクライアントだけを受け入れたい場合は、インターフェイスのコールバック関数で RpcBindingInqAuthClientRpcGetAuthorizationContextForClient、または RpcServerInqCallAttributes を呼び出してセキュリティレベルを取得するか、RpcImpersonateClient でクライアントの偽装を試みる必要があります。また、FlagsRPC_IF_ALLOW_SECURE_ONLY フラグを指定して、認証されていない呼び出しを拒否することもできます。

サーバーアプリケーションが IfCallback にインターフェイス用のセキュリティコールバック関数を指定すると、RPC ランタイムは、そのインターフェイスに対する認証情報のない呼び出しを自動的に拒否します。さらにランタイムは、各クライアントが使用したインターフェイスを記録します。クライアントが現在の通信セッション中に使用していないインターフェイスに対して RPC を行うと、RPC ランタイムライブラリはそのインターフェイスのセキュリティコールバック関数を呼び出します。FlagsRPC_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 の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 Structure
import 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: pointer
struct 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