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

RPC_CALL_ATTRIBUTES_V2_A

構造体
サイズx64: 112 バイト / x86: 84 バイト

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

フィールド

フィールドサイズx64x86説明
VersionDWORD4+0+0RPC_CALL_ATTRIBUTES 構造体のバージョンです。この構造体では、この値は 2 に設定しなければなりません。
FlagsDWORD4+4+4

この構造体を渡した RpcServerInqCallAttributes の呼び出しによって、この構造体のどのメンバーを設定するかを示すビットマスク形式のフラグです。

意味
RPC_QUERY_SERVER_PRINCIPAL_NAME
RpcServerInqCallAttributes がこの構造体の ServerPrincipalName メンバーを設定することを示します。
RPC_QUERY_CLIENT_PRINCIPAL_NAME
RpcServerInqCallAttributes がこの構造体の ClientPrincipalName メンバーを設定することを示します。
RPC_QUERY_CALL_LOCAL_ADDRESS
RpcServerInqCallAttributes がこの構造体の CallLocalAddress メンバーを設定することを示します。
RPC_QUERY_CLIENT_PID
RpcServerInqCallAttributes がこの構造体の ClientPID メンバーを設定することを示します。このフラグは ncalrpc プロトコルシーケンスでのみサポートされます。
ServerPrincipalNameBufferLengthDWORD4+8+8

ServerPrincipalName の長さ (バイト単位)。長さが不足している場合、ServerPrincipalName は変更されず、ServerPrincipalNameBufferLength には終端の NULL 文字を含む必要なバッファー長が格納され、ERROR_MORE_DATA が返されます。ServerPrincipalNameBufferLength が必要以上に大きい場合、戻り時に、終端の NULL 文字を含む実際に使用された長さ (バイト単位) が設定されます。「解説」を参照してください。

プロトコルシーケンスがサーバープリンシパル名の取得をサポートしていない場合、戻り時に ServerPrincipalNameBufferLength は 0 に設定され、ServerPrincipalName が指すバッファーは変更されません。Windows XP: ncacn_* グループのプロトコルシーケンスのみが、サーバープリンシパル名の取得をサポートします。

RPC_QUERY_SERVER_PRINCIPAL_NAME フラグが指定されていない場合、ServerPrincipalNameBufferLength は無視されます。ServerPrincipalNameBufferLength が 0 以外で ServerPrincipalNameNULL の場合は、ERROR_INVALID_PARAMETER が返されます。

ServerPrincipalNameBYTE*8/4+16+12Flags で要求され、かつプロトコルシーケンスでサポートされている場合の、サーバープリンシパル名へのポインターです。RPC_S_OK または ERROR_MORE_DATA 以外の戻り値の場合、ServerPrincipalName の内容は未定義であり、RPC によって変更されている可能性があります。
ClientPrincipalNameBufferLengthDWORD4+24+16

ClientPrincipalName が指すバッファーの長さ (バイト単位)。長さが不足している場合、ClientPrincipalName は変更されず、ClientPrincipalNameBufferLength には終端の NULL 文字を含む必要なバッファー長が格納され、ERROR_MORE_DATA が返されます。ClientPrincipalNameBufferLength が必要以上に大きい場合、戻り時に、終端の NULL 文字を含む実際に使用された長さ (バイト単位) が設定されます。

プロトコルシーケンスがクライアントプリンシパル名の取得をサポートしていない場合、戻り時に ClientPrincipalNameBufferLength は 0 に設定され、ClientPrincipalName が指すバッファーは変更されません。Windows XP: ncalrpc プロトコルシーケンスのみが、クライアントプリンシパル名の取得をサポートします。

RPC_QUERY_CLIENT_PRINCIPAL_NAME フラグが指定されていない場合、ClientPrincipalNameBufferLength は無視されます。ClientPrincipalNameBufferLength が 0 以外で ClientPrincipalNameNULL の場合は、ERROR_INVALID_PARAMETER が返されます。

