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

QUERY_SERVICE_CONFIGW

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

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

フィールド

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

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

意味
SERVICE_FILE_SYSTEM_DRIVER
0x00000002
ファイル システム ドライバー サービスです。
SERVICE_KERNEL_DRIVER
0x00000001
ドライバー サービスです。
SERVICE_WIN32_OWN_PROCESS
0x00000010
独自のプロセスで実行されるサービスです。
SERVICE_WIN32_SHARE_PROCESS
0x00000020
他のサービスとプロセスを共有するサービスです。

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

意味
SERVICE_INTERACTIVE_PROCESS
0x00000100
サービスがデスクトップと対話できます。

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

dwStartTypeSERVICE_START_TYPE4+4+4

サービスを開始するタイミングです。このメンバーには次のいずれかの値を指定できます。

意味
SERVICE_AUTO_START
0x00000002
システムの起動時にサービス コントロール マネージャーによって自動的に開始されるサービスです。
SERVICE_BOOT_START
0x00000000
システム ローダーによって開始されるデバイス ドライバーです。この値はドライバー サービスに対してのみ有効です。
SERVICE_DEMAND_START
0x00000003
プロセスが StartService 関数を呼び出したときに、サービス コントロール マネージャーによって開始されるサービスです。
SERVICE_DISABLED
0x00000004
開始できないサービスです。このサービスを開始しようとすると、エラー コード ERROR_SERVICE_DISABLED が返されます。
SERVICE_SYSTEM_START
0x00000001
IoInitSystem 関数によって開始されるデバイス ドライバーです。この値はドライバー サービスに対してのみ有効です。
dwErrorControlSERVICE_ERROR4+8+8

このサービスの開始に失敗した場合の、エラーの重大度と実行される処理です。このメンバーには次のいずれかの値を指定できます。

意味
SERVICE_ERROR_CRITICAL
0x00000003
スタートアップ プログラムは、可能であればエラーをイベント ログに記録します。最後に成功した構成 (last-known good configuration) で起動している場合、起動処理は失敗します。それ以外の場合、システムは最後に成功した構成で再起動されます。
SERVICE_ERROR_IGNORE
0x00000000
スタートアップ プログラムはエラーを無視し、起動処理を続行します。
SERVICE_ERROR_NORMAL
0x00000001
スタートアップ プログラムはエラーをイベント ログに記録し、起動処理を続行します。
SERVICE_ERROR_SEVERE
0x00000002
スタートアップ プログラムはエラーをイベント ログに記録します。最後に成功した構成で起動している場合、起動処理は続行されます。それ以外の場合、システムは最後に成功した構成で再起動されます。
lpBinaryPathNameLPWSTR8/4+16+12

サービスのバイナリ ファイルへの完全修飾パスです。

このパスには、自動開始サービス用の引数を含めることもできます。これらの引数は、サービスのエントリ ポイント (通常は main 関数) に渡されます。

lpLoadOrderGroupLPWSTR8/4+24+16

このサービスが属するロード順序グループの名前です。このメンバーが NULL または空の文字列の場合、サービスはロード順序グループに属しません。

スタートアップ プログラムは、他のグループとの相対的な順序で複数のサービスをまとめて読み込むために、ロード順序グループを使用します。ロード順序グループの一覧は、次のレジストリ値に格納されています。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ServiceGroupOrder

dwTagIdDWORD4+32+20

lpLoadOrderGroup パラメーターで指定されたグループ内で、このサービスを一意に識別するタグ値です。値が 0 の場合は、そのサービスにタグが割り当てられていないことを示します。次のレジストリの場所にタグ順序ベクターを指定することで、ロード順序グループ内でのサービスの開始順序を制御するためにタグを使用できます。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GroupOrderList

タグが評価されるのは、SERVICE_BOOT_START または SERVICE_SYSTEM_START の開始種類を持つ SERVICE_KERNEL_DRIVER および SERVICE_FILE_SYSTEM_DRIVER 型のサービスに対してのみです。

