QueryServiceConfig (advapi32)
Last changed: Smoke-190.64.103.228

.
Summary
The QueryServiceConfig function retrieves the configuration parameters of the specified service. Optional configuration parameters are available using the QueryServiceConfig2 function.

C# Signature:

[DllImport("advapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern Boolean QueryServiceConfig(IntPtr hService, IntPtr intPtrQueryConfig, UInt32 cbBufSize, out UInt32 pcbBytesNeeded);

VB Signature:

Declare Function QueryServiceConfig Lib "advapi32.dll" (TODO) As TODO

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

    // Get service executable and run it in the console. Change "Name of service" to your service name.
    using System;
    using System.Runtime.InteropServices;

    #region P/Invoke QueryService
    [StructLayout(LayoutKind.Sequential)]
    public class QUERY_SERVICE_CONFIG
    {
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.U4)]
        public UInt32 dwServiceType;
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.U4)]
        public UInt32 dwStartType;
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.U4)]
        public UInt32 dwErrorControl;
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]
        public String lpBinaryPathName;
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]
        public String lpLoadOrderGroup;
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.U4)]
        public UInt32 dwTagID;
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]
        public String lpDependencies;
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]
        public String lpServiceStartName;
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]
        public String lpDisplayName;
    };

    [DllImport("advapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
    public static extern Boolean QueryServiceConfig(IntPtr hService, IntPtr intPtrQueryConfig, UInt32 cbBufSize, out UInt32 pcbBytesNeeded);
    [DllImport("advapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
    public static extern IntPtr OpenSCManager(String lpMachineName, String lpDatabaseName, UInt32 dwDesiredAccess);
    [DllImport("advapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
    public static extern IntPtr OpenService(IntPtr hSCManager, String lpServiceName, UInt32 dwDesiredAccess);

    private const int SC_MANAGER_ALL_ACCESS = 0x000F003F;
    private const int SERVICE_QUERY_CONFIG = 0x00000001;

    #endregion P/Invoke QueryService

    IntPtr databaseHandle = OpenSCManager(null, null, SC_MANAGER_ALL_ACCESS);
    if(databaseHandle == IntPtr.Zero)
        throw new System.Runtime.InteropServices.ExternalException("Error OpenSCManager\n");

    IntPtr serviceHandle = OpenService(databaseHandle,  "Name of service", SERVICE_QUERY_CONFIG);
    if(databaseHandle == IntPtr.Zero)
        throw new System.Runtime.InteropServices.ExternalException("Error OpenService\n");

    UInt32 dwBytesNeeded = 0;

    // Allocate memory for struct.
    IntPtr ptr = Marshal.AllocHGlobal(4096);

    bool success = QueryServiceConfig(serviceHandle, ptr, 4096, out dwBytesNeeded);

    QUERY_SERVICE_CONFIG qUERY_SERVICE_CONFIG = new QUERY_SERVICE_CONFIG();
    // Copy
    Marshal.PtrToStructure(ptr, qUERY_SERVICE_CONFIG);
    // Free memory for struct.
    Marshal.FreeHGlobal(ptr);

    ProcessStartInfo psi = new ProcessStartInfo();
    psi.FileName = qUERY_SERVICE_CONFIG.lpBinaryPathName;
    psi.Arguments = "-r";
    Process p = Process.Start(psi);

Alternative Managed API:

Do you know one? Please contribute it!

Documentation