ホーム › Security.Authentication.Identity › SECPKG_APP_MODE_INFO
SECPKG_APP_MODE_INFO
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| UserFunction | DWORD | 4 | +0 | +0 | ユーザーモードで呼び出す関数を示す識別子値。 |
| Argument1 | UINT_PTR | 8/4 | +8 | +4 | 呼び出し関数へ渡す第1引数(ポインタサイズ整数)。 |
| Argument2 | UINT_PTR | 8/4 | +16 | +8 | 呼び出し関数へ渡す第2引数(ポインタサイズ整数)。 |
| UserData | SecBuffer | 16/12 | +24 | +12 | 関数とやり取りするデータを保持するSecBuffer。 |
| ReturnToLsa | BOOLEAN | 1 | +40 | +24 | 処理後にLSAへ制御を返すかを示す真偽値。 |
各言語での定義
#include <windows.h>
// SecBuffer (x64 16 / x86 12 バイト)
typedef struct SecBuffer {
DWORD cbBuffer;
DWORD BufferType;
void* pvBuffer;
} SecBuffer;
// SECPKG_APP_MODE_INFO (x64 48 / x86 28 バイト)
typedef struct SECPKG_APP_MODE_INFO {
DWORD UserFunction;
UINT_PTR Argument1;
UINT_PTR Argument2;
SecBuffer UserData;
BOOLEAN ReturnToLsa;
} SECPKG_APP_MODE_INFO;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SecBuffer
{
public uint cbBuffer;
public uint BufferType;
public IntPtr pvBuffer;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SECPKG_APP_MODE_INFO
{
public uint UserFunction;
public UIntPtr Argument1;
public UIntPtr Argument2;
public SecBuffer UserData;
[MarshalAs(UnmanagedType.U1)] public bool ReturnToLsa;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SecBuffer
Public cbBuffer As UInteger
Public BufferType As UInteger
Public pvBuffer As IntPtr
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SECPKG_APP_MODE_INFO
Public UserFunction As UInteger
Public Argument1 As UIntPtr
Public Argument2 As UIntPtr
Public UserData As SecBuffer
<MarshalAs(UnmanagedType.U1)> Public ReturnToLsa As Boolean
End Structureimport ctypes
from ctypes import wintypes
class SecBuffer(ctypes.Structure):
_fields_ = [
("cbBuffer", wintypes.DWORD),
("BufferType", wintypes.DWORD),
("pvBuffer", ctypes.c_void_p),
]
class SECPKG_APP_MODE_INFO(ctypes.Structure):
_fields_ = [
("UserFunction", wintypes.DWORD),
("Argument1", ctypes.c_size_t),
("Argument2", ctypes.c_size_t),
("UserData", SecBuffer),
("ReturnToLsa", ctypes.c_byte),
]#[repr(C)]
pub struct SecBuffer {
pub cbBuffer: u32,
pub BufferType: u32,
pub pvBuffer: *mut core::ffi::c_void,
}
#[repr(C)]
pub struct SECPKG_APP_MODE_INFO {
pub UserFunction: u32,
pub Argument1: usize,
pub Argument2: usize,
pub UserData: SecBuffer,
pub ReturnToLsa: u8,
}import "golang.org/x/sys/windows"
type SecBuffer struct {
cbBuffer uint32
BufferType uint32
pvBuffer uintptr
}
type SECPKG_APP_MODE_INFO struct {
UserFunction uint32
Argument1 uintptr
Argument2 uintptr
UserData SecBuffer
ReturnToLsa byte
}type
SecBuffer = record
cbBuffer: DWORD;
BufferType: DWORD;
pvBuffer: Pointer;
end;
SECPKG_APP_MODE_INFO = record
UserFunction: DWORD;
Argument1: NativeUInt;
Argument2: NativeUInt;
UserData: SecBuffer;
ReturnToLsa: ByteBool;
end;const SecBuffer = extern struct {
cbBuffer: u32,
BufferType: u32,
pvBuffer: ?*anyopaque,
};
const SECPKG_APP_MODE_INFO = extern struct {
UserFunction: u32,
Argument1: usize,
Argument2: usize,
UserData: SecBuffer,
ReturnToLsa: u8,
};type
SecBuffer {.bycopy.} = object
cbBuffer: uint32
BufferType: uint32
pvBuffer: pointer
SECPKG_APP_MODE_INFO {.bycopy.} = object
UserFunction: uint32
Argument1: uint
Argument2: uint
UserData: SecBuffer
ReturnToLsa: uint8struct SecBuffer
{
uint cbBuffer;
uint BufferType;
void* pvBuffer;
}
struct SECPKG_APP_MODE_INFO
{
uint UserFunction;
size_t Argument1;
size_t Argument2;
SecBuffer UserData;
ubyte ReturnToLsa;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SECPKG_APP_MODE_INFO サイズ: 28 バイト(x86)
dim st, 7 ; 4byte整数×7(構造体サイズ 28 / 4 切り上げ)
; UserFunction : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; Argument1 : UINT_PTR (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; Argument2 : UINT_PTR (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; UserData : SecBuffer (+12, 12byte) varptr(st)+12 を基点に操作(12byte:入れ子/配列)
; ReturnToLsa : BOOLEAN (+24, 1byte) poke st,24,値 / 値 = peek(st,24)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SECPKG_APP_MODE_INFO サイズ: 48 バイト(x64)
dim st, 12 ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; UserFunction : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; Argument1 : UINT_PTR (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; Argument2 : UINT_PTR (+16, 8byte) qpoke st,16,値 / qpeek(st,16) ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; UserData : SecBuffer (+24, 16byte) varptr(st)+24 を基点に操作(16byte:入れ子/配列)
; ReturnToLsa : BOOLEAN (+40, 1byte) poke st,40,値 / 値 = peek(st,40)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global SecBuffer
#field int cbBuffer
#field int BufferType
#field intptr pvBuffer
#endstruct
#defstruct global SECPKG_APP_MODE_INFO
#field int UserFunction
#field intptr Argument1
#field intptr Argument2
#field SecBuffer UserData
#field bool1 ReturnToLsa
#endstruct
stdim st, SECPKG_APP_MODE_INFO ; NSTRUCT 変数を確保
st->UserFunction = 100
mes "UserFunction=" + st->UserFunction