-/* $Id: scm.c,v 1.5 2000/03/26 22:00:07 dwelch Exp $
+/* $Id: scm.c,v 1.14 2002/12/26 17:23:27 robd Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
/* INCLUDES ******************************************************************/
+#define NTOS_MODE_USER
+#include <ntos.h>
#include <windows.h>
-#include <ddk/ntddk.h>
+#include <tchar.h>
/* FUNCTIONS *****************************************************************/
LPCSTR lpDependencies,
LPCSTR lpServiceStartName,
LPCSTR lpPassword,
- LPCSTR lpDisplayName
- )
+ LPCSTR lpDisplayName)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
LPCWSTR lpDependencies,
LPCWSTR lpServiceStartName,
LPCWSTR lpPassword,
- LPCWSTR lpDisplayName
- )
+ LPCWSTR lpDisplayName)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
*/
BOOL
STDCALL
-CloseServiceHandle( SC_HANDLE hSCObject )
+CloseServiceHandle(SC_HANDLE hSCObject)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
*/
BOOL
STDCALL
-ControlService(
- SC_HANDLE hService,
- DWORD dwControl,
- LPSERVICE_STATUS lpServiceStatus
- )
+ControlService(SC_HANDLE hService,
+ DWORD dwControl,
+ LPSERVICE_STATUS lpServiceStatus)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
STDCALL
CreateServiceA(
SC_HANDLE hSCManager,
- LPCTSTR lpServiceName,
- LPCTSTR lpDisplayName,
+ LPCSTR lpServiceName,
+ LPCSTR lpDisplayName,
DWORD dwDesiredAccess,
DWORD dwServiceType,
DWORD dwStartType,
DWORD dwErrorControl,
- LPCTSTR lpBinaryPathName,
- LPCTSTR lpLoadOrderGroup,
+ LPCSTR lpBinaryPathName,
+ LPCSTR lpLoadOrderGroup,
LPDWORD lpdwTagId,
- LPCTSTR lpDependencies,
- LPCTSTR lpServiceStartName,
- LPCTSTR lpPassword
- )
+ LPCSTR lpDependencies,
+ LPCSTR lpServiceStartName,
+ LPCSTR lpPassword)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return NULL;
LPDWORD lpdwTagId,
LPCWSTR lpDependencies,
LPCWSTR lpServiceStartName,
- LPCWSTR lpPassword
- )
+ LPCWSTR lpPassword)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return NULL;
*/
BOOL
STDCALL
-DeleteService( SC_HANDLE hService )
+DeleteService(SC_HANDLE hService)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
LPENUM_SERVICE_STATUSA lpServices,
DWORD cbBufSize,
LPDWORD pcbBytesNeeded,
- LPDWORD lpServicesReturned
- )
+ LPDWORD lpServicesReturned)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
LPENUM_SERVICE_STATUSW lpServices,
DWORD cbBufSize,
LPDWORD pcbBytesNeeded,
- LPDWORD lpServicesReturned
- )
+ LPDWORD lpServicesReturned)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
DWORD Unknown5,
DWORD Unknown6,
DWORD Unknown7,
- DWORD Unknown8
- )
+ DWORD Unknown8)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
DWORD cbBufSize,
LPDWORD pcbBytesNeeded,
LPDWORD lpServicesReturned,
- LPDWORD lpResumeHandle
- )
+ LPDWORD lpResumeHandle)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
*/
BOOL
STDCALL
-EnumServicesStatusExA(VOID)
+EnumServicesStatusExA(SC_HANDLE hSCManager,
+ SC_ENUM_TYPE InfoLevel,
+ DWORD dwServiceType,
+ DWORD dwServiceState,
+ LPBYTE lpServices,
+ DWORD cbBufSize,
+ LPDWORD pcbBytesNeeded,
+ LPDWORD lpServicesReturned,
+ LPDWORD lpResumeHandle,
+ LPCSTR pszGroupName)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
*/
BOOL
STDCALL
-EnumServicesStatusExW(VOID)
+EnumServicesStatusExW(SC_HANDLE hSCManager,
+ SC_ENUM_TYPE InfoLevel,
+ DWORD dwServiceType,
+ DWORD dwServiceState,
+ LPBYTE lpServices,
+ DWORD cbBufSize,
+ LPDWORD pcbBytesNeeded,
+ LPDWORD lpServicesReturned,
+ LPDWORD lpResumeHandle,
+ LPCWSTR pszGroupName)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
DWORD cbBufSize,
LPDWORD pcbBytesNeeded,
LPDWORD lpServicesReturned,
- LPDWORD lpResumeHandle
- )
+ LPDWORD lpResumeHandle)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
SC_HANDLE hSCManager,
LPCSTR lpServiceName,
LPSTR lpDisplayName,
- LPDWORD lpcchBuffer
- )
+ LPDWORD lpcchBuffer)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
SC_HANDLE hSCManager,
LPCWSTR lpServiceName,
LPWSTR lpDisplayName,
- LPDWORD lpcchBuffer
- )
+ LPDWORD lpcchBuffer)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
SC_HANDLE hSCManager,
LPCSTR lpDisplayName,
LPSTR lpServiceName,
- LPDWORD lpcchBuffer
- )
+ LPDWORD lpcchBuffer)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
SC_HANDLE hSCManager,
LPCWSTR lpDisplayName,
LPWSTR lpServiceName,
- LPDWORD lpcchBuffer
- )
+ LPDWORD lpcchBuffer)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
*/
SC_LOCK
STDCALL
-LockServiceDatabase(
- SC_HANDLE hSCManager
- )
+LockServiceDatabase(SC_HANDLE hSCManager)
{
SetLastError (ERROR_CALL_NOT_IMPLEMENTED);
return NULL;
/**********************************************************************
* OpenSCManagerA
*/
-SC_HANDLE STDCALL OpenSCManagerA(LPCSTR lpMachineName,
- LPCSTR lpDatabaseName,
- DWORD dwDesiredAccess)
-{
- SC_HANDLE h;
- UNICODE_STRING MachineNameW;
- UNICODE_STRING DatabaseNameW;
- ANSI_STRING MachineNameA;
- ANSI_STRING DatabaseNameA;
-
- RtlInitAnsiString(&MachineNameA, lpMachineName);
- RtlAnsiStringToUnicodeString(&MachineNameW,
+SC_HANDLE STDCALL
+OpenSCManagerA(LPCSTR lpMachineName,
+ LPCSTR lpDatabaseName,
+ DWORD dwDesiredAccess)
+{
+ SC_HANDLE Handle;
+ UNICODE_STRING MachineNameW;
+ UNICODE_STRING DatabaseNameW;
+ ANSI_STRING MachineNameA;
+ ANSI_STRING DatabaseNameA;
+
+ RtlInitAnsiString(&MachineNameA, (LPSTR)lpMachineName);
+ RtlAnsiStringToUnicodeString(&MachineNameW,
&MachineNameA,
TRUE);
- RtlInitAnsiString(&DatabaseNameA, lpDatabaseName);
- RtlAnsiStringToUnicodeString(&DatabaseNameW,
+ RtlInitAnsiString(&DatabaseNameA, (LPSTR)lpDatabaseName);
+ RtlAnsiStringToUnicodeString(&DatabaseNameW,
&DatabaseNameA,
TRUE);
-
- h = OpenSCManagerW(MachineNameW.Buffer,
- DatabaseNameW.Buffer,
- dwDesiredAccess);
-
- RtlFreeHeap(GetProcessHeap(),
- 0,
- MachineNameW.Buffer);
- RtlFreeHeap(GetProcessHeap(),
- 0,
- DatabaseNameW.Buffer);
-
- return(h);
+
+ Handle = OpenSCManagerW(MachineNameW.Buffer,
+ DatabaseNameW.Buffer,
+ dwDesiredAccess);
+
+ RtlFreeHeap(GetProcessHeap(),
+ 0,
+ MachineNameW.Buffer);
+ RtlFreeHeap(GetProcessHeap(),
+ 0,
+ DatabaseNameW.Buffer);
+
+ return(Handle);
}
/**********************************************************************
* OpenSCManagerW
*/
-SC_HANDLE STDCALL OpenSCManagerW(LPCWSTR lpMachineName,
- LPCWSTR lpDatabaseName,
- DWORD dwDesiredAccess)
-{
- HANDLE h;
-
- if (lpMachineName == NULL ||
- wcslen(lpMachineName) == 0)
- {
- if (lpDatabaseName != NULL &&
- wcscmp(lpDatabaseName, SERVICES_ACTIVE_DATABASEW) != 0)
- {
- return(NULL);
- }
-
- h = CreateFile(L"\\\\.\\pipe\ntsrvctrl",
- dwDesiredAccess,
- 0,
- NULL,
- OPEN_EXISTING,
- 0,
- NULL);
- if (h == INVALID_HANDLE_VALUE)
- {
- return(NULL);
- }
+SC_HANDLE STDCALL OpenSCManagerW(LPCWSTR lpMachineName,
+ LPCWSTR lpDatabaseName,
+ DWORD dwDesiredAccess)
+{
+ HANDLE hPipe;
+ DWORD dwMode;
+ DWORD dwWait;
+ BOOL fSuccess;
+ HANDLE hStartEvent;
+ LPWSTR lpszPipeName = L"\\\\.\\pipe\\Ntsvcs";
- return(h);
- }
- else
- {
- return(NULL);
- }
+ if(lpMachineName == NULL || wcslen(lpMachineName) == 0)
+ {
+ if(lpDatabaseName != NULL && wcscmp(lpDatabaseName, SERVICES_ACTIVE_DATABASEW) != 0)
+ { return(NULL); }
+
+ // Only connect to scm when event "SvcctrlStartEvent_A3725DX" is signaled
+ hStartEvent = OpenEvent(SYNCHRONIZE, FALSE, _T("SvcctrlStartEvent_A3725DX"));
+ if(hStartEvent == NULL)
+ {
+ SetLastError(ERROR_DATABASE_DOES_NOT_EXIST);
+ return (NULL);
+ }
+ dwWait = WaitForSingleObject(hStartEvent, INFINITE);
+ if(dwWait == WAIT_FAILED)
+ {
+ SetLastError(ERROR_ACCESS_DENIED);
+ return (NULL);
+ }
+ CloseHandle(hStartEvent);
+
+ // Try to open a named pipe; wait for it, if necessary
+ while(1)
+ {
+ hPipe = CreateFileW(lpszPipeName, // pipe name
+ dwDesiredAccess,
+ 0, // no sharing
+ NULL, // no security attributes
+ OPEN_EXISTING, // opens existing pipe
+ 0, // default attributes
+ NULL); // no template file
+
+ // Break if the pipe handle is valid
+ if(hPipe != INVALID_HANDLE_VALUE)
+ break;
+
+ // Exit if an error other than ERROR_PIPE_BUSY occurs
+ if(GetLastError()!= ERROR_PIPE_BUSY)
+ { return(NULL); }
+
+ // All pipe instances are busy, so wait for 20 seconds
+ if(!WaitNamedPipeW(lpszPipeName, 20000))
+ { return(NULL); }
+ }
+
+ // The pipe connected; change to message-read mode
+ dwMode = PIPE_READMODE_MESSAGE;
+ fSuccess = SetNamedPipeHandleState(
+ hPipe, // pipe handle
+ &dwMode, // new pipe mode
+ NULL, // don't set maximum bytes
+ NULL); // don't set maximum time
+ if(!fSuccess)
+ {
+ CloseHandle(hPipe);
+ return(NULL);
+ }
+#if 0
+ // Send a message to the pipe server
+ lpvMessage = (argc > 1) ? argv[1] : "default message";
+
+ fSuccess = WriteFile(
+ hPipe, // pipe handle
+ lpvMessage, // message
+ strlen(lpvMessage) + 1, // message length
+ &cbWritten, // bytes written
+ NULL); // not overlapped
+ if(!fSuccess)
+ {
+ CloseHandle(hPipe);
+ return(NULL);
+ }
+
+ do
+ {
+ // Read from the pipe
+ fSuccess = ReadFile(
+ hPipe, // pipe handle
+ chBuf, // buffer to receive reply
+ 512, // size of buffer
+ &cbRead, // number of bytes read
+ NULL); // not overlapped
+
+ if(! fSuccess && GetLastError() != ERROR_MORE_DATA)
+ break;
+
+ // Reply from the pipe is written to STDOUT.
+ if(!WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), chBuf, cbRead, &cbWritten, NULL))
+ break;
+ } while(!fSuccess); // repeat loop if ERROR_MORE_DATA
+
+ //CloseHandle(hPipe);
+#endif
+ return(hPipe);
+ }
+ else
+ {
+ /* FIXME: Connect to remote SCM */
+ return(NULL);
+ }
}
/**********************************************************************
* OpenServiceA
*/
-SC_HANDLE
-STDCALL
-OpenServiceA(
- SC_HANDLE hSCManager,
- LPCSTR lpServiceName,
- DWORD dwDesiredAccess
- )
+SC_HANDLE STDCALL
+OpenServiceA(SC_HANDLE hSCManager,
+ LPCSTR lpServiceName,
+ DWORD dwDesiredAccess)
{
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return NULL;
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return(NULL);
}
LPCSTR ServiceName,
HANDLE ClientToken,
PPRIVILEGE_SET Privileges,
- BOOL AccessGranted
- )
+ BOOL AccessGranted)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
LPCWSTR ServiceName,
HANDLE ClientToken,
PPRIVILEGE_SET Privileges,
- BOOL AccessGranted
- )
+ BOOL AccessGranted)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 1;
SC_HANDLE hService,
LPQUERY_SERVICE_CONFIGA lpServiceConfig,
DWORD cbBufSize,
- LPDWORD pcbBytesNeeded
- )
+ LPDWORD pcbBytesNeeded)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
SC_HANDLE hService,
LPQUERY_SERVICE_CONFIGW lpServiceConfig,
DWORD cbBufSize,
- LPDWORD pcbBytesNeeded
- )
+ LPDWORD pcbBytesNeeded)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
SC_HANDLE hSCManager,
LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus,
DWORD cbBufSize,
- LPDWORD pcbBytesNeeded
- )
+ LPDWORD pcbBytesNeeded)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
SC_HANDLE hSCManager,
LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus,
DWORD cbBufSize,
- LPDWORD pcbBytesNeeded
- )
+ LPDWORD pcbBytesNeeded)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
SECURITY_INFORMATION dwSecurityInformation,
PSECURITY_DESCRIPTOR lpSecurityDescriptor,
DWORD cbBufSize,
- LPDWORD pcbBytesNeeded
- )
+ LPDWORD pcbBytesNeeded)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
STDCALL
QueryServiceStatus(
SC_HANDLE hService,
- LPSERVICE_STATUS lpServiceStatus
- )
+ LPSERVICE_STATUS lpServiceStatus)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
*/
BOOL
STDCALL
-QueryServiceStatusEx(VOID)
+QueryServiceStatusEx(SC_HANDLE hService,
+ SC_STATUS_TYPE InfoLevel,
+ LPBYTE lpBuffer,
+ DWORD cbBufSize,
+ LPDWORD pcbBytesNeeded)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
StartServiceA(
SC_HANDLE hService,
DWORD dwNumServiceArgs,
- LPCSTR *lpServiceArgVectors
- )
+ LPCSTR *lpServiceArgVectors)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
StartServiceW(
SC_HANDLE hService,
DWORD dwNumServiceArgs,
- LPCWSTR *lpServiceArgVectors
- )
+ LPCWSTR *lpServiceArgVectors)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
*/
BOOL
STDCALL
-UnlockServiceDatabase(
- SC_LOCK ScLock
- )
+UnlockServiceDatabase(SC_LOCK ScLock)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;