Win32 API 日本語リファレンス
ホームDevices.BiometricFramework › WINBIO_STORAGE_RECORD

WINBIO_STORAGE_RECORD

構造体
サイズx64: 64 バイト / x86: 32 バイト

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

フィールド

フィールドサイズx64x86説明
IdentityWINBIO_IDENTITY*8/4+0+0ストレージレコードの GUID または SID を格納する WINBIO_IDENTITY 構造体へのポインターです。
SubFactorBYTE1+8+4

テンプレートデータに関連付けられた生体認証サブファクターを指定する WINBIO_BIOMETRIC_SUBTYPE 値です。

重要

SubFactor の値として指定された値を検証しようとしないでください。Windows 生体認証サービスは、指定された値を検証してから実装に渡します。値が WINBIO_SUBTYPE_NO_INFORMATION または WINBIO_SUBTYPE_ANY の場合は、必要に応じて検証してください。

IndexVectorDWORD*8/4+16+8連続した ULONG 値の配列へのポインターです。これらの値は、エンジンアダプターによって生体認証テンプレートに割り当てられたバケットアドレスを表します。
IndexElementCountUINT_PTR8/4+24+12IndexVector フィールドで指定された配列に含まれる ULONG 値の数です。
TemplateBlobBYTE*8/4+32+16生体認証テンプレートデータを格納するバイト配列へのポインターです。
TemplateBlobSizeUINT_PTR8/4+40+20TemplateBlob パラメーターで指定されたテンプレートのサイズ (バイト単位)。
PayloadBlobBYTE*8/4+48+24整合性チェック用のデータを格納するバイト配列へのポインターです。このフィールドは、埋め込みストレージを備えたリムーバブルデバイス用のアダプターでのみ使用されます。
PayloadBlobSizeUINT_PTR8/4+56+28PayloadBlob パラメーターで指定されたデータのサイズ (バイト単位)。

公式ドキュメント

WINBIO_STORAGE_RECORD 構造体は、標準形式の生体認証テンプレートと関連データを格納します。この構造体は、エンジンアダプターとストレージアダプターの間で情報を受け渡すために使用されます。

解説(Remarks)

