RPC_CALL_ATTRIBUTES_V1_W
構造体サイズ=各フィールドのバイト数(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 | WORD* | 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 | WORD* | 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 セッションであることを示します。 |
公式ドキュメント
RPC_CALL_ATTRIBUTES_V1 構造体は、 RpcServerInqCallAttributes 関数にパラメーターを提供します。Windows XP および Windows Server 2003 オペレーティング システム向けに ANSI 版と UNICODE 版が実装されています。
解説(Remarks)
RPC_CALL_ATTRIBUTES 構造体はバージョン管理方式を採用しており、これによって RpcServerInqCallAttributes 関数は、サフィックス識別子を持つ新しい関数を導入することなく新しい機能を取り込むことができます。たとえば、ヘッダー内の単純な #define で識別される RPC_CALL_ATTRIBUTES の 2 番目のバージョンでは、対応する代替関数をリリースすることなく、将来のバージョンの 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_W (x64 56 / x86 36 バイト)
typedef struct RPC_CALL_ATTRIBUTES_V1_W {
DWORD Version;
DWORD Flags;
DWORD ServerPrincipalNameBufferLength;
WORD* ServerPrincipalName;
DWORD ClientPrincipalNameBufferLength;
WORD* ClientPrincipalName;
DWORD AuthenticationLevel;
DWORD AuthenticationService;
BOOL NullSession;
} RPC_CALL_ATTRIBUTES_V1_W;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RPC_CALL_ATTRIBUTES_V1_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;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RPC_CALL_ATTRIBUTES_V1_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
End Structureimport ctypes
from ctypes import wintypes
class RPC_CALL_ATTRIBUTES_V1_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),
]#[repr(C)]
pub struct RPC_CALL_ATTRIBUTES_V1_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,
}import "golang.org/x/sys/windows"
type RPC_CALL_ATTRIBUTES_V1_W struct {
Version uint32
Flags uint32
ServerPrincipalNameBufferLength uint32
ServerPrincipalName uintptr
ClientPrincipalNameBufferLength uint32
ClientPrincipalName uintptr
AuthenticationLevel uint32
AuthenticationService uint32
NullSession int32
}type
RPC_CALL_ATTRIBUTES_V1_W = 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_W = 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_W {.bycopy.} = object
Version: uint32
Flags: uint32
ServerPrincipalNameBufferLength: uint32
ServerPrincipalName: pointer
ClientPrincipalNameBufferLength: uint32
ClientPrincipalName: pointer
AuthenticationLevel: uint32
AuthenticationService: uint32
NullSession: int32struct RPC_CALL_ATTRIBUTES_V1_W
{
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_W サイズ: 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 : 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 も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; RPC_CALL_ATTRIBUTES_V1_W サイズ: 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 : 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 も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global RPC_CALL_ATTRIBUTES_V1_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
#endstruct
stdim st, RPC_CALL_ATTRIBUTES_V1_W ; NSTRUCT 変数を確保
st->Version = 100
mes "Version=" + st->Version