GetCachedSigningLevel
関数指定ファイルのキャッシュ署名レベルと拇印を取得する。
シグネチャ
// KERNEL32.dll
#include <windows.h>
BOOL GetCachedSigningLevel(
HANDLE File,
DWORD* Flags,
DWORD* SigningLevel,
BYTE* Thumbprint, // optional
DWORD* ThumbprintSize, // optional
DWORD* ThumbprintAlgorithm // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||
|---|---|---|---|---|---|---|---|---|---|
| File | HANDLE | in | ファイルのハンドル。 | ||||||
| Flags | DWORD* | out | ファイルに設定されたフラグへのポインター。次の Flags がサポートされています。
これらのフラグを組み合わせて使用する (SIGNING_LEVEL_FILE_CACHE_FLAG_NOT_VALIDATED | SIGNING_LEVEL_FILE_CACHE_FLAG_VALIDATE_ONLY) ことは、ファイルが検証されたことを示します。 | ||||||
| SigningLevel | DWORD* | out | 署名レベルへのポインター。 | ||||||
| Thumbprint | BYTE* | outoptional | 拇印 (thumbprint) へのポインター。 | ||||||
| ThumbprintSize | DWORD* | inoutoptional | 拇印サイズへのポインター。 | ||||||
| ThumbprintAlgorithm | DWORD* | outoptional | 拇印アルゴリズムへのポインター。 |
戻り値の型: BOOL
公式ドキュメント
キャッシュされた署名レベルを取得します。
戻り値
関数が成功した場合は TRUE を返します。
関数が失敗した場合は FALSE を返します。拡張エラー情報を取得するには、GetLastError を呼び出します。GetLastError は WinError.h で定義されているエラーコードのいずれかを返す場合があります。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// KERNEL32.dll
#include <windows.h>
BOOL GetCachedSigningLevel(
HANDLE File,
DWORD* Flags,
DWORD* SigningLevel,
BYTE* Thumbprint, // optional
DWORD* ThumbprintSize, // optional
DWORD* ThumbprintAlgorithm // optional
);[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", ExactSpelling = true)]
static extern bool GetCachedSigningLevel(
IntPtr File, // HANDLE
out uint Flags, // DWORD* out
out uint SigningLevel, // DWORD* out
IntPtr Thumbprint, // BYTE* optional, out
IntPtr ThumbprintSize, // DWORD* optional, in/out
IntPtr ThumbprintAlgorithm // DWORD* optional, out
);<DllImport("KERNEL32.dll", ExactSpelling:=True)>
Public Shared Function GetCachedSigningLevel(
File As IntPtr, ' HANDLE
<Out> ByRef Flags As UInteger, ' DWORD* out
<Out> ByRef SigningLevel As UInteger, ' DWORD* out
Thumbprint As IntPtr, ' BYTE* optional, out
ThumbprintSize As IntPtr, ' DWORD* optional, in/out
ThumbprintAlgorithm As IntPtr ' DWORD* optional, out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function' File : HANDLE
' Flags : DWORD* out
' SigningLevel : DWORD* out
' Thumbprint : BYTE* optional, out
' ThumbprintSize : DWORD* optional, in/out
' ThumbprintAlgorithm : DWORD* optional, out
Declare PtrSafe Function GetCachedSigningLevel Lib "kernel32" ( _
ByVal File As LongPtr, _
ByRef Flags As Long, _
ByRef SigningLevel As Long, _
ByVal Thumbprint As LongPtr, _
ByVal ThumbprintSize As LongPtr, _
ByVal ThumbprintAlgorithm As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
GetCachedSigningLevel = ctypes.windll.kernel32.GetCachedSigningLevel
GetCachedSigningLevel.restype = wintypes.BOOL
GetCachedSigningLevel.argtypes = [
wintypes.HANDLE, # File : HANDLE
ctypes.POINTER(wintypes.DWORD), # Flags : DWORD* out
ctypes.POINTER(wintypes.DWORD), # SigningLevel : DWORD* out
ctypes.POINTER(ctypes.c_ubyte), # Thumbprint : BYTE* optional, out
ctypes.POINTER(wintypes.DWORD), # ThumbprintSize : DWORD* optional, in/out
ctypes.POINTER(wintypes.DWORD), # ThumbprintAlgorithm : DWORD* optional, out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('KERNEL32.dll')
GetCachedSigningLevel = Fiddle::Function.new(
lib['GetCachedSigningLevel'],
[
Fiddle::TYPE_VOIDP, # File : HANDLE
Fiddle::TYPE_VOIDP, # Flags : DWORD* out
Fiddle::TYPE_VOIDP, # SigningLevel : DWORD* out
Fiddle::TYPE_VOIDP, # Thumbprint : BYTE* optional, out
Fiddle::TYPE_VOIDP, # ThumbprintSize : DWORD* optional, in/out
Fiddle::TYPE_VOIDP, # ThumbprintAlgorithm : DWORD* optional, out
],
Fiddle::TYPE_INT)#[link(name = "kernel32")]
extern "system" {
fn GetCachedSigningLevel(
File: *mut core::ffi::c_void, // HANDLE
Flags: *mut u32, // DWORD* out
SigningLevel: *mut u32, // DWORD* out
Thumbprint: *mut u8, // BYTE* optional, out
ThumbprintSize: *mut u32, // DWORD* optional, in/out
ThumbprintAlgorithm: *mut u32 // DWORD* optional, out
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll")]
public static extern bool GetCachedSigningLevel(IntPtr File, out uint Flags, out uint SigningLevel, IntPtr Thumbprint, IntPtr ThumbprintSize, IntPtr ThumbprintAlgorithm);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_GetCachedSigningLevel' -Namespace Win32 -PassThru
# $api::GetCachedSigningLevel(File, Flags, SigningLevel, Thumbprint, ThumbprintSize, ThumbprintAlgorithm)#uselib "KERNEL32.dll"
#func global GetCachedSigningLevel "GetCachedSigningLevel" sptr, sptr, sptr, sptr, sptr, sptr
; GetCachedSigningLevel File, varptr(Flags), varptr(SigningLevel), varptr(Thumbprint), varptr(ThumbprintSize), varptr(ThumbprintAlgorithm) ; 戻り値は stat
; File : HANDLE -> "sptr"
; Flags : DWORD* out -> "sptr"
; SigningLevel : DWORD* out -> "sptr"
; Thumbprint : BYTE* optional, out -> "sptr"
; ThumbprintSize : DWORD* optional, in/out -> "sptr"
; ThumbprintAlgorithm : DWORD* optional, out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。出力引数:
#uselib "KERNEL32.dll" #cfunc global GetCachedSigningLevel "GetCachedSigningLevel" sptr, var, var, var, var, var ; res = GetCachedSigningLevel(File, Flags, SigningLevel, Thumbprint, ThumbprintSize, ThumbprintAlgorithm) ; File : HANDLE -> "sptr" ; Flags : DWORD* out -> "var" ; SigningLevel : DWORD* out -> "var" ; Thumbprint : BYTE* optional, out -> "var" ; ThumbprintSize : DWORD* optional, in/out -> "var" ; ThumbprintAlgorithm : DWORD* optional, out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "KERNEL32.dll" #cfunc global GetCachedSigningLevel "GetCachedSigningLevel" sptr, sptr, sptr, sptr, sptr, sptr ; res = GetCachedSigningLevel(File, varptr(Flags), varptr(SigningLevel), varptr(Thumbprint), varptr(ThumbprintSize), varptr(ThumbprintAlgorithm)) ; File : HANDLE -> "sptr" ; Flags : DWORD* out -> "sptr" ; SigningLevel : DWORD* out -> "sptr" ; Thumbprint : BYTE* optional, out -> "sptr" ; ThumbprintSize : DWORD* optional, in/out -> "sptr" ; ThumbprintAlgorithm : DWORD* optional, out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
出力引数:
; BOOL GetCachedSigningLevel(HANDLE File, DWORD* Flags, DWORD* SigningLevel, BYTE* Thumbprint, DWORD* ThumbprintSize, DWORD* ThumbprintAlgorithm) #uselib "KERNEL32.dll" #cfunc global GetCachedSigningLevel "GetCachedSigningLevel" intptr, var, var, var, var, var ; res = GetCachedSigningLevel(File, Flags, SigningLevel, Thumbprint, ThumbprintSize, ThumbprintAlgorithm) ; File : HANDLE -> "intptr" ; Flags : DWORD* out -> "var" ; SigningLevel : DWORD* out -> "var" ; Thumbprint : BYTE* optional, out -> "var" ; ThumbprintSize : DWORD* optional, in/out -> "var" ; ThumbprintAlgorithm : DWORD* optional, out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; BOOL GetCachedSigningLevel(HANDLE File, DWORD* Flags, DWORD* SigningLevel, BYTE* Thumbprint, DWORD* ThumbprintSize, DWORD* ThumbprintAlgorithm) #uselib "KERNEL32.dll" #cfunc global GetCachedSigningLevel "GetCachedSigningLevel" intptr, intptr, intptr, intptr, intptr, intptr ; res = GetCachedSigningLevel(File, varptr(Flags), varptr(SigningLevel), varptr(Thumbprint), varptr(ThumbprintSize), varptr(ThumbprintAlgorithm)) ; File : HANDLE -> "intptr" ; Flags : DWORD* out -> "intptr" ; SigningLevel : DWORD* out -> "intptr" ; Thumbprint : BYTE* optional, out -> "intptr" ; ThumbprintSize : DWORD* optional, in/out -> "intptr" ; ThumbprintAlgorithm : DWORD* optional, out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
procGetCachedSigningLevel = kernel32.NewProc("GetCachedSigningLevel")
)
// File (HANDLE), Flags (DWORD* out), SigningLevel (DWORD* out), Thumbprint (BYTE* optional, out), ThumbprintSize (DWORD* optional, in/out), ThumbprintAlgorithm (DWORD* optional, out)
r1, _, err := procGetCachedSigningLevel.Call(
uintptr(File),
uintptr(Flags),
uintptr(SigningLevel),
uintptr(Thumbprint),
uintptr(ThumbprintSize),
uintptr(ThumbprintAlgorithm),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // BOOLfunction GetCachedSigningLevel(
File: THandle; // HANDLE
Flags: Pointer; // DWORD* out
SigningLevel: Pointer; // DWORD* out
Thumbprint: Pointer; // BYTE* optional, out
ThumbprintSize: Pointer; // DWORD* optional, in/out
ThumbprintAlgorithm: Pointer // DWORD* optional, out
): BOOL; stdcall;
external 'KERNEL32.dll' name 'GetCachedSigningLevel';result := DllCall("KERNEL32\GetCachedSigningLevel"
, "Ptr", File ; HANDLE
, "Ptr", Flags ; DWORD* out
, "Ptr", SigningLevel ; DWORD* out
, "Ptr", Thumbprint ; BYTE* optional, out
, "Ptr", ThumbprintSize ; DWORD* optional, in/out
, "Ptr", ThumbprintAlgorithm ; DWORD* optional, out
, "Int") ; return: BOOL●GetCachedSigningLevel(File, Flags, SigningLevel, Thumbprint, ThumbprintSize, ThumbprintAlgorithm) = DLL("KERNEL32.dll", "bool GetCachedSigningLevel(void*, void*, void*, void*, void*, void*)")
# 呼び出し: GetCachedSigningLevel(File, Flags, SigningLevel, Thumbprint, ThumbprintSize, ThumbprintAlgorithm)
# File : HANDLE -> "void*"
# Flags : DWORD* out -> "void*"
# SigningLevel : DWORD* out -> "void*"
# Thumbprint : BYTE* optional, out -> "void*"
# ThumbprintSize : DWORD* optional, in/out -> "void*"
# ThumbprintAlgorithm : DWORD* optional, out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "kernel32" fn GetCachedSigningLevel(
File: ?*anyopaque, // HANDLE
Flags: [*c]u32, // DWORD* out
SigningLevel: [*c]u32, // DWORD* out
Thumbprint: [*c]u8, // BYTE* optional, out
ThumbprintSize: [*c]u32, // DWORD* optional, in/out
ThumbprintAlgorithm: [*c]u32 // DWORD* optional, out
) callconv(std.os.windows.WINAPI) i32;proc GetCachedSigningLevel(
File: pointer, # HANDLE
Flags: ptr uint32, # DWORD* out
SigningLevel: ptr uint32, # DWORD* out
Thumbprint: ptr uint8, # BYTE* optional, out
ThumbprintSize: ptr uint32, # DWORD* optional, in/out
ThumbprintAlgorithm: ptr uint32 # DWORD* optional, out
): int32 {.importc: "GetCachedSigningLevel", stdcall, dynlib: "KERNEL32.dll".}pragma(lib, "kernel32");
extern(Windows)
int GetCachedSigningLevel(
void* File, // HANDLE
uint* Flags, // DWORD* out
uint* SigningLevel, // DWORD* out
ubyte* Thumbprint, // BYTE* optional, out
uint* ThumbprintSize, // DWORD* optional, in/out
uint* ThumbprintAlgorithm // DWORD* optional, out
);ccall((:GetCachedSigningLevel, "KERNEL32.dll"), stdcall, Int32,
(Ptr{Cvoid}, Ptr{UInt32}, Ptr{UInt32}, Ptr{UInt8}, Ptr{UInt32}, Ptr{UInt32}),
File, Flags, SigningLevel, Thumbprint, ThumbprintSize, ThumbprintAlgorithm)
# File : HANDLE -> Ptr{Cvoid}
# Flags : DWORD* out -> Ptr{UInt32}
# SigningLevel : DWORD* out -> Ptr{UInt32}
# Thumbprint : BYTE* optional, out -> Ptr{UInt8}
# ThumbprintSize : DWORD* optional, in/out -> Ptr{UInt32}
# ThumbprintAlgorithm : DWORD* optional, out -> Ptr{UInt32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t GetCachedSigningLevel(
void* File,
uint32_t* Flags,
uint32_t* SigningLevel,
uint8_t* Thumbprint,
uint32_t* ThumbprintSize,
uint32_t* ThumbprintAlgorithm);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.GetCachedSigningLevel(File, Flags, SigningLevel, Thumbprint, ThumbprintSize, ThumbprintAlgorithm)
-- File : HANDLE
-- Flags : DWORD* out
-- SigningLevel : DWORD* out
-- Thumbprint : BYTE* optional, out
-- ThumbprintSize : DWORD* optional, in/out
-- ThumbprintAlgorithm : DWORD* optional, out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const GetCachedSigningLevel = lib.func('__stdcall', 'GetCachedSigningLevel', 'int32_t', ['void *', 'uint32_t *', 'uint32_t *', 'uint8_t *', 'uint32_t *', 'uint32_t *']);
// GetCachedSigningLevel(File, Flags, SigningLevel, Thumbprint, ThumbprintSize, ThumbprintAlgorithm)
// File : HANDLE -> 'void *'
// Flags : DWORD* out -> 'uint32_t *'
// SigningLevel : DWORD* out -> 'uint32_t *'
// Thumbprint : BYTE* optional, out -> 'uint8_t *'
// ThumbprintSize : DWORD* optional, in/out -> 'uint32_t *'
// ThumbprintAlgorithm : DWORD* optional, out -> 'uint32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("KERNEL32.dll", {
GetCachedSigningLevel: { parameters: ["pointer", "pointer", "pointer", "pointer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.GetCachedSigningLevel(File, Flags, SigningLevel, Thumbprint, ThumbprintSize, ThumbprintAlgorithm)
// File : HANDLE -> "pointer"
// Flags : DWORD* out -> "pointer"
// SigningLevel : DWORD* out -> "pointer"
// Thumbprint : BYTE* optional, out -> "pointer"
// ThumbprintSize : DWORD* optional, in/out -> "pointer"
// ThumbprintAlgorithm : DWORD* optional, out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t GetCachedSigningLevel(
void* File,
uint32_t* Flags,
uint32_t* SigningLevel,
uint8_t* Thumbprint,
uint32_t* ThumbprintSize,
uint32_t* ThumbprintAlgorithm);
C, "KERNEL32.dll");
// $ffi->GetCachedSigningLevel(File, Flags, SigningLevel, Thumbprint, ThumbprintSize, ThumbprintAlgorithm);
// File : HANDLE
// Flags : DWORD* out
// SigningLevel : DWORD* out
// Thumbprint : BYTE* optional, out
// ThumbprintSize : DWORD* optional, in/out
// ThumbprintAlgorithm : DWORD* optional, out
// 構造体/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 Kernel32 extends StdCallLibrary {
Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class);
boolean GetCachedSigningLevel(
Pointer File, // HANDLE
IntByReference Flags, // DWORD* out
IntByReference SigningLevel, // DWORD* out
byte[] Thumbprint, // BYTE* optional, out
IntByReference ThumbprintSize, // DWORD* optional, in/out
IntByReference ThumbprintAlgorithm // DWORD* optional, out
);
}@[Link("kernel32")]
lib LibKERNEL32
fun GetCachedSigningLevel = GetCachedSigningLevel(
File : Void*, # HANDLE
Flags : UInt32*, # DWORD* out
SigningLevel : UInt32*, # DWORD* out
Thumbprint : UInt8*, # BYTE* optional, out
ThumbprintSize : UInt32*, # DWORD* optional, in/out
ThumbprintAlgorithm : UInt32* # DWORD* optional, out
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef GetCachedSigningLevelNative = Int32 Function(Pointer<Void>, Pointer<Uint32>, Pointer<Uint32>, Pointer<Uint8>, Pointer<Uint32>, Pointer<Uint32>);
typedef GetCachedSigningLevelDart = int Function(Pointer<Void>, Pointer<Uint32>, Pointer<Uint32>, Pointer<Uint8>, Pointer<Uint32>, Pointer<Uint32>);
final GetCachedSigningLevel = DynamicLibrary.open('KERNEL32.dll')
.lookupFunction<GetCachedSigningLevelNative, GetCachedSigningLevelDart>('GetCachedSigningLevel');
// File : HANDLE -> Pointer<Void>
// Flags : DWORD* out -> Pointer<Uint32>
// SigningLevel : DWORD* out -> Pointer<Uint32>
// Thumbprint : BYTE* optional, out -> Pointer<Uint8>
// ThumbprintSize : DWORD* optional, in/out -> Pointer<Uint32>
// ThumbprintAlgorithm : DWORD* optional, out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function GetCachedSigningLevel(
File: THandle; // HANDLE
Flags: Pointer; // DWORD* out
SigningLevel: Pointer; // DWORD* out
Thumbprint: Pointer; // BYTE* optional, out
ThumbprintSize: Pointer; // DWORD* optional, in/out
ThumbprintAlgorithm: Pointer // DWORD* optional, out
): BOOL; stdcall;
external 'KERNEL32.dll' name 'GetCachedSigningLevel';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "GetCachedSigningLevel"
c_GetCachedSigningLevel :: Ptr () -> Ptr Word32 -> Ptr Word32 -> Ptr Word8 -> Ptr Word32 -> Ptr Word32 -> IO CInt
-- File : HANDLE -> Ptr ()
-- Flags : DWORD* out -> Ptr Word32
-- SigningLevel : DWORD* out -> Ptr Word32
-- Thumbprint : BYTE* optional, out -> Ptr Word8
-- ThumbprintSize : DWORD* optional, in/out -> Ptr Word32
-- ThumbprintAlgorithm : DWORD* optional, out -> Ptr Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let getcachedsigninglevel =
foreign "GetCachedSigningLevel"
((ptr void) @-> (ptr uint32_t) @-> (ptr uint32_t) @-> (ptr uint8_t) @-> (ptr uint32_t) @-> (ptr uint32_t) @-> returning int32_t)
(* File : HANDLE -> (ptr void) *)
(* Flags : DWORD* out -> (ptr uint32_t) *)
(* SigningLevel : DWORD* out -> (ptr uint32_t) *)
(* Thumbprint : BYTE* optional, out -> (ptr uint8_t) *)
(* ThumbprintSize : DWORD* optional, in/out -> (ptr uint32_t) *)
(* ThumbprintAlgorithm : DWORD* optional, out -> (ptr uint32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)
(cffi:defcfun ("GetCachedSigningLevel" get-cached-signing-level :convention :stdcall) :int32
(file :pointer) ; HANDLE
(flags :pointer) ; DWORD* out
(signing-level :pointer) ; DWORD* out
(thumbprint :pointer) ; BYTE* optional, out
(thumbprint-size :pointer) ; DWORD* optional, in/out
(thumbprint-algorithm :pointer)) ; DWORD* optional, out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $GetCachedSigningLevel = Win32::API::More->new('KERNEL32',
'BOOL GetCachedSigningLevel(HANDLE File, LPVOID Flags, LPVOID SigningLevel, LPVOID Thumbprint, LPVOID ThumbprintSize, LPVOID ThumbprintAlgorithm)');
# my $ret = $GetCachedSigningLevel->Call($File, $Flags, $SigningLevel, $Thumbprint, $ThumbprintSize, $ThumbprintAlgorithm);
# File : HANDLE -> HANDLE
# Flags : DWORD* out -> LPVOID
# SigningLevel : DWORD* out -> LPVOID
# Thumbprint : BYTE* optional, out -> LPVOID
# ThumbprintSize : DWORD* optional, in/out -> LPVOID
# ThumbprintAlgorithm : DWORD* optional, out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。