Win32 API 日本語リファレンス
ホームSecurity.Cryptography.Sip › SIP_SUBJECTINFO

SIP_SUBJECTINFO

構造体
サイズx64: 128 バイト / x86: 80 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
cbSizeDWORD4+0+0この構造体のバイト単位サイズ。呼び出し前に設定する。
pgSubjectTypeGUID*8/4+8+4署名対象の主体種別を示すGUIDへのポインタ。
hFileHANDLE8/4+16+8署名対象ファイルのハンドル。INVALID_HANDLE_VALUE可。
pwsFileNameLPWSTR8/4+24+12署名対象ファイル名を示すワイド文字列。NULL可。
pwsDisplayNameLPWSTR8/4+32+16対象の表示名を示すワイド文字列。NULL可。
dwReserved1DWORD4+40+20予約フィールド。0を設定する。
dwIntVersionDWORD4+44+24SIPの内部バージョン番号。
hProvUINT_PTR8/4+48+28暗号化サービスプロバイダーのハンドル。
DigestAlgorithmCRYPT_ALGORITHM_IDENTIFIER24/12+56+32ダイジェスト計算に用いるアルゴリズム識別子。
dwFlagsDWORD4+80+44SIP処理の動作を制御するフラグ。
dwEncodingTypeDWORD4+84+48データのエンコード種別を示す値。
dwReserved2DWORD4+88+52予約フィールド。0を設定する。
fdwCAPISettingsDWORD4+92+56CryptoAPIに関する設定フラグ。
fdwSecuritySettingsDWORD4+96+60セキュリティに関する設定フラグ。
dwIndexDWORD4+100+64処理対象のインデックス。
dwUnionChoiceDWORD4+104+68無名共用体の選択を示す値。
Anonymous_Anonymous_e__Union8/4+112+72選択に応じた追加データを保持する無名共用体。
pClientDatavoid*8/4+120+76クライアント定義データへのポインタ。NULL可。

共用体: _Anonymous_e__Union x64 8B / x86 4B

フィールドサイズx64x86
psFlatMS_ADDINFO_FLAT*8/4+0+0
psCatMemberMS_ADDINFO_CATALOGMEMBER*8/4+0+0
psBlobMS_ADDINFO_BLOB*8/4+0+0
psDetachedSigMS_ADDINFO_DETACHEDSIG*8/4+0+0

各言語での定義

#include <windows.h>

// CRYPT_INTEGER_BLOB  (x64 16 / x86 8 バイト)
typedef struct CRYPT_INTEGER_BLOB {
    DWORD cbData;
    BYTE* pbData;
} CRYPT_INTEGER_BLOB;

// CRYPT_ALGORITHM_IDENTIFIER  (x64 24 / x86 12 バイト)
typedef struct CRYPT_ALGORITHM_IDENTIFIER {
    LPSTR pszObjId;
    CRYPT_INTEGER_BLOB Parameters;
} CRYPT_ALGORITHM_IDENTIFIER;

