/*
 * svcctl interface definitions - exported by services.exe to access the
 * services database
 *
 * Copyright 2007 Google (Mikolaj Zalewski)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "wtypes.idl";

/*
 * some defined for the C code
 */
cpp_quote("#include \"winsvc.h\"")
cpp_quote("#define SVCCTL_TRANSPORT {'n','c','a','c','n','_','n','p',0}")
cpp_quote("#define SVCCTL_ENDPOINT {'\\\\','p','i','p','e','\\\\','s','v','c','c','t','l',0}")

/* Not the Windows event name - if needed the true one can be found in Inside Windows */
cpp_quote("#define SVCCTL_STARTED_EVENT {'_','_','w','i','n','e','_','S','v','c','c','t','l','S','t','a','r','t','e','d',0}")

/* Service startup protocol over control pipe - not compatible with Windows */
enum service_pipe_command
{
    WINESERV_STARTINFO = 1,
    WINESERV_SENDCONTROL = 2
};

typedef struct service_start_info_t
{
    enum service_pipe_command cmd;        /* request code */
    DWORD                     total_size; /* total request size */
    DWORD                     name_size;  /* size of name in data buffer */
    DWORD                     control;    /* control code */
    WCHAR                     data[1];
} service_start_info;

[
    uuid(367abb81-9844-35f1-ad32-98f038001003),
    version(2.0),
    pointer_default(unique),
    endpoint("ncacn_np:[\\pipe\\svcctl]")
]
interface svcctl
{
    /* handle types */
    typedef [handle] LPCWSTR MACHINE_HANDLEW;
    typedef [context_handle] void *SC_RPC_HANDLE;
    typedef [context_handle] void *SC_RPC_LOCK;

    /* undocumented access rights */
    cpp_quote("#define SERVICE_SET_STATUS   0x8000")

cpp_quote("#if 0 /* already defined in winsvc.h */")
typedef struct _QUERY_SERVICE_CONFIGW {
    DWORD   dwServiceType;
    DWORD   dwStartType;
    DWORD   dwErrorControl;
    [unique] LPWSTR  lpBinaryPathName;
    [unique] LPWSTR  lpLoadOrderGroup;
    DWORD   dwTagId;
    [unique] LPWSTR  lpDependencies;
    [unique] LPWSTR  lpServiceStartName;
    [unique] LPWSTR  lpDisplayName;
} QUERY_SERVICE_CONFIGW, *LPQUERY_SERVICE_CONFIGW;

typedef struct _SERVICE_STATUS {
  DWORD dwServiceType;
  DWORD dwCurrentState;
  DWORD dwControlsAccepted;
  DWORD dwWin32ExitCode;
  DWORD dwServiceSpecificExitCode;
  DWORD dwCheckPoint;
  DWORD dwWaitHint;
} SERVICE_STATUS, *LPSERVICE_STATUS;

typedef enum _SC_STATUS_TYPE {
  SC_STATUS_PROCESS_INFO      = 0
} SC_STATUS_TYPE;

typedef struct _SERVICE_DESCRIPTIONW {
   LPWSTR lpDescription;
} SERVICE_DESCRIPTIONW,*LPSERVICE_DESCRIPTIONW;

typedef enum _SC_ACTION_TYPE {
    SC_ACTION_NONE        = 0,
    SC_ACTION_RESTART     = 1,
    SC_ACTION_REBOOT      = 2,
    SC_ACTION_RUN_COMMAND = 3
} SC_ACTION_TYPE;

typedef struct _SC_ACTION {
    SC_ACTION_TYPE  Type;
    DWORD       Delay;
} SC_ACTION,*LPSC_ACTION;

typedef struct _SERVICE_FAILURE_ACTIONSW {
    DWORD dwResetPeriod;
    [unique] LPWSTR lpRebootMsg;
    [unique] LPWSTR lpCommand;
    DWORD cActions;
    [size_is(cActions)] SC_ACTION *lpsaActions;
} SERVICE_FAILURE_ACTIONSW,*LPSERVICE_FAILURE_ACTIONSW;

typedef struct _SERVICE_PRESHUTDOWN_INFO {
    DWORD dwPreshutdownTimeout;
} SERVICE_PRESHUTDOWN_INFO,*LPSERVICE_PRESHUTDOWN_INFO;

#define SERVICE_CONFIG_DESCRIPTION              1
#define SERVICE_CONFIG_FAILURE_ACTIONS          2
#define SERVICE_CONFIG_DELAYED_AUTO_START_INFO  3
#define SERVICE_CONFIG_FAILURE_ACTIONS_FLAG     4
#define SERVICE_CONFIG_SERVICE_SID_INFO         5
#define SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO 6
#define SERVICE_CONFIG_PRESHUTDOWN_INFO         7

typedef struct _ENUM_SERVICE_STATUSW {
    LPWSTR          lpServiceName;
    LPWSTR          lpDisplayName;
    SERVICE_STATUS  ServiceStatus;
} ENUM_SERVICE_STATUSW, *LPENUM_SERVICE_STATUSW;

cpp_quote("#endif")

typedef [switch_type(DWORD)] union
{
  [case (SERVICE_CONFIG_DESCRIPTION)] SERVICE_DESCRIPTIONW descr;
  [case (SERVICE_CONFIG_FAILURE_ACTIONS)] SERVICE_FAILURE_ACTIONSW actions;
  [case (SERVICE_CONFIG_PRESHUTDOWN_INFO)] SERVICE_PRESHUTDOWN_INFO preshutdown;
} SERVICE_CONFIG2W;

