2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/advapi32/service/scm.c
5 * PURPOSE: Service control manager functions
6 * PROGRAMMER: Emanuele Aliberti
13 /* INCLUDES ******************************************************************/
21 /* FUNCTIONS *****************************************************************/
23 handle_t BindingHandle
= NULL
;
28 LPWSTR pszStringBinding
;
31 if (BindingHandle
!= NULL
)
34 status
= RpcStringBindingComposeW(NULL
,
42 DPRINT1("RpcStringBindingCompose returned 0x%x\n", status
);
46 /* Set the binding handle that will be used to bind to the server. */
47 status
= RpcBindingFromStringBindingW(pszStringBinding
,
51 DPRINT1("RpcBindingFromStringBinding returned 0x%x\n", status
);
54 status
= RpcStringFreeW(&pszStringBinding
);
57 DPRINT1("RpcStringFree returned 0x%x\n", status
);
68 if (BindingHandle
== NULL
)
71 status
= RpcBindingFree(&BindingHandle
);
74 DPRINT1("RpcBindingFree returned 0x%x\n", status
);
80 /**********************************************************************
81 * ChangeServiceConfigA
92 LPCSTR lpBinaryPathName
,
93 LPCSTR lpLoadOrderGroup
,
95 LPCSTR lpDependencies
,
96 LPCSTR lpServiceStartName
,
100 DPRINT1("ChangeServiceConfigA is unimplemented\n");
101 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
106 /**********************************************************************
107 * ChangeServiceConfigW
113 ChangeServiceConfigW(
117 DWORD dwErrorControl
,
118 LPCWSTR lpBinaryPathName
,
119 LPCWSTR lpLoadOrderGroup
,
121 LPCWSTR lpDependencies
,
122 LPCWSTR lpServiceStartName
,
124 LPCWSTR lpDisplayName
)
126 DPRINT1("ChangeServiceConfigW is unimplemented\n");
127 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
132 /**********************************************************************
138 CloseServiceHandle(SC_HANDLE hSCObject
)
142 DPRINT("CloseServiceHandle() called\n");
146 /* Call to services.exe using RPC */
147 dwError
= ScmrCloseServiceHandle(BindingHandle
,
148 (unsigned int)hSCObject
);
151 DPRINT1("ScmrCloseServiceHandle() failed (Error %lu)\n", dwError
);
152 SetLastError(dwError
);
156 DPRINT("CloseServiceHandle() done\n");
162 /**********************************************************************
168 ControlService(SC_HANDLE hService
,
170 LPSERVICE_STATUS lpServiceStatus
)
174 DPRINT("ControlService(%x, %x, %p)\n",
175 hService
, dwControl
, lpServiceStatus
);
179 /* Call to services.exe using RPC */
180 dwError
= ScmrControlService(BindingHandle
,
181 (unsigned int)hService
,
184 if (dwError
!= ERROR_SUCCESS
)
186 DPRINT1("ScmrControlService() failed (Error %lu)\n", dwError
);
187 SetLastError(dwError
);
191 DPRINT("ControlService() done\n");
197 /**********************************************************************
203 ControlServiceEx(IN SC_HANDLE hService
,
205 IN DWORD dwInfoLevel
,
206 IN OUT PVOID pControlParams
)
208 DPRINT1("ControlServiceEx(0x%p, 0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n",
209 hService
, dwControl
, dwInfoLevel
, pControlParams
);
210 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
216 /**********************************************************************
224 SC_HANDLE hSCManager
,
225 LPCSTR lpServiceName
,
226 LPCSTR lpDisplayName
,
227 DWORD dwDesiredAccess
,
230 DWORD dwErrorControl
,
231 LPCSTR lpBinaryPathName
,
232 LPCSTR lpLoadOrderGroup
,
234 LPCSTR lpDependencies
,
235 LPCSTR lpServiceStartName
,
238 DPRINT1("CreateServiceA is unimplemented, but returning INVALID_HANDLE_VALUE instead of NULL\n");
239 return INVALID_HANDLE_VALUE
;
243 /**********************************************************************
251 SC_HANDLE hSCManager
,
252 LPCWSTR lpServiceName
,
253 LPCWSTR lpDisplayName
,
254 DWORD dwDesiredAccess
,
257 DWORD dwErrorControl
,
258 LPCWSTR lpBinaryPathName
,
259 LPCWSTR lpLoadOrderGroup
,
261 LPCWSTR lpDependencies
,
262 LPCWSTR lpServiceStartName
,
265 DPRINT1("CreateServiceW is unimplemented, but returning INVALID_HANDLE_VALUE instead of NULL\n");
266 return INVALID_HANDLE_VALUE
;
270 /**********************************************************************
276 DeleteService(SC_HANDLE hService
)
280 DPRINT("DeleteService(%x)\n", hService
);
284 /* Call to services.exe using RPC */
285 dwError
= ScmrDeleteService(BindingHandle
,
286 (unsigned int)hService
);
287 if (dwError
!= ERROR_SUCCESS
)
289 DPRINT1("ScmrDeleteService() failed (Error %lu)\n", dwError
);
290 SetLastError(dwError
);
298 /**********************************************************************
299 * EnumDependentServicesA
305 EnumDependentServicesA(
307 DWORD dwServiceState
,
308 LPENUM_SERVICE_STATUSA lpServices
,
310 LPDWORD pcbBytesNeeded
,
311 LPDWORD lpServicesReturned
)
313 DPRINT1("EnumDependentServicesA is unimplemented\n");
314 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
319 /**********************************************************************
320 * EnumDependentServicesW
326 EnumDependentServicesW(
328 DWORD dwServiceState
,
329 LPENUM_SERVICE_STATUSW lpServices
,
331 LPDWORD pcbBytesNeeded
,
332 LPDWORD lpServicesReturned
)
334 DPRINT1("EnumDependentServicesW is unimplemented\n");
335 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
340 /**********************************************************************
358 DPRINT1("EnumServiceGroupW is unimplemented\n");
359 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
364 /**********************************************************************
365 * EnumServicesStatusA
371 EnumServicesStatusA (
372 SC_HANDLE hSCManager
,
374 DWORD dwServiceState
,
375 LPENUM_SERVICE_STATUSA lpServices
,
377 LPDWORD pcbBytesNeeded
,
378 LPDWORD lpServicesReturned
,
379 LPDWORD lpResumeHandle
)
381 DPRINT1("EnumServicesStatusA is unimplemented\n");
382 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
387 /**********************************************************************
388 * EnumServicesStatusExA
394 EnumServicesStatusExA(SC_HANDLE hSCManager
,
395 SC_ENUM_TYPE InfoLevel
,
397 DWORD dwServiceState
,
400 LPDWORD pcbBytesNeeded
,
401 LPDWORD lpServicesReturned
,
402 LPDWORD lpResumeHandle
,
405 DPRINT1("EnumServicesStatusExA is unimplemented\n");
406 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
411 /**********************************************************************
412 * EnumServicesStatusExW
418 EnumServicesStatusExW(SC_HANDLE hSCManager
,
419 SC_ENUM_TYPE InfoLevel
,
421 DWORD dwServiceState
,
424 LPDWORD pcbBytesNeeded
,
425 LPDWORD lpServicesReturned
,
426 LPDWORD lpResumeHandle
,
427 LPCWSTR pszGroupName
)
429 DPRINT1("EnumServicesStatusExW is unimplemented\n");
430 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
435 /**********************************************************************
436 * EnumServicesStatusW
443 SC_HANDLE hSCManager
,
445 DWORD dwServiceState
,
446 LPENUM_SERVICE_STATUSW lpServices
,
448 LPDWORD pcbBytesNeeded
,
449 LPDWORD lpServicesReturned
,
450 LPDWORD lpResumeHandle
)
452 DPRINT1("EnumServicesStatusW is unimplemented\n");
453 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
458 /**********************************************************************
459 * GetServiceDisplayNameA
465 GetServiceDisplayNameA(
466 SC_HANDLE hSCManager
,
467 LPCSTR lpServiceName
,
471 DPRINT1("GetServiceDisplayNameA is unimplemented\n");
472 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
477 /**********************************************************************
478 * GetServiceDisplayNameW
484 GetServiceDisplayNameW(
485 SC_HANDLE hSCManager
,
486 LPCWSTR lpServiceName
,
487 LPWSTR lpDisplayName
,
490 DPRINT1("GetServiceDisplayNameW is unimplemented\n");
491 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
496 /**********************************************************************
504 SC_HANDLE hSCManager
,
505 LPCSTR lpDisplayName
,
509 DPRINT1("GetServiceKeyNameA is unimplemented\n");
510 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
515 /**********************************************************************
523 SC_HANDLE hSCManager
,
524 LPCWSTR lpDisplayName
,
525 LPWSTR lpServiceName
,
528 DPRINT1("GetServiceKeyNameW is unimplemented\n");
529 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
534 /**********************************************************************
535 * LockServiceDatabase
540 LockServiceDatabase(SC_HANDLE hSCManager
)
545 DPRINT("LockServiceDatabase(%x)\n", hSCManager
);
549 /* Call to services.exe using RPC */
550 dwError
= ScmrLockServiceDatabase(BindingHandle
,
551 (unsigned int)hSCManager
,
552 (unsigned int *)&hLock
);
553 if (dwError
!= ERROR_SUCCESS
)
555 DPRINT1("ScmrLockServiceDatabase() failed (Error %lu)\n", dwError
);
556 SetLastError(dwError
);
560 DPRINT("hLock = %p\n", hLock
);
567 WaitForSCManager(VOID
)
571 DPRINT("WaitForSCManager() called\n");
573 /* Try to open the existing event */
574 hEvent
= OpenEventW(SYNCHRONIZE
,
576 L
"SvcctrlStartEvent_A3725DX");
579 if (GetLastError() != ERROR_FILE_NOT_FOUND
)
582 /* Try to create a new event */
583 hEvent
= CreateEventW(NULL
,
586 L
"SvcctrlStartEvent_A3725DX");
589 /* Try to open the existing event again */
590 hEvent
= OpenEventW(SYNCHRONIZE
,
592 L
"SvcctrlStartEvent_A3725DX");
598 /* Wait for 3 minutes */
599 WaitForSingleObject(hEvent
, 180000);
602 DPRINT("ScmWaitForSCManager() done\n");
606 /**********************************************************************
612 OpenSCManagerA(LPCSTR lpMachineName
,
613 LPCSTR lpDatabaseName
,
614 DWORD dwDesiredAccess
)
616 SC_HANDLE hScm
= NULL
;
619 DPRINT("OpenSCManagerA(%s, %s, %lx)\n",
620 lpMachineName
, lpDatabaseName
, dwDesiredAccess
);
626 /* Call to services.exe using RPC */
627 dwError
= ScmrOpenSCManagerA(BindingHandle
,
628 (LPSTR
)lpMachineName
,
629 (LPSTR
)lpDatabaseName
,
631 (unsigned int*)&hScm
);
632 if (dwError
!= ERROR_SUCCESS
)
634 DPRINT1("ScmrOpenSCManagerA() failed (Error %lu)\n", dwError
);
635 SetLastError(dwError
);
639 DPRINT("hScm = %p\n", hScm
);
645 /**********************************************************************
651 OpenSCManagerW(LPCWSTR lpMachineName
,
652 LPCWSTR lpDatabaseName
,
653 DWORD dwDesiredAccess
)
655 SC_HANDLE hScm
= NULL
;
658 DPRINT("OpenSCManagerW(%S, %S, %lx)\n",
659 lpMachineName
, lpDatabaseName
, dwDesiredAccess
);
665 /* Call to services.exe using RPC */
666 dwError
= ScmrOpenSCManagerW(BindingHandle
,
667 (LPWSTR
)lpMachineName
,
668 (LPWSTR
)lpDatabaseName
,
670 (unsigned int*)&hScm
);
671 if (dwError
!= ERROR_SUCCESS
)
673 DPRINT1("ScmrOpenSCManagerW() failed (Error %lu)\n", dwError
);
674 SetLastError(dwError
);
678 DPRINT("hScm = %p\n", hScm
);
684 /**********************************************************************
690 OpenServiceA(SC_HANDLE hSCManager
,
691 LPCSTR lpServiceName
,
692 DWORD dwDesiredAccess
)
694 SC_HANDLE hService
= NULL
;
697 DPRINT("OpenServiceA(%p, %s, %lx)\n",
698 hSCManager
, lpServiceName
, dwDesiredAccess
);
702 /* Call to services.exe using RPC */
703 dwError
= ScmrOpenServiceA(BindingHandle
,
704 (unsigned int)hSCManager
,
705 (LPSTR
)lpServiceName
,
707 (unsigned int*)&hService
);
708 if (dwError
!= ERROR_SUCCESS
)
710 DPRINT1("ScmrOpenServiceA() failed (Error %lu)\n", dwError
);
711 SetLastError(dwError
);
715 DPRINT("hService = %p\n", hService
);
721 /**********************************************************************
727 OpenServiceW(SC_HANDLE hSCManager
,
728 LPCWSTR lpServiceName
,
729 DWORD dwDesiredAccess
)
731 SC_HANDLE hService
= NULL
;
734 DPRINT("OpenServiceW(%p, %S, %lx)\n",
735 hSCManager
, lpServiceName
, dwDesiredAccess
);
739 /* Call to services.exe using RPC */
740 dwError
= ScmrOpenServiceW(BindingHandle
,
741 (unsigned int)hSCManager
,
742 (LPWSTR
)lpServiceName
,
744 (unsigned int*)&hService
);
745 if (dwError
!= ERROR_SUCCESS
)
747 DPRINT1("ScmrOpenServiceW() failed (Error %lu)\n", dwError
);
748 SetLastError(dwError
);
752 DPRINT("hService = %p\n", hService
);
758 /**********************************************************************
759 * QueryServiceConfigA
767 LPQUERY_SERVICE_CONFIGA lpServiceConfig
,
769 LPDWORD pcbBytesNeeded
)
771 DPRINT1("QueryServiceConfigA is unimplemented\n");
772 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
777 /**********************************************************************
778 * QueryServiceConfigW
786 LPQUERY_SERVICE_CONFIGW lpServiceConfig
,
788 LPDWORD pcbBytesNeeded
)
790 DPRINT1("QueryServiceConfigW is unimplemented\n");
791 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
796 /**********************************************************************
797 * QueryServiceLockStatusA
803 QueryServiceLockStatusA(
804 SC_HANDLE hSCManager
,
805 LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
,
807 LPDWORD pcbBytesNeeded
)
809 DPRINT1("QueryServiceLockStatusA is unimplemented\n");
810 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
815 /**********************************************************************
816 * QueryServiceLockStatusW
822 QueryServiceLockStatusW(
823 SC_HANDLE hSCManager
,
824 LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
,
826 LPDWORD pcbBytesNeeded
)
828 DPRINT1("QueryServiceLockStatusW is unimplemented\n");
829 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
834 /**********************************************************************
835 * QueryServiceObjectSecurity
841 QueryServiceObjectSecurity(
843 SECURITY_INFORMATION dwSecurityInformation
,
844 PSECURITY_DESCRIPTOR lpSecurityDescriptor
,
846 LPDWORD pcbBytesNeeded
)
848 DPRINT1("QueryServiceObjectSecurity is unimplemented\n");
849 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
854 /**********************************************************************
860 QueryServiceStatus(SC_HANDLE hService
,
861 LPSERVICE_STATUS lpServiceStatus
)
865 DPRINT("QueryServiceStatus(%p, %p)\n",
866 hService
, lpServiceStatus
);
870 /* Call to services.exe using RPC */
871 dwError
= ScmrQueryServiceStatus(BindingHandle
,
872 (unsigned int)hService
,
874 if (dwError
!= ERROR_SUCCESS
)
876 DPRINT1("ScmrQueryServiceStatus() failed (Error %lu)\n", dwError
);
877 SetLastError(dwError
);
885 /**********************************************************************
886 * QueryServiceStatusEx
892 QueryServiceStatusEx(SC_HANDLE hService
,
893 SC_STATUS_TYPE InfoLevel
,
896 LPDWORD pcbBytesNeeded
)
898 DPRINT1("QueryServiceStatusEx is unimplemented\n");
899 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
904 /**********************************************************************
913 DWORD dwNumServiceArgs
,
914 LPCSTR
*lpServiceArgVectors
)
916 DPRINT1("StartServiceA is unimplemented\n");
917 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
922 /**********************************************************************
931 DWORD dwNumServiceArgs
,
932 LPCWSTR
*lpServiceArgVectors
)
934 DPRINT1("StartServiceW is unimplemented\n");
935 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
940 /**********************************************************************
941 * UnlockServiceDatabase
946 UnlockServiceDatabase(SC_LOCK ScLock
)
951 DPRINT("UnlockServiceDatabase(%x)\n", hSCManager
);
956 /* Call to services.exe using RPC */
957 dwError
= ScmrUnlockServiceDatabase(BindingHandle
,
958 (unsigned int)ScLock
);
959 if (dwError
!= ERROR_SUCCESS
)
961 DPRINT1("ScmrUnlockServiceDatabase() failed (Error %lu)\n", dwError
);
962 SetLastError(dwError
);
970 void __RPC_FAR
* __RPC_USER
midl_user_allocate(size_t len
)
972 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
975 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
977 HeapFree(GetProcessHeap(), 0, ptr
);