ホーム › Security.Authorization › EXPLICIT_ACCESS_A
EXPLICIT_ACCESS_A
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| grfAccessPermissions | DWORD | 4 | +0 | +0 | 付与または拒否するアクセス権のビットマスク。 |
| grfAccessMode | ACCESS_MODE | 4 | +4 | +4 | アクセスの許可/拒否/監査等を示すACCESS_MODE値。 |
| grfInheritance | ACE_FLAGS | 4 | +8 | +8 | 子オブジェクトへの継承方法を示すACE_FLAGSビット値。 |
| Trustee | TRUSTEE_A | 32/20 | +16 | +12 | アクセス権が適用される対象トラスティ(ANSI)。 |
各言語での定義
#include <windows.h>
// TRUSTEE_A (x64 32 / x86 20 バイト)
typedef struct TRUSTEE_A {
TRUSTEE_A* pMultipleTrustee;
MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation;
TRUSTEE_FORM TrusteeForm;
TRUSTEE_TYPE TrusteeType;
LPSTR ptstrName;
} TRUSTEE_A;
// EXPLICIT_ACCESS_A (x64 48 / x86 32 バイト)
typedef struct EXPLICIT_ACCESS_A {
DWORD grfAccessPermissions;
ACCESS_MODE grfAccessMode;
ACE_FLAGS grfInheritance;
TRUSTEE_A Trustee;
} EXPLICIT_ACCESS_A;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TRUSTEE_A
{
public IntPtr pMultipleTrustee;
public int MultipleTrusteeOperation;
public int TrusteeForm;
public int TrusteeType;
public IntPtr ptstrName;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct EXPLICIT_ACCESS_A
{
public uint grfAccessPermissions;
public int grfAccessMode;
public uint grfInheritance;
public TRUSTEE_A Trustee;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TRUSTEE_A
Public pMultipleTrustee As IntPtr
Public MultipleTrusteeOperation As Integer
Public TrusteeForm As Integer
Public TrusteeType As Integer
Public ptstrName As IntPtr
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure EXPLICIT_ACCESS_A
Public grfAccessPermissions As UInteger
Public grfAccessMode As Integer
Public grfInheritance As UInteger
Public Trustee As TRUSTEE_A
End Structureimport ctypes
from ctypes import wintypes
class TRUSTEE_A(ctypes.Structure):
_fields_ = [
("pMultipleTrustee", ctypes.c_void_p),
("MultipleTrusteeOperation", ctypes.c_int),
("TrusteeForm", ctypes.c_int),
("TrusteeType", ctypes.c_int),
("ptstrName", ctypes.c_void_p),
]
class EXPLICIT_ACCESS_A(ctypes.Structure):
_fields_ = [
("grfAccessPermissions", wintypes.DWORD),
("grfAccessMode", ctypes.c_int),
("grfInheritance", wintypes.DWORD),
("Trustee", TRUSTEE_A),
]#[repr(C)]
pub struct TRUSTEE_A {
pub pMultipleTrustee: *mut core::ffi::c_void,
pub MultipleTrusteeOperation: i32,
pub TrusteeForm: i32,
pub TrusteeType: i32,
pub ptstrName: *mut core::ffi::c_void,
}
#[repr(C)]
pub struct EXPLICIT_ACCESS_A {
pub grfAccessPermissions: u32,
pub grfAccessMode: i32,
pub grfInheritance: u32,
pub Trustee: TRUSTEE_A,
}import "golang.org/x/sys/windows"
type TRUSTEE_A struct {
pMultipleTrustee uintptr
MultipleTrusteeOperation int32
TrusteeForm int32
TrusteeType int32
ptstrName uintptr
}
type EXPLICIT_ACCESS_A struct {
grfAccessPermissions uint32
grfAccessMode int32
grfInheritance uint32
Trustee TRUSTEE_A
}type
TRUSTEE_A = record
pMultipleTrustee: Pointer;
MultipleTrusteeOperation: Integer;
TrusteeForm: Integer;
TrusteeType: Integer;
ptstrName: Pointer;
end;
EXPLICIT_ACCESS_A = record
grfAccessPermissions: DWORD;
grfAccessMode: Integer;
grfInheritance: DWORD;
Trustee: TRUSTEE_A;
end;const TRUSTEE_A = extern struct {
pMultipleTrustee: ?*anyopaque,
MultipleTrusteeOperation: i32,
TrusteeForm: i32,
TrusteeType: i32,
ptstrName: ?*anyopaque,
};
const EXPLICIT_ACCESS_A = extern struct {
grfAccessPermissions: u32,
grfAccessMode: i32,
grfInheritance: u32,
Trustee: TRUSTEE_A,
};type
TRUSTEE_A {.bycopy.} = object
pMultipleTrustee: pointer
MultipleTrusteeOperation: int32
TrusteeForm: int32
TrusteeType: int32
ptstrName: pointer
EXPLICIT_ACCESS_A {.bycopy.} = object
grfAccessPermissions: uint32
grfAccessMode: int32
grfInheritance: uint32
Trustee: TRUSTEE_Astruct TRUSTEE_A
{
void* pMultipleTrustee;
int MultipleTrusteeOperation;
int TrusteeForm;
int TrusteeType;
void* ptstrName;
}
struct EXPLICIT_ACCESS_A
{
uint grfAccessPermissions;
int grfAccessMode;
uint grfInheritance;
TRUSTEE_A Trustee;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; EXPLICIT_ACCESS_A サイズ: 32 バイト(x86)
dim st, 8 ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; grfAccessPermissions : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; grfAccessMode : ACCESS_MODE (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; grfInheritance : ACE_FLAGS (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; Trustee : TRUSTEE_A (+12, 20byte) varptr(st)+12 を基点に操作(20byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; EXPLICIT_ACCESS_A サイズ: 48 バイト(x64)
dim st, 12 ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; grfAccessPermissions : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; grfAccessMode : ACCESS_MODE (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; grfInheritance : ACE_FLAGS (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; Trustee : TRUSTEE_A (+16, 32byte) varptr(st)+16 を基点に操作(32byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global TRUSTEE_A
#field intptr pMultipleTrustee
#field int MultipleTrusteeOperation
#field int TrusteeForm
#field int TrusteeType
#field intptr ptstrName
#endstruct
#defstruct global EXPLICIT_ACCESS_A
#field int grfAccessPermissions
#field int grfAccessMode
#field int grfInheritance
#field TRUSTEE_A Trustee
#endstruct
stdim st, EXPLICIT_ACCESS_A ; NSTRUCT 変数を確保
st->grfAccessPermissions = 100
mes "grfAccessPermissions=" + st->grfAccessPermissions