lpDependenciesLPWSTR8/4+40+24このサービスより先に開始する必要があるサービス名またはロード順序グループ名を、NULL 文字で区切って並べた配列へのポインターです。この配列は 2 つの NULL 文字で終端されます。ポインターが NULL の場合、または空の文字列を指している場合、サービスに依存関係はありません。グループ名を指定する場合は、サービスとサービス グループが同じ名前空間を共有するため、サービス名と区別できるように SC_GROUP_IDENTIFIER 文字 (WinSvc.h で定義) を先頭に付ける必要があります。サービスへの依存は、依存先のサービスが実行されている場合にのみ、このサービスを実行できることを意味します。グループへの依存は、グループのすべてのメンバーを開始しようと試みた後、そのグループのメンバーが少なくとも 1 つ実行されていれば、このサービスを実行できることを意味します。
lpServiceStartNameLPWSTR8/4+48+28

サービスの種類が SERVICE_WIN32_OWN_PROCESS または SERVICE_WIN32_SHARE_PROCESS の場合、このメンバーは、サービス プロセスの実行時にログオンに使用されるアカウントの名前です。この名前は Domain\UserName の形式で指定できます。アカウントが組み込みドメインに属している場合は、.\UserName の形式でも指定できます。プロセスが LocalSystem アカウントで実行される場合は、"LocalSystem" を指定することもできます。

サービスの種類が SERVICE_KERNEL_DRIVER または SERVICE_FILE_SYSTEM_DRIVER の場合、このメンバーは、入出力 (I/O) システムがデバイス ドライバーを読み込むために使用するドライバー オブジェクト名 (\FileSystem\Rdr や \Driver\Xns など) です。このメンバーが NULL の場合、ドライバーは、サービス名に基づいて I/O システムが作成する既定のオブジェクト名で実行されます。

lpDisplayNameLPWSTR8/4+56+32

サービス コントロール プログラムがサービスを識別するために使用する表示名です。この文字列の最大長は 256 文字です。名前の大文字と小文字は、サービス コントロール マネージャー内で保持されます。表示名の比較は、常に大文字と小文字を区別せずに行われます。

このパラメーターでは、次の形式でローカライズされた文字列を指定できます。

@[Path]DLLName,-StrID

識別子 StrID を持つ文字列が DLLName から読み込まれます。Path は省略可能です。詳細については、RegLoadMUIString を参照してください。

Windows Server 2003 および Windows XP: ローカライズされた文字列は Windows Vista までサポートされません。

公式ドキュメント

インストールされているサービスの構成情報を格納します。 QueryServiceConfig 関数によって使用されます。

解説(Remarks)

サービスの構成情報は、 CreateService 関数の呼び出しによってサービスが作成されるときに、最初に指定されます。この情報は ChangeServiceConfig 関数を呼び出すことで変更できます。

例については、 サービスの構成の照会 を参照してください。

メモ

winsvc.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて ANSI 版または Unicode 版を自動的に選択するエイリアスとして QUERY_SERVICE_CONFIG を定義します。エンコードに依存しないこのエイリアスを、エンコードに依存するコードと混在させると、不一致が生じてコンパイル エラーや実行時エラーの原因となることがあります。詳細については、関数プロトタイプの規則 を参照してください。

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

各言語での定義

#include <windows.h>

