Win32 API 日本語リファレンス
ホームSystem.Ioctl › STORAGE_HW_CRYPTO_DESCRIPTOR

STORAGE_HW_CRYPTO_DESCRIPTOR

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

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

フィールド

フィールドサイズx64x86説明
HeaderSTORAGE_DESCRIPTOR_HEADER8+0+0バージョンとサイズを含むSTORAGE_DESCRIPTOR_HEADER。ディスクリプタ共通ヘッダ。
NumKeysSupportedDWORD4+8+8デバイスがサポートする暗号鍵の総数。
NumCryptoCapabilitiesDWORD4+12+12暗号機能エントリの総数。
OffsetToCryptoCapabilitiesDWORD4+16+16暗号機能配列への本構造体先頭からのバイトオフセット。
SizeOfCryptoCapabilityDWORD4+20+20個々の暗号機能エントリのサイズをバイト単位で示す。
IceTypeSTORAGE_ICE_TYPE4+24+24インライン暗号エンジン(ICE)の種類を示すSTORAGE_ICE_TYPE列挙値。
SecurityComplianceBitmaskSTORAGE_SECURITY_COMPLIANCE_BITMASK1+28+28サポートするセキュリティ準拠規格をビットマスクで示す。
KeyTypeBitmaskSTORAGE_CRYPTO_KEY_TYPE1+29+29サポートする鍵タイプをビットマスクで示す。

各言語での定義

#include <windows.h>

// STORAGE_DESCRIPTOR_HEADER  (x64 8 / x86 8 バイト)
typedef struct STORAGE_DESCRIPTOR_HEADER {
    DWORD Version;
    DWORD Size;
} STORAGE_DESCRIPTOR_HEADER;

// STORAGE_SECURITY_COMPLIANCE_BITMASK  (x64 1 / x86 1 バイト)
typedef struct STORAGE_SECURITY_COMPLIANCE_BITMASK {
    _Anonymous_e__Struct Anonymous;
    BYTE AsUchar;
} STORAGE_SECURITY_COMPLIANCE_BITMASK;

// STORAGE_CRYPTO_KEY_TYPE  (x64 1 / x86 1 バイト)
typedef struct STORAGE_CRYPTO_KEY_TYPE {
    _Anonymous_e__Struct Anonymous;
    BYTE AsUchar;
} STORAGE_CRYPTO_KEY_TYPE;

