ホーム › System.Iis › EXTENSION_CONTROL_BLOCK
EXTENSION_CONTROL_BLOCK
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| cbSize | DWORD | 4 | +0 | +0 | この構造体のバイトサイズを示すDWORDである。 |
| dwVersion | DWORD | 4 | +4 | +4 | ISAPI仕様のバージョン番号を示すDWORDである。 |
| ConnID | HCONN | 8/4 | +8 | +8 | サーバーが割り当てた接続ID(HCONN)である。 |
| dwHttpStatusCode | DWORD | 4 | +16 | +12 | 応答のHTTPステータスコードを示すDWORDである。 |
| lpszLogData | CHAR | 80 | +20 | +16 | ログに記録する追加データを格納するCHAR配列である。 |
| lpszMethod | LPSTR | 8/4 | +104 | +96 | リクエストのHTTPメソッド(GET/POST等)を示すLPSTRである。 |
| lpszQueryString | LPSTR | 8/4 | +112 | +100 | URLのクエリ文字列を示すLPSTRである。 |
| lpszPathInfo | LPSTR | 8/4 | +120 | +104 | 追加のパス情報を示すLPSTRである。 |
| lpszPathTranslated | LPSTR | 8/4 | +128 | +108 | 物理パスに変換されたパスを示すLPSTRである。 |
| cbTotalBytes | DWORD | 4 | +136 | +112 | クライアントから送られる総バイト数を示すDWORDである。 |
| cbAvailable | DWORD | 4 | +140 | +116 | lpbDataで即座に利用可能なバイト数を示すDWORDである。 |
| lpbData | BYTE* | 8/4 | +144 | +120 | 受信済みデータの先頭へのポインタ(BYTE*)である。 |
| lpszContentType | LPSTR | 8/4 | +152 | +124 | リクエストボディのコンテンツタイプを示すLPSTRである。 |
| GetServerVariable | PFN_IIS_GETSERVERVARIABLE | 8/4 | +160 | +128 | サーバー変数を取得する関数ポインタである。 |
| WriteClient | PFN_IIS_WRITECLIENT | 8/4 | +168 | +132 | クライアントへデータを書き込む関数ポインタである。 |
| ReadClient | PFN_IIS_READCLIENT | 8/4 | +176 | +136 | クライアントからデータを読み取る関数ポインタである。 |
| ServerSupportFunction | PFN_IIS_SERVERSUPPORTFUNCTION | 8/4 | +184 | +140 | 各種サーバー支援機能を呼び出す関数ポインタである。 |
各言語での定義
#include <windows.h>
// EXTENSION_CONTROL_BLOCK (x64 192 / x86 144 バイト)
typedef struct EXTENSION_CONTROL_BLOCK {
DWORD cbSize;
DWORD dwVersion;
HCONN ConnID;
DWORD dwHttpStatusCode;
CHAR lpszLogData[80];
LPSTR lpszMethod;
LPSTR lpszQueryString;
LPSTR lpszPathInfo;
LPSTR lpszPathTranslated;
DWORD cbTotalBytes;
DWORD cbAvailable;
BYTE* lpbData;
LPSTR lpszContentType;
PFN_IIS_GETSERVERVARIABLE GetServerVariable;
PFN_IIS_WRITECLIENT WriteClient;
PFN_IIS_READCLIENT ReadClient;
PFN_IIS_SERVERSUPPORTFUNCTION ServerSupportFunction;
} EXTENSION_CONTROL_BLOCK;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct EXTENSION_CONTROL_BLOCK
{
public uint cbSize;
public uint dwVersion;
public IntPtr ConnID;
public uint dwHttpStatusCode;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)] public sbyte[] lpszLogData;
public IntPtr lpszMethod;
public IntPtr lpszQueryString;
public IntPtr lpszPathInfo;
public IntPtr lpszPathTranslated;
public uint cbTotalBytes;
public uint cbAvailable;
public IntPtr lpbData;
public IntPtr lpszContentType;
public IntPtr GetServerVariable;
public IntPtr WriteClient;
public IntPtr ReadClient;
public IntPtr ServerSupportFunction;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure EXTENSION_CONTROL_BLOCK
Public cbSize As UInteger
Public dwVersion As UInteger
Public ConnID As IntPtr
Public dwHttpStatusCode As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=80)> Public lpszLogData() As SByte
Public lpszMethod As IntPtr
Public lpszQueryString As IntPtr
Public lpszPathInfo As IntPtr
Public lpszPathTranslated As IntPtr
Public cbTotalBytes As UInteger
Public cbAvailable As UInteger
Public lpbData As IntPtr
Public lpszContentType As IntPtr
Public GetServerVariable As IntPtr
Public WriteClient As IntPtr
Public ReadClient As IntPtr
Public ServerSupportFunction As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class EXTENSION_CONTROL_BLOCK(ctypes.Structure):
_fields_ = [
("cbSize", wintypes.DWORD),
("dwVersion", wintypes.DWORD),
("ConnID", ctypes.c_void_p),
("dwHttpStatusCode", wintypes.DWORD),
("lpszLogData", ctypes.c_byte * 80),
("lpszMethod", ctypes.c_void_p),
("lpszQueryString", ctypes.c_void_p),
("lpszPathInfo", ctypes.c_void_p),
("lpszPathTranslated", ctypes.c_void_p),
("cbTotalBytes", wintypes.DWORD),
("cbAvailable", wintypes.DWORD),
("lpbData", ctypes.c_void_p),
("lpszContentType", ctypes.c_void_p),
("GetServerVariable", ctypes.c_void_p),
("WriteClient", ctypes.c_void_p),
("ReadClient", ctypes.c_void_p),
("ServerSupportFunction", ctypes.c_void_p),
]#[repr(C)]
pub struct EXTENSION_CONTROL_BLOCK {
pub cbSize: u32,
pub dwVersion: u32,
pub ConnID: *mut core::ffi::c_void,
pub dwHttpStatusCode: u32,
pub lpszLogData: [i8; 80],
pub lpszMethod: *mut core::ffi::c_void,
pub lpszQueryString: *mut core::ffi::c_void,
pub lpszPathInfo: *mut core::ffi::c_void,
pub lpszPathTranslated: *mut core::ffi::c_void,
pub cbTotalBytes: u32,
pub cbAvailable: u32,
pub lpbData: *mut core::ffi::c_void,
pub lpszContentType: *mut core::ffi::c_void,
pub GetServerVariable: *mut core::ffi::c_void,
pub WriteClient: *mut core::ffi::c_void,
pub ReadClient: *mut core::ffi::c_void,
pub ServerSupportFunction: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type EXTENSION_CONTROL_BLOCK struct {
cbSize uint32
dwVersion uint32
ConnID uintptr
dwHttpStatusCode uint32
lpszLogData [80]int8
lpszMethod uintptr
lpszQueryString uintptr
lpszPathInfo uintptr
lpszPathTranslated uintptr
cbTotalBytes uint32
cbAvailable uint32
lpbData uintptr
lpszContentType uintptr
GetServerVariable uintptr
WriteClient uintptr
ReadClient uintptr
ServerSupportFunction uintptr
}type
EXTENSION_CONTROL_BLOCK = record
cbSize: DWORD;
dwVersion: DWORD;
ConnID: Pointer;
dwHttpStatusCode: DWORD;
lpszLogData: array[0..79] of Shortint;
lpszMethod: Pointer;
lpszQueryString: Pointer;
lpszPathInfo: Pointer;
lpszPathTranslated: Pointer;
cbTotalBytes: DWORD;
cbAvailable: DWORD;
lpbData: Pointer;
lpszContentType: Pointer;
GetServerVariable: Pointer;
WriteClient: Pointer;
ReadClient: Pointer;
ServerSupportFunction: Pointer;
end;const EXTENSION_CONTROL_BLOCK = extern struct {
cbSize: u32,
dwVersion: u32,
ConnID: ?*anyopaque,
dwHttpStatusCode: u32,
lpszLogData: [80]i8,
lpszMethod: ?*anyopaque,
lpszQueryString: ?*anyopaque,
lpszPathInfo: ?*anyopaque,
lpszPathTranslated: ?*anyopaque,
cbTotalBytes: u32,
cbAvailable: u32,
lpbData: ?*anyopaque,
lpszContentType: ?*anyopaque,
GetServerVariable: ?*anyopaque,
WriteClient: ?*anyopaque,
ReadClient: ?*anyopaque,
ServerSupportFunction: ?*anyopaque,
};type
EXTENSION_CONTROL_BLOCK {.bycopy.} = object
cbSize: uint32
dwVersion: uint32
ConnID: pointer
dwHttpStatusCode: uint32
lpszLogData: array[80, int8]
lpszMethod: pointer
lpszQueryString: pointer
lpszPathInfo: pointer
lpszPathTranslated: pointer
cbTotalBytes: uint32
cbAvailable: uint32
lpbData: pointer
lpszContentType: pointer
GetServerVariable: pointer
WriteClient: pointer
ReadClient: pointer
ServerSupportFunction: pointerstruct EXTENSION_CONTROL_BLOCK
{
uint cbSize;
uint dwVersion;
void* ConnID;
uint dwHttpStatusCode;
byte[80] lpszLogData;
void* lpszMethod;
void* lpszQueryString;
void* lpszPathInfo;
void* lpszPathTranslated;
uint cbTotalBytes;
uint cbAvailable;
void* lpbData;
void* lpszContentType;
void* GetServerVariable;
void* WriteClient;
void* ReadClient;
void* ServerSupportFunction;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; EXTENSION_CONTROL_BLOCK サイズ: 144 バイト(x86)
dim st, 36 ; 4byte整数×36(構造体サイズ 144 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; dwVersion : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; ConnID : HCONN (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; dwHttpStatusCode : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; lpszLogData : CHAR (+16, 80byte) varptr(st)+16 を基点に操作(80byte:入れ子/配列)
; lpszMethod : LPSTR (+96, 4byte) st.24 = 値 / 値 = st.24 (lpoke/lpeek も可)
; lpszQueryString : LPSTR (+100, 4byte) st.25 = 値 / 値 = st.25 (lpoke/lpeek も可)
; lpszPathInfo : LPSTR (+104, 4byte) st.26 = 値 / 値 = st.26 (lpoke/lpeek も可)
; lpszPathTranslated : LPSTR (+108, 4byte) st.27 = 値 / 値 = st.27 (lpoke/lpeek も可)
; cbTotalBytes : DWORD (+112, 4byte) st.28 = 値 / 値 = st.28 (lpoke/lpeek も可)
; cbAvailable : DWORD (+116, 4byte) st.29 = 値 / 値 = st.29 (lpoke/lpeek も可)
; lpbData : BYTE* (+120, 4byte) st.30 = 値 / 値 = st.30 (lpoke/lpeek も可)
; lpszContentType : LPSTR (+124, 4byte) st.31 = 値 / 値 = st.31 (lpoke/lpeek も可)
; GetServerVariable : PFN_IIS_GETSERVERVARIABLE (+128, 4byte) st.32 = 値 / 値 = st.32 (lpoke/lpeek も可)
; WriteClient : PFN_IIS_WRITECLIENT (+132, 4byte) st.33 = 値 / 値 = st.33 (lpoke/lpeek も可)
; ReadClient : PFN_IIS_READCLIENT (+136, 4byte) st.34 = 値 / 値 = st.34 (lpoke/lpeek も可)
; ServerSupportFunction : PFN_IIS_SERVERSUPPORTFUNCTION (+140, 4byte) st.35 = 値 / 値 = st.35 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; EXTENSION_CONTROL_BLOCK サイズ: 192 バイト(x64)
dim st, 48 ; 4byte整数×48(構造体サイズ 192 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; dwVersion : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; ConnID : HCONN (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; dwHttpStatusCode : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; lpszLogData : CHAR (+20, 80byte) varptr(st)+20 を基点に操作(80byte:入れ子/配列)
; lpszMethod : LPSTR (+104, 8byte) qpoke st,104,値 / qpeek(st,104) ※IronHSPのみ。3.7/3.8は lpoke st,104,下位 : lpoke st,108,上位
; lpszQueryString : LPSTR (+112, 8byte) qpoke st,112,値 / qpeek(st,112) ※IronHSPのみ。3.7/3.8は lpoke st,112,下位 : lpoke st,116,上位
; lpszPathInfo : LPSTR (+120, 8byte) qpoke st,120,値 / qpeek(st,120) ※IronHSPのみ。3.7/3.8は lpoke st,120,下位 : lpoke st,124,上位
; lpszPathTranslated : LPSTR (+128, 8byte) qpoke st,128,値 / qpeek(st,128) ※IronHSPのみ。3.7/3.8は lpoke st,128,下位 : lpoke st,132,上位
; cbTotalBytes : DWORD (+136, 4byte) st.34 = 値 / 値 = st.34 (lpoke/lpeek も可)
; cbAvailable : DWORD (+140, 4byte) st.35 = 値 / 値 = st.35 (lpoke/lpeek も可)
; lpbData : BYTE* (+144, 8byte) qpoke st,144,値 / qpeek(st,144) ※IronHSPのみ。3.7/3.8は lpoke st,144,下位 : lpoke st,148,上位
; lpszContentType : LPSTR (+152, 8byte) qpoke st,152,値 / qpeek(st,152) ※IronHSPのみ。3.7/3.8は lpoke st,152,下位 : lpoke st,156,上位
; GetServerVariable : PFN_IIS_GETSERVERVARIABLE (+160, 8byte) qpoke st,160,値 / qpeek(st,160) ※IronHSPのみ。3.7/3.8は lpoke st,160,下位 : lpoke st,164,上位
; WriteClient : PFN_IIS_WRITECLIENT (+168, 8byte) qpoke st,168,値 / qpeek(st,168) ※IronHSPのみ。3.7/3.8は lpoke st,168,下位 : lpoke st,172,上位
; ReadClient : PFN_IIS_READCLIENT (+176, 8byte) qpoke st,176,値 / qpeek(st,176) ※IronHSPのみ。3.7/3.8は lpoke st,176,下位 : lpoke st,180,上位
; ServerSupportFunction : PFN_IIS_SERVERSUPPORTFUNCTION (+184, 8byte) qpoke st,184,値 / qpeek(st,184) ※IronHSPのみ。3.7/3.8は lpoke st,184,下位 : lpoke st,188,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global EXTENSION_CONTROL_BLOCK
#field int cbSize
#field int dwVersion
#field intptr ConnID
#field int dwHttpStatusCode
#field byte lpszLogData 80
#field intptr lpszMethod
#field intptr lpszQueryString
#field intptr lpszPathInfo
#field intptr lpszPathTranslated
#field int cbTotalBytes
#field int cbAvailable
#field intptr lpbData
#field intptr lpszContentType
#field intptr GetServerVariable
#field intptr WriteClient
#field intptr ReadClient
#field intptr ServerSupportFunction
#endstruct
stdim st, EXTENSION_CONTROL_BLOCK ; NSTRUCT 変数を確保
st->cbSize = 100
mes "cbSize=" + st->cbSize