Win32 API 日本語リファレンス
ホームSecurity.DirectoryServices › DSCreateISecurityInfoObjectEx

DSCreateISecurityInfoObjectEx

関数
サーバーや資格情報を指定してディレクトリオブジェクト用ISecurityInformationを作成する。
DLLDSSEC.dll呼出規約winapi対応OSwindowsserver2008

シグネチャ

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

HRESULT DSCreateISecurityInfoObjectEx(
    LPCWSTR pwszObjectPath,
    LPCWSTR pwszObjectClass,
    LPCWSTR pwszServer,
    LPCWSTR pwszUserName,
    LPCWSTR pwszPassword,
    DWORD dwFlags,
    ISecurityInformation** ppSI,
    PFNREADOBJECTSECURITY pfnReadSD,   // optional
    PFNWRITEOBJECTSECURITY pfnWriteSD,   // optional
    LPARAM lpContext
);

パラメーター

名前方向説明
pwszObjectPathLPCWSTRinISecurityInformation インターフェイスのインスタンスを作成する対象となる DS オブジェクトの完全パス。
pwszObjectClassLPCWSTRinpwszObjectPath パラメーターで指定されたオブジェクトのクラス。
pwszServerLPCWSTRinpwszObjectPath パラメーターで指定されたオブジェクトのサーバー。このパラメーターの値が NULL の場合、サーバーは pwszObjectPath パラメーターで指定されたパスから取得されます。
pwszUserNameLPCWSTRin新しい ISecurityInformation オブジェクトに関連付けるユーザー名。このパラメーターの値が NULL の場合、Active Directory Services Interfaces (ADSI) の既定値が使用されます。
pwszPasswordLPCWSTRin新しい ISecurityInformation オブジェクトに関連付けるパスワード。このパラメーターの値が NULL の場合、Active Directory Services Interfaces (ADSI) の既定値が使用されます。
dwFlagsDWORDin

ISecurityInformation インターフェイスの新しいインスタンスに関連付けられるセキュリティ プロパティ ページに使用するフラグ。このパラメーターには、次のフラグの任意の組み合わせを指定できます。

意味
DSSI_READ_ONLY
0x00000001
セキュリティ プロパティは読み取り専用です。
DSSI_NO_ACCESS_CHECK
0x00000002
アクセス チェックは実行されません。
DSSI_NO_EDIT_SACL
0x00000004
システム アクセス制御リスト (SACL) プロパティは読み取り専用です。
DSSI_NO_EDIT_OWNER
0x00000008
オブジェクトの所有者プロパティは読み取り専用です。
DSSI_IS_ROOT
0x00000010
オブジェクトはルート オブジェクトです。
DSSI_NO_FILTER
0x00000020
フィルターを適用しません。
DSSI_NO_READONLY_MESSAGE
0x00000040
読み取り専用のポップアップ メッセージを抑制します。
ppSIISecurityInformation**outこの関数が作成する ISecurityInformation インターフェイスのインスタンスへのポインター。
pfnReadSDPFNREADOBJECTSECURITYinoptionalオブジェクトのセキュリティ記述子の読み取りに使用される関数へのポインター。この値は NULL でもかまいません。pfnReadSDNULL でない場合、DSCreateISecurityInfoObjectpfnReadSD が参照する関数を呼び出して、オブジェクトのセキュリティ記述子を取得します。
pfnWriteSDPFNWRITEOBJECTSECURITYinoptionalオブジェクトのセキュリティ記述子の書き込みに使用される関数へのポインター。この値は NULL でもかまいません。pfnWriteSDNULL でない場合、DSCreateISecurityInfoObjectpfnWriteSD が参照する関数を呼び出して、オブジェクトのセキュリティ記述子を書き込みます。
lpContextLPARAMinpfnReadSD パラメーターおよび pfnWriteSD パラメーターで指定された関数に渡すコンテキスト。

戻り値の型: HRESULT

公式ドキュメント

指定されたサーバー上の指定されたディレクトリ サービス (DS) オブジェクトに関連付けられた ISecurityInformation インターフェイスのインスタンスを作成します。

戻り値

関数が成功した場合は、S_OK を返します。

関数が失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラー コードの一覧については、「Common HRESULT Values」を参照してください。

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

各言語での呼び出し定義

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