ClientPrincipalNameBYTE*8/4+32+20Flags メンバーで要求され、かつプロトコルシーケンスでサポートされている場合の、クライアントプリンシパル名へのポインターです。RPC_S_OK または ERROR_MORE_DATA 以外の戻り値の場合、ClientPrincipalName の内容は未定義であり、RPC によって変更されている可能性があります。
AuthenticationLevelDWORD4+40+24呼び出しの認証レベルです。RPC がサポートする認証レベルについては、 Authentication-Level Constants を参照してください。
AuthenticationServiceDWORD4+44+28リモートプロシージャ呼び出しの実行に使用された認証サービス (セキュリティプロバイダー) です。
NullSessionBOOL4+48+32Null セッションが使用されるかどうかを指定します。0 は呼び出しが Null セッション経由ではないことを示し、それ以外の値は Null セッションであることを示します。
KernelModeCallerBOOL4+52+36カーネルモードからの呼び出しかを示すフラグ。BOOL型。
ProtocolSequenceDWORD4+56+40呼び出しが行われたプロトコルシーケンスを示す定数です。
IsClientLocalDWORD4+60+44クライアントの位置 (ローカル、リモート、または不明) を示す RpcCallClientLocality 列挙型の値です。
ClientPIDHANDLE8/4+64+48呼び出し元クライアントのプロセス ID を格納するハンドルです。このフィールドは ncalrpc プロトコルシーケンスでのみサポートされ、Flags パラメーターに RPC_QUERY_CLIENT_PID が指定されている場合にのみ設定されます。
CallStatusDWORD4+72+52

RPC 呼び出しの状態を指定するビットフィールドです。

意味
RPC_CALL_STATUS_IN_PROGRESS
0x01
呼び出しは進行中です。
RPC_CALL_STATUS_CANCELLED
0x02
呼び出しはキャンセルされました。
RPC_CALL_STATUS_DISCONNECTED
0x03
クライアントが切断されました。
CallTypeRpcCallType4+76+56RPC 呼び出しの種類を示す RpcCallType 列挙型の値です。
CallLocalAddressRPC_CALL_LOCAL_ADDRESS_V1*8/4+80+60

呼び出しが行われたローカルアドレスに関する情報をサーバーに提供する RPC_CALL_LOCAL_ADDRESS 構造体へのポインターです。

FlagsRPC_QUERY_CALL_LOCAL_ADDRESS が指定されている場合、このフィールドは NULL であってはなりません。そうでない場合は RPC_S_INVALID_ARG が返されます。

アプリケーションが指定したバッファーが不足している場合、RpcServerInqCallAttributesERROR_MORE_DATA を返します。

OpNumWORD2+88+64対応する IDL ファイル内で呼び出しに関連付けられている opnum の値です。
InterfaceUuidGUID16+92+68

呼び出しが行われるインターフェイスの UUID です。

- KernelMode

呼び出しがカーネルモードから行われたかどうかを指定します。0 は呼び出しがカーネルモードから行われていないことを示し、それ以外の値はカーネルモードから行われたことを示します。

公式ドキュメント

RPC_CALL_ATTRIBUTES_V2 構造体は、 RpcServerInqCallAttributes 関数にパラメーターを提供します。 バージョン 2 は、ローカルアドレスとクライアントプロセス ID のサポートを指定します。

解説(Remarks)

RPC_CALL_ATTRIBUTES 構造体はバージョン管理方式を採用しており、これにより RpcServerInqCallAttributes 関数は、接尾辞付きの新しい関数を導入することなく新しい機能を取り込むことができます。たとえば、ヘッダー内の単純な #define で識別される RPC_CALL_ATTRIBUTES の 2 番目のバージョンでは、新しいメンバーを追加することにより、対応する代替関数をリリースすることなく、将来のバージョンの RpcServerInqCallAttributes 関数に組み込まれる新しい機能を利用できます。