    /* Compatible with Windows function 0x00 */
    DWORD svcctl_CloseServiceHandle(
        [in,out] SC_RPC_HANDLE *handle
    );

    /* Compatible with Windows function 0x01 */
    DWORD svcctl_ControlService(
        [in] SC_RPC_HANDLE hService,
        [in] DWORD dwControl,
        [out] SERVICE_STATUS *lpServiceStatus
    );

    /* Compatible with Windows function 0x02 */
    DWORD svcctl_DeleteService(
        [in] SC_RPC_HANDLE hService
    );

    /* Compatible with Windows function 0x03 */
    DWORD svcctl_LockServiceDatabase(
        [in] SC_RPC_HANDLE hSCManager,
        [out] SC_RPC_LOCK *phLock
    );

    /* Not compatible with Windows function 0x04 */
    DWORD svcctl_QueryServiceObjectSecurity(/* FIXME */);

    /* Not compatible with Windows function 0x05 */
    DWORD svcctl_SetServiceObjectSecurity(/* FIXME */);

    /* Not compatible with Windows function 0x06 */
    DWORD svcctl_QueryServiceStatus(/* FIXME */);

    /* Compatible with Windows function 0x07 */
    DWORD svcctl_SetServiceStatus(
        [in] SC_RPC_HANDLE hServiceStatus,
        [in] LPSERVICE_STATUS lpServiceStatus
    );

    /* Compatible with Windows function 0x08 */
    DWORD svcctl_UnlockServiceDatabase(
        [in,out] SC_RPC_LOCK *phLock
    );

    /* Not compatible with Windows function 0x09 */
    DWORD svcctl_NotifyBootConfigStatus(/* FIXME */);

    /* Not compatible with Windows function 0x0a */
    DWORD svcctl_SCSetServiceBitsW(/* FIXME */);

    /* Compatible with Windows function 0x0b */
    DWORD svcctl_ChangeServiceConfigW(
        [in] SC_RPC_HANDLE hService,
        [in] DWORD dwServiceType,
        [in] DWORD dwStartType,
        [in] DWORD dwErrorControl,
        [in,unique] LPCWSTR lpBinaryPathName,
        [in,unique] LPCWSTR lpLoadOrderGroupKey,
        [in,out,unique] DWORD *lpdwTagId,
        [in,unique,size_is(dwDependenciesSize)] const BYTE *lpDependencies,
        [in] DWORD dwDependenciesSize,
        [in,unique] LPCWSTR lpServiceStartName,
        [in,unique,size_is(dwPasswordSize)] const BYTE *lpPassword,
        [in] DWORD dwPasswordSize,
        [in,unique] LPCWSTR lpDisplayName
    );

    /* Compatible with Windows function 0x0c */
    DWORD svcctl_CreateServiceW(
        [in] SC_RPC_HANDLE hSCManager,
        [in] LPCWSTR lpServiceName,
        [in,unique] LPCWSTR lpDisplayName,
        [in] DWORD dwDesiredAccess,
        [in] DWORD dwServiceType,
        [in] DWORD dwStartType,
        [in] DWORD dwErrorControl,
        [in] LPCWSTR lpBinaryPathName,
        [in,unique] LPCWSTR lpLoadOrderGroup,
        [in,out,unique] DWORD *lpdwTagId,
        [in,unique,size_is(dwDependenciesSize)] const BYTE *lpDependencies,
        [in] DWORD dwDependenciesSize,
        [in,unique] LPCWSTR lpServiceStartName,
        [in,unique,size_is(dwPasswordSize)] const BYTE *lpPassword,
        [in] DWORD dwPasswordSize,
        [out] SC_RPC_HANDLE *phService
    );

    /* Not compatible with Windows function 0x0d */
    DWORD svcctl_EnumDependentServicesW(/* FIXME */);

    /* Not compatible with Windows function 0x0e */
    DWORD svcctl_EnumServicesStatusW(
        [in] SC_RPC_HANDLE hmngr,
        [in] DWORD type,
        [in] DWORD state,
        [out,size_is(size)] BYTE *buffer,
        [in] DWORD size,
        [out] LPDWORD needed,
        [out] LPDWORD returned
    );

    /* Compatible with Windows function 0x0f */
    DWORD svcctl_OpenSCManagerW(
        [in,unique] MACHINE_HANDLEW MachineName,
        [in,unique] LPCWSTR DatabaseName,
        [in] DWORD dwAccessMask,
        [out] SC_RPC_HANDLE *handle
    );