// STORAGE_HW_CRYPTO_DESCRIPTOR  (x64 32 / x86 32 バイト)
typedef struct STORAGE_HW_CRYPTO_DESCRIPTOR {
    STORAGE_DESCRIPTOR_HEADER Header;
    DWORD NumKeysSupported;
    DWORD NumCryptoCapabilities;
    DWORD OffsetToCryptoCapabilities;
    DWORD SizeOfCryptoCapability;
    STORAGE_ICE_TYPE IceType;
    STORAGE_SECURITY_COMPLIANCE_BITMASK SecurityComplianceBitmask;
    STORAGE_CRYPTO_KEY_TYPE KeyTypeBitmask;
} STORAGE_HW_CRYPTO_DESCRIPTOR;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct STORAGE_DESCRIPTOR_HEADER
{
    public uint Version;
    public uint Size;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct STORAGE_SECURITY_COMPLIANCE_BITMASK
{
    public _Anonymous_e__Struct Anonymous;
    public byte AsUchar;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct STORAGE_CRYPTO_KEY_TYPE
{
    public _Anonymous_e__Struct Anonymous;
    public byte AsUchar;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct STORAGE_HW_CRYPTO_DESCRIPTOR
{
    public STORAGE_DESCRIPTOR_HEADER Header;
    public uint NumKeysSupported;
    public uint NumCryptoCapabilities;
    public uint OffsetToCryptoCapabilities;
    public uint SizeOfCryptoCapability;
    public int IceType;
    public STORAGE_SECURITY_COMPLIANCE_BITMASK SecurityComplianceBitmask;
    public STORAGE_CRYPTO_KEY_TYPE KeyTypeBitmask;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure STORAGE_DESCRIPTOR_HEADER
    Public Version As UInteger
    Public Size As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure STORAGE_SECURITY_COMPLIANCE_BITMASK
    Public Anonymous As _Anonymous_e__Struct
    Public AsUchar As Byte
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure STORAGE_CRYPTO_KEY_TYPE
    Public Anonymous As _Anonymous_e__Struct
    Public AsUchar As Byte
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure STORAGE_HW_CRYPTO_DESCRIPTOR
    Public Header As STORAGE_DESCRIPTOR_HEADER
    Public NumKeysSupported As UInteger
    Public NumCryptoCapabilities As UInteger
    Public OffsetToCryptoCapabilities As UInteger
    Public SizeOfCryptoCapability As UInteger
    Public IceType As Integer
    Public SecurityComplianceBitmask As STORAGE_SECURITY_COMPLIANCE_BITMASK
    Public KeyTypeBitmask As STORAGE_CRYPTO_KEY_TYPE
End Structure
import ctypes
from ctypes import wintypes

class STORAGE_DESCRIPTOR_HEADER(ctypes.Structure):
    _fields_ = [
        ("Version", wintypes.DWORD),
        ("Size", wintypes.DWORD),
    ]

class STORAGE_SECURITY_COMPLIANCE_BITMASK(ctypes.Structure):
    _fields_ = [
        ("Anonymous", _Anonymous_e__Struct),
        ("AsUchar", ctypes.c_ubyte),
    ]

class STORAGE_CRYPTO_KEY_TYPE(ctypes.Structure):
    _fields_ = [
        ("Anonymous", _Anonymous_e__Struct),
        ("AsUchar", ctypes.c_ubyte),
    ]

class STORAGE_HW_CRYPTO_DESCRIPTOR(ctypes.Structure):
    _fields_ = [
        ("Header", STORAGE_DESCRIPTOR_HEADER),
        ("NumKeysSupported", wintypes.DWORD),
        ("NumCryptoCapabilities", wintypes.DWORD),
        ("OffsetToCryptoCapabilities", wintypes.DWORD),
        ("SizeOfCryptoCapability", wintypes.DWORD),
        ("IceType", ctypes.c_int),
        ("SecurityComplianceBitmask", STORAGE_SECURITY_COMPLIANCE_BITMASK),
        ("KeyTypeBitmask", STORAGE_CRYPTO_KEY_TYPE),
    ]
#[repr(C)]
pub struct STORAGE_DESCRIPTOR_HEADER {
    pub Version: u32,
    pub Size: u32,
}

#[repr(C)]
pub struct STORAGE_SECURITY_COMPLIANCE_BITMASK {
    pub Anonymous: _Anonymous_e__Struct,
    pub AsUchar: u8,
}

#[repr(C)]
pub struct STORAGE_CRYPTO_KEY_TYPE {
    pub Anonymous: _Anonymous_e__Struct,
    pub AsUchar: u8,
}

#[repr(C)]
pub struct STORAGE_HW_CRYPTO_DESCRIPTOR {
    pub Header: STORAGE_DESCRIPTOR_HEADER,
    pub NumKeysSupported: u32,
    pub NumCryptoCapabilities: u32,
    pub OffsetToCryptoCapabilities: u32,
    pub SizeOfCryptoCapability: u32,
    pub IceType: i32,
    pub SecurityComplianceBitmask: STORAGE_SECURITY_COMPLIANCE_BITMASK,
    pub KeyTypeBitmask: STORAGE_CRYPTO_KEY_TYPE,
}
import "golang.org/x/sys/windows"

type STORAGE_DESCRIPTOR_HEADER struct {
	Version uint32
	Size uint32
}

type STORAGE_SECURITY_COMPLIANCE_BITMASK struct {
	Anonymous _Anonymous_e__Struct
	AsUchar byte
}

type STORAGE_CRYPTO_KEY_TYPE struct {
	Anonymous _Anonymous_e__Struct
	AsUchar byte
}

type STORAGE_HW_CRYPTO_DESCRIPTOR struct {
	Header STORAGE_DESCRIPTOR_HEADER
	NumKeysSupported uint32
	NumCryptoCapabilities uint32
	OffsetToCryptoCapabilities uint32
	SizeOfCryptoCapability uint32
	IceType int32
	SecurityComplianceBitmask STORAGE_SECURITY_COMPLIANCE_BITMASK
	KeyTypeBitmask STORAGE_CRYPTO_KEY_TYPE
}
type
  STORAGE_DESCRIPTOR_HEADER = record
    Version: DWORD;
    Size: DWORD;
  end;

  STORAGE_SECURITY_COMPLIANCE_BITMASK = record
    Anonymous: _Anonymous_e__Struct;
    AsUchar: Byte;
  end;

  STORAGE_CRYPTO_KEY_TYPE = record
    Anonymous: _Anonymous_e__Struct;
    AsUchar: Byte;
  end;

  STORAGE_HW_CRYPTO_DESCRIPTOR = record
    Header: STORAGE_DESCRIPTOR_HEADER;
    NumKeysSupported: DWORD;
    NumCryptoCapabilities: DWORD;
    OffsetToCryptoCapabilities: DWORD;
    SizeOfCryptoCapability: DWORD;
    IceType: Integer;
    SecurityComplianceBitmask: STORAGE_SECURITY_COMPLIANCE_BITMASK;
    KeyTypeBitmask: STORAGE_CRYPTO_KEY_TYPE;
  end;
const STORAGE_DESCRIPTOR_HEADER = extern struct {
    Version: u32,
    Size: u32,
};

const STORAGE_SECURITY_COMPLIANCE_BITMASK = extern struct {
    Anonymous: _Anonymous_e__Struct,
    AsUchar: u8,
};

const STORAGE_CRYPTO_KEY_TYPE = extern struct {
    Anonymous: _Anonymous_e__Struct,
    AsUchar: u8,
};

const STORAGE_HW_CRYPTO_DESCRIPTOR = extern struct {
    Header: STORAGE_DESCRIPTOR_HEADER,
    NumKeysSupported: u32,
    NumCryptoCapabilities: u32,
    OffsetToCryptoCapabilities: u32,
    SizeOfCryptoCapability: u32,
    IceType: i32,
    SecurityComplianceBitmask: STORAGE_SECURITY_COMPLIANCE_BITMASK,
    KeyTypeBitmask: STORAGE_CRYPTO_KEY_TYPE,
};
type
  STORAGE_DESCRIPTOR_HEADER {.bycopy.} = object
    Version: uint32
    Size: uint32

  STORAGE_SECURITY_COMPLIANCE_BITMASK {.bycopy.} = object
    Anonymous: _Anonymous_e__Struct
    AsUchar: uint8

  STORAGE_CRYPTO_KEY_TYPE {.bycopy.} = object
    Anonymous: _Anonymous_e__Struct
    AsUchar: uint8

  STORAGE_HW_CRYPTO_DESCRIPTOR {.bycopy.} = object
    Header: STORAGE_DESCRIPTOR_HEADER
    NumKeysSupported: uint32
    NumCryptoCapabilities: uint32
    OffsetToCryptoCapabilities: uint32
    SizeOfCryptoCapability: uint32
    IceType: int32
    SecurityComplianceBitmask: STORAGE_SECURITY_COMPLIANCE_BITMASK
    KeyTypeBitmask: STORAGE_CRYPTO_KEY_TYPE
struct STORAGE_DESCRIPTOR_HEADER
{
    uint Version;
    uint Size;
}

struct STORAGE_SECURITY_COMPLIANCE_BITMASK
{
    _Anonymous_e__Struct Anonymous;
    ubyte AsUchar;
}

struct STORAGE_CRYPTO_KEY_TYPE
{
    _Anonymous_e__Struct Anonymous;
    ubyte AsUchar;
}

struct STORAGE_HW_CRYPTO_DESCRIPTOR
{
    STORAGE_DESCRIPTOR_HEADER Header;
    uint NumKeysSupported;
    uint NumCryptoCapabilities;
    uint OffsetToCryptoCapabilities;
    uint SizeOfCryptoCapability;
    int IceType;
    STORAGE_SECURITY_COMPLIANCE_BITMASK SecurityComplianceBitmask;
    STORAGE_CRYPTO_KEY_TYPE KeyTypeBitmask;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; STORAGE_HW_CRYPTO_DESCRIPTOR サイズ: 32 バイト(x64)
dim st, 8    ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; Header : STORAGE_DESCRIPTOR_HEADER (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; NumKeysSupported : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; NumCryptoCapabilities : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; OffsetToCryptoCapabilities : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; SizeOfCryptoCapability : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; IceType : STORAGE_ICE_TYPE (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; SecurityComplianceBitmask : STORAGE_SECURITY_COMPLIANCE_BITMASK (+28, 1byte)  varptr(st)+28 を基点に操作(1byte:入れ子/配列)
; KeyTypeBitmask : STORAGE_CRYPTO_KEY_TYPE (+29, 1byte)  varptr(st)+29 を基点に操作(1byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global STORAGE_DESCRIPTOR_HEADER
    #field int Version
    #field int Size
#endstruct

#defstruct global STORAGE_HW_CRYPTO_DESCRIPTOR
    #field STORAGE_DESCRIPTOR_HEADER Header
    #field int NumKeysSupported
    #field int NumCryptoCapabilities
    #field int OffsetToCryptoCapabilities
    #field int SizeOfCryptoCapability
    #field int IceType
    #field byte SecurityComplianceBitmask 1
    #field byte KeyTypeBitmask 1
#endstruct

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