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

SERVICE_STATUS

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

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

フィールド

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

サービスの種類です。このメンバーには、次のいずれかの値を指定できます。

Value Meaning
SERVICE_FILE_SYSTEM_DRIVER
0x00000002
サービスはファイルシステムドライバーです。
SERVICE_KERNEL_DRIVER
0x00000001
サービスはデバイスドライバーです。
SERVICE_WIN32_OWN_PROCESS
0x00000010
サービスは独自のプロセスで実行されます。
SERVICE_WIN32_SHARE_PROCESS
0x00000020
サービスは他のサービスとプロセスを共有します。
SERVICE_USER_OWN_PROCESS
0x00000050
サービスは、ログオンしているユーザーアカウントで独自のプロセスとして実行されます。
SERVICE_USER_SHARE_PROCESS
0x00000060
サービスは、ログオンしているユーザーアカウントで実行される 1 つ以上の他のサービスとプロセスを共有します。

サービスの種類が SERVICE_WIN32_OWN_PROCESS または SERVICE_WIN32_SHARE_PROCESS であり、サービスが LocalSystem アカウント のコンテキストで実行されている場合は、次の種類も指定できます。

Value Meaning
SERVICE_INTERACTIVE_PROCESS
0x00000100
サービスはデスクトップと対話できます。

詳細については、 対話型サービスを参照してください。

dwCurrentStateSERVICE_STATUS_CURRENT_STATE4+4+4

サービスの現在の状態です。このメンバーには、次のいずれかの値を指定できます。

Value Meaning
SERVICE_CONTINUE_PENDING
0x00000005
サービスの再開が保留中です。
SERVICE_PAUSE_PENDING
0x00000006
サービスの一時停止が保留中です。
SERVICE_PAUSED
0x00000007
サービスは一時停止しています。
SERVICE_RUNNING
0x00000004
サービスは実行中です。
SERVICE_START_PENDING
0x00000002
サービスは開始中です。
SERVICE_STOP_PENDING
0x00000003
サービスは停止中です。
SERVICE_STOPPED
0x00000001
サービスは実行されていません。
dwControlsAcceptedDWORD4+8+8

サービスがハンドラー関数で受け付けて処理する制御コードです( Handler および HandlerEx を参照してください)。ユーザーインターフェイスのプロセスは、 ControlService 関数または ControlServiceEx 関数で制御コマンドを指定して、サービスを制御できます。既定では、すべてのサービスが SERVICE_CONTROL_INTERROGATE 値を受け付けます。

SERVICE_CONTROL_DEVICEEVENT 値を受け付けるには、サービスは RegisterDeviceNotification 関数を使用して、デバイスイベントを受け取るように登録しなければなりません。

制御コードは次のとおりです。

Control code Meaning
SERVICE_ACCEPT_NETBINDCHANGE
0x00000010
サービスは、停止して再起動しなくてもバインドの変更を受け付けられるネットワークコンポーネントです。

この制御コードにより、サービスは SERVICE_CONTROL_NETBINDADDSERVICE_CONTROL_NETBINDREMOVESERVICE_CONTROL_NETBINDENABLESERVICE_CONTROL_NETBINDDISABLE の各通知を受け取れます。

SERVICE_ACCEPT_PARAMCHANGE
0x00000008
サービスは、停止して再起動しなくても起動パラメーターを読み直すことができます。

この制御コードにより、サービスは SERVICE_CONTROL_PARAMCHANGE 通知を受け取れます。

SERVICE_ACCEPT_PAUSE_CONTINUE
0x00000002
サービスは一時停止および再開できます。

この制御コードにより、サービスは SERVICE_CONTROL_PAUSE 通知および SERVICE_CONTROL_CONTINUE 通知を受け取れます。

SERVICE_ACCEPT_PRESHUTDOWN
0x00000100
サービスはシャットダウン前のタスクを実行できます。

この制御コードにより、サービスは SERVICE_CONTROL_PRESHUTDOWN 通知を受け取れます。なお、 ControlServiceControlServiceEx はこの通知を送信できません。送信できるのはシステムだけです。

Windows Server 2003 および Windows XP: この値はサポートされていません。

SERVICE_ACCEPT_SHUTDOWN
0x00000004
システムのシャットダウンが発生したときに、サービスに通知されます。