// SIP_SUBJECTINFO  (x64 128 / x86 80 バイト)
typedef struct SIP_SUBJECTINFO {
    DWORD cbSize;
    GUID* pgSubjectType;
    HANDLE hFile;
    LPWSTR pwsFileName;
    LPWSTR pwsDisplayName;
    DWORD dwReserved1;
    DWORD dwIntVersion;
    UINT_PTR hProv;
    CRYPT_ALGORITHM_IDENTIFIER DigestAlgorithm;
    DWORD dwFlags;
    DWORD dwEncodingType;
    DWORD dwReserved2;
    DWORD fdwCAPISettings;
    DWORD fdwSecuritySettings;
    DWORD dwIndex;
    DWORD dwUnionChoice;
    _Anonymous_e__Union Anonymous;
    void* pClientData;
} SIP_SUBJECTINFO;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CRYPT_INTEGER_BLOB
{
    public uint cbData;
    public IntPtr pbData;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CRYPT_ALGORITHM_IDENTIFIER
{
    public IntPtr pszObjId;
    public CRYPT_INTEGER_BLOB Parameters;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SIP_SUBJECTINFO
{
    public uint cbSize;
    public IntPtr pgSubjectType;
    public IntPtr hFile;
    public IntPtr pwsFileName;
    public IntPtr pwsDisplayName;
    public uint dwReserved1;
    public uint dwIntVersion;
    public UIntPtr hProv;
    public CRYPT_ALGORITHM_IDENTIFIER DigestAlgorithm;
    public uint dwFlags;
    public uint dwEncodingType;
    public uint dwReserved2;
    public uint fdwCAPISettings;
    public uint fdwSecuritySettings;
    public uint dwIndex;
    public uint dwUnionChoice;
    public _Anonymous_e__Union Anonymous;
    public IntPtr pClientData;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CRYPT_INTEGER_BLOB
    Public cbData As UInteger
    Public pbData As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CRYPT_ALGORITHM_IDENTIFIER
    Public pszObjId As IntPtr
    Public Parameters As CRYPT_INTEGER_BLOB
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SIP_SUBJECTINFO
    Public cbSize As UInteger
    Public pgSubjectType As IntPtr
    Public hFile As IntPtr
    Public pwsFileName As IntPtr
    Public pwsDisplayName As IntPtr
    Public dwReserved1 As UInteger
    Public dwIntVersion As UInteger
    Public hProv As UIntPtr
    Public DigestAlgorithm As CRYPT_ALGORITHM_IDENTIFIER
    Public dwFlags As UInteger
    Public dwEncodingType As UInteger
    Public dwReserved2 As UInteger
    Public fdwCAPISettings As UInteger
    Public fdwSecuritySettings As UInteger
    Public dwIndex As UInteger
    Public dwUnionChoice As UInteger
    Public Anonymous As _Anonymous_e__Union
    Public pClientData As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class CRYPT_INTEGER_BLOB(ctypes.Structure):
    _fields_ = [
        ("cbData", wintypes.DWORD),
        ("pbData", ctypes.c_void_p),
    ]

class CRYPT_ALGORITHM_IDENTIFIER(ctypes.Structure):
    _fields_ = [
        ("pszObjId", ctypes.c_void_p),
        ("Parameters", CRYPT_INTEGER_BLOB),
    ]

class SIP_SUBJECTINFO(ctypes.Structure):
    _fields_ = [
        ("cbSize", wintypes.DWORD),
        ("pgSubjectType", ctypes.c_void_p),
        ("hFile", ctypes.c_void_p),
        ("pwsFileName", ctypes.c_void_p),
        ("pwsDisplayName", ctypes.c_void_p),
        ("dwReserved1", wintypes.DWORD),
        ("dwIntVersion", wintypes.DWORD),
        ("hProv", ctypes.c_size_t),
        ("DigestAlgorithm", CRYPT_ALGORITHM_IDENTIFIER),
        ("dwFlags", wintypes.DWORD),
        ("dwEncodingType", wintypes.DWORD),
        ("dwReserved2", wintypes.DWORD),
        ("fdwCAPISettings", wintypes.DWORD),
        ("fdwSecuritySettings", wintypes.DWORD),
        ("dwIndex", wintypes.DWORD),
        ("dwUnionChoice", wintypes.DWORD),
        ("Anonymous", _Anonymous_e__Union),
        ("pClientData", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct CRYPT_INTEGER_BLOB {
    pub cbData: u32,
    pub pbData: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct CRYPT_ALGORITHM_IDENTIFIER {
    pub pszObjId: *mut core::ffi::c_void,
    pub Parameters: CRYPT_INTEGER_BLOB,
}

#[repr(C)]
pub struct SIP_SUBJECTINFO {
    pub cbSize: u32,
    pub pgSubjectType: *mut core::ffi::c_void,
    pub hFile: *mut core::ffi::c_void,
    pub pwsFileName: *mut core::ffi::c_void,
    pub pwsDisplayName: *mut core::ffi::c_void,
    pub dwReserved1: u32,
    pub dwIntVersion: u32,
    pub hProv: usize,
    pub DigestAlgorithm: CRYPT_ALGORITHM_IDENTIFIER,
    pub dwFlags: u32,
    pub dwEncodingType: u32,
    pub dwReserved2: u32,
    pub fdwCAPISettings: u32,
    pub fdwSecuritySettings: u32,
    pub dwIndex: u32,
    pub dwUnionChoice: u32,
    pub Anonymous: _Anonymous_e__Union,
    pub pClientData: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type CRYPT_INTEGER_BLOB struct {
	cbData uint32
	pbData uintptr
}

type CRYPT_ALGORITHM_IDENTIFIER struct {
	pszObjId uintptr
	Parameters CRYPT_INTEGER_BLOB
}

type SIP_SUBJECTINFO struct {
	cbSize uint32
	pgSubjectType uintptr
	hFile uintptr
	pwsFileName uintptr
	pwsDisplayName uintptr
	dwReserved1 uint32
	dwIntVersion uint32
	hProv uintptr
	DigestAlgorithm CRYPT_ALGORITHM_IDENTIFIER
	dwFlags uint32
	dwEncodingType uint32
	dwReserved2 uint32
	fdwCAPISettings uint32
	fdwSecuritySettings uint32
	dwIndex uint32
	dwUnionChoice uint32
	Anonymous _Anonymous_e__Union
	pClientData uintptr
}
type
  CRYPT_INTEGER_BLOB = record
    cbData: DWORD;
    pbData: Pointer;
  end;

  CRYPT_ALGORITHM_IDENTIFIER = record
    pszObjId: Pointer;
    Parameters: CRYPT_INTEGER_BLOB;
  end;

  SIP_SUBJECTINFO = record
    cbSize: DWORD;
    pgSubjectType: Pointer;
    hFile: Pointer;
    pwsFileName: Pointer;
    pwsDisplayName: Pointer;
    dwReserved1: DWORD;
    dwIntVersion: DWORD;
    hProv: NativeUInt;
    DigestAlgorithm: CRYPT_ALGORITHM_IDENTIFIER;
    dwFlags: DWORD;
    dwEncodingType: DWORD;
    dwReserved2: DWORD;
    fdwCAPISettings: DWORD;
    fdwSecuritySettings: DWORD;
    dwIndex: DWORD;
    dwUnionChoice: DWORD;
    Anonymous: _Anonymous_e__Union;
    pClientData: Pointer;
  end;
const CRYPT_INTEGER_BLOB = extern struct {
    cbData: u32,
    pbData: ?*anyopaque,
};

const CRYPT_ALGORITHM_IDENTIFIER = extern struct {
    pszObjId: ?*anyopaque,
    Parameters: CRYPT_INTEGER_BLOB,
};

const SIP_SUBJECTINFO = extern struct {
    cbSize: u32,
    pgSubjectType: ?*anyopaque,
    hFile: ?*anyopaque,
    pwsFileName: ?*anyopaque,
    pwsDisplayName: ?*anyopaque,
    dwReserved1: u32,
    dwIntVersion: u32,
    hProv: usize,
    DigestAlgorithm: CRYPT_ALGORITHM_IDENTIFIER,
    dwFlags: u32,
    dwEncodingType: u32,
    dwReserved2: u32,
    fdwCAPISettings: u32,
    fdwSecuritySettings: u32,
    dwIndex: u32,
    dwUnionChoice: u32,
    Anonymous: _Anonymous_e__Union,
    pClientData: ?*anyopaque,
};
type
  CRYPT_INTEGER_BLOB {.bycopy.} = object
    cbData: uint32
    pbData: pointer

  CRYPT_ALGORITHM_IDENTIFIER {.bycopy.} = object
    pszObjId: pointer
    Parameters: CRYPT_INTEGER_BLOB

  SIP_SUBJECTINFO {.bycopy.} = object
    cbSize: uint32
    pgSubjectType: pointer
    hFile: pointer
    pwsFileName: pointer
    pwsDisplayName: pointer
    dwReserved1: uint32
    dwIntVersion: uint32
    hProv: uint
    DigestAlgorithm: CRYPT_ALGORITHM_IDENTIFIER
    dwFlags: uint32
    dwEncodingType: uint32
    dwReserved2: uint32
    fdwCAPISettings: uint32
    fdwSecuritySettings: uint32
    dwIndex: uint32
    dwUnionChoice: uint32
    Anonymous: _Anonymous_e__Union
    pClientData: pointer
struct CRYPT_INTEGER_BLOB
{
    uint cbData;
    void* pbData;
}

struct CRYPT_ALGORITHM_IDENTIFIER
{
    void* pszObjId;
    CRYPT_INTEGER_BLOB Parameters;
}

struct SIP_SUBJECTINFO
{
    uint cbSize;
    void* pgSubjectType;
    void* hFile;
    void* pwsFileName;
    void* pwsDisplayName;
    uint dwReserved1;
    uint dwIntVersion;
    size_t hProv;
    CRYPT_ALGORITHM_IDENTIFIER DigestAlgorithm;
    uint dwFlags;
    uint dwEncodingType;
    uint dwReserved2;
    uint fdwCAPISettings;
    uint fdwSecuritySettings;
    uint dwIndex;
    uint dwUnionChoice;
    _Anonymous_e__Union Anonymous;
    void* pClientData;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SIP_SUBJECTINFO サイズ: 80 バイト(x86)
dim st, 20    ; 4byte整数×20(構造体サイズ 80 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; pgSubjectType : GUID* (+4, 4byte)  varptr(st)+4 を基点に操作(4byte:入れ子/配列)
; hFile : HANDLE (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; pwsFileName : LPWSTR (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; pwsDisplayName : LPWSTR (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; dwReserved1 : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; dwIntVersion : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; hProv : UINT_PTR (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; DigestAlgorithm : CRYPT_ALGORITHM_IDENTIFIER (+32, 12byte)  varptr(st)+32 を基点に操作(12byte:入れ子/配列)
; dwFlags : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; dwEncodingType : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; dwReserved2 : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; fdwCAPISettings : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; fdwSecuritySettings : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; dwIndex : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; dwUnionChoice : DWORD (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; Anonymous : _Anonymous_e__Union (+72, 4byte)  varptr(st)+72 を基点に操作(4byte:入れ子/配列)
; pClientData : void* (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SIP_SUBJECTINFO サイズ: 128 バイト(x64)
dim st, 32    ; 4byte整数×32(構造体サイズ 128 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; pgSubjectType : GUID* (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; hFile : HANDLE (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; pwsFileName : LPWSTR (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; pwsDisplayName : LPWSTR (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; dwReserved1 : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; dwIntVersion : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; hProv : UINT_PTR (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; DigestAlgorithm : CRYPT_ALGORITHM_IDENTIFIER (+56, 24byte)  varptr(st)+56 を基点に操作(24byte:入れ子/配列)
; dwFlags : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; dwEncodingType : DWORD (+84, 4byte)  st.21 = 値  /  値 = st.21   (lpoke/lpeek も可)
; dwReserved2 : DWORD (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; fdwCAPISettings : DWORD (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; fdwSecuritySettings : DWORD (+96, 4byte)  st.24 = 値  /  値 = st.24   (lpoke/lpeek も可)
; dwIndex : DWORD (+100, 4byte)  st.25 = 値  /  値 = st.25   (lpoke/lpeek も可)
; dwUnionChoice : DWORD (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; Anonymous : _Anonymous_e__Union (+112, 8byte)  varptr(st)+112 を基点に操作(8byte:入れ子/配列)
; pClientData : void* (+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 どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global CRYPT_INTEGER_BLOB
    #field int cbData
    #field intptr pbData
#endstruct

#defstruct global CRYPT_ALGORITHM_IDENTIFIER
    #field intptr pszObjId
    #field CRYPT_INTEGER_BLOB Parameters
#endstruct

#defstruct global SIP_SUBJECTINFO
    #field int cbSize
    #field intptr pgSubjectType
    #field intptr hFile
    #field intptr pwsFileName
    #field intptr pwsDisplayName
    #field int dwReserved1
    #field int dwIntVersion
    #field intptr hProv
    #field CRYPT_ALGORITHM_IDENTIFIER DigestAlgorithm
    #field int dwFlags
    #field int dwEncodingType
    #field int dwReserved2
    #field int fdwCAPISettings
    #field int fdwSecuritySettings
    #field int dwIndex
    #field int dwUnionChoice
    #field byte Anonymous 8
    #field intptr pClientData
#endstruct

stdim st, SIP_SUBJECTINFO        ; NSTRUCT 変数を確保
st->cbSize = 100
mes "cbSize=" + st->cbSize
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。