WINBIO_STORAGE_RECORD 構造体とそれが指すメモリは、その構造体を作成したコンポーネントが所有します。特に、構造体をいつ削除するか、および埋め込まれたポインターがいつ無効になるかは、そのコンポーネントが決定します。他のコンポーネントがこの構造体への一時的なアクセスを与えられた場合、それらは所有元のコンポーネントが定めた構造体の有効期間に関する規則に従わなければなりません。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// WINBIO_STORAGE_RECORD  (x64 64 / x86 32 バイト)
typedef struct WINBIO_STORAGE_RECORD {
    WINBIO_IDENTITY* Identity;
    BYTE SubFactor;
    DWORD* IndexVector;
    UINT_PTR IndexElementCount;
    BYTE* TemplateBlob;
    UINT_PTR TemplateBlobSize;
    BYTE* PayloadBlob;
    UINT_PTR PayloadBlobSize;
} WINBIO_STORAGE_RECORD;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WINBIO_STORAGE_RECORD
{
    public IntPtr Identity;
    public byte SubFactor;
    public IntPtr IndexVector;
    public UIntPtr IndexElementCount;
    public IntPtr TemplateBlob;
    public UIntPtr TemplateBlobSize;
    public IntPtr PayloadBlob;
    public UIntPtr PayloadBlobSize;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WINBIO_STORAGE_RECORD
    Public Identity As IntPtr
    Public SubFactor As Byte
    Public IndexVector As IntPtr
    Public IndexElementCount As UIntPtr
    Public TemplateBlob As IntPtr
    Public TemplateBlobSize As UIntPtr
    Public PayloadBlob As IntPtr
    Public PayloadBlobSize As UIntPtr
End Structure
import ctypes
from ctypes import wintypes

class WINBIO_STORAGE_RECORD(ctypes.Structure):
    _fields_ = [
        ("Identity", ctypes.c_void_p),
        ("SubFactor", ctypes.c_ubyte),
        ("IndexVector", ctypes.c_void_p),
        ("IndexElementCount", ctypes.c_size_t),
        ("TemplateBlob", ctypes.c_void_p),
        ("TemplateBlobSize", ctypes.c_size_t),
        ("PayloadBlob", ctypes.c_void_p),
        ("PayloadBlobSize", ctypes.c_size_t),
    ]
#[repr(C)]
pub struct WINBIO_STORAGE_RECORD {
    pub Identity: *mut core::ffi::c_void,
    pub SubFactor: u8,
    pub IndexVector: *mut core::ffi::c_void,
    pub IndexElementCount: usize,
    pub TemplateBlob: *mut core::ffi::c_void,
    pub TemplateBlobSize: usize,
    pub PayloadBlob: *mut core::ffi::c_void,
    pub PayloadBlobSize: usize,
}
import "golang.org/x/sys/windows"

type WINBIO_STORAGE_RECORD struct {
	Identity uintptr
	SubFactor byte
	IndexVector uintptr
	IndexElementCount uintptr
	TemplateBlob uintptr
	TemplateBlobSize uintptr
	PayloadBlob uintptr
	PayloadBlobSize uintptr
}
type
  WINBIO_STORAGE_RECORD = record
    Identity: Pointer;
    SubFactor: Byte;
    IndexVector: Pointer;
    IndexElementCount: NativeUInt;
    TemplateBlob: Pointer;
    TemplateBlobSize: NativeUInt;
    PayloadBlob: Pointer;
    PayloadBlobSize: NativeUInt;
  end;
const WINBIO_STORAGE_RECORD = extern struct {
    Identity: ?*anyopaque,
    SubFactor: u8,
    IndexVector: ?*anyopaque,
    IndexElementCount: usize,
    TemplateBlob: ?*anyopaque,
    TemplateBlobSize: usize,
    PayloadBlob: ?*anyopaque,
    PayloadBlobSize: usize,
};
type
  WINBIO_STORAGE_RECORD {.bycopy.} = object
    Identity: pointer
    SubFactor: uint8
    IndexVector: pointer
    IndexElementCount: uint
    TemplateBlob: pointer
    TemplateBlobSize: uint
    PayloadBlob: pointer
    PayloadBlobSize: uint
struct WINBIO_STORAGE_RECORD
{
    void* Identity;
    ubyte SubFactor;
    void* IndexVector;
    size_t IndexElementCount;
    void* TemplateBlob;
    size_t TemplateBlobSize;
    void* PayloadBlob;
    size_t PayloadBlobSize;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WINBIO_STORAGE_RECORD サイズ: 32 バイト(x86)
dim st, 8    ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; Identity : WINBIO_IDENTITY* (+0, 4byte)  varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; SubFactor : BYTE (+4, 1byte)  poke st,4,値  /  値 = peek(st,4)
; IndexVector : DWORD* (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; IndexElementCount : UINT_PTR (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; TemplateBlob : BYTE* (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; TemplateBlobSize : UINT_PTR (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; PayloadBlob : BYTE* (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; PayloadBlobSize : UINT_PTR (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WINBIO_STORAGE_RECORD サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; Identity : WINBIO_IDENTITY* (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; SubFactor : BYTE (+8, 1byte)  poke st,8,値  /  値 = peek(st,8)
; IndexVector : DWORD* (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; IndexElementCount : UINT_PTR (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; TemplateBlob : BYTE* (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; TemplateBlobSize : UINT_PTR (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; PayloadBlob : BYTE* (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; PayloadBlobSize : UINT_PTR (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global WINBIO_STORAGE_RECORD
    #field intptr Identity
    #field byte SubFactor
    #field intptr IndexVector
    #field intptr IndexElementCount
    #field intptr TemplateBlob
    #field intptr TemplateBlobSize
    #field intptr PayloadBlob
    #field intptr PayloadBlobSize
#endstruct

stdim st, WINBIO_STORAGE_RECORD        ; NSTRUCT 変数を確保
st->SubFactor = 100
mes "SubFactor=" + st->SubFactor