SERVICE_CONTROL_STATUS_REASON_PARAMSA
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dwReason | DWORD | 4 | +0 | +0 | サービスの状態を SERVICE_CONTROL_STOP に変更する理由です。現在の制御コードが SERVICE_CONTROL_STOP でない場合、このメンバーは無視されます。 このメンバーには、1 つの一般コード、1 つの主要理由コード、および 1 つの副次理由コードの組み合わせを設定しなければなりません。 一般理由コードは次のとおりです。
主要理由コードは次のとおりです。
副次理由コードは次のとおりです。 | ||||||||||||||||||||||
| pszComment | LPSTR | 8/4 | +8 | +4 | サービスの停止に関する追加情報を提供する省略可能な文字列です。この文字列は停止理由コードと共にイベント ログに記録されます。このメンバーは NULL であるか、終端の null 文字を含めて 128 文字未満の有効な文字列でなければなりません。 | ||||||||||||||||||||||
| ServiceStatus | SERVICE_STATUS_PROCESS | 36 | +16 | +8 | 最新のサービス状態情報を受け取る SERVICE_STATUS_PROCESS 構造体へのポインターです。返される情報は、サービスがサービス コントロール マネージャーに報告した最新の状態を反映します。 サービス コントロール マネージャーがこの構造体に値を格納するのは、 ControlServiceEx が次のいずれかのエラー コードを返した場合のみです: NO_ERROR、ERROR_INVALID_SERVICE_CONTROL、ERROR_SERVICE_CANNOT_ACCEPT_CTRL、または ERROR_SERVICE_NOT_ACTIVE。それ以外の場合、この構造体には値が格納されません。 |
公式ドキュメント
サービス制御パラメーターを格納します。
解説(Remarks)
winsvc.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて ANSI 版と Unicode 版を自動的に選択するエイリアスとして SERVICE_CONTROL_STATUS_REASON_PARAMS を定義しています。エンコーディング中立のエイリアスを、エンコーディング中立でないコードと混在させて使用すると、不一致が生じてコンパイル エラーまたは実行時エラーの原因となる場合があります。詳細については、Conventions for Function Prototypes を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// SERVICE_STATUS_PROCESS (x64 36 / x86 36 バイト)
typedef struct SERVICE_STATUS_PROCESS {
ENUM_SERVICE_TYPE dwServiceType;
SERVICE_STATUS_CURRENT_STATE dwCurrentState;
DWORD dwControlsAccepted;
DWORD dwWin32ExitCode;
DWORD dwServiceSpecificExitCode;
DWORD dwCheckPoint;
DWORD dwWaitHint;
DWORD dwProcessId;
SERVICE_RUNS_IN_PROCESS dwServiceFlags;
} SERVICE_STATUS_PROCESS;
// SERVICE_CONTROL_STATUS_REASON_PARAMSA (x64 56 / x86 44 バイト)
typedef struct SERVICE_CONTROL_STATUS_REASON_PARAMSA {
DWORD dwReason;
LPSTR pszComment;
SERVICE_STATUS_PROCESS ServiceStatus;
} SERVICE_CONTROL_STATUS_REASON_PARAMSA;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SERVICE_STATUS_PROCESS
{
public uint dwServiceType;
public uint dwCurrentState;
public uint dwControlsAccepted;
public uint dwWin32ExitCode;
public uint dwServiceSpecificExitCode;
public uint dwCheckPoint;
public uint dwWaitHint;
public uint dwProcessId;
public uint dwServiceFlags;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SERVICE_CONTROL_STATUS_REASON_PARAMSA
{
public uint dwReason;
public IntPtr pszComment;
public SERVICE_STATUS_PROCESS ServiceStatus;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SERVICE_STATUS_PROCESS
Public dwServiceType As UInteger
Public dwCurrentState As UInteger
Public dwControlsAccepted As UInteger
Public dwWin32ExitCode As UInteger
Public dwServiceSpecificExitCode As UInteger
Public dwCheckPoint As UInteger
Public dwWaitHint As UInteger
Public dwProcessId As UInteger
Public dwServiceFlags As UInteger
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SERVICE_CONTROL_STATUS_REASON_PARAMSA
Public dwReason As UInteger
Public pszComment As IntPtr
Public ServiceStatus As SERVICE_STATUS_PROCESS
End Structureimport ctypes
from ctypes import wintypes
class SERVICE_STATUS_PROCESS(ctypes.Structure):
_fields_ = [
("dwServiceType", wintypes.DWORD),
("dwCurrentState", wintypes.DWORD),
("dwControlsAccepted", wintypes.DWORD),
("dwWin32ExitCode", wintypes.DWORD),
("dwServiceSpecificExitCode", wintypes.DWORD),
("dwCheckPoint", wintypes.DWORD),
("dwWaitHint", wintypes.DWORD),
("dwProcessId", wintypes.DWORD),
("dwServiceFlags", wintypes.DWORD),
]
class SERVICE_CONTROL_STATUS_REASON_PARAMSA(ctypes.Structure):
_fields_ = [
("dwReason", wintypes.DWORD),
("pszComment", ctypes.c_void_p),
("ServiceStatus", SERVICE_STATUS_PROCESS),
]#[repr(C)]
pub struct SERVICE_STATUS_PROCESS {
pub dwServiceType: u32,
pub dwCurrentState: u32,
pub dwControlsAccepted: u32,
pub dwWin32ExitCode: u32,
pub dwServiceSpecificExitCode: u32,
pub dwCheckPoint: u32,
pub dwWaitHint: u32,
pub dwProcessId: u32,
pub dwServiceFlags: u32,
}
#[repr(C)]
pub struct SERVICE_CONTROL_STATUS_REASON_PARAMSA {
pub dwReason: u32,
pub pszComment: *mut core::ffi::c_void,
pub ServiceStatus: SERVICE_STATUS_PROCESS,
}import "golang.org/x/sys/windows"
type SERVICE_STATUS_PROCESS struct {
dwServiceType uint32
dwCurrentState uint32
dwControlsAccepted uint32
dwWin32ExitCode uint32
dwServiceSpecificExitCode uint32
dwCheckPoint uint32
dwWaitHint uint32
dwProcessId uint32
dwServiceFlags uint32
}
type SERVICE_CONTROL_STATUS_REASON_PARAMSA struct {
dwReason uint32
pszComment uintptr
ServiceStatus SERVICE_STATUS_PROCESS
}type
SERVICE_STATUS_PROCESS = record
dwServiceType: DWORD;
dwCurrentState: DWORD;
dwControlsAccepted: DWORD;
dwWin32ExitCode: DWORD;
dwServiceSpecificExitCode: DWORD;
dwCheckPoint: DWORD;
dwWaitHint: DWORD;
dwProcessId: DWORD;
dwServiceFlags: DWORD;
end;
SERVICE_CONTROL_STATUS_REASON_PARAMSA = record
dwReason: DWORD;
pszComment: Pointer;
ServiceStatus: SERVICE_STATUS_PROCESS;
end;const SERVICE_STATUS_PROCESS = extern struct {
dwServiceType: u32,
dwCurrentState: u32,
dwControlsAccepted: u32,
dwWin32ExitCode: u32,
dwServiceSpecificExitCode: u32,
dwCheckPoint: u32,
dwWaitHint: u32,
dwProcessId: u32,
dwServiceFlags: u32,
};
const SERVICE_CONTROL_STATUS_REASON_PARAMSA = extern struct {
dwReason: u32,
pszComment: ?*anyopaque,
ServiceStatus: SERVICE_STATUS_PROCESS,
};type
SERVICE_STATUS_PROCESS {.bycopy.} = object
dwServiceType: uint32
dwCurrentState: uint32
dwControlsAccepted: uint32
dwWin32ExitCode: uint32
dwServiceSpecificExitCode: uint32
dwCheckPoint: uint32
dwWaitHint: uint32
dwProcessId: uint32
dwServiceFlags: uint32
SERVICE_CONTROL_STATUS_REASON_PARAMSA {.bycopy.} = object
dwReason: uint32
pszComment: pointer
ServiceStatus: SERVICE_STATUS_PROCESSstruct SERVICE_STATUS_PROCESS
{
uint dwServiceType;
uint dwCurrentState;
uint dwControlsAccepted;
uint dwWin32ExitCode;
uint dwServiceSpecificExitCode;
uint dwCheckPoint;
uint dwWaitHint;
uint dwProcessId;
uint dwServiceFlags;
}
struct SERVICE_CONTROL_STATUS_REASON_PARAMSA
{
uint dwReason;
void* pszComment;
SERVICE_STATUS_PROCESS ServiceStatus;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SERVICE_CONTROL_STATUS_REASON_PARAMSA サイズ: 44 バイト(x86)
dim st, 11 ; 4byte整数×11(構造体サイズ 44 / 4 切り上げ)
; dwReason : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; pszComment : LPSTR (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; ServiceStatus : SERVICE_STATUS_PROCESS (+8, 36byte) varptr(st)+8 を基点に操作(36byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SERVICE_CONTROL_STATUS_REASON_PARAMSA サイズ: 56 バイト(x64)
dim st, 14 ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; dwReason : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; pszComment : LPSTR (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; ServiceStatus : SERVICE_STATUS_PROCESS (+16, 36byte) varptr(st)+16 を基点に操作(36byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global SERVICE_STATUS_PROCESS
#field int dwServiceType
#field int dwCurrentState
#field int dwControlsAccepted
#field int dwWin32ExitCode
#field int dwServiceSpecificExitCode
#field int dwCheckPoint
#field int dwWaitHint
#field int dwProcessId
#field int dwServiceFlags
#endstruct
#defstruct global SERVICE_CONTROL_STATUS_REASON_PARAMSA
#field int dwReason
#field intptr pszComment
#field SERVICE_STATUS_PROCESS ServiceStatus
#endstruct
stdim st, SERVICE_CONTROL_STATUS_REASON_PARAMSA ; NSTRUCT 変数を確保
st->dwReason = 100
mes "dwReason=" + st->dwReason