Win32 API 日本語リファレンス
ホームSystem.Services › SERVICE_CONTROL_STATUS_REASON_PARAMSW

SERVICE_CONTROL_STATUS_REASON_PARAMSW

構造体
サイズx64: 56 バイト / x86: 44 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
dwReasonDWORD4+0+0

サービスの状態を SERVICE_CONTROL_STOP に変更する理由です。現在の制御コードが SERVICE_CONTROL_STOP でない場合、このメンバーは無視されます。

このメンバーには、1 つの一般理由コード、1 つの主要理由コード、および 1 つの副次理由コードの組み合わせを設定しなければなりません。

次に一般理由コードを示します。

意味
SERVICE_STOP_REASON_FLAG_CUSTOM
0x20000000
理由コードはユーザーによって定義されます。このフラグが指定されていない場合、理由コードはシステムによって定義されます。このフラグをシステム定義の理由コードと共に指定した場合、関数の呼び出しは失敗します。

ユーザーは、SERVICE_STOP_REASON_MAJOR_MIN_CUSTOM (0x00400000) から SERVICE_STOP_REASON_MAJOR_MAX_CUSTOM (0x00ff0000) の範囲でカスタムの主要理由コードを、SERVICE_STOP_REASON_MINOR_MIN_CUSTOM (0x00000100) から SERVICE_STOP_REASON_MINOR_MAX_CUSTOM (0x0000FFFF) の範囲でカスタムの副次理由コードを作成できます。

SERVICE_STOP_REASON_FLAG_PLANNED
0x40000000
サービスの停止は計画されたものです。
SERVICE_STOP_REASON_FLAG_UNPLANNED
0x10000000
サービスの停止は計画外のものです。

次に主要理由コードを示します。

意味
SERVICE_STOP_REASON_MAJOR_APPLICATION
0x00050000
アプリケーションの問題です。
SERVICE_STOP_REASON_MAJOR_HARDWARE
0x00020000
ハードウェアの問題です。
SERVICE_STOP_REASON_MAJOR_NONE
0x00060000
主要理由はありません。
SERVICE_STOP_REASON_MAJOR_OPERATINGSYSTEM
0x00030000
オペレーティング システムの問題です。
SERVICE_STOP_REASON_MAJOR_OTHER
0x00010000
その他の問題です。
SERVICE_STOP_REASON_MAJOR_SOFTWARE
0x00040000
ソフトウェアの問題です。

次に副次理由コードを示します。

意味
SERVICE_STOP_REASON_MINOR_DISK
0x00000008
ディスクです。
SERVICE_STOP_REASON_MINOR_ENVIRONMENT
0x0000000a
環境です。
SERVICE_STOP_REASON_MINOR_HARDWARE_DRIVER
0x0000000b
ドライバーです。
SERVICE_STOP_REASON_MINOR_HUNG
0x00000006
応答なしです。
SERVICE_STOP_REASON_MINOR_INSTALLATION
0x00000003
インストールです。
SERVICE_STOP_REASON_MINOR_MAINTENANCE
0x00000002
メンテナンスです。
SERVICE_STOP_REASON_MINOR_MMC
0x00000016
MMC の問題です。
SERVICE_STOP_REASON_MINOR_NETWORK_CONNECTIVITY
0x00000011
ネットワーク接続です。
SERVICE_STOP_REASON_MINOR_NETWORKCARD
0x00000009
ネットワーク カードです。
SERVICE_STOP_REASON_MINOR_NONE
0x00060000
副次理由はありません。
SERVICE_STOP_REASON_MINOR_OTHER
0x00000001
その他の問題です。
SERVICE_STOP_REASON_MINOR_OTHERDRIVER
0x0000000c
その他のドライバー イベントです。
SERVICE_STOP_REASON_MINOR_RECONFIG
0x00000005
再構成です。
SERVICE_STOP_REASON_MINOR_SECURITY
0x00000010
セキュリティの問題です。
SERVICE_STOP_REASON_MINOR_SECURITYFIX
0x0000000f
セキュリティ更新プログラムです。
SERVICE_STOP_REASON_MINOR_SECURITYFIX_UNINSTALL
0x00000015
セキュリティ更新プログラムのアンインストールです。
SERVICE_STOP_REASON_MINOR_SERVICEPACK
0x0000000d
サービス パックです。
SERVICE_STOP_REASON_MINOR_SERVICEPACK_UNINSTALL
0x00000013
サービス パックのアンインストールです。
SERVICE_STOP_REASON_MINOR_SOFTWARE_UPDATE
0x0000000e
ソフトウェア更新プログラムです。
SERVICE_STOP_REASON_MINOR_SOFTWARE_UPDATE_UNINSTALL
0x0000000e
ソフトウェア更新プログラムのアンインストールです。
SERVICE_STOP_REASON_MINOR_UNSTABLE
0x00000007
不安定です。
SERVICE_STOP_REASON_MINOR_UPGRADE
0x00000004
アップグレードです。
SERVICE_STOP_REASON_MINOR_WMI
0x00000012
WMI の問題です。
pszCommentLPWSTR8/4+8+4サービスの停止に関する追加情報を提供する省略可能な文字列です。この文字列は停止理由コードと共にイベント ログに記録されます。このメンバーは NULL であるか、終端の null 文字を含めて 128 文字未満の有効な文字列でなければなりません。
ServiceStatusSERVICE_STATUS_PROCESS36+16+8

