#include "winservice.h"
 #include "wintray.h"
 
+void set_service_description(SC_HANDLE hSCManager, SC_HANDLE hService,
+                             LPSTR lpDesc);
+
 
 // OS-SPECIFIC ROUTINES
 
               "be run the next time this machine is rebooted. ",
               szAppName,
               MB_ICONINFORMATION | MB_OK);
-
-#ifdef needed
-      // Run the service...
-      STARTUPINFO si;
-      si.cb = sizeof(si);
-      si.cbReserved2 = 0;
-      si.lpReserved = NULL;
-      si.lpReserved2 = NULL;
-      si.dwFlags = 0;
-      si.lpTitle = NULL;
-      PROCESS_INFORMATION pi;
-      if (!CreateProcess(NULL, servicecmd,   // Program name & path
-              NULL, NULL,                    // Security attributes
-              FALSE,                         // Inherit handles?
-              NORMAL_PRIORITY_CLASS,         // Extra startup flags
-              NULL,                          // Environment table
-              NULL,                          // Current directory
-              &si,
-              &pi
-              )) {
-         MessageBox(NULL, "CreateProcess: the Bacula service failed to start", szAppName, MB_ICONSTOP | MB_OK);
-         break;
-      }
-#endif
       break;
 
            // Windows NT
          break;
       }
 
-      /*****FIXME***** add code to set Description */
+      set_service_description(hsrvmanager,hservice, 
+"Provides file backup and restore services. Bacula -- the Network Backup Solution.");
 
       CloseServiceHandle(hsrvmanager);
       CloseServiceHandle(hservice);
 }
 
 /* ================== Not yet implemented ===================== */
-#ifdef implemented
-VOID ReconfigureSampleService(BOOL fDisable, LPSTR lpDesc) 
+void set_service_description(SC_HANDLE hSCManager, SC_HANDLE hService,
+                             LPSTR lpDesc) 
 { 
     SC_LOCK sclLock; 
     LPQUERY_SERVICE_LOCK_STATUS lpqslsBuf; 
     SERVICE_DESCRIPTION sdBuf;
-    DWORD dwBytesNeeded, dwStartType; 
+    DWORD dwBytesNeeded;
  
     // Need to acquire database lock before reconfiguring. 
  
-    sclLock = LockServiceDatabase(schSCManager); 
+    sclLock = LockServiceDatabase(hSCManager); 
  
     // If the database cannot be locked, report the details. 
  
-    if (sclLock == NULL) 
-    { 
+    if (sclLock == NULL) {
         // Exit if the database is not locked by another process. 
  
-        if (GetLastError() != ERROR_SERVICE_DATABASE_LOCKED) 
-            MyErrorExit("LockServiceDatabase"); 
+        if (GetLastError() != ERROR_SERVICE_DATABASE_LOCKED) {
+            log_error_message("LockServiceDatabase"); 
+            return;
+        }
  
         // Allocate a buffer to get details about the lock. 
- 
-        lpqslsBuf = (LPQUERY_SERVICE_LOCK_STATUS) LocalAlloc( 
+        lpqslsBuf = (LPQUERY_SERVICE_LOCK_STATUS)LocalAlloc( 
             LPTR, sizeof(QUERY_SERVICE_LOCK_STATUS)+256); 
-        if (lpqslsBuf == NULL) 
-            MyErrorExit("LocalAlloc"); 
+        if (lpqslsBuf == NULL) {
+            log_error_message("LocalAlloc"); 
+            return;
+        }
  
         // Get and print the lock status information. 
  
         if (!QueryServiceLockStatus( 
-            schSCManager, 
+            hSCManager, 
             lpqslsBuf, 
             sizeof(QUERY_SERVICE_LOCK_STATUS)+256, 
-            &dwBytesNeeded) ) 
-            MyErrorExit("QueryServiceLockStatus"); 
+            &dwBytesNeeded)) {
+           log_error_message("QueryServiceLockStatus"); 
+        }
  
-        if (lpqslsBuf->fIsLocked) 
-            printf("Locked by: %s, duration: %d seconds\n", 
+        if (lpqslsBuf->fIsLocked) {
+            printf("Locked by: %s, duration: %ld seconds\n", 
                 lpqslsBuf->lpLockOwner, 
                 lpqslsBuf->dwLockDuration); 
-        else 
+        } else {
             printf("No longer locked\n"); 
+        }
  
         LocalFree(lpqslsBuf); 
-        MyErrorExit("Could not lock database"); 
+        log_error_message("Could not lock database"); 
+        return;
     } 
  
     // The database is locked, so it is safe to make changes. 
  
-    // Open a handle to the service. 
- 
-    schService = OpenService( 
-        schSCManager,           // SCManager database 
-        "Sample_Srv",           // name of service 
-        SERVICE_CHANGE_CONFIG); // need CHANGE access 
-    if (schService == NULL) 
-        MyErrorExit("OpenService"); 
- 
-    dwStartType = (fDisable) ? SERVICE_DISABLED : 
-                            SERVICE_DEMAND_START; 
- 
-    // Make the changes. 
-
-    if (! ChangeServiceConfig( 
-        schService,        // handle of service 
-        SERVICE_NO_CHANGE, // service type: no change 
-        dwStartType,       // change service start type 
-        SERVICE_NO_CHANGE, // error control: no change 
-        NULL,              // binary path: no change 
-        NULL,              // load order group: no change 
-        NULL,              // tag ID: no change 
-        NULL,              // dependencies: no change 
-        NULL,              // account name: no change 
-        NULL,              // password: no change 
-        NULL) )            // display name: no change
-    {
-        MyErrorExit("ChangeServiceConfig"); 
-    }
-    else 
-        printf("ChangeServiceConfig SUCCESS\n"); 
- 
     sdBuf.lpDescription = lpDesc;
 
-    if( !ChangeServiceConfig2(
-        schService,                // handle to service
-        SERVICE_CONFIG_DESCRIPTION // change: description
-        &sdBuf) )                  // value: new description
-    {
-        MyErrorExit("ChangeServiceConfig2");
-    }
-    else
+    if(!ChangeServiceConfig2(
+        hService,                   // handle to service
+        SERVICE_CONFIG_DESCRIPTION, // change: description
+        &sdBuf) ) {                 // value: new description
+       log_error_message("ChangeServiceConfig2");
+    } else {
         printf("ChangeServiceConfig2 SUCCESS\n");
+    }
 
     // Release the database lock. 
- 
     UnlockServiceDatabase(sclLock); 
- 
-    // Close the handle to the service. 
- 
-    CloseServiceHandle(schService); 
 }
-#endif