この制御コードにより、サービスは SERVICE_CONTROL_SHUTDOWN 通知を受け取れます。なお、 ControlServiceControlServiceEx はこの通知を送信できません。送信できるのはシステムだけです。

SERVICE_ACCEPT_STOP
0x00000001
サービスは停止できます。

この制御コードにより、サービスは SERVICE_CONTROL_STOP 通知を受け取れます。

このメンバーには、次の拡張制御コードを含めることもできます。これらは HandlerEx でのみサポートされます。(なお、これらの制御コードは ControlServiceControlServiceEx では送信できません。)

Control code Meaning
SERVICE_ACCEPT_HARDWAREPROFILECHANGE
0x00000020
コンピューターのハードウェアプロファイルが変更されたときに、サービスに通知されます。これにより、システムはサービスに SERVICE_CONTROL_HARDWAREPROFILECHANGE 通知を送信できます。
SERVICE_ACCEPT_POWEREVENT
0x00000040
コンピューターの電源状態が変化したときに、サービスに通知されます。これにより、システムはサービスに SERVICE_CONTROL_POWEREVENT 通知を送信できます。
SERVICE_ACCEPT_SESSIONCHANGE
0x00000080
コンピューターのセッションの状態が変化したときに、サービスに通知されます。これにより、システムはサービスに SERVICE_CONTROL_SESSIONCHANGE 通知を送信できます。
SERVICE_ACCEPT_TIMECHANGE
0x00000200
システム時刻が変更されたときに、サービスに通知されます。これにより、システムはサービスに SERVICE_CONTROL_TIMECHANGE 通知を送信できます。

Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: この制御コードはサポートされていません。

SERVICE_ACCEPT_TRIGGEREVENT
0x00000400
サービスが登録したイベントが発生したときに、サービスに通知されます。これにより、システムはサービスに SERVICE_CONTROL_TRIGGEREVENT 通知を送信できます。

Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: この制御コードはサポートされていません。

SERVICE_ACCEPT_USERMODEREBOOT
0x00000800
ユーザーが再起動を開始したときに、サービスに通知されます。

Windows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: この制御コードはサポートされていません。

dwWin32ExitCodeDWORD4+12+12サービスの開始時または停止時に発生したエラーを報告するために、サービスが使用するエラーコードです。サービス固有のエラーコードを返すには、サービスはこの値を ERROR_SERVICE_SPECIFIC_ERROR に設定し、dwServiceSpecificExitCode メンバーにエラーコードが格納されていることを示さなければなりません。実行中および正常終了時には、サービスはこの値を NO_ERROR に設定します。
dwServiceSpecificExitCodeDWORD4+16+16サービスの開始中または停止中にエラーが発生した場合に、サービスが返すサービス固有のエラーコードです。この値は、dwWin32ExitCode メンバーが ERROR_SERVICE_SPECIFIC_ERROR に設定されている場合を除き、無視されます。
dwCheckPointDWORD4+20+20開始、停止、一時停止、再開といった時間のかかる操作の進行状況を報告するために、サービスが定期的に増やすチェックポイント値です。たとえば、サービスは起動時に初期化の各ステップが完了するたびに、この値を増やします。サービスに対して操作を実行したユーザーインターフェイスのプログラムは、時間のかかる操作の進行状況を追跡するために、この値を使用します。サービスに開始、停止、一時停止、再開のいずれの操作も保留されていない場合、この値は無効であり、0 でなければなりません。
dwWaitHintDWORD4+24+24保留中の開始、停止、一時停止、再開の各操作に必要と見込まれる時間(ミリ秒単位)です。指定された時間が経過する前に、サービスは dwCheckPoint の値を増やすか dwCurrentState を変更したうえで、次の SetServiceStatus 関数の呼び出しを行う必要があります。dwWaitHint で指定された時間が経過しても dwCheckPoint が増えず、dwCurrentState も変化していない場合、サービス制御マネージャーまたはサービス制御プログラムは、エラーが発生したと見なしてサービスを停止できます。ただし、サービスが他のサービスとプロセスを共有している場合は、そのプロセスを共有する他のサービスも終了させることになるため、サービス制御マネージャーはサービスアプリケーションを終了できません。

公式ドキュメント