// QUERY_SERVICE_CONFIGW  (x64 64 / x86 36 バイト)
typedef struct QUERY_SERVICE_CONFIGW {
    ENUM_SERVICE_TYPE dwServiceType;
    SERVICE_START_TYPE dwStartType;
    SERVICE_ERROR dwErrorControl;
    LPWSTR lpBinaryPathName;
    LPWSTR lpLoadOrderGroup;
    DWORD dwTagId;
    LPWSTR lpDependencies;
    LPWSTR lpServiceStartName;
    LPWSTR lpDisplayName;
} QUERY_SERVICE_CONFIGW;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct QUERY_SERVICE_CONFIGW
{
    public uint dwServiceType;
    public uint dwStartType;
    public uint dwErrorControl;
    public IntPtr lpBinaryPathName;
    public IntPtr lpLoadOrderGroup;
    public uint dwTagId;
    public IntPtr lpDependencies;
    public IntPtr lpServiceStartName;
    public IntPtr lpDisplayName;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure QUERY_SERVICE_CONFIGW
    Public dwServiceType As UInteger
    Public dwStartType As UInteger
    Public dwErrorControl As UInteger
    Public lpBinaryPathName As IntPtr
    Public lpLoadOrderGroup As IntPtr
    Public dwTagId As UInteger
    Public lpDependencies As IntPtr
    Public lpServiceStartName As IntPtr
    Public lpDisplayName As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class QUERY_SERVICE_CONFIGW(ctypes.Structure):
    _fields_ = [
        ("dwServiceType", wintypes.DWORD),
        ("dwStartType", wintypes.DWORD),
        ("dwErrorControl", wintypes.DWORD),
        ("lpBinaryPathName", ctypes.c_void_p),
        ("lpLoadOrderGroup", ctypes.c_void_p),
        ("dwTagId", wintypes.DWORD),
        ("lpDependencies", ctypes.c_void_p),
        ("lpServiceStartName", ctypes.c_void_p),
        ("lpDisplayName", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct QUERY_SERVICE_CONFIGW {
    pub dwServiceType: u32,
    pub dwStartType: u32,
    pub dwErrorControl: u32,
    pub lpBinaryPathName: *mut core::ffi::c_void,
    pub lpLoadOrderGroup: *mut core::ffi::c_void,
    pub dwTagId: u32,
    pub lpDependencies: *mut core::ffi::c_void,
    pub lpServiceStartName: *mut core::ffi::c_void,
    pub lpDisplayName: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type QUERY_SERVICE_CONFIGW struct {
	dwServiceType uint32
	dwStartType uint32
	dwErrorControl uint32
	lpBinaryPathName uintptr
	lpLoadOrderGroup uintptr
	dwTagId uint32
	lpDependencies uintptr
	lpServiceStartName uintptr
	lpDisplayName uintptr
}
type
  QUERY_SERVICE_CONFIGW = record
    dwServiceType: DWORD;
    dwStartType: DWORD;
    dwErrorControl: DWORD;
    lpBinaryPathName: Pointer;
    lpLoadOrderGroup: Pointer;
    dwTagId: DWORD;
    lpDependencies: Pointer;
    lpServiceStartName: Pointer;
    lpDisplayName: Pointer;
  end;
const QUERY_SERVICE_CONFIGW = extern struct {
    dwServiceType: u32,
    dwStartType: u32,
    dwErrorControl: u32,
    lpBinaryPathName: ?*anyopaque,
    lpLoadOrderGroup: ?*anyopaque,
    dwTagId: u32,
    lpDependencies: ?*anyopaque,
    lpServiceStartName: ?*anyopaque,
    lpDisplayName: ?*anyopaque,
};
type
  QUERY_SERVICE_CONFIGW {.bycopy.} = object
    dwServiceType: uint32
    dwStartType: uint32
    dwErrorControl: uint32
    lpBinaryPathName: pointer
    lpLoadOrderGroup: pointer
    dwTagId: uint32
    lpDependencies: pointer
    lpServiceStartName: pointer
    lpDisplayName: pointer
struct QUERY_SERVICE_CONFIGW
{
    uint dwServiceType;
    uint dwStartType;
    uint dwErrorControl;
    void* lpBinaryPathName;
    void* lpLoadOrderGroup;
    uint dwTagId;
    void* lpDependencies;
    void* lpServiceStartName;
    void* lpDisplayName;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; QUERY_SERVICE_CONFIGW サイズ: 36 バイト(x86)
dim st, 9    ; 4byte整数×9(構造体サイズ 36 / 4 切り上げ)
; dwServiceType : ENUM_SERVICE_TYPE (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; dwStartType : SERVICE_START_TYPE (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dwErrorControl : SERVICE_ERROR (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; lpBinaryPathName : LPWSTR (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; lpLoadOrderGroup : LPWSTR (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; dwTagId : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; lpDependencies : LPWSTR (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; lpServiceStartName : LPWSTR (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; lpDisplayName : LPWSTR (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; QUERY_SERVICE_CONFIGW サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; dwServiceType : ENUM_SERVICE_TYPE (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; dwStartType : SERVICE_START_TYPE (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dwErrorControl : SERVICE_ERROR (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; lpBinaryPathName : LPWSTR (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; lpLoadOrderGroup : LPWSTR (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; dwTagId : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; lpDependencies : LPWSTR (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; lpServiceStartName : LPWSTR (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; lpDisplayName : LPWSTR (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global QUERY_SERVICE_CONFIGW
    #field int dwServiceType
    #field int dwStartType
    #field int dwErrorControl
    #field intptr lpBinaryPathName
    #field intptr lpLoadOrderGroup
    #field int dwTagId
    #field intptr lpDependencies
    #field intptr lpServiceStartName
    #field intptr lpDisplayName
#endstruct

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