CoInitializeSecurity
関数シグネチャ
// OLE32.dll
#include <windows.h>
HRESULT CoInitializeSecurity(
PSECURITY_DESCRIPTOR pSecDesc, // optional
INT cAuthSvc,
SOLE_AUTHENTICATION_SERVICE* asAuthSvc, // optional
void* pReserved1, // optional
RPC_C_AUTHN_LEVEL dwAuthnLevel,
RPC_C_IMP_LEVEL dwImpLevel,
void* pAuthList, // optional
DWORD dwCapabilities,
void* pReserved3 // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| pSecDesc | PSECURITY_DESCRIPTOR | inoptional | サーバーが呼び出しを受信するために使用するアクセス許可です。このパラメーターは、サーバーが CoInitializeSecurity を呼び出す場合にのみ COM によって使用されます。値は、AppID、IAccessControl オブジェクト、または絶対形式の SECURITY_DESCRIPTOR の 3 種類のいずれかへのポインターです。詳細については「解説」を参照してください。 |
| cAuthSvc | INT | in | asAuthSvc パラメーター内のエントリ数です。このパラメーターは、サーバーが CoInitializeSecurity を呼び出す場合にのみ COM によって使用されます。このパラメーターが 0 の場合、認証サービスは登録されず、サーバーはセキュアな呼び出しを受信できません。値が -1 の場合は、登録する認証サービスを COM に選択させます。その場合、asAuthSvc パラメーターは NULL でなければなりません。ただし、このパラメーターが -1 の場合、Schannel がサーバーの認証サービスとして選択されることはありません。 |
| asAuthSvc | SOLE_AUTHENTICATION_SERVICE* | inoptional | サーバーが呼び出しを受信するために使用する認証サービスの配列です。このパラメーターは、サーバーが CoInitializeSecurity を呼び出す場合にのみ COM によって使用されます。詳細については SOLE_AUTHENTICATION_SERVICE を参照してください。 |
| pReserved1 | void* | inoptional | このパラメーターは予約されており、NULL でなければなりません。 |
| dwAuthnLevel | RPC_C_AUTHN_LEVEL | in | プロセスの既定の認証レベルです。サーバーとクライアントの両方が、CoInitializeSecurity を呼び出すときにこのパラメーターを使用します。COM は、これより低い認証レベルで到着した呼び出しを失敗させます。既定では、すべてのプロキシは少なくともこの認証レベルを使用します。この値には、認証レベル定数のいずれかを指定する必要があります。既定では、IUnknown へのすべての呼び出しはこのレベルで行われます。 |
| dwImpLevel | RPC_C_IMP_LEVEL | in | プロキシの既定の偽装レベルです。このパラメーターの値は、プロセスがクライアントである場合にのみ使用されます。偽装レベル定数の値を指定する必要がありますが、CoInitializeSecurity での使用が想定されていない RPC_C_IMP_LEVEL_DEFAULT は除きます。 クライアントからの送信呼び出しは、常に指定された偽装レベルを使用します(ネゴシエートはされません)。クライアントへの受信呼び出しは任意の偽装レベルで行われる可能性があります。既定では、すべての IUnknown 呼び出しはこの偽装レベルで行われるため、セキュリティを意識したアプリケーションであってもこのレベルは慎重に設定する必要があります。各認証サービスがどの偽装レベルをサポートするかを確認するには、COM and Security Packages 内の認証サービスの説明を参照してください。偽装レベルの詳細については Impersonation を参照してください。 |
| pAuthList | void* | inoptional | SOLE_AUTHENTICATION_LIST へのポインターで、これは SOLE_AUTHENTICATION_INFO 構造体の配列です。このリストは、クライアントがサーバーを呼び出すために使用できる各認証サービスの情報を示します。このパラメーターは、クライアントが CoInitializeSecurity を呼び出す場合にのみ COM によって使用されます。 |
| dwCapabilities | DWORD | in | 1 つ以上の EOLE_AUTHENTICATION_CAPABILITIES 値を設定して指定する、クライアントまたはサーバーの追加機能です。これらの値の中には同時に使用できないものや、特定の認証サービスの使用時には設定できないものがあります。これらのフラグの詳細については「解説」を参照してください。 |
| pReserved3 | void* | inoptional | このパラメーターは予約されており、NULL でなければなりません。 |
戻り値の型: HRESULT
公式ドキュメント
セキュリティを登録し、プロセスの既定のセキュリティ値を設定します。
戻り値
この関数は、標準の戻り値 E_INVALIDARG に加えて、次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| 成功を示します。 | |
|
CoInitializeSecurity は既に呼び出されています。 |
|
| asAuthSvc パラメーターが NULL ではなく、リスト内のどの認証サービスも登録できませんでした。認証サービス固有のエラーコードについては、asAuthSvc に保存された結果を確認してください。 | |
|
メモリ不足です。 |
解説(Remarks)
CoInitializeSecurity 関数は、セキュリティ層を初期化し、指定された値をセキュリティの既定値として設定します。プロセスが CoInitializeSecurity を呼び出さない場合、COM は最初にインターフェイスがマーシャリングまたはアンマーシャリングされたときに自動的にこの関数を呼び出し、システムの既定のセキュリティを登録します。それまでは、既定のセキュリティパッケージは登録されません。
この関数は、明示的または暗黙的に、プロセスごとに正確に 1 回だけ呼び出されます。クライアント、サーバー、またはその両方から呼び出すことができます。レガシーアプリケーションやその他の CoInitializeSecurity を明示的に呼び出さないアプリケーションの場合、COM はレジストリの値を使用してこの関数を暗黙的に呼び出します。レジストリを使用してプロセス全体のセキュリティを設定した後で CoInitializeSecurity を呼び出すと、AppID レジストリ値は無視され、CoInitializeSecurity の値が使用されます。
CoInitializeSecurity は、コンピューター全体のアクセス許可とアプリケーション固有のアクセス許可の両方を上書きするために使用できますが、コンピューター全体の制限ポリシーを上書きすることはできません。
pSecDesc が AppID を指している場合、dwCapabilities に EOAC_APPID フラグを設定する必要があります。EOAC_APPID フラグが設定されている場合、CoInitializeSecurity へのその他のすべてのパラメーターは無視されます。CoInitializeSecurity はレジストリの AppID キーの下にある認証レベルを探し、それを使用して既定のセキュリティを決定します。AppID キーを使用してセキュリティを設定する方法の詳細については、Setting Process-Wide Security Through the Registry を参照してください。
pSecDesc が IAccessControl オブジェクトへのポインターである場合、EOAC_ACCESS_CONTROL フラグを設定する必要があり、dwAuthnLevel を none にすることはできません。IAccessControl オブジェクトは、誰がプロセスを呼び出せるかを決定するために使用されます。DCOM は IAccessControl を AddRef し、CoUninitialize が呼び出されたときに Release します。IAccessControl オブジェクトの状態は変更しないでください。
pSecDesc が SECURITY_DESCRIPTOR へのポインターである場合、dwCapabilities に EOAC_APPID フラグも EOAC_ACCESS_CONTROL フラグも設定できません。SECURITY_DESCRIPTOR の所有者とグループを設定する必要があり、DCOM が監査をサポートするまではシステム ACL を NULL にする必要があります。SECURITY_DESCRIPTOR の随意 ACL (DACL) 内のアクセス制御エントリ (ACE) は、どの呼び出し元がプロセスのオブジェクトへの接続を許可されるかを判断するために使用されます。ACE のない DACL はアクセスを一切許可しませんが、NULL の DACL は誰からの呼び出しも許可します。ACL と ACE の詳細については Access Control Model を参照してください。アプリケーションは、CoInitializeSecurity を呼び出す前に、SECURITY_DESCRIPTOR が正しく形成されていることを確認するために、IsValidSecurityDescriptor ではなく AccessCheck を呼び出す必要があります。
pSecDesc を NULL として渡すことは強く推奨されません。適切な代替策としては、Everyone を許可する SECURITY_DESCRIPTOR を使用することが考えられます。pSecDesc が NULL の場合、dwCapabilities のフラグによって、CoInitializeSecurity がサーバーの使用するアクセス許可をどのように定義するかが、次のように決まります。
- EOAC_APPID フラグが設定されている場合、CoInitializeSecurity はレジストリ内でアプリケーションの .exe 名を検索し、そこに格納されている AppID を使用します。
- EOAC_ACCESS_CONTROL フラグが設定されている場合、CoInitializeSecurity はエラーを返します。
- EOAC_APPID フラグも EOAC_ACCESS_CONTROL フラグも設定されていない場合、CoInitializeSecurity はローカルおよびリモートの匿名ユーザーを含むすべての呼び出し元を許可します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// OLE32.dll
#include <windows.h>
HRESULT CoInitializeSecurity(
PSECURITY_DESCRIPTOR pSecDesc, // optional
INT cAuthSvc,
SOLE_AUTHENTICATION_SERVICE* asAuthSvc, // optional
void* pReserved1, // optional
RPC_C_AUTHN_LEVEL dwAuthnLevel,
RPC_C_IMP_LEVEL dwImpLevel,
void* pAuthList, // optional
DWORD dwCapabilities,
void* pReserved3 // optional
);[DllImport("OLE32.dll", ExactSpelling = true)]
static extern int CoInitializeSecurity(
IntPtr pSecDesc, // PSECURITY_DESCRIPTOR optional
int cAuthSvc, // INT
IntPtr asAuthSvc, // SOLE_AUTHENTICATION_SERVICE* optional
IntPtr pReserved1, // void* optional
uint dwAuthnLevel, // RPC_C_AUTHN_LEVEL
uint dwImpLevel, // RPC_C_IMP_LEVEL
IntPtr pAuthList, // void* optional
uint dwCapabilities, // DWORD
IntPtr pReserved3 // void* optional
);<DllImport("OLE32.dll", ExactSpelling:=True)>
Public Shared Function CoInitializeSecurity(
pSecDesc As IntPtr, ' PSECURITY_DESCRIPTOR optional
cAuthSvc As Integer, ' INT
asAuthSvc As IntPtr, ' SOLE_AUTHENTICATION_SERVICE* optional
pReserved1 As IntPtr, ' void* optional
dwAuthnLevel As UInteger, ' RPC_C_AUTHN_LEVEL
dwImpLevel As UInteger, ' RPC_C_IMP_LEVEL
pAuthList As IntPtr, ' void* optional
dwCapabilities As UInteger, ' DWORD
pReserved3 As IntPtr ' void* optional
) As Integer
End Function' pSecDesc : PSECURITY_DESCRIPTOR optional
' cAuthSvc : INT
' asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional
' pReserved1 : void* optional
' dwAuthnLevel : RPC_C_AUTHN_LEVEL
' dwImpLevel : RPC_C_IMP_LEVEL
' pAuthList : void* optional
' dwCapabilities : DWORD
' pReserved3 : void* optional
Declare PtrSafe Function CoInitializeSecurity Lib "ole32" ( _
ByVal pSecDesc As LongPtr, _
ByVal cAuthSvc As Long, _
ByVal asAuthSvc As LongPtr, _
ByVal pReserved1 As LongPtr, _
ByVal dwAuthnLevel As Long, _
ByVal dwImpLevel As Long, _
ByVal pAuthList As LongPtr, _
ByVal dwCapabilities As Long, _
ByVal pReserved3 As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
CoInitializeSecurity = ctypes.windll.ole32.CoInitializeSecurity
CoInitializeSecurity.restype = ctypes.c_int
CoInitializeSecurity.argtypes = [
wintypes.HANDLE, # pSecDesc : PSECURITY_DESCRIPTOR optional
ctypes.c_int, # cAuthSvc : INT
ctypes.c_void_p, # asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional
ctypes.POINTER(None), # pReserved1 : void* optional
wintypes.DWORD, # dwAuthnLevel : RPC_C_AUTHN_LEVEL
wintypes.DWORD, # dwImpLevel : RPC_C_IMP_LEVEL
ctypes.POINTER(None), # pAuthList : void* optional
wintypes.DWORD, # dwCapabilities : DWORD
ctypes.POINTER(None), # pReserved3 : void* optional
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('OLE32.dll')
CoInitializeSecurity = Fiddle::Function.new(
lib['CoInitializeSecurity'],
[
Fiddle::TYPE_VOIDP, # pSecDesc : PSECURITY_DESCRIPTOR optional
Fiddle::TYPE_INT, # cAuthSvc : INT
Fiddle::TYPE_VOIDP, # asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional
Fiddle::TYPE_VOIDP, # pReserved1 : void* optional
-Fiddle::TYPE_INT, # dwAuthnLevel : RPC_C_AUTHN_LEVEL
-Fiddle::TYPE_INT, # dwImpLevel : RPC_C_IMP_LEVEL
Fiddle::TYPE_VOIDP, # pAuthList : void* optional
-Fiddle::TYPE_INT, # dwCapabilities : DWORD
Fiddle::TYPE_VOIDP, # pReserved3 : void* optional
],
Fiddle::TYPE_INT)#[link(name = "ole32")]
extern "system" {
fn CoInitializeSecurity(
pSecDesc: *mut core::ffi::c_void, // PSECURITY_DESCRIPTOR optional
cAuthSvc: i32, // INT
asAuthSvc: *mut SOLE_AUTHENTICATION_SERVICE, // SOLE_AUTHENTICATION_SERVICE* optional
pReserved1: *mut (), // void* optional
dwAuthnLevel: u32, // RPC_C_AUTHN_LEVEL
dwImpLevel: u32, // RPC_C_IMP_LEVEL
pAuthList: *mut (), // void* optional
dwCapabilities: u32, // DWORD
pReserved3: *mut () // void* optional
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("OLE32.dll")]
public static extern int CoInitializeSecurity(IntPtr pSecDesc, int cAuthSvc, IntPtr asAuthSvc, IntPtr pReserved1, uint dwAuthnLevel, uint dwImpLevel, IntPtr pAuthList, uint dwCapabilities, IntPtr pReserved3);
"@
$api = Add-Type -MemberDefinition $sig -Name 'OLE32_CoInitializeSecurity' -Namespace Win32 -PassThru
# $api::CoInitializeSecurity(pSecDesc, cAuthSvc, asAuthSvc, pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3)#uselib "OLE32.dll"
#func global CoInitializeSecurity "CoInitializeSecurity" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; CoInitializeSecurity pSecDesc, cAuthSvc, varptr(asAuthSvc), pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3 ; 戻り値は stat
; pSecDesc : PSECURITY_DESCRIPTOR optional -> "sptr"
; cAuthSvc : INT -> "sptr"
; asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> "sptr"
; pReserved1 : void* optional -> "sptr"
; dwAuthnLevel : RPC_C_AUTHN_LEVEL -> "sptr"
; dwImpLevel : RPC_C_IMP_LEVEL -> "sptr"
; pAuthList : void* optional -> "sptr"
; dwCapabilities : DWORD -> "sptr"
; pReserved3 : void* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "OLE32.dll" #cfunc global CoInitializeSecurity "CoInitializeSecurity" sptr, int, var, sptr, int, int, sptr, int, sptr ; res = CoInitializeSecurity(pSecDesc, cAuthSvc, asAuthSvc, pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3) ; pSecDesc : PSECURITY_DESCRIPTOR optional -> "sptr" ; cAuthSvc : INT -> "int" ; asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> "var" ; pReserved1 : void* optional -> "sptr" ; dwAuthnLevel : RPC_C_AUTHN_LEVEL -> "int" ; dwImpLevel : RPC_C_IMP_LEVEL -> "int" ; pAuthList : void* optional -> "sptr" ; dwCapabilities : DWORD -> "int" ; pReserved3 : void* optional -> "sptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "OLE32.dll" #cfunc global CoInitializeSecurity "CoInitializeSecurity" sptr, int, sptr, sptr, int, int, sptr, int, sptr ; res = CoInitializeSecurity(pSecDesc, cAuthSvc, varptr(asAuthSvc), pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3) ; pSecDesc : PSECURITY_DESCRIPTOR optional -> "sptr" ; cAuthSvc : INT -> "int" ; asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> "sptr" ; pReserved1 : void* optional -> "sptr" ; dwAuthnLevel : RPC_C_AUTHN_LEVEL -> "int" ; dwImpLevel : RPC_C_IMP_LEVEL -> "int" ; pAuthList : void* optional -> "sptr" ; dwCapabilities : DWORD -> "int" ; pReserved3 : void* optional -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; HRESULT CoInitializeSecurity(PSECURITY_DESCRIPTOR pSecDesc, INT cAuthSvc, SOLE_AUTHENTICATION_SERVICE* asAuthSvc, void* pReserved1, RPC_C_AUTHN_LEVEL dwAuthnLevel, RPC_C_IMP_LEVEL dwImpLevel, void* pAuthList, DWORD dwCapabilities, void* pReserved3) #uselib "OLE32.dll" #cfunc global CoInitializeSecurity "CoInitializeSecurity" intptr, int, var, intptr, int, int, intptr, int, intptr ; res = CoInitializeSecurity(pSecDesc, cAuthSvc, asAuthSvc, pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3) ; pSecDesc : PSECURITY_DESCRIPTOR optional -> "intptr" ; cAuthSvc : INT -> "int" ; asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> "var" ; pReserved1 : void* optional -> "intptr" ; dwAuthnLevel : RPC_C_AUTHN_LEVEL -> "int" ; dwImpLevel : RPC_C_IMP_LEVEL -> "int" ; pAuthList : void* optional -> "intptr" ; dwCapabilities : DWORD -> "int" ; pReserved3 : void* optional -> "intptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; HRESULT CoInitializeSecurity(PSECURITY_DESCRIPTOR pSecDesc, INT cAuthSvc, SOLE_AUTHENTICATION_SERVICE* asAuthSvc, void* pReserved1, RPC_C_AUTHN_LEVEL dwAuthnLevel, RPC_C_IMP_LEVEL dwImpLevel, void* pAuthList, DWORD dwCapabilities, void* pReserved3) #uselib "OLE32.dll" #cfunc global CoInitializeSecurity "CoInitializeSecurity" intptr, int, intptr, intptr, int, int, intptr, int, intptr ; res = CoInitializeSecurity(pSecDesc, cAuthSvc, varptr(asAuthSvc), pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3) ; pSecDesc : PSECURITY_DESCRIPTOR optional -> "intptr" ; cAuthSvc : INT -> "int" ; asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> "intptr" ; pReserved1 : void* optional -> "intptr" ; dwAuthnLevel : RPC_C_AUTHN_LEVEL -> "int" ; dwImpLevel : RPC_C_IMP_LEVEL -> "int" ; pAuthList : void* optional -> "intptr" ; dwCapabilities : DWORD -> "int" ; pReserved3 : void* optional -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
ole32 = windows.NewLazySystemDLL("OLE32.dll")
procCoInitializeSecurity = ole32.NewProc("CoInitializeSecurity")
)
// pSecDesc (PSECURITY_DESCRIPTOR optional), cAuthSvc (INT), asAuthSvc (SOLE_AUTHENTICATION_SERVICE* optional), pReserved1 (void* optional), dwAuthnLevel (RPC_C_AUTHN_LEVEL), dwImpLevel (RPC_C_IMP_LEVEL), pAuthList (void* optional), dwCapabilities (DWORD), pReserved3 (void* optional)
r1, _, err := procCoInitializeSecurity.Call(
uintptr(pSecDesc),
uintptr(cAuthSvc),
uintptr(asAuthSvc),
uintptr(pReserved1),
uintptr(dwAuthnLevel),
uintptr(dwImpLevel),
uintptr(pAuthList),
uintptr(dwCapabilities),
uintptr(pReserved3),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // HRESULTfunction CoInitializeSecurity(
pSecDesc: THandle; // PSECURITY_DESCRIPTOR optional
cAuthSvc: Integer; // INT
asAuthSvc: Pointer; // SOLE_AUTHENTICATION_SERVICE* optional
pReserved1: Pointer; // void* optional
dwAuthnLevel: DWORD; // RPC_C_AUTHN_LEVEL
dwImpLevel: DWORD; // RPC_C_IMP_LEVEL
pAuthList: Pointer; // void* optional
dwCapabilities: DWORD; // DWORD
pReserved3: Pointer // void* optional
): Integer; stdcall;
external 'OLE32.dll' name 'CoInitializeSecurity';result := DllCall("OLE32\CoInitializeSecurity"
, "Ptr", pSecDesc ; PSECURITY_DESCRIPTOR optional
, "Int", cAuthSvc ; INT
, "Ptr", asAuthSvc ; SOLE_AUTHENTICATION_SERVICE* optional
, "Ptr", pReserved1 ; void* optional
, "UInt", dwAuthnLevel ; RPC_C_AUTHN_LEVEL
, "UInt", dwImpLevel ; RPC_C_IMP_LEVEL
, "Ptr", pAuthList ; void* optional
, "UInt", dwCapabilities ; DWORD
, "Ptr", pReserved3 ; void* optional
, "Int") ; return: HRESULT●CoInitializeSecurity(pSecDesc, cAuthSvc, asAuthSvc, pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3) = DLL("OLE32.dll", "int CoInitializeSecurity(void*, int, void*, void*, dword, dword, void*, dword, void*)")
# 呼び出し: CoInitializeSecurity(pSecDesc, cAuthSvc, asAuthSvc, pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3)
# pSecDesc : PSECURITY_DESCRIPTOR optional -> "void*"
# cAuthSvc : INT -> "int"
# asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> "void*"
# pReserved1 : void* optional -> "void*"
# dwAuthnLevel : RPC_C_AUTHN_LEVEL -> "dword"
# dwImpLevel : RPC_C_IMP_LEVEL -> "dword"
# pAuthList : void* optional -> "void*"
# dwCapabilities : DWORD -> "dword"
# pReserved3 : void* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "ole32" fn CoInitializeSecurity(
pSecDesc: ?*anyopaque, // PSECURITY_DESCRIPTOR optional
cAuthSvc: i32, // INT
asAuthSvc: [*c]SOLE_AUTHENTICATION_SERVICE, // SOLE_AUTHENTICATION_SERVICE* optional
pReserved1: ?*anyopaque, // void* optional
dwAuthnLevel: u32, // RPC_C_AUTHN_LEVEL
dwImpLevel: u32, // RPC_C_IMP_LEVEL
pAuthList: ?*anyopaque, // void* optional
dwCapabilities: u32, // DWORD
pReserved3: ?*anyopaque // void* optional
) callconv(std.os.windows.WINAPI) i32;proc CoInitializeSecurity(
pSecDesc: pointer, # PSECURITY_DESCRIPTOR optional
cAuthSvc: int32, # INT
asAuthSvc: ptr SOLE_AUTHENTICATION_SERVICE, # SOLE_AUTHENTICATION_SERVICE* optional
pReserved1: pointer, # void* optional
dwAuthnLevel: uint32, # RPC_C_AUTHN_LEVEL
dwImpLevel: uint32, # RPC_C_IMP_LEVEL
pAuthList: pointer, # void* optional
dwCapabilities: uint32, # DWORD
pReserved3: pointer # void* optional
): int32 {.importc: "CoInitializeSecurity", stdcall, dynlib: "OLE32.dll".}pragma(lib, "ole32");
extern(Windows)
int CoInitializeSecurity(
void* pSecDesc, // PSECURITY_DESCRIPTOR optional
int cAuthSvc, // INT
SOLE_AUTHENTICATION_SERVICE* asAuthSvc, // SOLE_AUTHENTICATION_SERVICE* optional
void* pReserved1, // void* optional
uint dwAuthnLevel, // RPC_C_AUTHN_LEVEL
uint dwImpLevel, // RPC_C_IMP_LEVEL
void* pAuthList, // void* optional
uint dwCapabilities, // DWORD
void* pReserved3 // void* optional
);ccall((:CoInitializeSecurity, "OLE32.dll"), stdcall, Int32,
(Ptr{Cvoid}, Int32, Ptr{SOLE_AUTHENTICATION_SERVICE}, Ptr{Cvoid}, UInt32, UInt32, Ptr{Cvoid}, UInt32, Ptr{Cvoid}),
pSecDesc, cAuthSvc, asAuthSvc, pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3)
# pSecDesc : PSECURITY_DESCRIPTOR optional -> Ptr{Cvoid}
# cAuthSvc : INT -> Int32
# asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> Ptr{SOLE_AUTHENTICATION_SERVICE}
# pReserved1 : void* optional -> Ptr{Cvoid}
# dwAuthnLevel : RPC_C_AUTHN_LEVEL -> UInt32
# dwImpLevel : RPC_C_IMP_LEVEL -> UInt32
# pAuthList : void* optional -> Ptr{Cvoid}
# dwCapabilities : DWORD -> UInt32
# pReserved3 : void* optional -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t CoInitializeSecurity(
void* pSecDesc,
int32_t cAuthSvc,
void* asAuthSvc,
void* pReserved1,
uint32_t dwAuthnLevel,
uint32_t dwImpLevel,
void* pAuthList,
uint32_t dwCapabilities,
void* pReserved3);
]]
local ole32 = ffi.load("ole32")
-- ole32.CoInitializeSecurity(pSecDesc, cAuthSvc, asAuthSvc, pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3)
-- pSecDesc : PSECURITY_DESCRIPTOR optional
-- cAuthSvc : INT
-- asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional
-- pReserved1 : void* optional
-- dwAuthnLevel : RPC_C_AUTHN_LEVEL
-- dwImpLevel : RPC_C_IMP_LEVEL
-- pAuthList : void* optional
-- dwCapabilities : DWORD
-- pReserved3 : void* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('OLE32.dll');
const CoInitializeSecurity = lib.func('__stdcall', 'CoInitializeSecurity', 'int32_t', ['void *', 'int32_t', 'void *', 'void *', 'uint32_t', 'uint32_t', 'void *', 'uint32_t', 'void *']);
// CoInitializeSecurity(pSecDesc, cAuthSvc, asAuthSvc, pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3)
// pSecDesc : PSECURITY_DESCRIPTOR optional -> 'void *'
// cAuthSvc : INT -> 'int32_t'
// asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> 'void *'
// pReserved1 : void* optional -> 'void *'
// dwAuthnLevel : RPC_C_AUTHN_LEVEL -> 'uint32_t'
// dwImpLevel : RPC_C_IMP_LEVEL -> 'uint32_t'
// pAuthList : void* optional -> 'void *'
// dwCapabilities : DWORD -> 'uint32_t'
// pReserved3 : void* optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("OLE32.dll", {
CoInitializeSecurity: { parameters: ["pointer", "i32", "pointer", "pointer", "u32", "u32", "pointer", "u32", "pointer"], result: "i32" },
});
// lib.symbols.CoInitializeSecurity(pSecDesc, cAuthSvc, asAuthSvc, pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3)
// pSecDesc : PSECURITY_DESCRIPTOR optional -> "pointer"
// cAuthSvc : INT -> "i32"
// asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> "pointer"
// pReserved1 : void* optional -> "pointer"
// dwAuthnLevel : RPC_C_AUTHN_LEVEL -> "u32"
// dwImpLevel : RPC_C_IMP_LEVEL -> "u32"
// pAuthList : void* optional -> "pointer"
// dwCapabilities : DWORD -> "u32"
// pReserved3 : void* optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t CoInitializeSecurity(
void* pSecDesc,
int32_t cAuthSvc,
void* asAuthSvc,
void* pReserved1,
uint32_t dwAuthnLevel,
uint32_t dwImpLevel,
void* pAuthList,
uint32_t dwCapabilities,
void* pReserved3);
C, "OLE32.dll");
// $ffi->CoInitializeSecurity(pSecDesc, cAuthSvc, asAuthSvc, pReserved1, dwAuthnLevel, dwImpLevel, pAuthList, dwCapabilities, pReserved3);
// pSecDesc : PSECURITY_DESCRIPTOR optional
// cAuthSvc : INT
// asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional
// pReserved1 : void* optional
// dwAuthnLevel : RPC_C_AUTHN_LEVEL
// dwImpLevel : RPC_C_IMP_LEVEL
// pAuthList : void* optional
// dwCapabilities : DWORD
// pReserved3 : void* 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 Ole32 extends StdCallLibrary {
Ole32 INSTANCE = Native.load("ole32", Ole32.class);
int CoInitializeSecurity(
Pointer pSecDesc, // PSECURITY_DESCRIPTOR optional
int cAuthSvc, // INT
Pointer asAuthSvc, // SOLE_AUTHENTICATION_SERVICE* optional
Pointer pReserved1, // void* optional
int dwAuthnLevel, // RPC_C_AUTHN_LEVEL
int dwImpLevel, // RPC_C_IMP_LEVEL
Pointer pAuthList, // void* optional
int dwCapabilities, // DWORD
Pointer pReserved3 // void* optional
);
}@[Link("ole32")]
lib LibOLE32
fun CoInitializeSecurity = CoInitializeSecurity(
pSecDesc : Void*, # PSECURITY_DESCRIPTOR optional
cAuthSvc : Int32, # INT
asAuthSvc : SOLE_AUTHENTICATION_SERVICE*, # SOLE_AUTHENTICATION_SERVICE* optional
pReserved1 : Void*, # void* optional
dwAuthnLevel : UInt32, # RPC_C_AUTHN_LEVEL
dwImpLevel : UInt32, # RPC_C_IMP_LEVEL
pAuthList : Void*, # void* optional
dwCapabilities : UInt32, # DWORD
pReserved3 : Void* # void* optional
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef CoInitializeSecurityNative = Int32 Function(Pointer<Void>, Int32, Pointer<Void>, Pointer<Void>, Uint32, Uint32, Pointer<Void>, Uint32, Pointer<Void>);
typedef CoInitializeSecurityDart = int Function(Pointer<Void>, int, Pointer<Void>, Pointer<Void>, int, int, Pointer<Void>, int, Pointer<Void>);
final CoInitializeSecurity = DynamicLibrary.open('OLE32.dll')
.lookupFunction<CoInitializeSecurityNative, CoInitializeSecurityDart>('CoInitializeSecurity');
// pSecDesc : PSECURITY_DESCRIPTOR optional -> Pointer<Void>
// cAuthSvc : INT -> Int32
// asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> Pointer<Void>
// pReserved1 : void* optional -> Pointer<Void>
// dwAuthnLevel : RPC_C_AUTHN_LEVEL -> Uint32
// dwImpLevel : RPC_C_IMP_LEVEL -> Uint32
// pAuthList : void* optional -> Pointer<Void>
// dwCapabilities : DWORD -> Uint32
// pReserved3 : void* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function CoInitializeSecurity(
pSecDesc: THandle; // PSECURITY_DESCRIPTOR optional
cAuthSvc: Integer; // INT
asAuthSvc: Pointer; // SOLE_AUTHENTICATION_SERVICE* optional
pReserved1: Pointer; // void* optional
dwAuthnLevel: DWORD; // RPC_C_AUTHN_LEVEL
dwImpLevel: DWORD; // RPC_C_IMP_LEVEL
pAuthList: Pointer; // void* optional
dwCapabilities: DWORD; // DWORD
pReserved3: Pointer // void* optional
): Integer; stdcall;
external 'OLE32.dll' name 'CoInitializeSecurity';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "CoInitializeSecurity"
c_CoInitializeSecurity :: Ptr () -> Int32 -> Ptr () -> Ptr () -> Word32 -> Word32 -> Ptr () -> Word32 -> Ptr () -> IO Int32
-- pSecDesc : PSECURITY_DESCRIPTOR optional -> Ptr ()
-- cAuthSvc : INT -> Int32
-- asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> Ptr ()
-- pReserved1 : void* optional -> Ptr ()
-- dwAuthnLevel : RPC_C_AUTHN_LEVEL -> Word32
-- dwImpLevel : RPC_C_IMP_LEVEL -> Word32
-- pAuthList : void* optional -> Ptr ()
-- dwCapabilities : DWORD -> Word32
-- pReserved3 : void* optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let coinitializesecurity =
foreign "CoInitializeSecurity"
((ptr void) @-> int32_t @-> (ptr void) @-> (ptr void) @-> uint32_t @-> uint32_t @-> (ptr void) @-> uint32_t @-> (ptr void) @-> returning int32_t)
(* pSecDesc : PSECURITY_DESCRIPTOR optional -> (ptr void) *)
(* cAuthSvc : INT -> int32_t *)
(* asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> (ptr void) *)
(* pReserved1 : void* optional -> (ptr void) *)
(* dwAuthnLevel : RPC_C_AUTHN_LEVEL -> uint32_t *)
(* dwImpLevel : RPC_C_IMP_LEVEL -> uint32_t *)
(* pAuthList : void* optional -> (ptr void) *)
(* dwCapabilities : DWORD -> uint32_t *)
(* pReserved3 : void* optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library ole32 (t "OLE32.dll"))
(cffi:use-foreign-library ole32)
(cffi:defcfun ("CoInitializeSecurity" co-initialize-security :convention :stdcall) :int32
(p-sec-desc :pointer) ; PSECURITY_DESCRIPTOR optional
(c-auth-svc :int32) ; INT
(as-auth-svc :pointer) ; SOLE_AUTHENTICATION_SERVICE* optional
(p-reserved1 :pointer) ; void* optional
(dw-authn-level :uint32) ; RPC_C_AUTHN_LEVEL
(dw-imp-level :uint32) ; RPC_C_IMP_LEVEL
(p-auth-list :pointer) ; void* optional
(dw-capabilities :uint32) ; DWORD
(p-reserved3 :pointer)) ; void* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $CoInitializeSecurity = Win32::API::More->new('OLE32',
'int CoInitializeSecurity(HANDLE pSecDesc, int cAuthSvc, LPVOID asAuthSvc, LPVOID pReserved1, DWORD dwAuthnLevel, DWORD dwImpLevel, LPVOID pAuthList, DWORD dwCapabilities, LPVOID pReserved3)');
# my $ret = $CoInitializeSecurity->Call($pSecDesc, $cAuthSvc, $asAuthSvc, $pReserved1, $dwAuthnLevel, $dwImpLevel, $pAuthList, $dwCapabilities, $pReserved3);
# pSecDesc : PSECURITY_DESCRIPTOR optional -> HANDLE
# cAuthSvc : INT -> int
# asAuthSvc : SOLE_AUTHENTICATION_SERVICE* optional -> LPVOID
# pReserved1 : void* optional -> LPVOID
# dwAuthnLevel : RPC_C_AUTHN_LEVEL -> DWORD
# dwImpLevel : RPC_C_IMP_LEVEL -> DWORD
# pAuthList : void* optional -> LPVOID
# dwCapabilities : DWORD -> DWORD
# pReserved3 : void* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f CoSetProxyBlanket — プロキシの認証情報や偽装レベルなどを設定する。