サービスのステータス情報を格納します。 ControlServiceEnumDependentServicesEnumServicesStatusQueryServiceStatus の各関数は、この構造体を使用します。サービスは SetServiceStatus 関数でこの構造体を使用して、現在のステータスをサービス制御マネージャーに報告します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// SERVICE_STATUS  (x64 28 / x86 28 バイト)
typedef struct SERVICE_STATUS {
    ENUM_SERVICE_TYPE dwServiceType;
    SERVICE_STATUS_CURRENT_STATE dwCurrentState;
    DWORD dwControlsAccepted;
    DWORD dwWin32ExitCode;
    DWORD dwServiceSpecificExitCode;
    DWORD dwCheckPoint;
    DWORD dwWaitHint;
} SERVICE_STATUS;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SERVICE_STATUS
{
    public uint dwServiceType;
    public uint dwCurrentState;
    public uint dwControlsAccepted;
    public uint dwWin32ExitCode;
    public uint dwServiceSpecificExitCode;
    public uint dwCheckPoint;
    public uint dwWaitHint;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SERVICE_STATUS
    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
End Structure
import ctypes
from ctypes import wintypes

class SERVICE_STATUS(ctypes.Structure):
    _fields_ = [
        ("dwServiceType", wintypes.DWORD),
        ("dwCurrentState", wintypes.DWORD),
        ("dwControlsAccepted", wintypes.DWORD),
        ("dwWin32ExitCode", wintypes.DWORD),
        ("dwServiceSpecificExitCode", wintypes.DWORD),
        ("dwCheckPoint", wintypes.DWORD),
        ("dwWaitHint", wintypes.DWORD),
    ]
#[repr(C)]
pub struct SERVICE_STATUS {
    pub dwServiceType: u32,
    pub dwCurrentState: u32,
    pub dwControlsAccepted: u32,
    pub dwWin32ExitCode: u32,
    pub dwServiceSpecificExitCode: u32,
    pub dwCheckPoint: u32,
    pub dwWaitHint: u32,
}
import "golang.org/x/sys/windows"

type SERVICE_STATUS struct {
	dwServiceType uint32
	dwCurrentState uint32
	dwControlsAccepted uint32
	dwWin32ExitCode uint32
	dwServiceSpecificExitCode uint32
	dwCheckPoint uint32
	dwWaitHint uint32
}
type
  SERVICE_STATUS = record
    dwServiceType: DWORD;
    dwCurrentState: DWORD;
    dwControlsAccepted: DWORD;
    dwWin32ExitCode: DWORD;
    dwServiceSpecificExitCode: DWORD;
    dwCheckPoint: DWORD;
    dwWaitHint: DWORD;
  end;
const SERVICE_STATUS = extern struct {
    dwServiceType: u32,
    dwCurrentState: u32,
    dwControlsAccepted: u32,
    dwWin32ExitCode: u32,
    dwServiceSpecificExitCode: u32,
    dwCheckPoint: u32,
    dwWaitHint: u32,
};
type
  SERVICE_STATUS {.bycopy.} = object
    dwServiceType: uint32
    dwCurrentState: uint32
    dwControlsAccepted: uint32
    dwWin32ExitCode: uint32
    dwServiceSpecificExitCode: uint32
    dwCheckPoint: uint32
    dwWaitHint: uint32
struct SERVICE_STATUS
{
    uint dwServiceType;
    uint dwCurrentState;
    uint dwControlsAccepted;
    uint dwWin32ExitCode;
    uint dwServiceSpecificExitCode;
    uint dwCheckPoint;
    uint dwWaitHint;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SERVICE_STATUS サイズ: 28 バイト(x64)
dim st, 7    ; 4byte整数×7(構造体サイズ 28 / 4 切り上げ)
; dwServiceType : ENUM_SERVICE_TYPE (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; dwCurrentState : SERVICE_STATUS_CURRENT_STATE (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dwControlsAccepted : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; dwWin32ExitCode : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; dwServiceSpecificExitCode : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; dwCheckPoint : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; dwWaitHint : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global SERVICE_STATUS
    #field int dwServiceType
    #field int dwCurrentState
    #field int dwControlsAccepted
    #field int dwWin32ExitCode
    #field int dwServiceSpecificExitCode
    #field int dwCheckPoint
    #field int dwWaitHint
#endstruct

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