RegisterTraceGuidsA
関数シグネチャ
// ADVAPI32.dll (ANSI / -A)
#include <windows.h>
DWORD RegisterTraceGuidsA(
WMIDPREQUEST RequestAddress,
void* RequestContext, // optional
const GUID* ControlGuid,
DWORD GuidCount,
TRACE_GUID_REGISTRATION* TraceGuidReg, // optional
LPCSTR MofImagePath, // optional
LPCSTR MofResourceName, // optional
ULONGLONG* RegistrationHandle
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| RequestAddress | WMIDPREQUEST | in | プロバイダーがイベントトレースセッションによって有効化または無効化されたときに通知を受け取る ControlCallback 関数へのポインター。 EnableTrace 関数が このコールバックをトリガーします。 |
| RequestContext | void* | inoptional | RequestAddress で指定された関数に ETW が渡す、省略可能なプロバイダー定義のコンテキストへのポインター。 |
| ControlGuid | GUID* | in | 登録するプロバイダーの制御 GUID (プロバイダー ID)。 |
| GuidCount | DWORD | in | TraceGuidReg 配列の要素数。TraceGuidReg が NULL の場合は、 このパラメーターを 0 に設定します。 |
| TraceGuidReg | TRACE_GUID_REGISTRATION* | inoptional | TRACE_GUID_REGISTRATION 構造体の配列へのポインター。 各要素は、プロバイダーが提供するイベントのカテゴリを識別します。 入力時、各構造体の Guid メンバーには、登録するプロバイダーが割り当てた イベントトレースクラス GUID が含まれます。クラス GUID は、プロバイダーが提供するイベントの カテゴリを識別します。プロバイダーは、イベントをログに記録するために TraceEvent 関数を呼び出す際に、 同じクラス GUID を使用して EVENT_TRACE_HEADER の Guid メンバーを設定します。 出力時、RegHandle メンバーには、イベントのクラス GUID 登録へのハンドルが格納されます。 プロバイダーが TraceEventInstance 関数を呼び出す場合は、 TRACE_GUID_REGISTRATION の RegHandle メンバーを使用して、 EVENT_INSTANCE_HEADER の RegHandle メンバーを設定します。 プロバイダーがイベントをログに記録するために TraceEvent 関数のみを呼び出す場合、 このパラメーターは NULL にできます。プロバイダーがイベントをログに記録するために TraceEventInstance 関数を呼び出す場合、このパラメーターを NULL にすることはできません。 |
| MofImagePath | LPCSTR | inoptional | このパラメーターはサポートされていません。NULL に設定してください。アプリケーションの セットアップ時に Mofcomp.exe を使用して MOF リソースを登録する必要があります。詳細については、 Publishing Your Event Schema を参照してください。 Windows XP with SP1、Windows XP、Windows 2000: MofResourceName で指定された リソースを含む DLL または実行可能プログラムのパスを指定する、省略可能な文字列への ポインター。プロバイダーが使用するイベントトレースクラスに関する情報をイベント プロバイダーとコンシューマーが別のメカニズムで共有する場合、このパラメーターは NULL にできます。 |
| MofResourceName | LPCSTR | inoptional | このパラメーターはサポートされていません。NULL に設定してください。アプリケーションの セットアップ時に Mofcomp.exe を使用して MOF リソースを登録する必要があります。詳細については、 Publishing Your Event Schema を参照してください。 Windows XP with SP1、Windows XP、Windows 2000: MofImagePath の文字列リソースを 指定する、省略可能な文字列へのポインター。この文字列リソースには、プロバイダーが サポートするイベントトレースクラスを記述するバイナリ MOF ファイルの名前が含まれます。 |
| RegistrationHandle | ULONGLONG* | out | プロバイダーの登録ハンドルを受け取ります。返されたハンドルは、 UnregisterTraceGuids 関数を呼び出すときに使用します。 重要
DLL またはドライバーによって作成されたすべての登録ハンドルは、 DLL またはドライバーがアンロードされる前に登録解除する必要があります。プロバイダーが 登録解除されていない場合、ETW がプロバイダーのコールバックを呼び出そうとしたときに クラッシュが発生します。 |
戻り値の型: DWORD
公式ドキュメント
RegisterTraceGuidsA (ANSI) 関数 (evntrace.h) は非推奨の関数であり、新しいコードでは提示されている代替手段を使用してください。
戻り値
関数が成功した場合、戻り値は ERROR_SUCCESS です。
関数が失敗した場合、戻り値は システムエラーコード のいずれかです。以下は 一般的なエラーとその原因です。
コントローラーが EnableTrace を呼び出して プロバイダーを有効化し、プロバイダーがまだ RegisterTraceGuids を呼び出していない場合、 この関数は ControlCallback が返した値を 返すこともあります。これが発生した場合、登録が成功していれば RegisterTraceGuids はコールバックの戻り値を返します。
-
以下のいずれかに該当します。
- RequestAddress が NULL です。
- ControlGuid が NULL です。
- RegistrationHandle が NULL です。
Windows XP および Windows 2000: TraceGuidReg が NULL であるか、GuidCount が 0 以下です。
解説(Remarks)
ほとんどの開発者は、この関数を直接呼び出すことはありません。代わりに、 開発者は通常 ETW フレームワークを使用します。たとえば、TMF ベースの WPP は、 RegisterTraceGuids、TraceMessage、UnregisterTraceGuids の呼び出しを 代わりに管理します。
この関数は、Classic (Windows 2000 形式) のイベントプロバイダーハンドルを開きます。このハンドルは、 TraceEvent、 TraceEventInstance、 TraceMessage、 TraceMessageVa を介して MOF および TMF ベースの WPP ETW イベントを書き込むために使用できます。
EventWrite を介して マニフェストベースまたは TraceLogging ベースの ETW イベントを書き込む Windows Vista 形式の プロバイダーハンドルを開くには、 EventRegister を使用してください。
プロバイダーの ControlGuid が以前に登録されて有効化されている場合、同じ ControlGuid を 参照する後続の登録は自動的に有効化されます。
プロセスは最大 1,024 個のプロバイダー GUID を登録できますが、プロセスが登録する プロバイダーの数は 1 つか 2 つに制限すべきです。この制限には、この関数および EventRegister 関数を使用して 登録されたものが含まれます。
Windows Vista より前: プロセスが登録できるプロバイダーの数に制限はありません。
例
RegisterTraceGuids を使用する例については、 Writing Classic Events を参照してください。
evntrace.h ヘッダーは RegisterTraceGuids をエイリアスとして定義しており、 UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI 版または Unicode 版を 自動的に選択します。エンコーディング中立のエイリアスの使用と、エンコーディング中立でない コードを混在させると、不一致が発生し、コンパイルエラーまたは実行時エラーを引き起こす 可能性があります。詳細については、 Conventions for Function Prototypes を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// ADVAPI32.dll (ANSI / -A)
#include <windows.h>
DWORD RegisterTraceGuidsA(
WMIDPREQUEST RequestAddress,
void* RequestContext, // optional
const GUID* ControlGuid,
DWORD GuidCount,
TRACE_GUID_REGISTRATION* TraceGuidReg, // optional
LPCSTR MofImagePath, // optional
LPCSTR MofResourceName, // optional
ULONGLONG* RegistrationHandle
);[DllImport("ADVAPI32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern uint RegisterTraceGuidsA(
IntPtr RequestAddress, // WMIDPREQUEST
IntPtr RequestContext, // void* optional
ref Guid ControlGuid, // GUID*
uint GuidCount, // DWORD
IntPtr TraceGuidReg, // TRACE_GUID_REGISTRATION* optional
[MarshalAs(UnmanagedType.LPStr)] string MofImagePath, // LPCSTR optional
[MarshalAs(UnmanagedType.LPStr)] string MofResourceName, // LPCSTR optional
out ulong RegistrationHandle // ULONGLONG* out
);<DllImport("ADVAPI32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function RegisterTraceGuidsA(
RequestAddress As IntPtr, ' WMIDPREQUEST
RequestContext As IntPtr, ' void* optional
ByRef ControlGuid As Guid, ' GUID*
GuidCount As UInteger, ' DWORD
TraceGuidReg As IntPtr, ' TRACE_GUID_REGISTRATION* optional
<MarshalAs(UnmanagedType.LPStr)> MofImagePath As String, ' LPCSTR optional
<MarshalAs(UnmanagedType.LPStr)> MofResourceName As String, ' LPCSTR optional
<Out> ByRef RegistrationHandle As ULong ' ULONGLONG* out
) As UInteger
End Function' RequestAddress : WMIDPREQUEST
' RequestContext : void* optional
' ControlGuid : GUID*
' GuidCount : DWORD
' TraceGuidReg : TRACE_GUID_REGISTRATION* optional
' MofImagePath : LPCSTR optional
' MofResourceName : LPCSTR optional
' RegistrationHandle : ULONGLONG* out
Declare PtrSafe Function RegisterTraceGuidsA Lib "advapi32" ( _
ByVal RequestAddress As LongPtr, _
ByVal RequestContext As LongPtr, _
ByVal ControlGuid As LongPtr, _
ByVal GuidCount As Long, _
ByVal TraceGuidReg As LongPtr, _
ByVal MofImagePath As String, _
ByVal MofResourceName As String, _
ByRef RegistrationHandle As LongLong) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
RegisterTraceGuidsA = ctypes.windll.advapi32.RegisterTraceGuidsA
RegisterTraceGuidsA.restype = wintypes.DWORD
RegisterTraceGuidsA.argtypes = [
ctypes.c_void_p, # RequestAddress : WMIDPREQUEST
ctypes.POINTER(None), # RequestContext : void* optional
ctypes.c_void_p, # ControlGuid : GUID*
wintypes.DWORD, # GuidCount : DWORD
ctypes.c_void_p, # TraceGuidReg : TRACE_GUID_REGISTRATION* optional
wintypes.LPCSTR, # MofImagePath : LPCSTR optional
wintypes.LPCSTR, # MofResourceName : LPCSTR optional
ctypes.POINTER(ctypes.c_ulonglong), # RegistrationHandle : ULONGLONG* out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('ADVAPI32.dll')
RegisterTraceGuidsA = Fiddle::Function.new(
lib['RegisterTraceGuidsA'],
[
Fiddle::TYPE_VOIDP, # RequestAddress : WMIDPREQUEST
Fiddle::TYPE_VOIDP, # RequestContext : void* optional
Fiddle::TYPE_VOIDP, # ControlGuid : GUID*
-Fiddle::TYPE_INT, # GuidCount : DWORD
Fiddle::TYPE_VOIDP, # TraceGuidReg : TRACE_GUID_REGISTRATION* optional
Fiddle::TYPE_VOIDP, # MofImagePath : LPCSTR optional
Fiddle::TYPE_VOIDP, # MofResourceName : LPCSTR optional
Fiddle::TYPE_VOIDP, # RegistrationHandle : ULONGLONG* out
],
-Fiddle::TYPE_INT)#[link(name = "advapi32")]
extern "system" {
fn RegisterTraceGuidsA(
RequestAddress: *const core::ffi::c_void, // WMIDPREQUEST
RequestContext: *mut (), // void* optional
ControlGuid: *const GUID, // GUID*
GuidCount: u32, // DWORD
TraceGuidReg: *mut TRACE_GUID_REGISTRATION, // TRACE_GUID_REGISTRATION* optional
MofImagePath: *const u8, // LPCSTR optional
MofResourceName: *const u8, // LPCSTR optional
RegistrationHandle: *mut u64 // ULONGLONG* out
) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("ADVAPI32.dll", CharSet = CharSet.Ansi)]
public static extern uint RegisterTraceGuidsA(IntPtr RequestAddress, IntPtr RequestContext, ref Guid ControlGuid, uint GuidCount, IntPtr TraceGuidReg, [MarshalAs(UnmanagedType.LPStr)] string MofImagePath, [MarshalAs(UnmanagedType.LPStr)] string MofResourceName, out ulong RegistrationHandle);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ADVAPI32_RegisterTraceGuidsA' -Namespace Win32 -PassThru
# $api::RegisterTraceGuidsA(RequestAddress, RequestContext, ControlGuid, GuidCount, TraceGuidReg, MofImagePath, MofResourceName, RegistrationHandle)#uselib "ADVAPI32.dll"
#func global RegisterTraceGuidsA "RegisterTraceGuidsA" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; RegisterTraceGuidsA RequestAddress, RequestContext, varptr(ControlGuid), GuidCount, varptr(TraceGuidReg), MofImagePath, MofResourceName, varptr(RegistrationHandle) ; 戻り値は stat
; RequestAddress : WMIDPREQUEST -> "sptr"
; RequestContext : void* optional -> "sptr"
; ControlGuid : GUID* -> "sptr"
; GuidCount : DWORD -> "sptr"
; TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> "sptr"
; MofImagePath : LPCSTR optional -> "sptr"
; MofResourceName : LPCSTR optional -> "sptr"
; RegistrationHandle : ULONGLONG* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "ADVAPI32.dll" #cfunc global RegisterTraceGuidsA "RegisterTraceGuidsA" sptr, sptr, var, int, var, str, str, var ; res = RegisterTraceGuidsA(RequestAddress, RequestContext, ControlGuid, GuidCount, TraceGuidReg, MofImagePath, MofResourceName, RegistrationHandle) ; RequestAddress : WMIDPREQUEST -> "sptr" ; RequestContext : void* optional -> "sptr" ; ControlGuid : GUID* -> "var" ; GuidCount : DWORD -> "int" ; TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> "var" ; MofImagePath : LPCSTR optional -> "str" ; MofResourceName : LPCSTR optional -> "str" ; RegistrationHandle : ULONGLONG* out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "ADVAPI32.dll" #cfunc global RegisterTraceGuidsA "RegisterTraceGuidsA" sptr, sptr, sptr, int, sptr, str, str, sptr ; res = RegisterTraceGuidsA(RequestAddress, RequestContext, varptr(ControlGuid), GuidCount, varptr(TraceGuidReg), MofImagePath, MofResourceName, varptr(RegistrationHandle)) ; RequestAddress : WMIDPREQUEST -> "sptr" ; RequestContext : void* optional -> "sptr" ; ControlGuid : GUID* -> "sptr" ; GuidCount : DWORD -> "int" ; TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> "sptr" ; MofImagePath : LPCSTR optional -> "str" ; MofResourceName : LPCSTR optional -> "str" ; RegistrationHandle : ULONGLONG* out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; DWORD RegisterTraceGuidsA(WMIDPREQUEST RequestAddress, void* RequestContext, GUID* ControlGuid, DWORD GuidCount, TRACE_GUID_REGISTRATION* TraceGuidReg, LPCSTR MofImagePath, LPCSTR MofResourceName, ULONGLONG* RegistrationHandle) #uselib "ADVAPI32.dll" #cfunc global RegisterTraceGuidsA "RegisterTraceGuidsA" intptr, intptr, var, int, var, str, str, var ; res = RegisterTraceGuidsA(RequestAddress, RequestContext, ControlGuid, GuidCount, TraceGuidReg, MofImagePath, MofResourceName, RegistrationHandle) ; RequestAddress : WMIDPREQUEST -> "intptr" ; RequestContext : void* optional -> "intptr" ; ControlGuid : GUID* -> "var" ; GuidCount : DWORD -> "int" ; TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> "var" ; MofImagePath : LPCSTR optional -> "str" ; MofResourceName : LPCSTR optional -> "str" ; RegistrationHandle : ULONGLONG* out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; DWORD RegisterTraceGuidsA(WMIDPREQUEST RequestAddress, void* RequestContext, GUID* ControlGuid, DWORD GuidCount, TRACE_GUID_REGISTRATION* TraceGuidReg, LPCSTR MofImagePath, LPCSTR MofResourceName, ULONGLONG* RegistrationHandle) #uselib "ADVAPI32.dll" #cfunc global RegisterTraceGuidsA "RegisterTraceGuidsA" intptr, intptr, intptr, int, intptr, str, str, intptr ; res = RegisterTraceGuidsA(RequestAddress, RequestContext, varptr(ControlGuid), GuidCount, varptr(TraceGuidReg), MofImagePath, MofResourceName, varptr(RegistrationHandle)) ; RequestAddress : WMIDPREQUEST -> "intptr" ; RequestContext : void* optional -> "intptr" ; ControlGuid : GUID* -> "intptr" ; GuidCount : DWORD -> "int" ; TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> "intptr" ; MofImagePath : LPCSTR optional -> "str" ; MofResourceName : LPCSTR optional -> "str" ; RegistrationHandle : ULONGLONG* out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
advapi32 = windows.NewLazySystemDLL("ADVAPI32.dll")
procRegisterTraceGuidsA = advapi32.NewProc("RegisterTraceGuidsA")
)
// RequestAddress (WMIDPREQUEST), RequestContext (void* optional), ControlGuid (GUID*), GuidCount (DWORD), TraceGuidReg (TRACE_GUID_REGISTRATION* optional), MofImagePath (LPCSTR optional), MofResourceName (LPCSTR optional), RegistrationHandle (ULONGLONG* out)
r1, _, err := procRegisterTraceGuidsA.Call(
uintptr(RequestAddress),
uintptr(RequestContext),
uintptr(ControlGuid),
uintptr(GuidCount),
uintptr(TraceGuidReg),
uintptr(unsafe.Pointer(windows.BytePtrFromString(MofImagePath))),
uintptr(unsafe.Pointer(windows.BytePtrFromString(MofResourceName))),
uintptr(RegistrationHandle),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // DWORDfunction RegisterTraceGuidsA(
RequestAddress: Pointer; // WMIDPREQUEST
RequestContext: Pointer; // void* optional
ControlGuid: PGUID; // GUID*
GuidCount: DWORD; // DWORD
TraceGuidReg: Pointer; // TRACE_GUID_REGISTRATION* optional
MofImagePath: PAnsiChar; // LPCSTR optional
MofResourceName: PAnsiChar; // LPCSTR optional
RegistrationHandle: Pointer // ULONGLONG* out
): DWORD; stdcall;
external 'ADVAPI32.dll' name 'RegisterTraceGuidsA';result := DllCall("ADVAPI32\RegisterTraceGuidsA"
, "Ptr", RequestAddress ; WMIDPREQUEST
, "Ptr", RequestContext ; void* optional
, "Ptr", ControlGuid ; GUID*
, "UInt", GuidCount ; DWORD
, "Ptr", TraceGuidReg ; TRACE_GUID_REGISTRATION* optional
, "AStr", MofImagePath ; LPCSTR optional
, "AStr", MofResourceName ; LPCSTR optional
, "Ptr", RegistrationHandle ; ULONGLONG* out
, "UInt") ; return: DWORD●RegisterTraceGuidsA(RequestAddress, RequestContext, ControlGuid, GuidCount, TraceGuidReg, MofImagePath, MofResourceName, RegistrationHandle) = DLL("ADVAPI32.dll", "dword RegisterTraceGuidsA(void*, void*, void*, dword, void*, char*, char*, void*)")
# 呼び出し: RegisterTraceGuidsA(RequestAddress, RequestContext, ControlGuid, GuidCount, TraceGuidReg, MofImagePath, MofResourceName, RegistrationHandle)
# RequestAddress : WMIDPREQUEST -> "void*"
# RequestContext : void* optional -> "void*"
# ControlGuid : GUID* -> "void*"
# GuidCount : DWORD -> "dword"
# TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> "void*"
# MofImagePath : LPCSTR optional -> "char*"
# MofResourceName : LPCSTR optional -> "char*"
# RegistrationHandle : ULONGLONG* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "advapi32" fn RegisterTraceGuidsA(
RequestAddress: ?*anyopaque, // WMIDPREQUEST
RequestContext: ?*anyopaque, // void* optional
ControlGuid: [*c]GUID, // GUID*
GuidCount: u32, // DWORD
TraceGuidReg: [*c]TRACE_GUID_REGISTRATION, // TRACE_GUID_REGISTRATION* optional
MofImagePath: [*c]const u8, // LPCSTR optional
MofResourceName: [*c]const u8, // LPCSTR optional
RegistrationHandle: [*c]u64 // ULONGLONG* out
) callconv(std.os.windows.WINAPI) u32;proc RegisterTraceGuidsA(
RequestAddress: pointer, # WMIDPREQUEST
RequestContext: pointer, # void* optional
ControlGuid: ptr GUID, # GUID*
GuidCount: uint32, # DWORD
TraceGuidReg: ptr TRACE_GUID_REGISTRATION, # TRACE_GUID_REGISTRATION* optional
MofImagePath: cstring, # LPCSTR optional
MofResourceName: cstring, # LPCSTR optional
RegistrationHandle: ptr uint64 # ULONGLONG* out
): uint32 {.importc: "RegisterTraceGuidsA", stdcall, dynlib: "ADVAPI32.dll".}pragma(lib, "advapi32");
extern(Windows)
uint RegisterTraceGuidsA(
void* RequestAddress, // WMIDPREQUEST
void* RequestContext, // void* optional
GUID* ControlGuid, // GUID*
uint GuidCount, // DWORD
TRACE_GUID_REGISTRATION* TraceGuidReg, // TRACE_GUID_REGISTRATION* optional
const(char)* MofImagePath, // LPCSTR optional
const(char)* MofResourceName, // LPCSTR optional
ulong* RegistrationHandle // ULONGLONG* out
);ccall((:RegisterTraceGuidsA, "ADVAPI32.dll"), stdcall, UInt32,
(Ptr{Cvoid}, Ptr{Cvoid}, Ptr{GUID}, UInt32, Ptr{TRACE_GUID_REGISTRATION}, Cstring, Cstring, Ptr{UInt64}),
RequestAddress, RequestContext, ControlGuid, GuidCount, TraceGuidReg, MofImagePath, MofResourceName, RegistrationHandle)
# RequestAddress : WMIDPREQUEST -> Ptr{Cvoid}
# RequestContext : void* optional -> Ptr{Cvoid}
# ControlGuid : GUID* -> Ptr{GUID}
# GuidCount : DWORD -> UInt32
# TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> Ptr{TRACE_GUID_REGISTRATION}
# MofImagePath : LPCSTR optional -> Cstring
# MofResourceName : LPCSTR optional -> Cstring
# RegistrationHandle : ULONGLONG* out -> Ptr{UInt64}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
uint32_t RegisterTraceGuidsA(
void* RequestAddress,
void* RequestContext,
void* ControlGuid,
uint32_t GuidCount,
void* TraceGuidReg,
const char* MofImagePath,
const char* MofResourceName,
uint64_t* RegistrationHandle);
]]
local advapi32 = ffi.load("advapi32")
-- advapi32.RegisterTraceGuidsA(RequestAddress, RequestContext, ControlGuid, GuidCount, TraceGuidReg, MofImagePath, MofResourceName, RegistrationHandle)
-- RequestAddress : WMIDPREQUEST
-- RequestContext : void* optional
-- ControlGuid : GUID*
-- GuidCount : DWORD
-- TraceGuidReg : TRACE_GUID_REGISTRATION* optional
-- MofImagePath : LPCSTR optional
-- MofResourceName : LPCSTR optional
-- RegistrationHandle : ULONGLONG* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('ADVAPI32.dll');
const RegisterTraceGuidsA = lib.func('__stdcall', 'RegisterTraceGuidsA', 'uint32_t', ['void *', 'void *', 'void *', 'uint32_t', 'void *', 'str', 'str', 'uint64_t *']);
// RegisterTraceGuidsA(RequestAddress, RequestContext, ControlGuid, GuidCount, TraceGuidReg, MofImagePath, MofResourceName, RegistrationHandle)
// RequestAddress : WMIDPREQUEST -> 'void *'
// RequestContext : void* optional -> 'void *'
// ControlGuid : GUID* -> 'void *'
// GuidCount : DWORD -> 'uint32_t'
// TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> 'void *'
// MofImagePath : LPCSTR optional -> 'str'
// MofResourceName : LPCSTR optional -> 'str'
// RegistrationHandle : ULONGLONG* out -> 'uint64_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
// コールバック(関数ポインタ)は koffi.proto/koffi.register で型を定義して渡す(素の void* では JS 関数を渡せない)。const lib = Deno.dlopen("ADVAPI32.dll", {
RegisterTraceGuidsA: { parameters: ["pointer", "pointer", "pointer", "u32", "pointer", "buffer", "buffer", "pointer"], result: "u32" },
});
// lib.symbols.RegisterTraceGuidsA(RequestAddress, RequestContext, ControlGuid, GuidCount, TraceGuidReg, MofImagePath, MofResourceName, RegistrationHandle)
// RequestAddress : WMIDPREQUEST -> "pointer"
// RequestContext : void* optional -> "pointer"
// ControlGuid : GUID* -> "pointer"
// GuidCount : DWORD -> "u32"
// TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> "pointer"
// MofImagePath : LPCSTR optional -> "buffer"
// MofResourceName : LPCSTR optional -> "buffer"
// RegistrationHandle : ULONGLONG* out -> "pointer"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
uint32_t RegisterTraceGuidsA(
void* RequestAddress,
void* RequestContext,
void* ControlGuid,
uint32_t GuidCount,
void* TraceGuidReg,
const char* MofImagePath,
const char* MofResourceName,
uint64_t* RegistrationHandle);
C, "ADVAPI32.dll");
// $ffi->RegisterTraceGuidsA(RequestAddress, RequestContext, ControlGuid, GuidCount, TraceGuidReg, MofImagePath, MofResourceName, RegistrationHandle);
// RequestAddress : WMIDPREQUEST
// RequestContext : void* optional
// ControlGuid : GUID*
// GuidCount : DWORD
// TraceGuidReg : TRACE_GUID_REGISTRATION* optional
// MofImagePath : LPCSTR optional
// MofResourceName : LPCSTR optional
// RegistrationHandle : ULONGLONG* 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 Advapi32 extends StdCallLibrary {
Advapi32 INSTANCE = Native.load("advapi32", Advapi32.class, W32APIOptions.ASCII_OPTIONS);
int RegisterTraceGuidsA(
Callback RequestAddress, // WMIDPREQUEST
Pointer RequestContext, // void* optional
Pointer ControlGuid, // GUID*
int GuidCount, // DWORD
Pointer TraceGuidReg, // TRACE_GUID_REGISTRATION* optional
String MofImagePath, // LPCSTR optional
String MofResourceName, // LPCSTR optional
LongByReference RegistrationHandle // ULONGLONG* out
);
}@[Link("advapi32")]
lib LibADVAPI32
fun RegisterTraceGuidsA = RegisterTraceGuidsA(
RequestAddress : Void*, # WMIDPREQUEST
RequestContext : Void*, # void* optional
ControlGuid : GUID*, # GUID*
GuidCount : UInt32, # DWORD
TraceGuidReg : TRACE_GUID_REGISTRATION*, # TRACE_GUID_REGISTRATION* optional
MofImagePath : UInt8*, # LPCSTR optional
MofResourceName : UInt8*, # LPCSTR optional
RegistrationHandle : UInt64* # ULONGLONG* out
) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef RegisterTraceGuidsANative = Uint32 Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Uint32, Pointer<Void>, Pointer<Utf8>, Pointer<Utf8>, Pointer<Uint64>);
typedef RegisterTraceGuidsADart = int Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, int, Pointer<Void>, Pointer<Utf8>, Pointer<Utf8>, Pointer<Uint64>);
final RegisterTraceGuidsA = DynamicLibrary.open('ADVAPI32.dll')
.lookupFunction<RegisterTraceGuidsANative, RegisterTraceGuidsADart>('RegisterTraceGuidsA');
// RequestAddress : WMIDPREQUEST -> Pointer<Void>
// RequestContext : void* optional -> Pointer<Void>
// ControlGuid : GUID* -> Pointer<Void>
// GuidCount : DWORD -> Uint32
// TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> Pointer<Void>
// MofImagePath : LPCSTR optional -> Pointer<Utf8>
// MofResourceName : LPCSTR optional -> Pointer<Utf8>
// RegistrationHandle : ULONGLONG* out -> Pointer<Uint64>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function RegisterTraceGuidsA(
RequestAddress: Pointer; // WMIDPREQUEST
RequestContext: Pointer; // void* optional
ControlGuid: PGUID; // GUID*
GuidCount: DWORD; // DWORD
TraceGuidReg: Pointer; // TRACE_GUID_REGISTRATION* optional
MofImagePath: PAnsiChar; // LPCSTR optional
MofResourceName: PAnsiChar; // LPCSTR optional
RegistrationHandle: Pointer // ULONGLONG* out
): DWORD; stdcall;
external 'ADVAPI32.dll' name 'RegisterTraceGuidsA';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "RegisterTraceGuidsA"
c_RegisterTraceGuidsA :: Ptr () -> Ptr () -> Ptr () -> Word32 -> Ptr () -> CString -> CString -> Ptr Word64 -> IO Word32
-- RequestAddress : WMIDPREQUEST -> Ptr ()
-- RequestContext : void* optional -> Ptr ()
-- ControlGuid : GUID* -> Ptr ()
-- GuidCount : DWORD -> Word32
-- TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> Ptr ()
-- MofImagePath : LPCSTR optional -> CString
-- MofResourceName : LPCSTR optional -> CString
-- RegistrationHandle : ULONGLONG* out -> Ptr Word64
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let registertraceguidsa =
foreign "RegisterTraceGuidsA"
((ptr void) @-> (ptr void) @-> (ptr void) @-> uint32_t @-> (ptr void) @-> string @-> string @-> (ptr uint64_t) @-> returning uint32_t)
(* RequestAddress : WMIDPREQUEST -> (ptr void) *)
(* RequestContext : void* optional -> (ptr void) *)
(* ControlGuid : GUID* -> (ptr void) *)
(* GuidCount : DWORD -> uint32_t *)
(* TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> (ptr void) *)
(* MofImagePath : LPCSTR optional -> string *)
(* MofResourceName : LPCSTR optional -> string *)
(* RegistrationHandle : ULONGLONG* out -> (ptr uint64_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library advapi32 (t "ADVAPI32.dll"))
(cffi:use-foreign-library advapi32)
(cffi:defcfun ("RegisterTraceGuidsA" register-trace-guids-a :convention :stdcall) :uint32
(request-address :pointer) ; WMIDPREQUEST
(request-context :pointer) ; void* optional
(control-guid :pointer) ; GUID*
(guid-count :uint32) ; DWORD
(trace-guid-reg :pointer) ; TRACE_GUID_REGISTRATION* optional
(mof-image-path :string) ; LPCSTR optional
(mof-resource-name :string) ; LPCSTR optional
(registration-handle :pointer)) ; ULONGLONG* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $RegisterTraceGuidsA = Win32::API::More->new('ADVAPI32',
'DWORD RegisterTraceGuidsA(LPVOID RequestAddress, LPVOID RequestContext, LPVOID ControlGuid, DWORD GuidCount, LPVOID TraceGuidReg, LPCSTR MofImagePath, LPCSTR MofResourceName, LPVOID RegistrationHandle)');
# my $ret = $RegisterTraceGuidsA->Call($RequestAddress, $RequestContext, $ControlGuid, $GuidCount, $TraceGuidReg, $MofImagePath, $MofResourceName, $RegistrationHandle);
# RequestAddress : WMIDPREQUEST -> LPVOID
# RequestContext : void* optional -> LPVOID
# ControlGuid : GUID* -> LPVOID
# GuidCount : DWORD -> DWORD
# TraceGuidReg : TRACE_GUID_REGISTRATION* optional -> LPVOID
# MofImagePath : LPCSTR optional -> LPCSTR
# MofResourceName : LPCSTR optional -> LPCSTR
# RegistrationHandle : ULONGLONG* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# コールバック(関数ポインタ)は Perl sub を直接渡せません。Win32::API::Callback を使用してください。関連項目
- f RegisterTraceGuidsW (Unicode版) — クラシックETWプロバイダーのトレースGUIDを登録する(Unicode版)。