RPC_CALL_ATTRIBUTES_V1_A
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Version | DWORD | 4 | +0 | +0 | 呼び出し側アプリケーションが使用している RpcServerInqCallAttributes 関数のバージョンです。解説を参照してください。 |
| Flags | DWORD | 4 | +4 | +4 | RPC_QUERY_SERVER_PRINCIPAL_NAME または RPC_QUERY_CLIENT_PRINCIPAL_NAME を要求するための有効なフラグを指定するビットマスクです。解説を参照してください。 |
| 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 がサポートする認証レベルについては、 認証レベル定数を参照してください。 |
| AuthenticationService | DWORD | 4 | +44 | +28 | リモート プロシージャ コールの実行に使用される認証サービス (セキュリティ プロバイダー) です。 |
| NullSession | BOOL | 4 | +48 | +32 | Null セッションが使用されるかどうかを指定します。0 はこの呼び出しが Null セッション経由ではないことを示し、それ以外の値は Null セッションであることを示します。 |
公式ドキュメント
RPC_CALL_ATTRIBUTES_V1 構造体は、 RpcServerInqCallAttributes 関数にパラメーターを提供します。Windows XP および Windows Server 2003 オペレーティング システム向けに ANSI 版と UNICODE 版が実装されています。
解説(Remarks)
RPC_CALL_ATTRIBUTES 構造体はバージョン管理方式を採用しており、これにより RpcServerInqCallAttributes 関数は、接尾辞付きの新しい関数を導入することなく新機能を取り込めます。たとえば、ヘッダー内の単純な #define で識別される 2 番目のバージョンの RPC_CALL_ATTRIBUTES は、対応する代替関数をリリースすることなく、将来のバージョンの RpcServerInqCallAttributes 関数に組み込まれる新機能を実現するためのメンバーを追加できます。
Version メンバーは、呼び出し側アプリケーションが使用している RPC_CALL_ATTRIBUTES 構造体のバージョン (現在は RPC_CALL_ATTRIBUTES_V1 または RPC_CALL_ATTRIBUTES_V2 のいずれか) を示します。この識別により、RPC ランタイムは最新バージョンの構造体を使用していないアプリケーションに対して下位互換性を提供できます。
Flags メンバーに RPC_QUERY_SERVER_PRINCIPAL_NAME を指定すると、 RpcServerInqCallAttributes は ServerPrincipalName にサーバー プリンシパル名を返します。RPC_QUERY_SERVER_PRINCIPAL_NAME が指定されていない場合、 RpcServerInqCallAttributes は ServerPrincipalName に渡されたポインターを変更せず、そのメモリ位置には何も格納しません。Flags メンバーに RPC_QUERY_CLIENT_PRINCIPAL_NAME を指定すると、 RpcServerInqCallAttributes は ClientPrincipalName にクライアント プリンシパル名を返します。RPC_QUERY_CLIENT_PRINCIPAL_NAME が指定されていない場合、 RpcServerInqCallAttributes は ClientPrincipalName に渡されたポインターを変更せず、そのメモリ位置には何も格納しません。
クライアントとサーバーの両方のプリンシパル名を取得する場合の最適な処理方法は、ClientPrincipalNameBufferLength と ServerPrincipalNameBufferLength の長さを保存しておき、ERROR_MORE_DATA が返された場合に、保存した長さとこれらのメンバーに返された長さを比較することです。保存した値が返された値以下であるメンバーは正常に返されており、もう一方のメンバーのバッファーが不足していたことを示します。次の呼び出しでは、正常に返されたプリンシパル名のフラグを省略します。これにより、正常に返されたプリンシパル名を再度取得してコピーする処理を回避できます。
RPC_CALL_ATTRIBUTES_V1 構造体は、通常、次の 2 つの方法で使用されます。
- 1 つ目の方法: 最初の RpcServerInqCallAttributes 関数呼び出しで ServerPrincipalNameBufferLength メンバーまたは ClientPrincipalNameBufferLength メンバーに 0 を指定し、必要なバッファー長を取得するか、プロトコルがプリンシパル名の返却をサポートしているかどうかを判断します。必要なバッファー長を取得したら、その長さのバッファーを割り当て、2 回目の呼び出しで実際のバッファー長を取得します。
- 2 つ目の方法: 呼び出し側は、多くの場合スタック上に割り当てた適度な大きさのバッファーから始め、ERROR_MORE_DATA が返された場合に必要な長さのバッファーを割り当てて、 RpcServerInqCallAttributes 関数を再度呼び出します。
例
RPC_CALL_ATTRIBUTES CallAttributes; // this maps to RPC_CALL_ATTRIBUTES_V1
memset(&CallAttributes, 0, sizeof(CallAttributes));
CallAttributes.Version = RPC_CALL_ATTRIBUTES_VERSION; // maps to 1
CallAttributes.Flags = ;//....
Status = RpcServerInqCallAttributes(0, &CallAttributes);
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// RPC_CALL_ATTRIBUTES_V1_A (x64 56 / x86 36 バイト)
typedef struct RPC_CALL_ATTRIBUTES_V1_A {
DWORD Version;
DWORD Flags;
DWORD ServerPrincipalNameBufferLength;
BYTE* ServerPrincipalName;
DWORD ClientPrincipalNameBufferLength;
BYTE* ClientPrincipalName;
DWORD AuthenticationLevel;
DWORD AuthenticationService;
BOOL NullSession;
} RPC_CALL_ATTRIBUTES_V1_A;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RPC_CALL_ATTRIBUTES_V1_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;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RPC_CALL_ATTRIBUTES_V1_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
End Structureimport ctypes
from ctypes import wintypes
class RPC_CALL_ATTRIBUTES_V1_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),
]#[repr(C)]
pub struct RPC_CALL_ATTRIBUTES_V1_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,
}import "golang.org/x/sys/windows"
type RPC_CALL_ATTRIBUTES_V1_A struct {
Version uint32
Flags uint32
ServerPrincipalNameBufferLength uint32
ServerPrincipalName uintptr
ClientPrincipalNameBufferLength uint32
ClientPrincipalName uintptr
AuthenticationLevel uint32
AuthenticationService uint32
NullSession int32
}type
RPC_CALL_ATTRIBUTES_V1_A = record
Version: DWORD;
Flags: DWORD;
ServerPrincipalNameBufferLength: DWORD;
ServerPrincipalName: Pointer;
ClientPrincipalNameBufferLength: DWORD;
ClientPrincipalName: Pointer;
AuthenticationLevel: DWORD;
AuthenticationService: DWORD;
NullSession: BOOL;
end;const RPC_CALL_ATTRIBUTES_V1_A = extern struct {
Version: u32,
Flags: u32,
ServerPrincipalNameBufferLength: u32,
ServerPrincipalName: ?*anyopaque,
ClientPrincipalNameBufferLength: u32,
ClientPrincipalName: ?*anyopaque,
AuthenticationLevel: u32,
AuthenticationService: u32,
NullSession: i32,
};type
RPC_CALL_ATTRIBUTES_V1_A {.bycopy.} = object
Version: uint32
Flags: uint32
ServerPrincipalNameBufferLength: uint32
ServerPrincipalName: pointer
ClientPrincipalNameBufferLength: uint32
ClientPrincipalName: pointer
AuthenticationLevel: uint32
AuthenticationService: uint32
NullSession: int32struct RPC_CALL_ATTRIBUTES_V1_A
{
uint Version;
uint Flags;
uint ServerPrincipalNameBufferLength;
void* ServerPrincipalName;
uint ClientPrincipalNameBufferLength;
void* ClientPrincipalName;
uint AuthenticationLevel;
uint AuthenticationService;
int NullSession;
}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_V1_A サイズ: 36 バイト(x86)
dim st, 9 ; 4byte整数×9(構造体サイズ 36 / 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 も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; RPC_CALL_ATTRIBUTES_V1_A サイズ: 56 バイト(x64)
dim st, 14 ; 4byte整数×14(構造体サイズ 56 / 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 も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global RPC_CALL_ATTRIBUTES_V1_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
#endstruct
stdim st, RPC_CALL_ATTRIBUTES_V1_A ; NSTRUCT 変数を確保
st->Version = 100
mes "Version=" + st->Version