RPC_CALL_ATTRIBUTES_V2_A
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Version | DWORD | 4 | +0 | +0 | RPC_CALL_ATTRIBUTES 構造体のバージョンです。この構造体では、この値は 2 に設定しなければなりません。 | ||||||||||
| Flags | DWORD | 4 | +4 | +4 | この構造体を渡した RpcServerInqCallAttributes の呼び出しによって、この構造体のどのメンバーを設定するかを示すビットマスク形式のフラグです。
| ||||||||||
| ServerPrincipalNameBufferLength | DWORD | 4 | +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 以外で ServerPrincipalName が NULL の場合は、ERROR_INVALID_PARAMETER が返されます。 | ||||||||||
| ServerPrincipalName | BYTE* | 8/4 | +16 | +12 | Flags で要求され、かつプロトコルシーケンスでサポートされている場合の、サーバープリンシパル名へのポインターです。RPC_S_OK または ERROR_MORE_DATA 以外の戻り値の場合、ServerPrincipalName の内容は未定義であり、RPC によって変更されている可能性があります。 | ||||||||||
| ClientPrincipalNameBufferLength | DWORD | 4 | +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 以外で ClientPrincipalName が NULL の場合は、ERROR_INVALID_PARAMETER が返されます。 | ||||||||||
| ClientPrincipalName | BYTE* | 8/4 | +32 | +20 | Flags メンバーで要求され、かつプロトコルシーケンスでサポートされている場合の、クライアントプリンシパル名へのポインターです。RPC_S_OK または ERROR_MORE_DATA 以外の戻り値の場合、ClientPrincipalName の内容は未定義であり、RPC によって変更されている可能性があります。 | ||||||||||
| AuthenticationLevel | DWORD | 4 | +40 | +24 | 呼び出しの認証レベルです。RPC がサポートする認証レベルについては、 Authentication-Level Constants を参照してください。 | ||||||||||
| AuthenticationService | DWORD | 4 | +44 | +28 | リモートプロシージャ呼び出しの実行に使用された認証サービス (セキュリティプロバイダー) です。 | ||||||||||
| NullSession | BOOL | 4 | +48 | +32 | Null セッションが使用されるかどうかを指定します。0 は呼び出しが Null セッション経由ではないことを示し、それ以外の値は Null セッションであることを示します。 | ||||||||||
| KernelModeCaller | BOOL | 4 | +52 | +36 | カーネルモードからの呼び出しかを示すフラグ。BOOL型。 | ||||||||||
| ProtocolSequence | DWORD | 4 | +56 | +40 | 呼び出しが行われたプロトコルシーケンスを示す定数です。 | ||||||||||
| IsClientLocal | DWORD | 4 | +60 | +44 | クライアントの位置 (ローカル、リモート、または不明) を示す RpcCallClientLocality 列挙型の値です。 | ||||||||||
| ClientPID | HANDLE | 8/4 | +64 | +48 | 呼び出し元クライアントのプロセス ID を格納するハンドルです。このフィールドは ncalrpc プロトコルシーケンスでのみサポートされ、Flags パラメーターに RPC_QUERY_CLIENT_PID が指定されている場合にのみ設定されます。 | ||||||||||
| CallStatus | DWORD | 4 | +72 | +52 | RPC 呼び出しの状態を指定するビットフィールドです。
| ||||||||||
| CallType | RpcCallType | 4 | +76 | +56 | RPC 呼び出しの種類を示す RpcCallType 列挙型の値です。 | ||||||||||
| CallLocalAddress | RPC_CALL_LOCAL_ADDRESS_V1* | 8/4 | +80 | +60 | 呼び出しが行われたローカルアドレスに関する情報をサーバーに提供する RPC_CALL_LOCAL_ADDRESS 構造体へのポインターです。 Flags に RPC_QUERY_CALL_LOCAL_ADDRESS が指定されている場合、このフィールドは NULL であってはなりません。そうでない場合は RPC_S_INVALID_ARG が返されます。 アプリケーションが指定したバッファーが不足している場合、RpcServerInqCallAttributes は ERROR_MORE_DATA を返します。 | ||||||||||
| OpNum | WORD | 2 | +88 | +64 | 対応する IDL ファイル内で呼び出しに関連付けられている opnum の値です。 | ||||||||||
| InterfaceUuid | GUID | 16 | +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 公式リファレンス: 英語 (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 Structureimport 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: GUIDstruct 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