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

CryptCATCDFOpen

関数
カタログ定義ファイル(CDF)を開いて解析ハンドルを取得する。
DLLWINTRUST.dll呼出規約winapi対応OSWindows XP 以降

シグネチャ

// WINTRUST.dll
#include <windows.h>

CRYPTCATCDF* CryptCATCDFOpen(
    LPWSTR pwszFilePath,
    PFN_CDF_PARSE_ERROR_CALLBACK pfnParseError   // optional
);

パラメーター

名前型方向説明
pwszFilePathLPWSTRin開く CDF ファイルのパスを含む、null で終わる文字列へのポインター。
pfnParseErrorPFN_CDF_PARSE_ERROR_CALLBACKinoptionalファイルの解析エラーを処理する、ユーザー定義関数へのポインター。

戻り値の型: CRYPTCATCDF*

公式ドキュメント

既存のカタログ定義ファイル (CDF) を読み取り用に開き、CRYPTCATCDF 構造体を初期化します。

戻り値

成功した場合、この関数は新しく作成された CRYPTCATCDF 構造体へのポインターを返します。失敗した場合、CryptCATCDFOpen 関数は NULL ポインターを返します。

解説(Remarks)

CDF の CatalogHeader セクションが次の条件に該当する場合、CryptCATCDFOpen 関数は以下の既定値を使用します。

CatalogHeader の条件 既定値
Name 値が指定されていない。 カタログ (.cat) 出力ファイルには、pwszFilePath のファイル名が使用されます。
PublicVersion 値が指定されていない。 0x00000001
EncodingType 値が指定されていない。 PKCS_7_ASN_ENCODING または X509_ASN_ENCODING (0x00010001)

次のエラー条件に該当する場合、CryptCATCDFOpen 関数は以下の動作を行います。

エラー条件 実行される動作
CDF 内に CatalogHeader タグまたは Name タグが見つからない。 呼び出し元によって指定されている場合、CryptCATCDFOpen 関数は pfnParseError で指定された関数を呼び出し、NULL ポインターを返します。
CryptCATCDFOpen 関数がカタログ (.cat) 出力ファイルのハンドルを取得するために CryptCATOpen 関数を呼び出したが、無効なハンドルまたは NULL ハンドルが返された。 CryptCATCDFClose 関数を呼び出し、NULL ポインターを返します。
カタログ ブランチ用の追加の OID 定義
szOID_CATALOG_LIST_MEMBER_V2 1.3.6.1.4.1.311.12.1.3
CAT_MEMBERINFO2_OBJID 1.3.6.1.4.1.311.12.2.3

Windows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: 追加のカタログ OID は使用できません。

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

各言語での呼び出し定義

// WINTRUST.dll
#include <windows.h>

CRYPTCATCDF* CryptCATCDFOpen(
    LPWSTR pwszFilePath,
    PFN_CDF_PARSE_ERROR_CALLBACK pfnParseError   // optional
);
[DllImport("WINTRUST.dll", ExactSpelling = true)]
static extern IntPtr CryptCATCDFOpen(
    [MarshalAs(UnmanagedType.LPWStr)] string pwszFilePath,   // LPWSTR
    IntPtr pfnParseError   // PFN_CDF_PARSE_ERROR_CALLBACK optional
);
<DllImport("WINTRUST.dll", ExactSpelling:=True)>
Public Shared Function CryptCATCDFOpen(
    <MarshalAs(UnmanagedType.LPWStr)> pwszFilePath As String,   ' LPWSTR
    pfnParseError As IntPtr   ' PFN_CDF_PARSE_ERROR_CALLBACK optional
) As IntPtr
End Function
' pwszFilePath : LPWSTR
' pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional
Declare PtrSafe Function CryptCATCDFOpen Lib "wintrust" ( _
    ByVal pwszFilePath As LongPtr, _
    ByVal pfnParseError As LongPtr) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CryptCATCDFOpen = ctypes.windll.wintrust.CryptCATCDFOpen