Version メンバーは、呼び出し元アプリケーションが使用している RPC_CALL_ATTRIBUTES 構造体のバージョン (現在は RPC_CALL_ATTRIBUTES_V1 または RPC_CALL_ATTRIBUTES_V2 のいずれか) を示します。この識別により、RPC ランタイムは、最新バージョンの構造体を使用していないアプリケーションに対して下位互換性を提供できます。

プロセスが終了するまで、ClientPID はクライアント上でそのプロセスを一意に識別します。プロセスが終了すると、ClientPID で指定されたプロセス ID が新しいプロセスに使用される可能性があります。

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

各言語での定義

#include <windows.h>

// RPC_CALL_ATTRIBUTES_V2_A  (x64 112 / x86 84 バイト)
typedef struct RPC_CALL_ATTRIBUTES_V2_A {
    DWORD Version;
    DWORD Flags;
    DWORD ServerPrincipalNameBufferLength;
    BYTE* ServerPrincipalName;
    DWORD ClientPrincipalNameBufferLength;
    BYTE* ClientPrincipalName;
    DWORD AuthenticationLevel;
    DWORD AuthenticationService;
    BOOL NullSession;
    BOOL KernelModeCaller;
    DWORD ProtocolSequence;
    DWORD IsClientLocal;
    HANDLE ClientPID;
    DWORD CallStatus;
    RpcCallType CallType;
    RPC_CALL_LOCAL_ADDRESS_V1* CallLocalAddress;
    WORD OpNum;
    GUID InterfaceUuid;
} RPC_CALL_ATTRIBUTES_V2_A;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RPC_CALL_ATTRIBUTES_V2_A
{
    public uint Version;
    public uint Flags;
    public uint ServerPrincipalNameBufferLength;
    public IntPtr ServerPrincipalName;
    public uint ClientPrincipalNameBufferLength;
    public IntPtr ClientPrincipalName;
    public uint AuthenticationLevel;
    public uint AuthenticationService;
    [MarshalAs(UnmanagedType.Bool)] public bool NullSession;
    [MarshalAs(UnmanagedType.Bool)] public bool KernelModeCaller;
    public uint ProtocolSequence;
    public uint IsClientLocal;
    public IntPtr ClientPID;
    public uint CallStatus;
    public int CallType;
    public IntPtr CallLocalAddress;
    public ushort OpNum;
    public Guid InterfaceUuid;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RPC_CALL_ATTRIBUTES_V2_A
    Public Version As UInteger
    Public Flags As UInteger
    Public ServerPrincipalNameBufferLength As UInteger
    Public ServerPrincipalName As IntPtr
    Public ClientPrincipalNameBufferLength As UInteger
    Public ClientPrincipalName As IntPtr
    Public AuthenticationLevel As UInteger
    Public AuthenticationService As UInteger
    <MarshalAs(UnmanagedType.Bool)> Public NullSession As Boolean
    <MarshalAs(UnmanagedType.Bool)> Public KernelModeCaller As Boolean
    Public ProtocolSequence As UInteger
    Public IsClientLocal As UInteger
    Public ClientPID As IntPtr
    Public CallStatus As UInteger
    Public CallType As Integer
    Public CallLocalAddress As IntPtr
    Public OpNum As UShort
    Public InterfaceUuid As Guid
End Structure
import ctypes
from ctypes import wintypes

class RPC_CALL_ATTRIBUTES_V2_A(ctypes.Structure):
    _fields_ = [
        ("Version", wintypes.DWORD),
        ("Flags", wintypes.DWORD),
        ("ServerPrincipalNameBufferLength", wintypes.DWORD),
        ("ServerPrincipalName", ctypes.c_void_p),
        ("ClientPrincipalNameBufferLength", wintypes.DWORD),
        ("ClientPrincipalName", ctypes.c_void_p),
        ("AuthenticationLevel", wintypes.DWORD),
        ("AuthenticationService", wintypes.DWORD),
        ("NullSession", wintypes.BOOL),
        ("KernelModeCaller", wintypes.BOOL),
        ("ProtocolSequence", wintypes.DWORD),
        ("IsClientLocal", wintypes.DWORD),
        ("ClientPID", ctypes.c_void_p),
        ("CallStatus", wintypes.DWORD),
        ("CallType", ctypes.c_int),
        ("CallLocalAddress", ctypes.c_void_p),
        ("OpNum", ctypes.c_ushort),
        ("InterfaceUuid", GUID),
    ]
#[repr(C)]
pub struct RPC_CALL_ATTRIBUTES_V2_A {
    pub Version: u32,
    pub Flags: u32,
    pub ServerPrincipalNameBufferLength: u32,
    pub ServerPrincipalName: *mut core::ffi::c_void,
    pub ClientPrincipalNameBufferLength: u32,
    pub ClientPrincipalName: *mut core::ffi::c_void,
    pub AuthenticationLevel: u32,
    pub AuthenticationService: u32,
    pub NullSession: i32,
    pub KernelModeCaller: i32,
    pub ProtocolSequence: u32,
    pub IsClientLocal: u32,
    pub ClientPID: *mut core::ffi::c_void,
    pub CallStatus: u32,
    pub CallType: i32,
    pub CallLocalAddress: *mut core::ffi::c_void,
    pub OpNum: u16,
    pub InterfaceUuid: GUID,
}
import "golang.org/x/sys/windows"

type RPC_CALL_ATTRIBUTES_V2_A struct {
	Version uint32
	Flags uint32
	ServerPrincipalNameBufferLength uint32
	ServerPrincipalName uintptr
	ClientPrincipalNameBufferLength uint32
	ClientPrincipalName uintptr
	AuthenticationLevel uint32
	AuthenticationService uint32
	NullSession int32
	KernelModeCaller int32
	ProtocolSequence uint32
	IsClientLocal uint32
	ClientPID uintptr
	CallStatus uint32
	CallType int32
	CallLocalAddress uintptr
	OpNum uint16
	InterfaceUuid windows.GUID
}
type
  RPC_CALL_ATTRIBUTES_V2_A = record
    Version: DWORD;
    Flags: DWORD;
    ServerPrincipalNameBufferLength: DWORD;
    ServerPrincipalName: Pointer;
    ClientPrincipalNameBufferLength: DWORD;
    ClientPrincipalName: Pointer;
    AuthenticationLevel: DWORD;
    AuthenticationService: DWORD;
    NullSession: BOOL;
    KernelModeCaller: BOOL;
    ProtocolSequence: DWORD;
    IsClientLocal: DWORD;
    ClientPID: Pointer;
    CallStatus: DWORD;
    CallType: Integer;
    CallLocalAddress: Pointer;
    OpNum: Word;
    InterfaceUuid: TGUID;
  end;
const RPC_CALL_ATTRIBUTES_V2_A = extern struct {
    Version: u32,
    Flags: u32,
    ServerPrincipalNameBufferLength: u32,
    ServerPrincipalName: ?*anyopaque,
    ClientPrincipalNameBufferLength: u32,
    ClientPrincipalName: ?*anyopaque,
    AuthenticationLevel: u32,
    AuthenticationService: u32,
    NullSession: i32,
    KernelModeCaller: i32,
    ProtocolSequence: u32,
    IsClientLocal: u32,
    ClientPID: ?*anyopaque,
    CallStatus: u32,
    CallType: i32,
    CallLocalAddress: ?*anyopaque,
    OpNum: u16,
    InterfaceUuid: GUID,
};
type
  RPC_CALL_ATTRIBUTES_V2_A {.bycopy.} = object
    Version: uint32
    Flags: uint32
    ServerPrincipalNameBufferLength: uint32
    ServerPrincipalName: pointer
    ClientPrincipalNameBufferLength: uint32
    ClientPrincipalName: pointer
    AuthenticationLevel: uint32
    AuthenticationService: uint32
    NullSession: int32
    KernelModeCaller: int32
    ProtocolSequence: uint32
    IsClientLocal: uint32
    ClientPID: pointer
    CallStatus: uint32
    CallType: int32
    CallLocalAddress: pointer
    OpNum: uint16
    InterfaceUuid: GUID
struct RPC_CALL_ATTRIBUTES_V2_A
{
    uint Version;
    uint Flags;
    uint ServerPrincipalNameBufferLength;
    void* ServerPrincipalName;
    uint ClientPrincipalNameBufferLength;
    void* ClientPrincipalName;
    uint AuthenticationLevel;
    uint AuthenticationService;
    int NullSession;
    int KernelModeCaller;
    uint ProtocolSequence;
    uint IsClientLocal;
    void* ClientPID;
    uint CallStatus;
    int CallType;
    void* CallLocalAddress;
    ushort OpNum;
    GUID InterfaceUuid;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; RPC_CALL_ATTRIBUTES_V2_A サイズ: 84 バイト(x86)
dim st, 21    ; 4byte整数×21(構造体サイズ 84 / 4 切り上げ)
; Version : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Flags : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; ServerPrincipalNameBufferLength : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; ServerPrincipalName : BYTE* (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; ClientPrincipalNameBufferLength : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; ClientPrincipalName : BYTE* (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; AuthenticationLevel : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; AuthenticationService : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; NullSession : BOOL (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; KernelModeCaller : BOOL (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; ProtocolSequence : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; IsClientLocal : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; ClientPID : HANDLE (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; CallStatus : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; CallType : RpcCallType (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; CallLocalAddress : RPC_CALL_LOCAL_ADDRESS_V1* (+60, 4byte)  varptr(st)+60 を基点に操作(4byte:入れ子/配列)
; OpNum : WORD (+64, 2byte)  wpoke st,64,値  /  値 = wpeek(st,64)
; InterfaceUuid : GUID (+68, 16byte)  varptr(st)+68 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; RPC_CALL_ATTRIBUTES_V2_A サイズ: 112 バイト(x64)
dim st, 28    ; 4byte整数×28(構造体サイズ 112 / 4 切り上げ)
; Version : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Flags : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; ServerPrincipalNameBufferLength : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; ServerPrincipalName : BYTE* (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; ClientPrincipalNameBufferLength : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; ClientPrincipalName : BYTE* (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; AuthenticationLevel : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; AuthenticationService : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; NullSession : BOOL (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; KernelModeCaller : BOOL (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; ProtocolSequence : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; IsClientLocal : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; ClientPID : HANDLE (+64, 8byte)  qpoke st,64,値 / qpeek(st,64)  ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; CallStatus : DWORD (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; CallType : RpcCallType (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; CallLocalAddress : RPC_CALL_LOCAL_ADDRESS_V1* (+80, 8byte)  varptr(st)+80 を基点に操作(8byte:入れ子/配列)
; OpNum : WORD (+88, 2byte)  wpoke st,88,値  /  値 = wpeek(st,88)
; InterfaceUuid : GUID (+92, 16byte)  varptr(st)+92 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global GUID, pack=1
    #field int Data1
    #field short Data2
    #field short Data3
    #field byte Data4 8
#endstruct

#defstruct global RPC_CALL_ATTRIBUTES_V2_A
    #field int Version
    #field int Flags
    #field int ServerPrincipalNameBufferLength
    #field intptr ServerPrincipalName
    #field int ClientPrincipalNameBufferLength
    #field intptr ClientPrincipalName
    #field int AuthenticationLevel
    #field int AuthenticationService
    #field bool NullSession
    #field bool KernelModeCaller
    #field int ProtocolSequence
    #field int IsClientLocal
    #field intptr ClientPID
    #field int CallStatus
    #field int CallType
    #field intptr CallLocalAddress
    #field short OpNum
    #field GUID InterfaceUuid
#endstruct

stdim st, RPC_CALL_ATTRIBUTES_V2_A        ; NSTRUCT 変数を確保
st->Version = 100
mes "Version=" + st->Version