ホーム › Security.WinTrust › CRYPT_PROVIDER_FUNCTIONS
CRYPT_PROVIDER_FUNCTIONS
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| cbStruct | DWORD | 4 | +0 | +0 | 本構造体のバイトサイズ。 |
| pfnAlloc | PFN_CPD_MEM_ALLOC | 8/4 | +8 | +4 | メモリ確保用コールバック関数へのポインタ。 |
| pfnFree | PFN_CPD_MEM_FREE | 8/4 | +16 | +8 | メモリ解放用コールバック関数へのポインタ。 |
| pfnAddStore2Chain | PFN_CPD_ADD_STORE | 8/4 | +24 | +12 | 証明書ストアを連鎖に追加するコールバック関数。 |
| pfnAddSgnr2Chain | PFN_CPD_ADD_SGNR | 8/4 | +32 | +16 | 署名者を連鎖に追加するコールバック関数。 |
| pfnAddCert2Chain | PFN_CPD_ADD_CERT | 8/4 | +40 | +20 | 証明書を連鎖に追加するコールバック関数。 |
| pfnAddPrivData2Chain | PFN_CPD_ADD_PRIVDATA | 8/4 | +48 | +24 | プライベートデータを連鎖に追加するコールバック関数。 |
| pfnInitialize | PFN_PROVIDER_INIT_CALL | 8/4 | +56 | +28 | プロバイダー初期化コールバック関数。 |
| pfnObjectTrust | PFN_PROVIDER_OBJTRUST_CALL | 8/4 | +64 | +32 | オブジェクト信頼検証コールバック関数。 |
| pfnSignatureTrust | PFN_PROVIDER_SIGTRUST_CALL | 8/4 | +72 | +36 | 署名信頼検証コールバック関数。 |
| pfnCertificateTrust | PFN_PROVIDER_CERTTRUST_CALL | 8/4 | +80 | +40 | 証明書信頼検証コールバック関数。 |
| pfnFinalPolicy | PFN_PROVIDER_FINALPOLICY_CALL | 8/4 | +88 | +44 | 最終ポリシー判定コールバック関数。 |
| pfnCertCheckPolicy | PFN_PROVIDER_CERTCHKPOLICY_CALL | 8/4 | +96 | +48 | 証明書ポリシー確認コールバック関数。 |
| pfnTestFinalPolicy | PFN_PROVIDER_TESTFINALPOLICY_CALL | 8/4 | +104 | +52 | テスト用最終ポリシー判定コールバック関数。 |
| psUIpfns | CRYPT_PROVUI_FUNCS* | 8/4 | +112 | +56 | UI関連コールバック関数群へのポインタ。 |
| pfnCleanupPolicy | PFN_PROVIDER_CLEANUP_CALL | 8/4 | +120 | +60 | ポリシー後始末コールバック関数。 |
各言語での定義
#include <windows.h>
// CRYPT_PROVIDER_FUNCTIONS (x64 128 / x86 64 バイト)
typedef struct CRYPT_PROVIDER_FUNCTIONS {
DWORD cbStruct;
PFN_CPD_MEM_ALLOC pfnAlloc;
PFN_CPD_MEM_FREE pfnFree;
PFN_CPD_ADD_STORE pfnAddStore2Chain;
PFN_CPD_ADD_SGNR pfnAddSgnr2Chain;
PFN_CPD_ADD_CERT pfnAddCert2Chain;
PFN_CPD_ADD_PRIVDATA pfnAddPrivData2Chain;
PFN_PROVIDER_INIT_CALL pfnInitialize;
PFN_PROVIDER_OBJTRUST_CALL pfnObjectTrust;
PFN_PROVIDER_SIGTRUST_CALL pfnSignatureTrust;
PFN_PROVIDER_CERTTRUST_CALL pfnCertificateTrust;
PFN_PROVIDER_FINALPOLICY_CALL pfnFinalPolicy;
PFN_PROVIDER_CERTCHKPOLICY_CALL pfnCertCheckPolicy;
PFN_PROVIDER_TESTFINALPOLICY_CALL pfnTestFinalPolicy;
CRYPT_PROVUI_FUNCS* psUIpfns;
PFN_PROVIDER_CLEANUP_CALL pfnCleanupPolicy;
} CRYPT_PROVIDER_FUNCTIONS;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CRYPT_PROVIDER_FUNCTIONS
{
public uint cbStruct;
public IntPtr pfnAlloc;
public IntPtr pfnFree;
public IntPtr pfnAddStore2Chain;
public IntPtr pfnAddSgnr2Chain;
public IntPtr pfnAddCert2Chain;
public IntPtr pfnAddPrivData2Chain;
public IntPtr pfnInitialize;
public IntPtr pfnObjectTrust;
public IntPtr pfnSignatureTrust;
public IntPtr pfnCertificateTrust;
public IntPtr pfnFinalPolicy;
public IntPtr pfnCertCheckPolicy;
public IntPtr pfnTestFinalPolicy;
public IntPtr psUIpfns;
public IntPtr pfnCleanupPolicy;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CRYPT_PROVIDER_FUNCTIONS
Public cbStruct As UInteger
Public pfnAlloc As IntPtr
Public pfnFree As IntPtr
Public pfnAddStore2Chain As IntPtr
Public pfnAddSgnr2Chain As IntPtr
Public pfnAddCert2Chain As IntPtr
Public pfnAddPrivData2Chain As IntPtr
Public pfnInitialize As IntPtr
Public pfnObjectTrust As IntPtr
Public pfnSignatureTrust As IntPtr
Public pfnCertificateTrust As IntPtr
Public pfnFinalPolicy As IntPtr
Public pfnCertCheckPolicy As IntPtr
Public pfnTestFinalPolicy As IntPtr
Public psUIpfns As IntPtr
Public pfnCleanupPolicy As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class CRYPT_PROVIDER_FUNCTIONS(ctypes.Structure):
_fields_ = [
("cbStruct", wintypes.DWORD),
("pfnAlloc", ctypes.c_void_p),
("pfnFree", ctypes.c_void_p),
("pfnAddStore2Chain", ctypes.c_void_p),
("pfnAddSgnr2Chain", ctypes.c_void_p),
("pfnAddCert2Chain", ctypes.c_void_p),
("pfnAddPrivData2Chain", ctypes.c_void_p),
("pfnInitialize", ctypes.c_void_p),
("pfnObjectTrust", ctypes.c_void_p),
("pfnSignatureTrust", ctypes.c_void_p),
("pfnCertificateTrust", ctypes.c_void_p),
("pfnFinalPolicy", ctypes.c_void_p),
("pfnCertCheckPolicy", ctypes.c_void_p),
("pfnTestFinalPolicy", ctypes.c_void_p),
("psUIpfns", ctypes.c_void_p),
("pfnCleanupPolicy", ctypes.c_void_p),
]#[repr(C)]
pub struct CRYPT_PROVIDER_FUNCTIONS {
pub cbStruct: u32,
pub pfnAlloc: *mut core::ffi::c_void,
pub pfnFree: *mut core::ffi::c_void,
pub pfnAddStore2Chain: *mut core::ffi::c_void,
pub pfnAddSgnr2Chain: *mut core::ffi::c_void,
pub pfnAddCert2Chain: *mut core::ffi::c_void,
pub pfnAddPrivData2Chain: *mut core::ffi::c_void,
pub pfnInitialize: *mut core::ffi::c_void,
pub pfnObjectTrust: *mut core::ffi::c_void,
pub pfnSignatureTrust: *mut core::ffi::c_void,
pub pfnCertificateTrust: *mut core::ffi::c_void,
pub pfnFinalPolicy: *mut core::ffi::c_void,
pub pfnCertCheckPolicy: *mut core::ffi::c_void,
pub pfnTestFinalPolicy: *mut core::ffi::c_void,
pub psUIpfns: *mut core::ffi::c_void,
pub pfnCleanupPolicy: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type CRYPT_PROVIDER_FUNCTIONS struct {
cbStruct uint32
pfnAlloc uintptr
pfnFree uintptr
pfnAddStore2Chain uintptr
pfnAddSgnr2Chain uintptr
pfnAddCert2Chain uintptr
pfnAddPrivData2Chain uintptr
pfnInitialize uintptr
pfnObjectTrust uintptr
pfnSignatureTrust uintptr
pfnCertificateTrust uintptr
pfnFinalPolicy uintptr
pfnCertCheckPolicy uintptr
pfnTestFinalPolicy uintptr
psUIpfns uintptr
pfnCleanupPolicy uintptr
}type
CRYPT_PROVIDER_FUNCTIONS = record
cbStruct: DWORD;
pfnAlloc: Pointer;
pfnFree: Pointer;
pfnAddStore2Chain: Pointer;
pfnAddSgnr2Chain: Pointer;
pfnAddCert2Chain: Pointer;
pfnAddPrivData2Chain: Pointer;
pfnInitialize: Pointer;
pfnObjectTrust: Pointer;
pfnSignatureTrust: Pointer;
pfnCertificateTrust: Pointer;
pfnFinalPolicy: Pointer;
pfnCertCheckPolicy: Pointer;
pfnTestFinalPolicy: Pointer;
psUIpfns: Pointer;
pfnCleanupPolicy: Pointer;
end;const CRYPT_PROVIDER_FUNCTIONS = extern struct {
cbStruct: u32,
pfnAlloc: ?*anyopaque,
pfnFree: ?*anyopaque,
pfnAddStore2Chain: ?*anyopaque,
pfnAddSgnr2Chain: ?*anyopaque,
pfnAddCert2Chain: ?*anyopaque,
pfnAddPrivData2Chain: ?*anyopaque,
pfnInitialize: ?*anyopaque,
pfnObjectTrust: ?*anyopaque,
pfnSignatureTrust: ?*anyopaque,
pfnCertificateTrust: ?*anyopaque,
pfnFinalPolicy: ?*anyopaque,
pfnCertCheckPolicy: ?*anyopaque,
pfnTestFinalPolicy: ?*anyopaque,
psUIpfns: ?*anyopaque,
pfnCleanupPolicy: ?*anyopaque,
};type
CRYPT_PROVIDER_FUNCTIONS {.bycopy.} = object
cbStruct: uint32
pfnAlloc: pointer
pfnFree: pointer
pfnAddStore2Chain: pointer
pfnAddSgnr2Chain: pointer
pfnAddCert2Chain: pointer
pfnAddPrivData2Chain: pointer
pfnInitialize: pointer
pfnObjectTrust: pointer
pfnSignatureTrust: pointer
pfnCertificateTrust: pointer
pfnFinalPolicy: pointer
pfnCertCheckPolicy: pointer
pfnTestFinalPolicy: pointer
psUIpfns: pointer
pfnCleanupPolicy: pointerstruct CRYPT_PROVIDER_FUNCTIONS
{
uint cbStruct;
void* pfnAlloc;
void* pfnFree;
void* pfnAddStore2Chain;
void* pfnAddSgnr2Chain;
void* pfnAddCert2Chain;
void* pfnAddPrivData2Chain;
void* pfnInitialize;
void* pfnObjectTrust;
void* pfnSignatureTrust;
void* pfnCertificateTrust;
void* pfnFinalPolicy;
void* pfnCertCheckPolicy;
void* pfnTestFinalPolicy;
void* psUIpfns;
void* pfnCleanupPolicy;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; CRYPT_PROVIDER_FUNCTIONS サイズ: 64 バイト(x86)
dim st, 16 ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; cbStruct : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; pfnAlloc : PFN_CPD_MEM_ALLOC (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; pfnFree : PFN_CPD_MEM_FREE (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; pfnAddStore2Chain : PFN_CPD_ADD_STORE (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; pfnAddSgnr2Chain : PFN_CPD_ADD_SGNR (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; pfnAddCert2Chain : PFN_CPD_ADD_CERT (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; pfnAddPrivData2Chain : PFN_CPD_ADD_PRIVDATA (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; pfnInitialize : PFN_PROVIDER_INIT_CALL (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; pfnObjectTrust : PFN_PROVIDER_OBJTRUST_CALL (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; pfnSignatureTrust : PFN_PROVIDER_SIGTRUST_CALL (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; pfnCertificateTrust : PFN_PROVIDER_CERTTRUST_CALL (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; pfnFinalPolicy : PFN_PROVIDER_FINALPOLICY_CALL (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; pfnCertCheckPolicy : PFN_PROVIDER_CERTCHKPOLICY_CALL (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; pfnTestFinalPolicy : PFN_PROVIDER_TESTFINALPOLICY_CALL (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; psUIpfns : CRYPT_PROVUI_FUNCS* (+56, 4byte) varptr(st)+56 を基点に操作(4byte:入れ子/配列)
; pfnCleanupPolicy : PFN_PROVIDER_CLEANUP_CALL (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; CRYPT_PROVIDER_FUNCTIONS サイズ: 128 バイト(x64)
dim st, 32 ; 4byte整数×32(構造体サイズ 128 / 4 切り上げ)
; cbStruct : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; pfnAlloc : PFN_CPD_MEM_ALLOC (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; pfnFree : PFN_CPD_MEM_FREE (+16, 8byte) qpoke st,16,値 / qpeek(st,16) ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; pfnAddStore2Chain : PFN_CPD_ADD_STORE (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; pfnAddSgnr2Chain : PFN_CPD_ADD_SGNR (+32, 8byte) qpoke st,32,値 / qpeek(st,32) ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; pfnAddCert2Chain : PFN_CPD_ADD_CERT (+40, 8byte) qpoke st,40,値 / qpeek(st,40) ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; pfnAddPrivData2Chain : PFN_CPD_ADD_PRIVDATA (+48, 8byte) qpoke st,48,値 / qpeek(st,48) ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; pfnInitialize : PFN_PROVIDER_INIT_CALL (+56, 8byte) qpoke st,56,値 / qpeek(st,56) ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; pfnObjectTrust : PFN_PROVIDER_OBJTRUST_CALL (+64, 8byte) qpoke st,64,値 / qpeek(st,64) ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; pfnSignatureTrust : PFN_PROVIDER_SIGTRUST_CALL (+72, 8byte) qpoke st,72,値 / qpeek(st,72) ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; pfnCertificateTrust : PFN_PROVIDER_CERTTRUST_CALL (+80, 8byte) qpoke st,80,値 / qpeek(st,80) ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; pfnFinalPolicy : PFN_PROVIDER_FINALPOLICY_CALL (+88, 8byte) qpoke st,88,値 / qpeek(st,88) ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; pfnCertCheckPolicy : PFN_PROVIDER_CERTCHKPOLICY_CALL (+96, 8byte) qpoke st,96,値 / qpeek(st,96) ※IronHSPのみ。3.7/3.8は lpoke st,96,下位 : lpoke st,100,上位
; pfnTestFinalPolicy : PFN_PROVIDER_TESTFINALPOLICY_CALL (+104, 8byte) qpoke st,104,値 / qpeek(st,104) ※IronHSPのみ。3.7/3.8は lpoke st,104,下位 : lpoke st,108,上位
; psUIpfns : CRYPT_PROVUI_FUNCS* (+112, 8byte) varptr(st)+112 を基点に操作(8byte:入れ子/配列)
; pfnCleanupPolicy : PFN_PROVIDER_CLEANUP_CALL (+120, 8byte) qpoke st,120,値 / qpeek(st,120) ※IronHSPのみ。3.7/3.8は lpoke st,120,下位 : lpoke st,124,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global CRYPT_PROVIDER_FUNCTIONS
#field int cbStruct
#field intptr pfnAlloc
#field intptr pfnFree
#field intptr pfnAddStore2Chain
#field intptr pfnAddSgnr2Chain
#field intptr pfnAddCert2Chain
#field intptr pfnAddPrivData2Chain
#field intptr pfnInitialize
#field intptr pfnObjectTrust
#field intptr pfnSignatureTrust
#field intptr pfnCertificateTrust
#field intptr pfnFinalPolicy
#field intptr pfnCertCheckPolicy
#field intptr pfnTestFinalPolicy
#field intptr psUIpfns
#field intptr pfnCleanupPolicy
#endstruct
stdim st, CRYPT_PROVIDER_FUNCTIONS ; NSTRUCT 変数を確保
st->cbStruct = 100
mes "cbStruct=" + st->cbStruct