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

RPC_CALL_ATTRIBUTES_V2_W

構造体
サイズ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 が返されます。

ServerPrincipalNameWORD*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 が返されます。

ClientPrincipalNameWORD*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呼び出しが行われたプロトコル シーケンスを示す定数。
IsClientLocalRpcCallClientLocality4+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 で識別される 2 番目のバージョンの RPC_CALL_ATTRIBUTES は、対応する代替関数をリリースすることなく、将来のバージョンの 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_W  (x64 112 / x86 84 バイト)
typedef struct RPC_CALL_ATTRIBUTES_V2_W {
    DWORD Version;
    DWORD Flags;
    DWORD ServerPrincipalNameBufferLength;
    WORD* ServerPrincipalName;
    DWORD ClientPrincipalNameBufferLength;
    WORD* ClientPrincipalName;
    DWORD AuthenticationLevel;
    DWORD AuthenticationService;
    BOOL NullSession;
    BOOL KernelModeCaller;
    DWORD ProtocolSequence;
    RpcCallClientLocality IsClientLocal;
    HANDLE ClientPID;
    DWORD CallStatus;
    RpcCallType CallType;
    RPC_CALL_LOCAL_ADDRESS_V1* CallLocalAddress;
    WORD OpNum;
    GUID InterfaceUuid;
} RPC_CALL_ATTRIBUTES_V2_W;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RPC_CALL_ATTRIBUTES_V2_W
{
    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 int 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_W
    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 Integer
    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_W(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", ctypes.c_int),
        ("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_W {
    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: i32,
    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_W struct {
	Version uint32
	Flags uint32
	ServerPrincipalNameBufferLength uint32
	ServerPrincipalName uintptr
	ClientPrincipalNameBufferLength uint32
	ClientPrincipalName uintptr
	AuthenticationLevel uint32
	AuthenticationService uint32
	NullSession int32
	KernelModeCaller int32
	ProtocolSequence uint32
	IsClientLocal int32
	ClientPID uintptr
	CallStatus uint32
	CallType int32
	CallLocalAddress uintptr
	OpNum uint16
	InterfaceUuid windows.GUID
}
type
  RPC_CALL_ATTRIBUTES_V2_W = record
    Version: DWORD;
    Flags: DWORD;
    ServerPrincipalNameBufferLength: DWORD;
    ServerPrincipalName: Pointer;
    ClientPrincipalNameBufferLength: DWORD;
    ClientPrincipalName: Pointer;
    AuthenticationLevel: DWORD;
    AuthenticationService: DWORD;
    NullSession: BOOL;
    KernelModeCaller: BOOL;
    ProtocolSequence: DWORD;
    IsClientLocal: Integer;
    ClientPID: Pointer;
    CallStatus: DWORD;
    CallType: Integer;
    CallLocalAddress: Pointer;
    OpNum: Word;
    InterfaceUuid: TGUID;
  end;
const RPC_CALL_ATTRIBUTES_V2_W = 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: i32,
    ClientPID: ?*anyopaque,
    CallStatus: u32,
    CallType: i32,
    CallLocalAddress: ?*anyopaque,
    OpNum: u16,
    InterfaceUuid: GUID,
};
type
  RPC_CALL_ATTRIBUTES_V2_W {.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: int32
    ClientPID: pointer
    CallStatus: uint32
    CallType: int32
    CallLocalAddress: pointer
    OpNum: uint16
    InterfaceUuid: GUID
struct RPC_CALL_ATTRIBUTES_V2_W
{
    uint Version;
    uint Flags;
    uint ServerPrincipalNameBufferLength;
    void* ServerPrincipalName;
    uint ClientPrincipalNameBufferLength;
    void* ClientPrincipalName;
    uint AuthenticationLevel;
    uint AuthenticationService;
    int NullSession;
    int KernelModeCaller;
    uint ProtocolSequence;
    int 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_W サイズ: 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 : WORD* (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; ClientPrincipalNameBufferLength : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; ClientPrincipalName : WORD* (+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 : RpcCallClientLocality (+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_W サイズ: 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 : WORD* (+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 : WORD* (+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 : RpcCallClientLocality (+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_W
    #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_W        ; NSTRUCT 変数を確保
st->Version = 100
mes "Version=" + st->Version