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

CoInitializeSecurity

関数
プロセス全体のCOMセキュリティ設定を初期化する。
DLLOLE32.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

// 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
);

パラメーター

名前方向説明
pSecDescPSECURITY_DESCRIPTORinoptionalサーバーが呼び出しを受信するために使用するアクセス許可です。このパラメーターは、サーバーが CoInitializeSecurity を呼び出す場合にのみ COM によって使用されます。値は、AppID、IAccessControl オブジェクト、または絶対形式の SECURITY_DESCRIPTOR の 3 種類のいずれかへのポインターです。詳細については「解説」を参照してください。
cAuthSvcINTinasAuthSvc パラメーター内のエントリ数です。このパラメーターは、サーバーが CoInitializeSecurity を呼び出す場合にのみ COM によって使用されます。このパラメーターが 0 の場合、認証サービスは登録されず、サーバーはセキュアな呼び出しを受信できません。値が -1 の場合は、登録する認証サービスを COM に選択させます。その場合、asAuthSvc パラメーターは NULL でなければなりません。ただし、このパラメーターが -1 の場合、Schannel がサーバーの認証サービスとして選択されることはありません。
asAuthSvcSOLE_AUTHENTICATION_SERVICE*inoptionalサーバーが呼び出しを受信するために使用する認証サービスの配列です。このパラメーターは、サーバーが CoInitializeSecurity を呼び出す場合にのみ COM によって使用されます。詳細については SOLE_AUTHENTICATION_SERVICE を参照してください。
pReserved1void*inoptionalこのパラメーターは予約されており、NULL でなければなりません。
dwAuthnLevelRPC_C_AUTHN_LEVELinプロセスの既定の認証レベルです。サーバーとクライアントの両方が、CoInitializeSecurity を呼び出すときにこのパラメーターを使用します。COM は、これより低い認証レベルで到着した呼び出しを失敗させます。既定では、すべてのプロキシは少なくともこの認証レベルを使用します。この値には、認証レベル定数のいずれかを指定する必要があります。既定では、IUnknown へのすべての呼び出しはこのレベルで行われます。
dwImpLevelRPC_C_IMP_LEVELin

プロキシの既定の偽装レベルです。このパラメーターの値は、プロセスがクライアントである場合にのみ使用されます。偽装レベル定数の値を指定する必要がありますが、CoInitializeSecurity での使用が想定されていない RPC_C_IMP_LEVEL_DEFAULT は除きます。

クライアントからの送信呼び出しは、常に指定された偽装レベルを使用します(ネゴシエートはされません)。クライアントへの受信呼び出しは任意の偽装レベルで行われる可能性があります。既定では、すべての IUnknown 呼び出しはこの偽装レベルで行われるため、セキュリティを意識したアプリケーションであってもこのレベルは慎重に設定する必要があります。各認証サービスがどの偽装レベルをサポートするかを確認するには、COM and Security Packages 内の認証サービスの説明を参照してください。偽装レベルの詳細については Impersonation を参照してください。

pAuthListvoid*inoptionalSOLE_AUTHENTICATION_LIST へのポインターで、これは SOLE_AUTHENTICATION_INFO 構造体の配列です。このリストは、クライアントがサーバーを呼び出すために使用できる各認証サービスの情報を示します。このパラメーターは、クライアントが CoInitializeSecurity を呼び出す場合にのみ COM によって使用されます。
dwCapabilitiesDWORDin1 つ以上の EOLE_AUTHENTICATION_CAPABILITIES 値を設定して指定する、クライアントまたはサーバーの追加機能です。これらの値の中には同時に使用できないものや、特定の認証サービスの使用時には設定できないものがあります。これらのフラグの詳細については「解説」を参照してください。
pReserved3void*inoptionalこのパラメーターは予約されており、NULL でなければなりません。

戻り値の型: HRESULT

公式ドキュメント

セキュリティを登録し、プロセスの既定のセキュリティ値を設定します。

戻り値

この関数は、標準の戻り値 E_INVALIDARG に加えて、次の値を返すことがあります。

戻り値 説明
S_OK
成功を示します。
RPC_E_TOO_LATE

CoInitializeSecurity は既に呼び出されています。

RPC_E_NO_GOOD_SECURITY_PACKAGES
asAuthSvc パラメーターが NULL ではなく、リスト内のどの認証サービスも登録できませんでした。認証サービス固有のエラーコードについては、asAuthSvc に保存された結果を確認してください。
E_OUT_OF_MEMORY
メモリ不足です。

解説(Remarks)

CoInitializeSecurity 関数は、セキュリティ層を初期化し、指定された値をセキュリティの既定値として設定します。プロセスが CoInitializeSecurity を呼び出さない場合、COM は最初にインターフェイスがマーシャリングまたはアンマーシャリングされたときに自動的にこの関数を呼び出し、システムの既定のセキュリティを登録します。それまでは、既定のセキュリティパッケージは登録されません。

この関数は、明示的または暗黙的に、プロセスごとに正確に 1 回だけ呼び出されます。クライアント、サーバー、またはその両方から呼び出すことができます。レガシーアプリケーションやその他の CoInitializeSecurity を明示的に呼び出さないアプリケーションの場合、COM はレジストリの値を使用してこの関数を暗黙的に呼び出します。レジストリを使用してプロセス全体のセキュリティを設定した後で CoInitializeSecurity を呼び出すと、AppID レジストリ値は無視され、CoInitializeSecurity の値が使用されます。

CoInitializeSecurity は、コンピューター全体のアクセス許可とアプリケーション固有のアクセス許可の両方を上書きするために使用できますが、コンピューター全体の制限ポリシーを上書きすることはできません。

pSecDesc が AppID を指している場合、dwCapabilitiesEOAC_APPID フラグを設定する必要があります。EOAC_APPID フラグが設定されている場合、CoInitializeSecurity へのその他のすべてのパラメーターは無視されます。CoInitializeSecurity はレジストリの AppID キーの下にある認証レベルを探し、それを使用して既定のセキュリティを決定します。AppID キーを使用してセキュリティを設定する方法の詳細については、Setting Process-Wide Security Through the Registry を参照してください。

pSecDescIAccessControl オブジェクトへのポインターである場合、EOAC_ACCESS_CONTROL フラグを設定する必要があり、dwAuthnLevel を none にすることはできません。IAccessControl オブジェクトは、誰がプロセスを呼び出せるかを決定するために使用されます。DCOM は IAccessControlAddRef し、CoUninitialize が呼び出されたときに Release します。IAccessControl オブジェクトの状態は変更しないでください。

pSecDescSECURITY_DESCRIPTOR へのポインターである場合、dwCapabilitiesEOAC_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 を呼び出す必要があります。

pSecDescNULL として渡すことは強く推奨されません。適切な代替策としては、Everyone を許可する SECURITY_DESCRIPTOR を使用することが考えられます。pSecDescNULL の場合、dwCapabilities のフラグによって、CoInitializeSecurity がサーバーの使用するアクセス許可をどのように定義するかが、次のように決まります。

CoInitializeSecurity 関数は、dwCapabilitiesEOAC_APPID フラグと EOAC_ACCESS_CONTROL フラグの両方が設定されている場合、エラーを返します。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 方式にも切替可。
出力引数:
; 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 方式にも切替可。
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   // HRESULT
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';
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 を使用。

関連項目

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