Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

625 lines
20 KiB

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
svcctl.idl
Abstract:
This is the IDL file that describes the RPC interface for the
remotable NetService API.
Author:
Dan Lafferty (danl) 03-Feb-1992
Environment:
User Mode -Win32
Revision History:
03-Feb-1992 danl
Created
--*/
//
// Interface Attributes
//
[
uuid(367ABB81-9844-35F1-AD32-98F038001003),
version(2.0),
#ifdef __midl
ms_union,
#endif // __midl
pointer_default(unique)
]
//
// Interface Keyword
//
interface svcctl
//
// Interface Body
//
{
import "imports.idl";
//
// Disable warnings about MIDL features that won't work
// if this file is compiled for a downlevel OS.
//
midl_pragma warning (disable:2466)
midl_pragma warning (disable:2467)
//
// Define handle types
//
typedef [handle] wchar_t * SVCCTL_HANDLEW;
typedef [handle] LPSTR SVCCTL_HANDLEA;
typedef [context_handle] PVOID SC_RPC_HANDLE;
typedef [context_handle] PVOID SC_RPC_LOCK;
typedef SC_RPC_HANDLE *LPSC_RPC_HANDLE;
typedef SC_RPC_LOCK *LPSC_RPC_LOCK;
//
// This Data Structure is used in specifying an array of string pointers
// used to pass command line arguments into StartService.
//
typedef struct _STRING_PTRSA {
[string] LPSTR StringPtr;
} STRING_PTRSA, *PSTRING_PTRSA, *LPSTRING_PTRSA;
typedef struct _STRING_PTRSW {
[string] wchar_t * StringPtr;
} STRING_PTRSW, *PSTRING_PTRSW, *LPSTRING_PTRSW;
//
// typedef needed to specify conformant range when size is
// given by reference in an in/out parameter
//
typedef [range(0, 1024 * 4)] DWORD BOUNDED_DWORD;
typedef BOUNDED_DWORD * LPBOUNDED_DWORD;
//////////////////////////////////////////////////////////////////////////////
// FUNCTION PROTOTYPES
//////////////////////////////////////////////////////////////////////////////
DWORD
RCloseServiceHandle(
[in,out] LPSC_RPC_HANDLE hSCObject
);
DWORD
RControlService(
[in] SC_RPC_HANDLE hService,
[in] DWORD dwControl,
[out] LPSERVICE_STATUS lpServiceStatus
);
DWORD
RDeleteService(
[in] SC_RPC_HANDLE hService
);
DWORD
RLockServiceDatabase(
[in] SC_RPC_HANDLE hSCManager,
[out] LPSC_RPC_LOCK lpLock
);
DWORD
RQueryServiceObjectSecurity(
[in] SC_RPC_HANDLE hService,
[in] SECURITY_INFORMATION dwSecurityInformation,
[out, size_is(cbBufSize)] LPBYTE lpSecurityDescriptor,
[in, range(0, 1024 * 8)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded
);
DWORD
RSetServiceObjectSecurity(
[in] SC_RPC_HANDLE hService,
[in] SECURITY_INFORMATION dwSecurityInformation,
[in,size_is(cbBufSize)] LPBYTE lpSecurityDescriptor,
[in] DWORD cbBufSize
);
DWORD
RQueryServiceStatus(
[in] SC_RPC_HANDLE hService,
[out] LPSERVICE_STATUS lpServiceStatus
);
DWORD
RSetServiceStatus(
[in] SC_RPC_HANDLE hServiceStatus,
[in] LPSERVICE_STATUS lpServiceStatus
);
DWORD
RUnlockServiceDatabase(
[in,out] LPSC_RPC_LOCK Lock
);
DWORD
RNotifyBootConfigStatus(
[in,string,unique] SVCCTL_HANDLEW lpMachineName,
[in] DWORD BootAcceptable
);
//////////////////////////////////////////////////////////////////////////////
// UNICODE FUNCTION PROTOTYPES
//////////////////////////////////////////////////////////////////////////////
DWORD
RI_ScSetServiceBitsW(
[in] SC_RPC_HANDLE hServiceStatus,
[in] DWORD dwServiceBits,
[in] DWORD bSetBitsOn,
[in] DWORD bUpdateImmediately,
[in,string,unique] wchar_t * pszTransportName
);
DWORD
RChangeServiceConfigW(
[in] SC_RPC_HANDLE hService,
[in] DWORD dwServiceType,
[in] DWORD dwStartType,
[in] DWORD dwErrorControl,
[in,string,unique] wchar_t * lpBinaryPathName,
[in,string,unique] wchar_t * lpLoadOrderGroup,
[in,out,unique] LPDWORD lpdwTagId,
[in,unique,size_is(dwDependSize)] LPBYTE lpDependencies,
[in] DWORD dwDependSize,
[in,string,unique] wchar_t * lpServiceStartName,
[in,unique,size_is(dwPwSize)] LPBYTE lpPassword,
[in] DWORD dwPwSize,
[in,string,unique] wchar_t * lpDisplayName
);
DWORD
RCreateServiceW(
[in] SC_RPC_HANDLE hSCManager,
[in,string] wchar_t * lpServiceName,
[in,string,unique] wchar_t * lpDisplayName,
[in] DWORD dwDesiredAccess,
[in] DWORD dwServiceType,
[in] DWORD dwStartType,
[in] DWORD dwErrorControl,
[in,string] wchar_t * lpBinaryPathName,
[in,string,unique] wchar_t * lpLoadOrderGroup,
[in,out,unique] LPDWORD lpdwTagId,
[in,unique,size_is(dwDependSize)] LPBYTE lpDependencies,
[in] DWORD dwDependSize,
[in,string,unique] wchar_t * lpServiceStartName,
[in,unique,size_is(dwPwSize)] LPBYTE lpPassword,
[in] DWORD dwPwSize,
[out] LPSC_RPC_HANDLE lpServiceHandle
);
DWORD
REnumDependentServicesW(
[in] SC_RPC_HANDLE hService,
[in] DWORD dwServiceState,
[out, size_is(cbBufSize)] LPBYTE lpServices,
[in, range(0, 1024 * 64)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded,
[out] LPDWORD lpServicesReturned
);
DWORD
REnumServicesStatusW(
[in] SC_RPC_HANDLE hSCManager,
[in] DWORD dwServiceType,
[in] DWORD dwServiceState,
[out, size_is(cbBufSize)] LPBYTE lpBuffer,
[in, range(0, 1024 * 64)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded,
[out] LPDWORD lpServicesReturned,
[in,out,unique] LPDWORD lpResumeIndex
);
DWORD
ROpenSCManagerW(
[in,string,unique] SVCCTL_HANDLEW lpMachineName,
[in,string,unique] wchar_t * lpDatabaseName,
[in] DWORD dwDesiredAccess,
[out] LPSC_RPC_HANDLE lpScHandle
);
DWORD
ROpenServiceW(
[in] SC_RPC_HANDLE hSCManager,
[in,string] wchar_t * lpServiceName,
[in] DWORD dwDesiredAccess,
[out] LPSC_RPC_HANDLE lpServiceHandle
);
DWORD
RQueryServiceConfigW(
[in] SC_RPC_HANDLE hService,
[out] LPQUERY_SERVICE_CONFIGW lpServiceConfig,
[in, range(0, 1024 * 8)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded
);
DWORD
RQueryServiceLockStatusW(
[in] SC_RPC_HANDLE hSCManager,
[out] LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus,
[in, range(0, 1024 * 4)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded
);
DWORD
RStartServiceW(
[in] SC_RPC_HANDLE hService,
[in] DWORD argc,
[in,unique,size_is(argc)] LPSTRING_PTRSW argv
);
DWORD
RGetServiceDisplayNameW(
[in] SC_RPC_HANDLE hSCManager,
[in,string] wchar_t * lpServiceName,
[out,string, size_is(*lpcchBuffer+1)] wchar_t * lpDisplayName,
[in,out] LPBOUNDED_DWORD lpcchBuffer
);
DWORD
RGetServiceKeyNameW(
[in] SC_RPC_HANDLE hSCManager,
[in,string] wchar_t * lpDisplayName,
[out,string, size_is(*lpcchBuffer+1)] wchar_t * lpServiceName,
[in,out] LPBOUNDED_DWORD lpcchBuffer
);
//////////////////////////////////////////////////////////////////////////////
// ANSI FUNCTION PROTOTYPES
//////////////////////////////////////////////////////////////////////////////
DWORD
RI_ScSetServiceBitsA(
[in] SC_RPC_HANDLE hServiceStatus,
[in] DWORD dwServiceBits,
[in] DWORD bSetBitsOn,
[in] DWORD bUpdateImmediately,
[in,out,string,unique] LPSTR pszTransportName
);
DWORD
RChangeServiceConfigA(
[in] SC_RPC_HANDLE hService,
[in] DWORD dwServiceType,
[in] DWORD dwStartType,
[in] DWORD dwErrorControl,
[in,string,unique] LPSTR lpBinaryPathName,
[in,string,unique] LPSTR lpLoadOrderGroup,
[in,out,unique] LPDWORD lpdwTagId,
[in,unique,size_is(dwDependSize)] LPBYTE lpDependencies,
[in] DWORD dwDependSize,
[in,string,unique] LPSTR lpServiceStartName,
[in,unique,size_is(dwPwSize)] LPBYTE lpPassword,
[in] DWORD dwPwSize,
[in,string,unique] LPSTR lpDisplayName
);
DWORD
RCreateServiceA(
[in] SC_RPC_HANDLE hSCManager,
[in,string] LPSTR lpServiceName,
[in,string,unique] LPSTR lpDisplayName,
[in] DWORD dwDesiredAccess,
[in] DWORD dwServiceType,
[in] DWORD dwStartType,
[in] DWORD dwErrorControl,
[in,string] LPSTR lpBinaryPathName,
[in,string,unique] LPSTR lpLoadOrderGroup,
[in,out,unique] LPDWORD lpdwTagId,
[in,unique,size_is(dwDependSize)] LPBYTE lpDependencies,
[in] DWORD dwDependSize,
[in,string,unique] LPSTR lpServiceStartName,
[in,unique,size_is(dwPwSize)] LPBYTE lpPassword,
[in] DWORD dwPwSize,
[out] LPSC_RPC_HANDLE lpServiceHandle
);
DWORD
REnumDependentServicesA(
[in] SC_RPC_HANDLE hService,
[in] DWORD dwServiceState,
[out, size_is(cbBufSize)] LPBYTE lpServices,
[in, range(0, 1024 * 64)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded,
[out] LPDWORD lpServicesReturned
);
DWORD
REnumServicesStatusA(
[in] SC_RPC_HANDLE hSCManager,
[in] DWORD dwServiceType,
[in] DWORD dwServiceState,
[out, size_is(cbBufSize)] LPBYTE lpBuffer,
[in, range(0, 1024 * 64)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded,
[out] LPDWORD lpServicesReturned,
[in,out,unique] LPDWORD lpResumeIndex
);
DWORD
ROpenSCManagerA(
[in,string,unique] SVCCTL_HANDLEA lpMachineName,
[in,string,unique] LPSTR lpDatabaseName,
[in] DWORD dwDesiredAccess,
[out] LPSC_RPC_HANDLE lpScHandle
);
DWORD
ROpenServiceA(
[in] SC_RPC_HANDLE hSCManager,
[in,string] LPSTR lpServiceName,
[in] DWORD dwDesiredAccess,
[out] LPSC_RPC_HANDLE lpServiceHandle
);
DWORD
RQueryServiceConfigA(
[in] SC_RPC_HANDLE hService,
[out] LPQUERY_SERVICE_CONFIGA lpServiceConfig,
[in, range(0, 1024 * 8)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded
);
DWORD
RQueryServiceLockStatusA(
[in] SC_RPC_HANDLE hSCManager,
[out] LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus,
[in, range(0, 1024 * 4)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded
);
DWORD
RStartServiceA(
[in] SC_RPC_HANDLE hService,
[in] DWORD argc,
[in,unique,size_is(argc)] LPSTRING_PTRSA argv
);
DWORD
RGetServiceDisplayNameA(
[in] SC_RPC_HANDLE hSCManager,
[in,string] LPSTR lpServiceName,
[out,string,
size_is(*lpcchBuffer)] LPSTR lpDisplayName,
[in,out] LPBOUNDED_DWORD lpcchBuffer
);
DWORD
RGetServiceKeyNameA(
[in] SC_RPC_HANDLE hSCManager,
[in,string] LPSTR lpDisplayName,
[out,string,
size_is(*lpcchBuffer)] LPSTR lpKeyName,
[in,out] LPBOUNDED_DWORD lpcchBuffer
);
/////////////////////////////////////////////////////////////////////////////
// Functions below this point are not in Windows NT version 3.51 or earlier
/////////////////////////////////////////////////////////////////////////////
// Internal only
DWORD
RI_ScGetCurrentGroupStateW(
[in] SC_RPC_HANDLE hSCManager,
[in,string,unique] wchar_t * pszGroupName,
[out] LPDWORD pdwCurrentState
);
// Internal only
DWORD
REnumServiceGroupW(
[in] SC_RPC_HANDLE hSCManager,
[in] DWORD dwServiceType,
[in] DWORD dwServiceState,
[out, size_is(cbBufSize)] LPBYTE lpBuffer,
[in, range(0, 1024 * 64)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded,
[out] LPDWORD lpServicesReturned,
[in,out,unique] LPDWORD lpResumeIndex,
[in,string,unique] LPCWSTR pszGroupName
);
/////////////////////////////////////////////////////////////////////////////
// Functions below this point are not in Windows NT version 4.0 or earlier
//
// (Note that new functions must always be added at the end, otherwise
// function calls are mismatched when client and server talk different
// versions of the interface)
/////////////////////////////////////////////////////////////////////////////
//
// This is a union of all the types of pointers to input data that can be
// passed to ChangeServiceConfig2
//
typedef struct _SC_RPC_CONFIG_INFOA
{
DWORD dwInfoLevel;
[switch_is(dwInfoLevel)] union
{
[case(1)] // SERVICE_CONFIG_DESCRIPTION
LPSERVICE_DESCRIPTIONA psd;
[case(2)] // SERVICE_CONFIG_FAILURE_ACTIONS
LPSERVICE_FAILURE_ACTIONSA psfa;
};
} SC_RPC_CONFIG_INFOA;
typedef struct _SC_RPC_CONFIG_INFOW
{
DWORD dwInfoLevel;
[switch_is(dwInfoLevel)] union
{
[case(1)] // SERVICE_CONFIG_DESCRIPTION
LPSERVICE_DESCRIPTIONW psd;
[case(2)] // SERVICE_CONFIG_FAILURE_ACTIONS
LPSERVICE_FAILURE_ACTIONSW psfa;
};
} SC_RPC_CONFIG_INFOW;
DWORD
RChangeServiceConfig2A(
[in] SC_RPC_HANDLE hService,
[in] SC_RPC_CONFIG_INFOA Info
);
DWORD
RChangeServiceConfig2W(
[in] SC_RPC_HANDLE hService,
[in] SC_RPC_CONFIG_INFOW Info
);
DWORD
RQueryServiceConfig2A(
[in] SC_RPC_HANDLE hService,
[in] DWORD dwInfoLevel,
[out, size_is(cbBufSize)] LPBYTE lpBuffer,
[in, range(0, 1024 * 8)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded
);
DWORD
RQueryServiceConfig2W(
[in] SC_RPC_HANDLE hService,
[in] DWORD dwInfoLevel,
[out, size_is(cbBufSize)] LPBYTE lpBuffer,
[in, range(0, 1024 * 8)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded
);
DWORD
RQueryServiceStatusEx(
[in] SC_RPC_HANDLE hService,
[in] SC_STATUS_TYPE InfoLevel,
[out, size_is(cbBufSize)] LPBYTE lpBuffer,
[in, range(0, 1024 * 8)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded
);
DWORD
REnumServicesStatusExA (
[in] SC_RPC_HANDLE hSCManager,
[in] SC_ENUM_TYPE InfoLevel,
[in] DWORD dwServiceType,
[in] DWORD dwServiceState,
[out, size_is(cbBufSize)] LPBYTE lpBuffer,
[in, range(0, 1024 * 64)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded,
[out] LPDWORD lpServicesReturned,
[in,out,unique] LPDWORD lpResumeIndex,
[in,string,unique] LPCSTR pszGroupName
);
DWORD
REnumServicesStatusExW (
[in] SC_RPC_HANDLE hSCManager,
[in] SC_ENUM_TYPE InfoLevel,
[in] DWORD dwServiceType,
[in] DWORD dwServiceState,
[out, size_is(cbBufSize)] LPBYTE lpBuffer,
[in, range(0, 1024 * 64)] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded,
[out] LPDWORD lpServicesReturned,
[in,out,unique] LPDWORD lpResumeIndex,
[in,string,unique] LPCWSTR pszGroupName
);
/////////////////////////////////////////////////////////////////////////////
// Functions below this point are not in Windows NT version 5.0 or earlier
//
// (Note that new functions must always be added at the end, otherwise
// function calls are mismatched when client and server talk different
// versions of the interface)
/////////////////////////////////////////////////////////////////////////////
DWORD
RI_ScSendTSMessage (
[in] SC_RPC_HANDLE hSCManager,
[in] DWORD OpCode,
[in] DWORD dwEvent,
[in, range(0, 2 * sizeof(DWORD))] DWORD cbData, // constrain to sizeof(WTSSESSION_NOTIFICATION)
[in,size_is(cbData)] LPBYTE lpData
);
/////////////////////////////////////////////////////////////////////////////
//
// IN THE FUTURE .....
//
// MIDL will support marshalling structures directly into the user's buffer.
// To do this, the server side must know how big the buffer should be
// for the server code. The server code must fill in the buffer.
// The [byte_count(bufferSize)] attribute is used in the .acf file to tell
// it the RPC server stub what size buffer needs to be allocated.
//
// byte_count is similar to all_nodes. all_nodes tells the MIDL client stubs
// to allocate one buffer into which is unmarshall the entire tree.
// byte_count tells the MIDL client stubs to unmarshall the entire tree into
// the user-provided buffer using the buffer size limits specified with
// the attribute.
//
//
// The strange syntax below uses size_is to allow the .IDL file to stand
// alone (without the .acf file) and operate correctly using a DEC or HP
// MIDL compiler. However, without the .ACF file, the instructions in
// the .IDL file indicate that the top level structures will be placed
// in the users buffer, but the lower level data will be placed in MIDL
// allocated buffers. - In a NON-all_nodes fashion.
//
// Note that cbBufSize/sizeof(ENUM_SERVICE_STATUS) will always be larger
// than lpServicesReturned. The size_is attribute tells the server side
// how much memory to allocate in the case where there is no .acf file.
//
// After the next drop of the MIDL complier, Donna will still need to
// fix MIDL so that it allows size_is and byte_count to apply to the
// same parameter. Perhaps we need approval from Dov.
//
//
//
//DWORD
//REnumServicesStatusW(
// [in] SC_RPC_HANDLE hSCManager,
// [in] DWORD dwServiceType,
// [in] DWORD dwServiceState,
//
// [out,size_is(cbBufSize/sizeof(ENUM_SERVICE_STATUS),
// length_is(*lpServicesReturned)] LPENUM_SERVICE_STATUS lpServices,
//
// [out] PDWORD pcbReturned,
// [in] DWORD cbBufSize,
// [out] LPDWORD pcbBytesNeeded,
// [out] LPDWORD lpServicesReturned,
// [in,out,unique] LPDWORD lpResumeHandle
// );
}