NSPV2_ROUTINE
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| cbSize | DWORD | 4 | +0 | +0 | 構造体のサイズ (バイト単位)。 |
| dwMajorVersion | DWORD | 4 | +4 | +4 | このプロバイダーがサポートするサービス プロバイダー仕様のメジャー バージョン。 |
| dwMinorVersion | DWORD | 4 | +8 | +8 | このプロバイダーがサポートするサービス プロバイダー仕様のマイナー バージョン。 |
| NSPv2Startup | LPNSPV2STARTUP | 8/4 | +16 | +12 | この NSPv2 プロバイダーの NSPv2Startup 関数へのポインター。 |
| NSPv2Cleanup | LPNSPV2CLEANUP | 8/4 | +24 | +16 | この NSPv2 プロバイダーの NSPv2Cleanup 関数へのポインター。 |
| NSPv2LookupServiceBegin | LPNSPV2LOOKUPSERVICEBEGIN | 8/4 | +32 | +20 | この NSPv2 プロバイダーの NSPv2LookupServiceBegin 関数へのポインター。 |
| NSPv2LookupServiceNextEx | LPNSPV2LOOKUPSERVICENEXTEX | 8/4 | +40 | +24 | この NSPv2 プロバイダーの NSPv2LookupServiceNextEx 関数へのポインター。 |
| NSPv2LookupServiceEnd | LPNSPV2LOOKUPSERVICEEND | 8/4 | +48 | +28 | この NSPv2 プロバイダーの NSPv2LookupServiceEnd 関数へのポインター。 |
| NSPv2SetServiceEx | LPNSPV2SETSERVICEEX | 8/4 | +56 | +32 | この NSPv2 プロバイダーの NSPv2SetServiceEx 関数へのポインター。 |
| NSPv2ClientSessionRundown | LPNSPV2CLIENTSESSIONRUNDOWN | 8/4 | +64 | +36 | この NSPv2 プロバイダーの NSPv2ClientSessionRundown 関数へのポインター。 |
公式ドキュメント
NSPV2_ROUTINE 構造体は、ネームスペース サービス プロバイダー バージョン 2 (NSPv2) プロバイダーが実装する関数に関する情報を格納します。
解説(Remarks)
NSPV2_ROUTINE 構造体は、Windows Vista 以降で利用できるネームスペース サービス プロバイダー バージョン 2 (NSPv2) アーキテクチャの一部として使用されます。
Windows Vista および Windows Server 2008 では、NSPV2_ROUTINE 構造体は NS_EMAIL ネームスペース プロバイダーに対する操作にのみ使用できます。
WSAAdvertiseProvider 関数は、クライアントが見つけられるように NSPv2 プロバイダーのインスタンスをアドバタイズします。WSAAdvertiseProvider の呼び出し元は、そのプロバイダーがサポートする NSPv2 のエントリ ポイントを設定した NSPV2_ROUTINE 構造体へのポインターを pNSPv2Routine パラメーターに渡します。
NSPv2 プロバイダーは、次の関数を実装する必要があります。
これら以外の関数はすべて省略可能であり、NSPv2 プロバイダーの要件に応じて実装します。
関数を実装しない場合、その関数への呼び出しは WSAEOPNOTSUPP を返すスタブ関数で受け取る必要があります。NSPV2_ROUTINE 構造体内にある未実装の関数に対応する NSPv2 関数ポインターは、そのスタブ関数を指すようにします。
通常、NSPv2 プロバイダーは呼び出し元のアプリケーションとは別のプロセスに実装されます。NSPv2 プロバイダーは、クライアントの動作によって起動されることはありません。特定のプロバイダーを利用可能にするか利用不可にするかは、プロバイダーをホストする各アプリケーションが WSAAdvertiseProvider 関数と WSAUnadvertiseProvider 関数を呼び出して決定します。クライアントの動作は、プロバイダーが利用可能な場合 (ネームスペース プロバイダーがアドバタイズされている場合) にそのプロバイダーへ接続を試みる結果になるだけです。
1 つのプロセスで複数のプロバイダーを同時に実装してアドバタイズできます。Windows Sockets は、呼び出しを正しいプロバイダーにディスパッチすることでネームスペース プロバイダーを管理します。また、RPC インターフェイスの詳細を隠蔽し、プロセス間の呼び出しをプロセス内の呼び出しに変換します。そのため NSPv2 プロバイダーは、NSPv1 プロバイダーが使用する NSP_ROUTINE 構造体と同様のエントリ ポイント関数のテーブルを実装するだけで済みます。NSPv2 プロバイダーは、RPC 固有の要件 (データのマーシャリングやシリアル化など) を考慮する必要はありません。
WSAUnadvertiseProvider 関数は、特定のネームスペース プロバイダーをクライアントから利用できない状態にします。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// NSPV2_ROUTINE (x64 72 / x86 40 バイト)
typedef struct NSPV2_ROUTINE {
DWORD cbSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
LPNSPV2STARTUP NSPv2Startup;
LPNSPV2CLEANUP NSPv2Cleanup;
LPNSPV2LOOKUPSERVICEBEGIN NSPv2LookupServiceBegin;
LPNSPV2LOOKUPSERVICENEXTEX NSPv2LookupServiceNextEx;
LPNSPV2LOOKUPSERVICEEND NSPv2LookupServiceEnd;
LPNSPV2SETSERVICEEX NSPv2SetServiceEx;
LPNSPV2CLIENTSESSIONRUNDOWN NSPv2ClientSessionRundown;
} NSPV2_ROUTINE;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NSPV2_ROUTINE
{
public uint cbSize;
public uint dwMajorVersion;
public uint dwMinorVersion;
public IntPtr NSPv2Startup;
public IntPtr NSPv2Cleanup;
public IntPtr NSPv2LookupServiceBegin;
public IntPtr NSPv2LookupServiceNextEx;
public IntPtr NSPv2LookupServiceEnd;
public IntPtr NSPv2SetServiceEx;
public IntPtr NSPv2ClientSessionRundown;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NSPV2_ROUTINE
Public cbSize As UInteger
Public dwMajorVersion As UInteger
Public dwMinorVersion As UInteger
Public NSPv2Startup As IntPtr
Public NSPv2Cleanup As IntPtr
Public NSPv2LookupServiceBegin As IntPtr
Public NSPv2LookupServiceNextEx As IntPtr
Public NSPv2LookupServiceEnd As IntPtr
Public NSPv2SetServiceEx As IntPtr
Public NSPv2ClientSessionRundown As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class NSPV2_ROUTINE(ctypes.Structure):
_fields_ = [
("cbSize", wintypes.DWORD),
("dwMajorVersion", wintypes.DWORD),
("dwMinorVersion", wintypes.DWORD),
("NSPv2Startup", ctypes.c_void_p),
("NSPv2Cleanup", ctypes.c_void_p),
("NSPv2LookupServiceBegin", ctypes.c_void_p),
("NSPv2LookupServiceNextEx", ctypes.c_void_p),
("NSPv2LookupServiceEnd", ctypes.c_void_p),
("NSPv2SetServiceEx", ctypes.c_void_p),
("NSPv2ClientSessionRundown", ctypes.c_void_p),
]#[repr(C)]
pub struct NSPV2_ROUTINE {
pub cbSize: u32,
pub dwMajorVersion: u32,
pub dwMinorVersion: u32,
pub NSPv2Startup: *mut core::ffi::c_void,
pub NSPv2Cleanup: *mut core::ffi::c_void,
pub NSPv2LookupServiceBegin: *mut core::ffi::c_void,
pub NSPv2LookupServiceNextEx: *mut core::ffi::c_void,
pub NSPv2LookupServiceEnd: *mut core::ffi::c_void,
pub NSPv2SetServiceEx: *mut core::ffi::c_void,
pub NSPv2ClientSessionRundown: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type NSPV2_ROUTINE struct {
cbSize uint32
dwMajorVersion uint32
dwMinorVersion uint32
NSPv2Startup uintptr
NSPv2Cleanup uintptr
NSPv2LookupServiceBegin uintptr
NSPv2LookupServiceNextEx uintptr
NSPv2LookupServiceEnd uintptr
NSPv2SetServiceEx uintptr
NSPv2ClientSessionRundown uintptr
}type
NSPV2_ROUTINE = record
cbSize: DWORD;
dwMajorVersion: DWORD;
dwMinorVersion: DWORD;
NSPv2Startup: Pointer;
NSPv2Cleanup: Pointer;
NSPv2LookupServiceBegin: Pointer;
NSPv2LookupServiceNextEx: Pointer;
NSPv2LookupServiceEnd: Pointer;
NSPv2SetServiceEx: Pointer;
NSPv2ClientSessionRundown: Pointer;
end;const NSPV2_ROUTINE = extern struct {
cbSize: u32,
dwMajorVersion: u32,
dwMinorVersion: u32,
NSPv2Startup: ?*anyopaque,
NSPv2Cleanup: ?*anyopaque,
NSPv2LookupServiceBegin: ?*anyopaque,
NSPv2LookupServiceNextEx: ?*anyopaque,
NSPv2LookupServiceEnd: ?*anyopaque,
NSPv2SetServiceEx: ?*anyopaque,
NSPv2ClientSessionRundown: ?*anyopaque,
};type
NSPV2_ROUTINE {.bycopy.} = object
cbSize: uint32
dwMajorVersion: uint32
dwMinorVersion: uint32
NSPv2Startup: pointer
NSPv2Cleanup: pointer
NSPv2LookupServiceBegin: pointer
NSPv2LookupServiceNextEx: pointer
NSPv2LookupServiceEnd: pointer
NSPv2SetServiceEx: pointer
NSPv2ClientSessionRundown: pointerstruct NSPV2_ROUTINE
{
uint cbSize;
uint dwMajorVersion;
uint dwMinorVersion;
void* NSPv2Startup;
void* NSPv2Cleanup;
void* NSPv2LookupServiceBegin;
void* NSPv2LookupServiceNextEx;
void* NSPv2LookupServiceEnd;
void* NSPv2SetServiceEx;
void* NSPv2ClientSessionRundown;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; NSPV2_ROUTINE サイズ: 40 バイト(x86)
dim st, 10 ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; dwMajorVersion : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; dwMinorVersion : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; NSPv2Startup : LPNSPV2STARTUP (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; NSPv2Cleanup : LPNSPV2CLEANUP (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; NSPv2LookupServiceBegin : LPNSPV2LOOKUPSERVICEBEGIN (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; NSPv2LookupServiceNextEx : LPNSPV2LOOKUPSERVICENEXTEX (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; NSPv2LookupServiceEnd : LPNSPV2LOOKUPSERVICEEND (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; NSPv2SetServiceEx : LPNSPV2SETSERVICEEX (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; NSPv2ClientSessionRundown : LPNSPV2CLIENTSESSIONRUNDOWN (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NSPV2_ROUTINE サイズ: 72 バイト(x64)
dim st, 18 ; 4byte整数×18(構造体サイズ 72 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; dwMajorVersion : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; dwMinorVersion : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; NSPv2Startup : LPNSPV2STARTUP (+16, 8byte) qpoke st,16,値 / qpeek(st,16) ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; NSPv2Cleanup : LPNSPV2CLEANUP (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; NSPv2LookupServiceBegin : LPNSPV2LOOKUPSERVICEBEGIN (+32, 8byte) qpoke st,32,値 / qpeek(st,32) ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; NSPv2LookupServiceNextEx : LPNSPV2LOOKUPSERVICENEXTEX (+40, 8byte) qpoke st,40,値 / qpeek(st,40) ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; NSPv2LookupServiceEnd : LPNSPV2LOOKUPSERVICEEND (+48, 8byte) qpoke st,48,値 / qpeek(st,48) ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; NSPv2SetServiceEx : LPNSPV2SETSERVICEEX (+56, 8byte) qpoke st,56,値 / qpeek(st,56) ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; NSPv2ClientSessionRundown : LPNSPV2CLIENTSESSIONRUNDOWN (+64, 8byte) qpoke st,64,値 / qpeek(st,64) ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global NSPV2_ROUTINE
#field int cbSize
#field int dwMajorVersion
#field int dwMinorVersion
#field intptr NSPv2Startup
#field intptr NSPv2Cleanup
#field intptr NSPv2LookupServiceBegin
#field intptr NSPv2LookupServiceNextEx
#field intptr NSPv2LookupServiceEnd
#field intptr NSPv2SetServiceEx
#field intptr NSPv2ClientSessionRundown
#endstruct
stdim st, NSPV2_ROUTINE ; NSTRUCT 変数を確保
st->cbSize = 100
mes "cbSize=" + st->cbSize