Unix extra lines cleaned up.
[reactos.git] / reactos / lib / advapi32 / service / scm.c
index 03b7157..5c52929 100644 (file)
@@ -1,4 +1,4 @@
-/* $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 *****************************************************************/
 
@@ -33,8 +35,7 @@ ChangeServiceConfigA(
        LPCSTR          lpDependencies,
        LPCSTR          lpServiceStartName,
        LPCSTR          lpPassword,
-       LPCSTR          lpDisplayName 
-       )
+       LPCSTR          lpDisplayName)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -57,8 +58,7 @@ ChangeServiceConfigW(
        LPCWSTR         lpDependencies,
        LPCWSTR         lpServiceStartName,
        LPCWSTR         lpPassword,
-       LPCWSTR         lpDisplayName 
-       )
+       LPCWSTR         lpDisplayName)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -70,7 +70,7 @@ ChangeServiceConfigW(
  */
 BOOL 
 STDCALL
-CloseServiceHandle( SC_HANDLE hSCObject )
+CloseServiceHandle(SC_HANDLE hSCObject)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -82,11 +82,9 @@ CloseServiceHandle( SC_HANDLE hSCObject )
  */
 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;
@@ -100,19 +98,18 @@ SC_HANDLE
 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;
@@ -137,8 +134,7 @@ CreateServiceW(
        LPDWORD         lpdwTagId,
        LPCWSTR         lpDependencies,
        LPCWSTR         lpServiceStartName,
-       LPCWSTR         lpPassword
-       )
+       LPCWSTR         lpPassword)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return NULL;
@@ -150,7 +146,7 @@ CreateServiceW(
  */
 BOOL
 STDCALL
-DeleteService( SC_HANDLE hService )
+DeleteService(SC_HANDLE hService)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -168,8 +164,7 @@ EnumDependentServicesA(
        LPENUM_SERVICE_STATUSA  lpServices,
        DWORD                   cbBufSize,
        LPDWORD                 pcbBytesNeeded,
-       LPDWORD                 lpServicesReturned
-       )
+       LPDWORD                 lpServicesReturned)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -187,8 +182,7 @@ EnumDependentServicesW(
        LPENUM_SERVICE_STATUSW  lpServices,
        DWORD                   cbBufSize,
        LPDWORD                 pcbBytesNeeded,
-       LPDWORD                 lpServicesReturned
-       )
+       LPDWORD                 lpServicesReturned)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -211,8 +205,7 @@ EnumServiceGroupW (
        DWORD   Unknown5,
        DWORD   Unknown6,
        DWORD   Unknown7,
-       DWORD   Unknown8
-       )
+       DWORD   Unknown8)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -232,8 +225,7 @@ EnumServicesStatusA (
        DWORD                   cbBufSize,
        LPDWORD                 pcbBytesNeeded,
        LPDWORD                 lpServicesReturned,
-       LPDWORD                 lpResumeHandle
-       )
+       LPDWORD                 lpResumeHandle)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -245,7 +237,16 @@ EnumServicesStatusA (
  */
 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;
@@ -257,7 +258,16 @@ EnumServicesStatusExA(VOID)
  */
 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;
@@ -277,8 +287,7 @@ EnumServicesStatusW(
        DWORD                   cbBufSize,
        LPDWORD                 pcbBytesNeeded,
        LPDWORD                 lpServicesReturned,
-       LPDWORD                 lpResumeHandle
-       )
+       LPDWORD                 lpResumeHandle)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -294,8 +303,7 @@ GetServiceDisplayNameA(
        SC_HANDLE       hSCManager,
        LPCSTR          lpServiceName,
        LPSTR           lpDisplayName,
-       LPDWORD         lpcchBuffer
-       )
+       LPDWORD         lpcchBuffer)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -311,8 +319,7 @@ GetServiceDisplayNameW(
        SC_HANDLE       hSCManager,
        LPCWSTR         lpServiceName,
        LPWSTR          lpDisplayName,
-       LPDWORD         lpcchBuffer
-       )
+       LPDWORD         lpcchBuffer)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -328,8 +335,7 @@ GetServiceKeyNameA(
        SC_HANDLE       hSCManager,
        LPCSTR          lpDisplayName,
        LPSTR           lpServiceName,
-       LPDWORD         lpcchBuffer
-       )
+       LPDWORD         lpcchBuffer)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -345,8 +351,7 @@ GetServiceKeyNameW(
        SC_HANDLE       hSCManager,
        LPCWSTR         lpDisplayName,
        LPWSTR          lpServiceName,
-       LPDWORD         lpcchBuffer
-       )
+       LPDWORD         lpcchBuffer)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -357,9 +362,7 @@ GetServiceKeyNameW(
  */
 SC_LOCK
 STDCALL
-LockServiceDatabase(
-       SC_HANDLE       hSCManager
-       )
+LockServiceDatabase(SC_HANDLE  hSCManager)
 {
        SetLastError (ERROR_CALL_NOT_IMPLEMENTED);
        return NULL;
@@ -369,92 +372,167 @@ LockServiceDatabase(
 /**********************************************************************
  *     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);
 }
 
 
@@ -484,8 +562,7 @@ PrivilegedServiceAuditAlarmA(
        LPCSTR          ServiceName,
        HANDLE          ClientToken,
        PPRIVILEGE_SET  Privileges,
-       BOOL            AccessGranted 
-       )
+       BOOL            AccessGranted)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -502,8 +579,7 @@ PrivilegedServiceAuditAlarmW(
        LPCWSTR         ServiceName,
        HANDLE          ClientToken,
        PPRIVILEGE_SET  Privileges,
-       BOOL            AccessGranted 
-       )
+       BOOL            AccessGranted)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return 1;
@@ -519,8 +595,7 @@ QueryServiceConfigA(
        SC_HANDLE               hService,
        LPQUERY_SERVICE_CONFIGA lpServiceConfig,
        DWORD                   cbBufSize,
-       LPDWORD                 pcbBytesNeeded
-       )
+       LPDWORD                 pcbBytesNeeded)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -536,8 +611,7 @@ QueryServiceConfigW(
        SC_HANDLE               hService,
        LPQUERY_SERVICE_CONFIGW lpServiceConfig,
        DWORD                   cbBufSize,
-       LPDWORD                 pcbBytesNeeded
-       )
+       LPDWORD                 pcbBytesNeeded)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -553,8 +627,7 @@ QueryServiceLockStatusA(
        SC_HANDLE                       hSCManager,
        LPQUERY_SERVICE_LOCK_STATUSA    lpLockStatus,
        DWORD                           cbBufSize,
-       LPDWORD                         pcbBytesNeeded
-       )
+       LPDWORD                         pcbBytesNeeded)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -570,8 +643,7 @@ QueryServiceLockStatusW(
        SC_HANDLE                       hSCManager,
        LPQUERY_SERVICE_LOCK_STATUSW    lpLockStatus,
        DWORD                           cbBufSize,
-       LPDWORD                         pcbBytesNeeded
-       )
+       LPDWORD                         pcbBytesNeeded)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -588,8 +660,7 @@ QueryServiceObjectSecurity(
        SECURITY_INFORMATION    dwSecurityInformation,
        PSECURITY_DESCRIPTOR    lpSecurityDescriptor,
        DWORD                   cbBufSize,
-       LPDWORD                 pcbBytesNeeded
-       )
+       LPDWORD                 pcbBytesNeeded)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -603,8 +674,7 @@ BOOL
 STDCALL
 QueryServiceStatus(
        SC_HANDLE               hService,
-       LPSERVICE_STATUS        lpServiceStatus
-       )
+       LPSERVICE_STATUS        lpServiceStatus)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -616,7 +686,11 @@ QueryServiceStatus(
  */
 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;
@@ -631,8 +705,7 @@ STDCALL
 StartServiceA(
        SC_HANDLE       hService,
        DWORD           dwNumServiceArgs,
-       LPCSTR          *lpServiceArgVectors
-       )
+       LPCSTR          *lpServiceArgVectors)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -649,8 +722,7 @@ STDCALL
 StartServiceW(
        SC_HANDLE       hService,
        DWORD           dwNumServiceArgs,
-       LPCWSTR         *lpServiceArgVectors
-       )
+       LPCWSTR         *lpServiceArgVectors)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;
@@ -662,9 +734,7 @@ StartServiceW(
  */
 BOOL
 STDCALL
-UnlockServiceDatabase(
-       SC_LOCK ScLock
-       )
+UnlockServiceDatabase(SC_LOCK  ScLock)
 {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return FALSE;