HRESULT DSCreateISecurityInfoObjectEx(
    LPCWSTR pwszObjectPath,
    LPCWSTR pwszObjectClass,
    LPCWSTR pwszServer,
    LPCWSTR pwszUserName,
    LPCWSTR pwszPassword,
    DWORD dwFlags,
    ISecurityInformation** ppSI,
    PFNREADOBJECTSECURITY pfnReadSD,   // optional
    PFNWRITEOBJECTSECURITY pfnWriteSD,   // optional
    LPARAM lpContext
);
[DllImport("DSSEC.dll", ExactSpelling = true)]
static extern int DSCreateISecurityInfoObjectEx(
    [MarshalAs(UnmanagedType.LPWStr)] string pwszObjectPath,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string pwszObjectClass,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string pwszServer,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string pwszUserName,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string pwszPassword,   // LPCWSTR
    uint dwFlags,   // DWORD
    IntPtr ppSI,   // ISecurityInformation** out
    IntPtr pfnReadSD,   // PFNREADOBJECTSECURITY optional
    IntPtr pfnWriteSD,   // PFNWRITEOBJECTSECURITY optional
    IntPtr lpContext   // LPARAM
);
<DllImport("DSSEC.dll", ExactSpelling:=True)>
Public Shared Function DSCreateISecurityInfoObjectEx(
    <MarshalAs(UnmanagedType.LPWStr)> pwszObjectPath As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> pwszObjectClass As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> pwszServer As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> pwszUserName As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> pwszPassword As String,   ' LPCWSTR
    dwFlags As UInteger,   ' DWORD
    ppSI As IntPtr,   ' ISecurityInformation** out
    pfnReadSD As IntPtr,   ' PFNREADOBJECTSECURITY optional
    pfnWriteSD As IntPtr,   ' PFNWRITEOBJECTSECURITY optional
    lpContext As IntPtr   ' LPARAM
) As Integer
End Function
' pwszObjectPath : LPCWSTR
' pwszObjectClass : LPCWSTR
' pwszServer : LPCWSTR
' pwszUserName : LPCWSTR
' pwszPassword : LPCWSTR
' dwFlags : DWORD
' ppSI : ISecurityInformation** out
' pfnReadSD : PFNREADOBJECTSECURITY optional
' pfnWriteSD : PFNWRITEOBJECTSECURITY optional
' lpContext : LPARAM
Declare PtrSafe Function DSCreateISecurityInfoObjectEx Lib "dssec" ( _
    ByVal pwszObjectPath As LongPtr, _
    ByVal pwszObjectClass As LongPtr, _
    ByVal pwszServer As LongPtr, _
    ByVal pwszUserName As LongPtr, _
    ByVal pwszPassword As LongPtr, _
    ByVal dwFlags As Long, _
    ByVal ppSI As LongPtr, _
    ByVal pfnReadSD As LongPtr, _
    ByVal pfnWriteSD As LongPtr, _
    ByVal lpContext As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

DSCreateISecurityInfoObjectEx = ctypes.windll.dssec.DSCreateISecurityInfoObjectEx
DSCreateISecurityInfoObjectEx.restype = ctypes.c_int
DSCreateISecurityInfoObjectEx.argtypes = [
    wintypes.LPCWSTR,  # pwszObjectPath : LPCWSTR
    wintypes.LPCWSTR,  # pwszObjectClass : LPCWSTR
    wintypes.LPCWSTR,  # pwszServer : LPCWSTR
    wintypes.LPCWSTR,  # pwszUserName : LPCWSTR
    wintypes.LPCWSTR,  # pwszPassword : LPCWSTR
    wintypes.DWORD,  # dwFlags : DWORD
    ctypes.c_void_p,  # ppSI : ISecurityInformation** out
    ctypes.c_void_p,  # pfnReadSD : PFNREADOBJECTSECURITY optional
    ctypes.c_void_p,  # pfnWriteSD : PFNWRITEOBJECTSECURITY optional
    ctypes.c_ssize_t,  # lpContext : LPARAM
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('DSSEC.dll')
DSCreateISecurityInfoObjectEx = Fiddle::Function.new(
  lib['DSCreateISecurityInfoObjectEx'],
  [
    Fiddle::TYPE_VOIDP,  # pwszObjectPath : LPCWSTR
    Fiddle::TYPE_VOIDP,  # pwszObjectClass : LPCWSTR
    Fiddle::TYPE_VOIDP,  # pwszServer : LPCWSTR
    Fiddle::TYPE_VOIDP,  # pwszUserName : LPCWSTR
    Fiddle::TYPE_VOIDP,  # pwszPassword : LPCWSTR
    -Fiddle::TYPE_INT,  # dwFlags : DWORD
    Fiddle::TYPE_VOIDP,  # ppSI : ISecurityInformation** out
    Fiddle::TYPE_VOIDP,  # pfnReadSD : PFNREADOBJECTSECURITY optional
    Fiddle::TYPE_VOIDP,  # pfnWriteSD : PFNWRITEOBJECTSECURITY optional
    Fiddle::TYPE_INTPTR_T,  # lpContext : LPARAM
  ],
  Fiddle::TYPE_INT)
#[link(name = "dssec")]
extern "system" {
    fn DSCreateISecurityInfoObjectEx(
        pwszObjectPath: *const u16,  // LPCWSTR
        pwszObjectClass: *const u16,  // LPCWSTR
        pwszServer: *const u16,  // LPCWSTR
        pwszUserName: *const u16,  // LPCWSTR
        pwszPassword: *const u16,  // LPCWSTR
        dwFlags: u32,  // DWORD
        ppSI: *mut *mut core::ffi::c_void,  // ISecurityInformation** out
        pfnReadSD: *const core::ffi::c_void,  // PFNREADOBJECTSECURITY optional
        pfnWriteSD: *const core::ffi::c_void,  // PFNWRITEOBJECTSECURITY optional
        lpContext: isize  // LPARAM
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("DSSEC.dll")]
public static extern int DSCreateISecurityInfoObjectEx([MarshalAs(UnmanagedType.LPWStr)] string pwszObjectPath, [MarshalAs(UnmanagedType.LPWStr)] string pwszObjectClass, [MarshalAs(UnmanagedType.LPWStr)] string pwszServer, [MarshalAs(UnmanagedType.LPWStr)] string pwszUserName, [MarshalAs(UnmanagedType.LPWStr)] string pwszPassword, uint dwFlags, IntPtr ppSI, IntPtr pfnReadSD, IntPtr pfnWriteSD, IntPtr lpContext);
"@
$api = Add-Type -MemberDefinition $sig -Name 'DSSEC_DSCreateISecurityInfoObjectEx' -Namespace Win32 -PassThru
# $api::DSCreateISecurityInfoObjectEx(pwszObjectPath, pwszObjectClass, pwszServer, pwszUserName, pwszPassword, dwFlags, ppSI, pfnReadSD, pfnWriteSD, lpContext)
#uselib "DSSEC.dll"
#func global DSCreateISecurityInfoObjectEx "DSCreateISecurityInfoObjectEx" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; DSCreateISecurityInfoObjectEx pwszObjectPath, pwszObjectClass, pwszServer, pwszUserName, pwszPassword, dwFlags, ppSI, pfnReadSD, pfnWriteSD, lpContext   ; 戻り値は stat
; pwszObjectPath : LPCWSTR -> "sptr"
; pwszObjectClass : LPCWSTR -> "sptr"
; pwszServer : LPCWSTR -> "sptr"
; pwszUserName : LPCWSTR -> "sptr"
; pwszPassword : LPCWSTR -> "sptr"
; dwFlags : DWORD -> "sptr"
; ppSI : ISecurityInformation** out -> "sptr"
; pfnReadSD : PFNREADOBJECTSECURITY optional -> "sptr"
; pfnWriteSD : PFNWRITEOBJECTSECURITY optional -> "sptr"
; lpContext : LPARAM -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "DSSEC.dll"
#cfunc global DSCreateISecurityInfoObjectEx "DSCreateISecurityInfoObjectEx" wstr, wstr, wstr, wstr, wstr, int, sptr, sptr, sptr, sptr
; res = DSCreateISecurityInfoObjectEx(pwszObjectPath, pwszObjectClass, pwszServer, pwszUserName, pwszPassword, dwFlags, ppSI, pfnReadSD, pfnWriteSD, lpContext)
; pwszObjectPath : LPCWSTR -> "wstr"
; pwszObjectClass : LPCWSTR -> "wstr"
; pwszServer : LPCWSTR -> "wstr"
; pwszUserName : LPCWSTR -> "wstr"
; pwszPassword : LPCWSTR -> "wstr"
; dwFlags : DWORD -> "int"
; ppSI : ISecurityInformation** out -> "sptr"
; pfnReadSD : PFNREADOBJECTSECURITY optional -> "sptr"
; pfnWriteSD : PFNWRITEOBJECTSECURITY optional -> "sptr"
; lpContext : LPARAM -> "sptr"
; HRESULT DSCreateISecurityInfoObjectEx(LPCWSTR pwszObjectPath, LPCWSTR pwszObjectClass, LPCWSTR pwszServer, LPCWSTR pwszUserName, LPCWSTR pwszPassword, DWORD dwFlags, ISecurityInformation** ppSI, PFNREADOBJECTSECURITY pfnReadSD, PFNWRITEOBJECTSECURITY pfnWriteSD, LPARAM lpContext)
#uselib "DSSEC.dll"
#cfunc global DSCreateISecurityInfoObjectEx "DSCreateISecurityInfoObjectEx" wstr, wstr, wstr, wstr, wstr, int, intptr, intptr, intptr, intptr
; res = DSCreateISecurityInfoObjectEx(pwszObjectPath, pwszObjectClass, pwszServer, pwszUserName, pwszPassword, dwFlags, ppSI, pfnReadSD, pfnWriteSD, lpContext)
; pwszObjectPath : LPCWSTR -> "wstr"
; pwszObjectClass : LPCWSTR -> "wstr"
; pwszServer : LPCWSTR -> "wstr"
; pwszUserName : LPCWSTR -> "wstr"
; pwszPassword : LPCWSTR -> "wstr"
; dwFlags : DWORD -> "int"
; ppSI : ISecurityInformation** out -> "intptr"
; pfnReadSD : PFNREADOBJECTSECURITY optional -> "intptr"
; pfnWriteSD : PFNWRITEOBJECTSECURITY optional -> "intptr"
; lpContext : LPARAM -> "intptr"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	dssec = windows.NewLazySystemDLL("DSSEC.dll")
	procDSCreateISecurityInfoObjectEx = dssec.NewProc("DSCreateISecurityInfoObjectEx")
)

// pwszObjectPath (LPCWSTR), pwszObjectClass (LPCWSTR), pwszServer (LPCWSTR), pwszUserName (LPCWSTR), pwszPassword (LPCWSTR), dwFlags (DWORD), ppSI (ISecurityInformation** out), pfnReadSD (PFNREADOBJECTSECURITY optional), pfnWriteSD (PFNWRITEOBJECTSECURITY optional), lpContext (LPARAM)
r1, _, err := procDSCreateISecurityInfoObjectEx.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwszObjectPath))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwszObjectClass))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwszServer))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwszUserName))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwszPassword))),
	uintptr(dwFlags),
	uintptr(ppSI),
	uintptr(pfnReadSD),
	uintptr(pfnWriteSD),
	uintptr(lpContext),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function DSCreateISecurityInfoObjectEx(
  pwszObjectPath: PWideChar;   // LPCWSTR
  pwszObjectClass: PWideChar;   // LPCWSTR
  pwszServer: PWideChar;   // LPCWSTR
  pwszUserName: PWideChar;   // LPCWSTR
  pwszPassword: PWideChar;   // LPCWSTR
  dwFlags: DWORD;   // DWORD
  ppSI: Pointer;   // ISecurityInformation** out
  pfnReadSD: Pointer;   // PFNREADOBJECTSECURITY optional
  pfnWriteSD: Pointer;   // PFNWRITEOBJECTSECURITY optional
  lpContext: NativeInt   // LPARAM
): Integer; stdcall;
  external 'DSSEC.dll' name 'DSCreateISecurityInfoObjectEx';