CryptCATCDFOpen.restype = ctypes.c_void_p
CryptCATCDFOpen.argtypes = [
    wintypes.LPCWSTR,  # pwszFilePath : LPWSTR
    ctypes.c_void_p,  # pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('WINTRUST.dll')
CryptCATCDFOpen = Fiddle::Function.new(
  lib['CryptCATCDFOpen'],
  [
    Fiddle::TYPE_VOIDP,  # pwszFilePath : LPWSTR
    Fiddle::TYPE_VOIDP,  # pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional
  ],
  Fiddle::TYPE_VOIDP)
#[link(name = "wintrust")]
extern "system" {
    fn CryptCATCDFOpen(
        pwszFilePath: *mut u16,  // LPWSTR
        pfnParseError: *const core::ffi::c_void  // PFN_CDF_PARSE_ERROR_CALLBACK optional
    ) -> *mut CRYPTCATCDF;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("WINTRUST.dll")]
public static extern IntPtr CryptCATCDFOpen([MarshalAs(UnmanagedType.LPWStr)] string pwszFilePath, IntPtr pfnParseError);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WINTRUST_CryptCATCDFOpen' -Namespace Win32 -PassThru
# $api::CryptCATCDFOpen(pwszFilePath, pfnParseError)
#uselib "WINTRUST.dll"
#func global CryptCATCDFOpen "CryptCATCDFOpen" sptr, sptr
; CryptCATCDFOpen pwszFilePath, pfnParseError   ; 戻り値は stat
; pwszFilePath : LPWSTR -> "sptr"
; pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "WINTRUST.dll"
#cfunc global CryptCATCDFOpen "CryptCATCDFOpen" wstr, sptr
; res = CryptCATCDFOpen(pwszFilePath, pfnParseError)
; pwszFilePath : LPWSTR -> "wstr"
; pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional -> "sptr"
; CRYPTCATCDF* CryptCATCDFOpen(LPWSTR pwszFilePath, PFN_CDF_PARSE_ERROR_CALLBACK pfnParseError)
#uselib "WINTRUST.dll"
#cfunc global CryptCATCDFOpen "CryptCATCDFOpen" wstr, intptr
; res = CryptCATCDFOpen(pwszFilePath, pfnParseError)
; pwszFilePath : LPWSTR -> "wstr"
; pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional -> "intptr"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	wintrust = windows.NewLazySystemDLL("WINTRUST.dll")
	procCryptCATCDFOpen = wintrust.NewProc("CryptCATCDFOpen")
)

// pwszFilePath (LPWSTR), pfnParseError (PFN_CDF_PARSE_ERROR_CALLBACK optional)
r1, _, err := procCryptCATCDFOpen.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwszFilePath))),
	uintptr(pfnParseError),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // CRYPTCATCDF*
function CryptCATCDFOpen(
  pwszFilePath: PWideChar;   // LPWSTR
  pfnParseError: Pointer   // PFN_CDF_PARSE_ERROR_CALLBACK optional
): Pointer; stdcall;
  external 'WINTRUST.dll' name 'CryptCATCDFOpen';
result := DllCall("WINTRUST\CryptCATCDFOpen"
    , "WStr", pwszFilePath   ; LPWSTR
    , "Ptr", pfnParseError   ; PFN_CDF_PARSE_ERROR_CALLBACK optional
    , "Ptr")   ; return: CRYPTCATCDF*
●CryptCATCDFOpen(pwszFilePath, pfnParseError) = DLL("WINTRUST.dll", "void* CryptCATCDFOpen(char*, void*)")
# 呼び出し: CryptCATCDFOpen(pwszFilePath, pfnParseError)
# pwszFilePath : LPWSTR -> "char*"
# pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "wintrust" fn CryptCATCDFOpen(
    pwszFilePath: [*c]const u16, // LPWSTR
    pfnParseError: ?*anyopaque // PFN_CDF_PARSE_ERROR_CALLBACK optional
) callconv(std.os.windows.WINAPI) [*c]CRYPTCATCDF;
proc CryptCATCDFOpen(
    pwszFilePath: WideCString,  # LPWSTR
    pfnParseError: pointer  # PFN_CDF_PARSE_ERROR_CALLBACK optional
): ptr CRYPTCATCDF {.importc: "CryptCATCDFOpen", stdcall, dynlib: "WINTRUST.dll".}
pragma(lib, "wintrust");
extern(Windows)
CRYPTCATCDF* CryptCATCDFOpen(
    const(wchar)* pwszFilePath,   // LPWSTR
    void* pfnParseError   // PFN_CDF_PARSE_ERROR_CALLBACK optional
);
ccall((:CryptCATCDFOpen, "WINTRUST.dll"), stdcall, Ptr{CRYPTCATCDF},
      (Cwstring, Ptr{Cvoid}),
      pwszFilePath, pfnParseError)
