First shot at CreateServiceW. It crashes due to a bug (aka missing feature) in widl...
[reactos.git] / reactos / lib / advapi32 / service / scm.c
index 16f798d..47f7c4f 100644 (file)
@@ -12,8 +12,8 @@
 
 /* INCLUDES ******************************************************************/
 
-#include "advapi32.h"
-#include "svcctl.h"
+#include <advapi32.h>
+#include "svcctl_c.h"
 
 #define NDEBUG
 #include <debug.h>
@@ -139,21 +139,22 @@ CloseServiceHandle(SC_HANDLE hSCObject)
 {
   DWORD dwError;
 
-  DPRINT1("CloseServiceHandle() called\n");
+  DPRINT("CloseServiceHandle() called\n");
 
   HandleBind();
 
   /* Call to services.exe using RPC */
   dwError = ScmrCloseServiceHandle(BindingHandle,
                                    (unsigned int)hSCObject);
-  DPRINT1("dwError %lu\n", dwError);
-
   if (dwError)
   {
+    DPRINT1("ScmrCloseServiceHandle() failed (Error %lu)\n", dwError);
     SetLastError(dwError);
     return FALSE;
   }
 
+  DPRINT("CloseServiceHandle() done\n");
+
   return TRUE;
 }
 
@@ -168,11 +169,10 @@ ControlService(SC_HANDLE        hService,
                DWORD            dwControl,
                LPSERVICE_STATUS lpServiceStatus)
 {
-#if 0
   DWORD dwError;
 
-  DPRINT1("ControlService(%x, %x, %p)\n",
-          hService, dwControl, lpServiceStatus);
+  DPRINT("ControlService(%x, %x, %p)\n",
+         hService, dwControl, lpServiceStatus);
 
   HandleBind();
 
@@ -183,19 +183,36 @@ ControlService(SC_HANDLE        hService,
                                lpServiceStatus);
   if (dwError != ERROR_SUCCESS)
   {
+    DPRINT1("ScmrControlService() failed (Error %lu)\n", dwError);
     SetLastError(dwError);
     return FALSE;
   }
 
+  DPRINT("ControlService() done\n");
+
   return TRUE;
-#endif
+}
 
-  DPRINT1("ControlService is unimplemented\n");
-  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-  return FALSE;
+
+/**********************************************************************
+ *  ControlServiceEx
+ *
+ * @unimplemented
+ */
+BOOL STDCALL
+ControlServiceEx(IN SC_HANDLE hService,
+                 IN DWORD dwControl,
+                 IN DWORD dwInfoLevel,
+                 IN OUT PVOID pControlParams)
+{
+    DPRINT1("ControlServiceEx(0x%p, 0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n",
+            hService, dwControl, dwInfoLevel, pControlParams);
+    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    return FALSE;
 }
 
 
+
 /**********************************************************************
  *  CreateServiceA
  *
@@ -228,25 +245,54 @@ CreateServiceA(
  *
  * @unimplemented
  */
-SC_HANDLE
-STDCALL
-CreateServiceW(
-    SC_HANDLE   hSCManager,
-    LPCWSTR     lpServiceName,
-    LPCWSTR     lpDisplayName,
-    DWORD       dwDesiredAccess,
-    DWORD       dwServiceType,
-    DWORD       dwStartType,
-    DWORD       dwErrorControl,
-    LPCWSTR     lpBinaryPathName,
-    LPCWSTR     lpLoadOrderGroup,
-    LPDWORD     lpdwTagId,
-    LPCWSTR     lpDependencies,
-    LPCWSTR     lpServiceStartName,
-    LPCWSTR     lpPassword)
-{
-    DPRINT1("CreateServiceW is unimplemented, but returning INVALID_HANDLE_VALUE instead of NULL\n");
-    return INVALID_HANDLE_VALUE;
+SC_HANDLE STDCALL
+CreateServiceW(SC_HANDLE hSCManager,
+               LPCWSTR lpServiceName,
+               LPCWSTR lpDisplayName,
+               DWORD dwDesiredAccess,
+               DWORD dwServiceType,
+               DWORD dwStartType,
+               DWORD dwErrorControl,
+               LPCWSTR lpBinaryPathName,
+               LPCWSTR lpLoadOrderGroup,
+               LPDWORD lpdwTagId,
+               LPCWSTR lpDependencies,
+               LPCWSTR lpServiceStartName,
+               LPCWSTR lpPassword)
+{
+    SC_HANDLE hService = NULL;
+    DWORD dwError;
+
+    DPRINT1("CreateServiceW() called\n");
+
+    HandleBind();
+
+    /* Call to services.exe using RPC */
+    dwError = ScmrCreateServiceW(BindingHandle,
+                                 (unsigned int)hSCManager,
+                                 (LPWSTR)lpServiceName,
+                                 (LPWSTR)lpDisplayName,
+                                 dwDesiredAccess,
+                                 dwServiceType,
+                                 dwStartType,
+                                 dwErrorControl,
+                                 (LPWSTR)lpBinaryPathName,
+                                 (LPWSTR)lpLoadOrderGroup,
+                                 lpdwTagId,
+                                 NULL,              /* FIXME: lpDependencies */
+                                 0,                 /* FIXME: dwDependenciesLength */
+                                 (LPWSTR)lpServiceStartName,
+                                 NULL,              /* FIXME: lpPassword */
+                                 0,                 /* FIXME: dwPasswordLength */
+                                 (unsigned int *)&hService);
+    if (dwError != ERROR_SUCCESS)
+    {
+        DPRINT1("ScmrCreateServiceW() failed (Error %lu)\n", dwError);
+        SetLastError(dwError);
+        return INVALID_HANDLE_VALUE;
+    }
+
+    return hService;
 }
 
 
@@ -260,7 +306,7 @@ DeleteService(SC_HANDLE hService)
 {
   DWORD dwError;
 
-  DPRINT1("DeleteService(%x)\n", hService);
+  DPRINT("DeleteService(%x)\n", hService);
 
   HandleBind();
 
@@ -269,6 +315,7 @@ DeleteService(SC_HANDLE hService)
                               (unsigned int)hService);
   if (dwError != ERROR_SUCCESS)
   {
+    DPRINT1("ScmrDeleteService() failed (Error %lu)\n", dwError);
     SetLastError(dwError);
     return FALSE;
   }
@@ -534,7 +581,7 @@ LockServiceDatabase(SC_HANDLE hSCManager)
                                     (unsigned int *)&hLock);
   if (dwError != ERROR_SUCCESS)
   {
-    DPRINT("ScmrLockServiceDatabase() failed (Error %lu)\n", dwError);
+    DPRINT1("ScmrLockServiceDatabase() failed (Error %lu)\n", dwError);
     SetLastError(dwError);
     return NULL;
   }