result := DllCall("DSSEC\DSCreateISecurityInfoObjectEx"
    , "WStr", pwszObjectPath   ; LPCWSTR
    , "WStr", pwszObjectClass   ; LPCWSTR
    , "WStr", pwszServer   ; LPCWSTR
    , "WStr", pwszUserName   ; LPCWSTR
    , "WStr", pwszPassword   ; LPCWSTR
    , "UInt", dwFlags   ; DWORD
    , "Ptr", ppSI   ; ISecurityInformation** out
    , "Ptr", pfnReadSD   ; PFNREADOBJECTSECURITY optional
    , "Ptr", pfnWriteSD   ; PFNWRITEOBJECTSECURITY optional
    , "Ptr", lpContext   ; LPARAM
    , "Int")   ; return: HRESULT
●DSCreateISecurityInfoObjectEx(pwszObjectPath, pwszObjectClass, pwszServer, pwszUserName, pwszPassword, dwFlags, ppSI, pfnReadSD, pfnWriteSD, lpContext) = DLL("DSSEC.dll", "int DSCreateISecurityInfoObjectEx(char*, char*, char*, char*, char*, dword, void*, void*, void*, int)")
# 呼び出し: DSCreateISecurityInfoObjectEx(pwszObjectPath, pwszObjectClass, pwszServer, pwszUserName, pwszPassword, dwFlags, ppSI, pfnReadSD, pfnWriteSD, lpContext)
# pwszObjectPath : LPCWSTR -> "char*"
# pwszObjectClass : LPCWSTR -> "char*"
# pwszServer : LPCWSTR -> "char*"
# pwszUserName : LPCWSTR -> "char*"
# pwszPassword : LPCWSTR -> "char*"
# dwFlags : DWORD -> "dword"
# ppSI : ISecurityInformation** out -> "void*"
# pfnReadSD : PFNREADOBJECTSECURITY optional -> "void*"
# pfnWriteSD : PFNWRITEOBJECTSECURITY optional -> "void*"
# lpContext : LPARAM -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "dssec" fn DSCreateISecurityInfoObjectEx(
    pwszObjectPath: [*c]const u16, // LPCWSTR
    pwszObjectClass: [*c]const u16, // LPCWSTR
    pwszServer: [*c]const u16, // LPCWSTR
    pwszUserName: [*c]const u16, // LPCWSTR
    pwszPassword: [*c]const u16, // LPCWSTR
    dwFlags: u32, // DWORD
    ppSI: ?*anyopaque, // ISecurityInformation** out
    pfnReadSD: ?*anyopaque, // PFNREADOBJECTSECURITY optional
    pfnWriteSD: ?*anyopaque, // PFNWRITEOBJECTSECURITY optional
    lpContext: isize // LPARAM
) callconv(std.os.windows.WINAPI) i32;
proc DSCreateISecurityInfoObjectEx(
    pwszObjectPath: WideCString,  # LPCWSTR
    pwszObjectClass: WideCString,  # LPCWSTR
    pwszServer: WideCString,  # LPCWSTR
    pwszUserName: WideCString,  # LPCWSTR
    pwszPassword: WideCString,  # LPCWSTR
    dwFlags: uint32,  # DWORD
    ppSI: pointer,  # ISecurityInformation** out
    pfnReadSD: pointer,  # PFNREADOBJECTSECURITY optional
    pfnWriteSD: pointer,  # PFNWRITEOBJECTSECURITY optional
    lpContext: int  # LPARAM
): int32 {.importc: "DSCreateISecurityInfoObjectEx", stdcall, dynlib: "DSSEC.dll".}
pragma(lib, "dssec");
extern(Windows)
int DSCreateISecurityInfoObjectEx(
    const(wchar)* pwszObjectPath,   // LPCWSTR
    const(wchar)* pwszObjectClass,   // LPCWSTR
    const(wchar)* pwszServer,   // LPCWSTR
    const(wchar)* pwszUserName,   // LPCWSTR
    const(wchar)* pwszPassword,   // LPCWSTR
    uint dwFlags,   // DWORD
    void* ppSI,   // ISecurityInformation** out
    void* pfnReadSD,   // PFNREADOBJECTSECURITY optional
    void* pfnWriteSD,   // PFNWRITEOBJECTSECURITY optional
    ptrdiff_t lpContext   // LPARAM
);
ccall((:DSCreateISecurityInfoObjectEx, "DSSEC.dll"), stdcall, Int32,
      (Cwstring, Cwstring, Cwstring, Cwstring, Cwstring, UInt32, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Int),
      pwszObjectPath, pwszObjectClass, pwszServer, pwszUserName, pwszPassword, dwFlags, ppSI, pfnReadSD, pfnWriteSD, lpContext)