# pwszFilePath : LPWSTR -> Cwstring
# pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
void* CryptCATCDFOpen(
    const uint16_t* pwszFilePath,
    void* pfnParseError);
]]
local wintrust = ffi.load("wintrust")
-- wintrust.CryptCATCDFOpen(pwszFilePath, pfnParseError)
-- pwszFilePath : LPWSTR
-- pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('WINTRUST.dll');
const CryptCATCDFOpen = lib.func('__stdcall', 'CryptCATCDFOpen', 'void *', ['str16', 'void *']);
// CryptCATCDFOpen(pwszFilePath, pfnParseError)
// pwszFilePath : LPWSTR -> 'str16'
// pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
// コールバック(関数ポインタ)は koffi.proto/koffi.register で型を定義して渡す(素の void* では JS 関数を渡せない)。
const lib = Deno.dlopen("WINTRUST.dll", {
  CryptCATCDFOpen: { parameters: ["buffer", "pointer"], result: "pointer" },
});
// lib.symbols.CryptCATCDFOpen(pwszFilePath, pfnParseError)
// pwszFilePath : LPWSTR -> "buffer"
// pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void* CryptCATCDFOpen(
    const uint16_t* pwszFilePath,
    void* pfnParseError);
C, "WINTRUST.dll");
// $ffi->CryptCATCDFOpen(pwszFilePath, pfnParseError);
// pwszFilePath : LPWSTR
// pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Wintrust extends StdCallLibrary {
    Wintrust INSTANCE = Native.load("wintrust", Wintrust.class);
    Pointer CryptCATCDFOpen(
        WString pwszFilePath,   // LPWSTR
        Callback pfnParseError   // PFN_CDF_PARSE_ERROR_CALLBACK optional
    );
}
@[Link("wintrust")]
lib LibWINTRUST
  fun CryptCATCDFOpen = CryptCATCDFOpen(
    pwszFilePath : UInt16*,   # LPWSTR
    pfnParseError : Void*   # PFN_CDF_PARSE_ERROR_CALLBACK optional
  ) : CRYPTCATCDF*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef CryptCATCDFOpenNative = Pointer<Void> Function(Pointer<Utf16>, Pointer<Void>);
typedef CryptCATCDFOpenDart = Pointer<Void> Function(Pointer<Utf16>, Pointer<Void>);
final CryptCATCDFOpen = DynamicLibrary.open('WINTRUST.dll')
    .lookupFunction<CryptCATCDFOpenNative, CryptCATCDFOpenDart>('CryptCATCDFOpen');
// pwszFilePath : LPWSTR -> Pointer<Utf16>
// pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CryptCATCDFOpen(
  pwszFilePath: PWideChar;   // LPWSTR
  pfnParseError: Pointer   // PFN_CDF_PARSE_ERROR_CALLBACK optional
): Pointer; stdcall;
  external 'WINTRUST.dll' name 'CryptCATCDFOpen';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "CryptCATCDFOpen"
  c_CryptCATCDFOpen :: CWString -> Ptr () -> IO (Ptr ())
-- pwszFilePath : LPWSTR -> CWString
-- pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let cryptcatcdfopen =
  foreign "CryptCATCDFOpen"
    ((ptr uint16_t) @-> (ptr void) @-> returning (ptr void))
(* pwszFilePath : LPWSTR -> (ptr uint16_t) *)
(* pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library wintrust (t "WINTRUST.dll"))
(cffi:use-foreign-library wintrust)

(cffi:defcfun ("CryptCATCDFOpen" crypt-catcdfopen :convention :stdcall) :pointer
  (pwsz-file-path (:string :encoding :utf-16le))   ; LPWSTR
  (pfn-parse-error :pointer))   ; PFN_CDF_PARSE_ERROR_CALLBACK optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CryptCATCDFOpen = Win32::API::More->new('WINTRUST',
    'LPVOID CryptCATCDFOpen(LPCWSTR pwszFilePath, LPVOID pfnParseError)');
# my $ret = $CryptCATCDFOpen->Call($pwszFilePath, $pfnParseError);
# pwszFilePath : LPWSTR -> LPCWSTR
# pfnParseError : PFN_CDF_PARSE_ERROR_CALLBACK optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# コールバック(関数ポインタ)は Perl sub を直接渡せません。Win32::API::Callback を使用してください。

関連項目

公式の関連項目
使用する型