@@ -611,9 +658,9 @@ OpenSCManagerA(LPCSTR lpMachineName,
                                (LPSTR)lpDatabaseName,
                                dwDesiredAccess,
                                (unsigned int*)&hScm);
-  if (dwError)
+  if (dwError != ERROR_SUCCESS)
   {
-    DPRINT("ScmrOpenSCManagerA() failed (Error %lu)\n", dwError);
+    DPRINT1("ScmrOpenSCManagerA() failed (Error %lu)\n", dwError);
     SetLastError(dwError);
     return NULL;
   }
@@ -836,17 +883,31 @@ QueryServiceObjectSecurity(
 /**********************************************************************
  *  QueryServiceStatus
  *
- * @unimplemented
+ * @implemented
  */
-BOOL
-STDCALL
-QueryServiceStatus(
-    SC_HANDLE       hService,
-    LPSERVICE_STATUS    lpServiceStatus)
+BOOL STDCALL
+QueryServiceStatus(SC_HANDLE hService,
+                   LPSERVICE_STATUS lpServiceStatus)
 {
-    DPRINT1("QueryServiceStatus is unimplemented\n");
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  DWORD dwError;
+
+  DPRINT("QueryServiceStatus(%p, %p)\n",
+         hService, lpServiceStatus);
+
+  HandleBind();
+
+  /* Call to services.exe using RPC */
+  dwError = ScmrQueryServiceStatus(BindingHandle,
+                                   (unsigned int)hService,
+                                   lpServiceStatus);
+  if (dwError != ERROR_SUCCESS)
+  {
+    DPRINT1("ScmrQueryServiceStatus() failed (Error %lu)\n", dwError);
+    SetLastError(dwError);
     return FALSE;
+  }
+
+  return TRUE;
 }
 
 
@@ -887,8 +948,6 @@ StartServiceA(
 }
 
 
-
-
 /**********************************************************************
  *  StartServiceW
  *
@@ -917,7 +976,9 @@ UnlockServiceDatabase(SC_LOCK ScLock)
 {
   DWORD dwError;
 
+#if 0
   DPRINT("UnlockServiceDatabase(%x)\n", hSCManager);
+#endif
 
   HandleBind();
 
@@ -926,7 +987,7 @@ UnlockServiceDatabase(SC_LOCK ScLock)
                                       (unsigned int)ScLock);
   if (dwError != ERROR_SUCCESS)
   {
-    DPRINT("ScmrUnlockServiceDatabase() failed (Error %lu)\n", dwError);
+    DPRINT1("ScmrUnlockServiceDatabase() failed (Error %lu)\n", dwError);
     SetLastError(dwError);
     return FALSE;
   }
@@ -937,12 +998,12 @@ UnlockServiceDatabase(SC_LOCK ScLock)
 
 void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
 {
-  return GlobalAlloc(GPTR,len);
+  return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
 }
 
 void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
 {
-  GlobalFree(ptr);
+  HeapFree(GetProcessHeap(), 0, ptr);
 }
 
 /* EOF */