# pwszObjectPath : LPCWSTR -> Cwstring
# pwszObjectClass : LPCWSTR -> Cwstring
# pwszServer : LPCWSTR -> Cwstring
# pwszUserName : LPCWSTR -> Cwstring
# pwszPassword : LPCWSTR -> Cwstring
# dwFlags : DWORD -> UInt32
# ppSI : ISecurityInformation** out -> Ptr{Cvoid}
# pfnReadSD : PFNREADOBJECTSECURITY optional -> Ptr{Cvoid}
# pfnWriteSD : PFNWRITEOBJECTSECURITY optional -> Ptr{Cvoid}
# lpContext : LPARAM -> Int
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t DSCreateISecurityInfoObjectEx(
    const uint16_t* pwszObjectPath,
    const uint16_t* pwszObjectClass,
    const uint16_t* pwszServer,
    const uint16_t* pwszUserName,
    const uint16_t* pwszPassword,
    uint32_t dwFlags,
    void* ppSI,
    void* pfnReadSD,
    void* pfnWriteSD,
    intptr_t lpContext);
]]
local dssec = ffi.load("dssec")
-- dssec.DSCreateISecurityInfoObjectEx(pwszObjectPath, pwszObjectClass, pwszServer, pwszUserName, pwszPassword, dwFlags, ppSI, pfnReadSD, pfnWriteSD, lpContext)
-- pwszObjectPath : LPCWSTR
-- pwszObjectClass : LPCWSTR
-- pwszServer : LPCWSTR
-- pwszUserName : LPCWSTR
-- pwszPassword : LPCWSTR
-- dwFlags : DWORD
-- ppSI : ISecurityInformation** out
-- pfnReadSD : PFNREADOBJECTSECURITY optional
-- pfnWriteSD : PFNWRITEOBJECTSECURITY optional
-- lpContext : LPARAM
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('DSSEC.dll');
const DSCreateISecurityInfoObjectEx = lib.func('__stdcall', 'DSCreateISecurityInfoObjectEx', 'int32_t', ['str16', 'str16', 'str16', 'str16', 'str16', 'uint32_t', 'void *', 'void *', 'void *', 'intptr_t']);
// DSCreateISecurityInfoObjectEx(pwszObjectPath, pwszObjectClass, pwszServer, pwszUserName, pwszPassword, dwFlags, ppSI, pfnReadSD, pfnWriteSD, lpContext)
// pwszObjectPath : LPCWSTR -> 'str16'
// pwszObjectClass : LPCWSTR -> 'str16'
// pwszServer : LPCWSTR -> 'str16'
// pwszUserName : LPCWSTR -> 'str16'
// pwszPassword : LPCWSTR -> 'str16'
// dwFlags : DWORD -> 'uint32_t'
// ppSI : ISecurityInformation** out -> 'void *'
// pfnReadSD : PFNREADOBJECTSECURITY optional -> 'void *'
// pfnWriteSD : PFNWRITEOBJECTSECURITY optional -> 'void *'
// lpContext : LPARAM -> 'intptr_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
// コールバック(関数ポインタ)は koffi.proto/koffi.register で型を定義して渡す(素の void* では JS 関数を渡せない)。
const lib = Deno.dlopen("DSSEC.dll", {
  DSCreateISecurityInfoObjectEx: { parameters: ["buffer", "buffer", "buffer", "buffer", "buffer", "u32", "pointer", "pointer", "pointer", "isize"], result: "i32" },
});
// lib.symbols.DSCreateISecurityInfoObjectEx(pwszObjectPath, pwszObjectClass, pwszServer, pwszUserName, pwszPassword, dwFlags, ppSI, pfnReadSD, pfnWriteSD, lpContext)
// pwszObjectPath : LPCWSTR -> "buffer"
// pwszObjectClass : LPCWSTR -> "buffer"
// pwszServer : LPCWSTR -> "buffer"
// pwszUserName : LPCWSTR -> "buffer"
// pwszPassword : LPCWSTR -> "buffer"
// dwFlags : DWORD -> "u32"
// ppSI : ISecurityInformation** out -> "pointer"
// pfnReadSD : PFNREADOBJECTSECURITY optional -> "pointer"
// pfnWriteSD : PFNWRITEOBJECTSECURITY optional -> "pointer"
// lpContext : LPARAM -> "isize"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t DSCreateISecurityInfoObjectEx(
    const uint16_t* pwszObjectPath,
    const uint16_t* pwszObjectClass,
    const uint16_t* pwszServer,
    const uint16_t* pwszUserName,
    const uint16_t* pwszPassword,
    uint32_t dwFlags,
    void* ppSI,
    void* pfnReadSD,
    void* pfnWriteSD,
    intptr_t lpContext);