最新のサービス状態情報を受け取る SERVICE_STATUS_PROCESS 構造体へのポインターです。返される情報は、サービスがサービス コントロール マネージャーに報告した最新の状態を反映します。

サービス コントロール マネージャーがこの構造体に値を設定するのは、 ControlServiceEx が次のいずれかのエラー コードを返した場合のみです: NO_ERRORERROR_INVALID_SERVICE_CONTROLERROR_SERVICE_CANNOT_ACCEPT_CTRL、または ERROR_SERVICE_NOT_ACTIVE。それ以外の場合、この構造体には値が設定されません。

公式ドキュメント

サービス制御パラメーターを格納します。

解説(Remarks)

メモ

winsvc.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして、SERVICE_CONTROL_STATUS_REASON_PARAMS を定義しています。エンコーディング中立のエイリアスの使用と、エンコーディング中立でないコードとを混在させると、不一致が生じてコンパイル エラーや実行時エラーの原因になることがあります。詳細については、「Conventions for Function Prototypes」を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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_PARAMSW  (x64 56 / x86 44 バイト)
typedef struct SERVICE_CONTROL_STATUS_REASON_PARAMSW {
    DWORD dwReason;
    LPWSTR pszComment;
    SERVICE_STATUS_PROCESS ServiceStatus;
} SERVICE_CONTROL_STATUS_REASON_PARAMSW;
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_PARAMSW
{
    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_PARAMSW
    Public dwReason As UInteger
    Public pszComment As IntPtr
    Public ServiceStatus As SERVICE_STATUS_PROCESS
End Structure
import 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_PARAMSW(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_PARAMSW {
    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_PARAMSW 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_PARAMSW = 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_PARAMSW = 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_PARAMSW {.bycopy.} = object
    dwReason: uint32
    pszComment: pointer
    ServiceStatus: SERVICE_STATUS_PROCESS
struct 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_PARAMSW
{
    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_PARAMSW サイズ: 44 バイト(x86)
dim st, 11    ; 4byte整数×11(構造体サイズ 44 / 4 切り上げ)
; dwReason : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; pszComment : LPWSTR (+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_PARAMSW サイズ: 56 バイト(x64)
dim st, 14    ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; dwReason : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; pszComment : LPWSTR (+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_PARAMSW
    #field int dwReason
    #field intptr pszComment
    #field SERVICE_STATUS_PROCESS ServiceStatus
#endstruct

stdim st, SERVICE_CONTROL_STATUS_REASON_PARAMSW        ; NSTRUCT 変数を確保
st->dwReason = 100
mes "dwReason=" + st->dwReason