    /* Compatible with Windows function 0x10 */
    DWORD svcctl_OpenServiceW(
        [in] SC_RPC_HANDLE hSCManager,
        [in] LPCWSTR lpServiceName,
        [in] DWORD dwDesiredAccess,
        [out] SC_RPC_HANDLE *phService
    );

    /* Windows function 0x11 must be using a different prototype - not compatible */
    DWORD svcctl_QueryServiceConfigW(
        [in] SC_RPC_HANDLE hService,
        [out] QUERY_SERVICE_CONFIGW *config);

    /* Not compatible with Windows function 0x12 */
    DWORD svcctl_QueryServiceLockStatusW(/* FIXME */);

    /* Untested with Windows function 0x13 */
    DWORD svcctl_StartServiceW(
        [in] SC_RPC_HANDLE hService,
        [in] DWORD dwNumServiceArgs,
        [in,unique,size_is(dwNumServiceArgs)] LPCWSTR *lpServiceArgVectors
    );

    /* Compatible with Windows function 0x14 */
    DWORD svcctl_GetServiceDisplayNameW(
        [in] SC_RPC_HANDLE hSCManager,
        [in] LPCWSTR lpServiceName,
        [out,string,size_is(*cchBufSize+1)] WCHAR lpBuffer[],
        [in,out] DWORD *cchBufSize);

    /* Compatible with Windows function 0x15 */
    DWORD svcctl_GetServiceKeyNameW(
        [in] SC_RPC_HANDLE hSCManager,
        [in] LPCWSTR lpServiceDisplayName,
        [out,string,size_is(*cchBufSize+1)] WCHAR lpBuffer[],
        [in,out] DWORD *cchBufSize);

    /* Not compatible with Windows function 0x16 */
    DWORD svcctl_SCSetServiceBitsA(/* FIXME */);

    /* Not compatible with Windows function 0x17 */
    DWORD svcctl_ChangeServiceConfigA(/* FIXME */);

    /* Not compatible with Windows function 0x18 */
    DWORD svcctl_CreateServiceA(/* FIXME */);

    /* Not compatible with Windows function 0x19 */
    DWORD svcctl_EnumDependentServicesA(/* FIXME */);

    /* Not compatible with Windows function 0x1a */
    DWORD svcctl_EnumServicesStatusA(/* FIXME */);

    /* Not compatible with Windows function 0x1b */
    DWORD svcctl_OpenSCManagerA(/* FIXME */);

    /* Not compatible with Windows function 0x1c */
    DWORD svcctl_OpenServiceA(/* FIXME */);

    /* Not compatible with Windows function 0x1d */
    DWORD svcctl_QueryServiceConfigA(/* FIXME */);

    /* Not compatible with Windows function 0x1e */
    DWORD svcctl_QueryServiceLockStatusA(/* FIXME */);

    /* Not compatible with Windows function 0x1f */
    DWORD svcctl_StartServiceA(/* FIXME */);

    /* Not compatible with Windows function 0x20 */
    DWORD svcctl_GetServiceDisplayNameA(/* FIXME */);

    /* Not compatible with Windows function 0x21 */
    DWORD svcctl_GetServiceKeyNameA(/* FIXME */);

    /* Not compatible with Windows function 0x22 */
    DWORD svcctl_GetCurrentGroupStateW(/* FIXME */);

    /* Not compatible with Windows function 0x23 */
    DWORD svcctl_EnumServiceGroupW(/* FIXME */);

    /* Not compatible with Windows function 0x24 */
    DWORD svcctl_ChangeServiceConfig2A(/* FIXME */);

    /* Untested with Windows function 0x25 */
    DWORD svcctl_ChangeServiceConfig2W(
        [in] SC_RPC_HANDLE hService,
        [in] DWORD InfoLevel,
        [in,switch_is(InfoLevel)] SERVICE_CONFIG2W *config );

    /* Not compatible with Windows function 0x26 */
    DWORD svcctl_QueryServiceConfig2A(/* FIXME */);

    /* Untested with Windows function 0x27 */
    DWORD svcctl_QueryServiceConfig2W(
        [in] SC_RPC_HANDLE hService,
        [in] DWORD InfoLevel,
        [out,size_is(cbBufSize)] BYTE lpBuffer[],
        [in] DWORD cbBufSize,
        [out] LPDWORD pcbBytesNeeded
    );

    /* Untested with Windows function 0x28 */
    DWORD svcctl_QueryServiceStatusEx(
        [in] SC_RPC_HANDLE hService,
        [in] SC_STATUS_TYPE InfoLevel,
        [out,size_is(cbBufSize)] BYTE *lpBuffer,
        [in] DWORD cbBufSize,
        [out] LPDWORD pcbBytesNeeded
    );

    DWORD svcctl_EnumServicesStatusExW(
        [in] SC_RPC_HANDLE hmngr,
        [in] DWORD type,
        [in] DWORD state,
        [out,size_is(size)] BYTE *buffer,
        [in] DWORD size,
        [out] LPDWORD needed,
        [out] LPDWORD returned,
        [in,unique] LPCWSTR group
    );
}