C, "DSSEC.dll");
// $ffi->DSCreateISecurityInfoObjectEx(pwszObjectPath, pwszObjectClass, pwszServer, pwszUserName, pwszPassword, dwFlags, ppSI, pfnReadSD, pfnWriteSD, lpContext);
// pwszObjectPath : LPCWSTR
// pwszObjectClass : LPCWSTR
// pwszServer : LPCWSTR
// pwszUserName : LPCWSTR
// pwszPassword : LPCWSTR
// dwFlags : DWORD
// ppSI : ISecurityInformation** out
// pfnReadSD : PFNREADOBJECTSECURITY optional
// pfnWriteSD : PFNWRITEOBJECTSECURITY optional
// lpContext : LPARAM
// 構造体/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 Dssec extends StdCallLibrary {
    Dssec INSTANCE = Native.load("dssec", Dssec.class);
    int DSCreateISecurityInfoObjectEx(
        WString pwszObjectPath,   // LPCWSTR
        WString pwszObjectClass,   // LPCWSTR
        WString pwszServer,   // LPCWSTR
        WString pwszUserName,   // LPCWSTR
        WString pwszPassword,   // LPCWSTR
        int dwFlags,   // DWORD
        Pointer ppSI,   // ISecurityInformation** out
        Callback pfnReadSD,   // PFNREADOBJECTSECURITY optional
        Callback pfnWriteSD,   // PFNWRITEOBJECTSECURITY optional
        long lpContext   // LPARAM
    );
}
@[Link("dssec")]
lib LibDSSEC
  fun DSCreateISecurityInfoObjectEx = DSCreateISecurityInfoObjectEx(
    pwszObjectPath : UInt16*,   # LPCWSTR
    pwszObjectClass : UInt16*,   # LPCWSTR
    pwszServer : UInt16*,   # LPCWSTR
    pwszUserName : UInt16*,   # LPCWSTR
    pwszPassword : UInt16*,   # LPCWSTR
    dwFlags : UInt32,   # DWORD
    ppSI : Void*,   # ISecurityInformation** out
    pfnReadSD : Void*,   # PFNREADOBJECTSECURITY optional
    pfnWriteSD : Void*,   # PFNWRITEOBJECTSECURITY optional
    lpContext : LibC::SSizeT   # LPARAM
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef DSCreateISecurityInfoObjectExNative = Int32 Function(Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Uint32, Pointer<Void>, Pointer<Void>, Pointer<Void>, IntPtr);
typedef DSCreateISecurityInfoObjectExDart = int Function(Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, int, Pointer<Void>, Pointer<Void>, Pointer<Void>, int);
final DSCreateISecurityInfoObjectEx = DynamicLibrary.open('DSSEC.dll')
    .lookupFunction<DSCreateISecurityInfoObjectExNative, DSCreateISecurityInfoObjectExDart>('DSCreateISecurityInfoObjectEx');
// pwszObjectPath : LPCWSTR -> Pointer<Utf16>
// pwszObjectClass : LPCWSTR -> Pointer<Utf16>
// pwszServer : LPCWSTR -> Pointer<Utf16>
// pwszUserName : LPCWSTR -> Pointer<Utf16>
// pwszPassword : LPCWSTR -> Pointer<Utf16>
// dwFlags : DWORD -> Uint32
// ppSI : ISecurityInformation** out -> Pointer<Void>
// pfnReadSD : PFNREADOBJECTSECURITY optional -> Pointer<Void>
// pfnWriteSD : PFNWRITEOBJECTSECURITY optional -> Pointer<Void>
// lpContext : LPARAM -> IntPtr
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function DSCreateISecurityInfoObjectEx(
  pwszObjectPath: PWideChar;   // LPCWSTR
  pwszObjectClass: PWideChar;   // LPCWSTR
  pwszServer: PWideChar;   // LPCWSTR
  pwszUserName: PWideChar;   // LPCWSTR
  pwszPassword: PWideChar;   // LPCWSTR
  dwFlags: DWORD;   // DWORD
  ppSI: Pointer;   // ISecurityInformation** out
  pfnReadSD: Pointer;   // PFNREADOBJECTSECURITY optional
  pfnWriteSD: Pointer;   // PFNWRITEOBJECTSECURITY optional
  lpContext: NativeInt   // LPARAM
): Integer; stdcall;
  external 'DSSEC.dll' name 'DSCreateISecurityInfoObjectEx';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "DSCreateISecurityInfoObjectEx"
  c_DSCreateISecurityInfoObjectEx :: CWString -> CWString -> CWString -> CWString -> CWString -> Word32 -> Ptr () -> Ptr () -> Ptr () -> CIntPtr -> IO Int32
-- pwszObjectPath : LPCWSTR -> CWString
-- pwszObjectClass : LPCWSTR -> CWString
-- pwszServer : LPCWSTR -> CWString
-- pwszUserName : LPCWSTR -> CWString
-- pwszPassword : LPCWSTR -> CWString
-- dwFlags : DWORD -> Word32
-- ppSI : ISecurityInformation** out -> Ptr ()
-- pfnReadSD : PFNREADOBJECTSECURITY optional -> Ptr ()
-- pfnWriteSD : PFNWRITEOBJECTSECURITY optional -> Ptr ()
-- lpContext : LPARAM -> CIntPtr
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let dscreateisecurityinfoobjectex =
  foreign "DSCreateISecurityInfoObjectEx"
    ((ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> uint32_t @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> intptr_t @-> returning int32_t)
(* pwszObjectPath : LPCWSTR -> (ptr uint16_t) *)
(* pwszObjectClass : LPCWSTR -> (ptr uint16_t) *)
(* pwszServer : LPCWSTR -> (ptr uint16_t) *)
(* pwszUserName : LPCWSTR -> (ptr uint16_t) *)
(* pwszPassword : LPCWSTR -> (ptr uint16_t) *)
(* dwFlags : DWORD -> uint32_t *)
(* ppSI : ISecurityInformation** out -> (ptr void) *)
(* pfnReadSD : PFNREADOBJECTSECURITY optional -> (ptr void) *)
(* pfnWriteSD : PFNWRITEOBJECTSECURITY optional -> (ptr void) *)
(* lpContext : LPARAM -> intptr_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library dssec (t "DSSEC.dll"))
(cffi:use-foreign-library dssec)

(cffi:defcfun ("DSCreateISecurityInfoObjectEx" dscreate-isecurity-info-object-ex :convention :stdcall) :int32
  (pwsz-object-path (:string :encoding :utf-16le))   ; LPCWSTR
  (pwsz-object-class (:string :encoding :utf-16le))   ; LPCWSTR
  (pwsz-server (:string :encoding :utf-16le))   ; LPCWSTR
  (pwsz-user-name (:string :encoding :utf-16le))   ; LPCWSTR
  (pwsz-password (:string :encoding :utf-16le))   ; LPCWSTR
  (dw-flags :uint32)   ; DWORD
  (pp-si :pointer)   ; ISecurityInformation** out
  (pfn-read-sd :pointer)   ; PFNREADOBJECTSECURITY optional
  (pfn-write-sd :pointer)   ; PFNWRITEOBJECTSECURITY optional
  (lp-context :int64))   ; LPARAM
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $DSCreateISecurityInfoObjectEx = Win32::API::More->new('DSSEC',
    'int DSCreateISecurityInfoObjectEx(LPCWSTR pwszObjectPath, LPCWSTR pwszObjectClass, LPCWSTR pwszServer, LPCWSTR pwszUserName, LPCWSTR pwszPassword, DWORD dwFlags, LPVOID ppSI, LPVOID pfnReadSD, LPVOID pfnWriteSD, LPARAM lpContext)');
# my $ret = $DSCreateISecurityInfoObjectEx->Call($pwszObjectPath, $pwszObjectClass, $pwszServer, $pwszUserName, $pwszPassword, $dwFlags, $ppSI, $pfnReadSD, $pfnWriteSD, $lpContext);
# pwszObjectPath : LPCWSTR -> LPCWSTR
# pwszObjectClass : LPCWSTR -> LPCWSTR
# pwszServer : LPCWSTR -> LPCWSTR
# pwszUserName : LPCWSTR -> LPCWSTR
# pwszPassword : LPCWSTR -> LPCWSTR
# dwFlags : DWORD -> DWORD
# ppSI : ISecurityInformation** out -> LPVOID
# pfnReadSD : PFNREADOBJECTSECURITY optional -> LPVOID
# pfnWriteSD : PFNWRITEOBJECTSECURITY optional -> LPVOID
# lpContext : LPARAM -> LPARAM
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# コールバック(関数ポインタ)は Perl sub を直接渡せません。Win32::API::Callback を使用してください。

関連項目

類似 API
使用する型