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 /**********************************************************************
205 SC_HANDLE hSCManager
,
206 LPCSTR lpServiceName
,
207 LPCSTR lpDisplayName
,
208 DWORD dwDesiredAccess
,
211 DWORD dwErrorControl
,
212 LPCSTR lpBinaryPathName
,
213 LPCSTR lpLoadOrderGroup
,
215 LPCSTR lpDependencies
,
216 LPCSTR lpServiceStartName
,
219 DPRINT1("CreateServiceA is unimplemented, but returning INVALID_HANDLE_VALUE instead of NULL\n");
220 return INVALID_HANDLE_VALUE
;
224 /**********************************************************************
232 SC_HANDLE hSCManager
,
233 LPCWSTR lpServiceName
,
234 LPCWSTR lpDisplayName
,
235 DWORD dwDesiredAccess
,
238 DWORD dwErrorControl
,
239 LPCWSTR lpBinaryPathName
,
240 LPCWSTR lpLoadOrderGroup
,
242 LPCWSTR lpDependencies
,
243 LPCWSTR lpServiceStartName
,
246 DPRINT1("CreateServiceW is unimplemented, but returning INVALID_HANDLE_VALUE instead of NULL\n");
247 return INVALID_HANDLE_VALUE
;
251 /**********************************************************************
257 DeleteService(SC_HANDLE hService
)
261 DPRINT("DeleteService(%x)\n", hService
);
265 /* Call to services.exe using RPC */
266 dwError
= ScmrDeleteService(BindingHandle
,
267 (unsigned int)hService
);
268 if (dwError
!= ERROR_SUCCESS
)
270 DPRINT1("ScmrDeleteService() failed (Error %lu)\n", dwError
);
271 SetLastError(dwError
);
279 /**********************************************************************
280 * EnumDependentServicesA
286 EnumDependentServicesA(
288 DWORD dwServiceState
,
289 LPENUM_SERVICE_STATUSA lpServices
,
291 LPDWORD pcbBytesNeeded
,
292 LPDWORD lpServicesReturned
)
294 DPRINT1("EnumDependentServicesA is unimplemented\n");
295 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
300 /**********************************************************************
301 * EnumDependentServicesW
307 EnumDependentServicesW(
309 DWORD dwServiceState
,
310 LPENUM_SERVICE_STATUSW lpServices
,
312 LPDWORD pcbBytesNeeded
,
313 LPDWORD lpServicesReturned
)
315 DPRINT1("EnumDependentServicesW is unimplemented\n");
316 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
321 /**********************************************************************
339 DPRINT1("EnumServiceGroupW is unimplemented\n");
340 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
345 /**********************************************************************
346 * EnumServicesStatusA
352 EnumServicesStatusA (
353 SC_HANDLE hSCManager
,
355 DWORD dwServiceState
,
356 LPENUM_SERVICE_STATUSA lpServices
,
358 LPDWORD pcbBytesNeeded
,
359 LPDWORD lpServicesReturned
,
360 LPDWORD lpResumeHandle
)
362 DPRINT1("EnumServicesStatusA is unimplemented\n");
363 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
368 /**********************************************************************
369 * EnumServicesStatusExA
375 EnumServicesStatusExA(SC_HANDLE hSCManager
,
376 SC_ENUM_TYPE InfoLevel
,
378 DWORD dwServiceState
,
381 LPDWORD pcbBytesNeeded
,
382 LPDWORD lpServicesReturned
,
383 LPDWORD lpResumeHandle
,
386 DPRINT1("EnumServicesStatusExA is unimplemented\n");
387 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
392 /**********************************************************************
393 * EnumServicesStatusExW
399 EnumServicesStatusExW(SC_HANDLE hSCManager
,
400 SC_ENUM_TYPE InfoLevel
,
402 DWORD dwServiceState
,
405 LPDWORD pcbBytesNeeded
,
406 LPDWORD lpServicesReturned
,
407 LPDWORD lpResumeHandle
,
408 LPCWSTR pszGroupName
)
410 DPRINT1("EnumServicesStatusExW is unimplemented\n");
411 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
416 /**********************************************************************
417 * EnumServicesStatusW
424 SC_HANDLE hSCManager
,
426 DWORD dwServiceState
,
427 LPENUM_SERVICE_STATUSW lpServices
,
429 LPDWORD pcbBytesNeeded
,
430 LPDWORD lpServicesReturned
,
431 LPDWORD lpResumeHandle
)
433 DPRINT1("EnumServicesStatusW is unimplemented\n");
434 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
439 /**********************************************************************
440 * GetServiceDisplayNameA
446 GetServiceDisplayNameA(
447 SC_HANDLE hSCManager
,
448 LPCSTR lpServiceName
,
452 DPRINT1("GetServiceDisplayNameA is unimplemented\n");
453 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
458 /**********************************************************************
459 * GetServiceDisplayNameW
465 GetServiceDisplayNameW(
466 SC_HANDLE hSCManager
,
467 LPCWSTR lpServiceName
,
468 LPWSTR lpDisplayName
,
471 DPRINT1("GetServiceDisplayNameW is unimplemented\n");
472 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
477 /**********************************************************************
485 SC_HANDLE hSCManager
,
486 LPCSTR lpDisplayName
,
490 DPRINT1("GetServiceKeyNameA is unimplemented\n");
491 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
496 /**********************************************************************
504 SC_HANDLE hSCManager
,
505 LPCWSTR lpDisplayName
,
506 LPWSTR lpServiceName
,
509 DPRINT1("GetServiceKeyNameW is unimplemented\n");
510 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
515 /**********************************************************************
516 * LockServiceDatabase
521 LockServiceDatabase(SC_HANDLE hSCManager
)
526 DPRINT("LockServiceDatabase(%x)\n", hSCManager
);
530 /* Call to services.exe using RPC */
531 dwError
= ScmrLockServiceDatabase(BindingHandle
,
532 (unsigned int)hSCManager
,
533 (unsigned int *)&hLock
);
534 if (dwError
!= ERROR_SUCCESS
)
536 DPRINT1("ScmrLockServiceDatabase() failed (Error %lu)\n", dwError
);
537 SetLastError(dwError
);
541 DPRINT("hLock = %p\n", hLock
);
548 WaitForSCManager(VOID
)
552 DPRINT("WaitForSCManager() called\n");
554 /* Try to open the existing event */
555 hEvent
= OpenEventW(SYNCHRONIZE
,
557 L
"SvcctrlStartEvent_A3725DX");
560 if (GetLastError() != ERROR_FILE_NOT_FOUND
)
563 /* Try to create a new event */
564 hEvent
= CreateEventW(NULL
,
567 L
"SvcctrlStartEvent_A3725DX");
570 /* Try to open the existing event again */
571 hEvent
= OpenEventW(SYNCHRONIZE
,
573 L
"SvcctrlStartEvent_A3725DX");
579 /* Wait for 3 minutes */
580 WaitForSingleObject(hEvent
, 180000);
583 DPRINT("ScmWaitForSCManager() done\n");
587 /**********************************************************************
593 OpenSCManagerA(LPCSTR lpMachineName
,
594 LPCSTR lpDatabaseName
,
595 DWORD dwDesiredAccess
)
597 SC_HANDLE hScm
= NULL
;
600 DPRINT("OpenSCManagerA(%s, %s, %lx)\n",
601 lpMachineName
, lpDatabaseName
, dwDesiredAccess
);
607 /* Call to services.exe using RPC */
608 dwError
= ScmrOpenSCManagerA(BindingHandle
,
609 (LPSTR
)lpMachineName
,
610 (LPSTR
)lpDatabaseName
,
612 (unsigned int*)&hScm
);
613 if (dwError
!= ERROR_SUCCESS
)
615 DPRINT1("ScmrOpenSCManagerA() failed (Error %lu)\n", dwError
);
616 SetLastError(dwError
);
620 DPRINT("hScm = %p\n", hScm
);
626 /**********************************************************************
632 OpenSCManagerW(LPCWSTR lpMachineName
,
633 LPCWSTR lpDatabaseName
,
634 DWORD dwDesiredAccess
)
636 SC_HANDLE hScm
= NULL
;
639 DPRINT("OpenSCManagerW(%S, %S, %lx)\n",
640 lpMachineName
, lpDatabaseName
, dwDesiredAccess
);
646 /* Call to services.exe using RPC */
647 dwError
= ScmrOpenSCManagerW(BindingHandle
,
648 (LPWSTR
)lpMachineName
,
649 (LPWSTR
)lpDatabaseName
,
651 (unsigned int*)&hScm
);
652 if (dwError
!= ERROR_SUCCESS
)
654 DPRINT1("ScmrOpenSCManagerW() failed (Error %lu)\n", dwError
);
655 SetLastError(dwError
);
659 DPRINT("hScm = %p\n", hScm
);
665 /**********************************************************************
671 OpenServiceA(SC_HANDLE hSCManager
,
672 LPCSTR lpServiceName
,
673 DWORD dwDesiredAccess
)
675 SC_HANDLE hService
= NULL
;
678 DPRINT("OpenServiceA(%p, %s, %lx)\n",
679 hSCManager
, lpServiceName
, dwDesiredAccess
);
683 /* Call to services.exe using RPC */
684 dwError
= ScmrOpenServiceA(BindingHandle
,
685 (unsigned int)hSCManager
,
686 (LPSTR
)lpServiceName
,
688 (unsigned int*)&hService
);
689 if (dwError
!= ERROR_SUCCESS
)
691 DPRINT1("ScmrOpenServiceA() failed (Error %lu)\n", dwError
);
692 SetLastError(dwError
);
696 DPRINT("hService = %p\n", hService
);
702 /**********************************************************************
708 OpenServiceW(SC_HANDLE hSCManager
,
709 LPCWSTR lpServiceName
,
710 DWORD dwDesiredAccess
)
712 SC_HANDLE hService
= NULL
;
715 DPRINT("OpenServiceW(%p, %S, %lx)\n",
716 hSCManager
, lpServiceName
, dwDesiredAccess
);
720 /* Call to services.exe using RPC */
721 dwError
= ScmrOpenServiceW(BindingHandle
,
722 (unsigned int)hSCManager
,
723 (LPWSTR
)lpServiceName
,
725 (unsigned int*)&hService
);
726 if (dwError
!= ERROR_SUCCESS
)
728 DPRINT1("ScmrOpenServiceW() failed (Error %lu)\n", dwError
);
729 SetLastError(dwError
);
733 DPRINT("hService = %p\n", hService
);
739 /**********************************************************************
740 * QueryServiceConfigA
748 LPQUERY_SERVICE_CONFIGA lpServiceConfig
,
750 LPDWORD pcbBytesNeeded
)
752 DPRINT1("QueryServiceConfigA is unimplemented\n");
753 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
758 /**********************************************************************
759 * QueryServiceConfigW
767 LPQUERY_SERVICE_CONFIGW lpServiceConfig
,
769 LPDWORD pcbBytesNeeded
)
771 DPRINT1("QueryServiceConfigW is unimplemented\n");
772 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
777 /**********************************************************************
778 * QueryServiceLockStatusA
784 QueryServiceLockStatusA(
785 SC_HANDLE hSCManager
,
786 LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
,
788 LPDWORD pcbBytesNeeded
)
790 DPRINT1("QueryServiceLockStatusA is unimplemented\n");
791 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
796 /**********************************************************************
797 * QueryServiceLockStatusW
803 QueryServiceLockStatusW(
804 SC_HANDLE hSCManager
,
805 LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
,
807 LPDWORD pcbBytesNeeded
)
809 DPRINT1("QueryServiceLockStatusW is unimplemented\n");
810 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
815 /**********************************************************************
816 * QueryServiceObjectSecurity
822 QueryServiceObjectSecurity(
824 SECURITY_INFORMATION dwSecurityInformation
,
825 PSECURITY_DESCRIPTOR lpSecurityDescriptor
,
827 LPDWORD pcbBytesNeeded
)
829 DPRINT1("QueryServiceObjectSecurity is unimplemented\n");
830 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
835 /**********************************************************************
844 LPSERVICE_STATUS lpServiceStatus
)
846 DPRINT1("QueryServiceStatus is unimplemented\n");
847 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
852 /**********************************************************************
853 * QueryServiceStatusEx
859 QueryServiceStatusEx(SC_HANDLE hService
,
860 SC_STATUS_TYPE InfoLevel
,
863 LPDWORD pcbBytesNeeded
)
865 DPRINT1("QueryServiceStatusEx is unimplemented\n");
866 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
871 /**********************************************************************
880 DWORD dwNumServiceArgs
,
881 LPCSTR
*lpServiceArgVectors
)
883 DPRINT1("StartServiceA is unimplemented\n");
884 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
891 /**********************************************************************
900 DWORD dwNumServiceArgs
,
901 LPCWSTR
*lpServiceArgVectors
)
903 DPRINT1("StartServiceW is unimplemented\n");
904 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
909 /**********************************************************************
910 * UnlockServiceDatabase
915 UnlockServiceDatabase(SC_LOCK ScLock
)
919 DPRINT("UnlockServiceDatabase(%x)\n", hSCManager
);
923 /* Call to services.exe using RPC */
924 dwError
= ScmrUnlockServiceDatabase(BindingHandle
,
925 (unsigned int)ScLock
);
926 if (dwError
!= ERROR_SUCCESS
)
928 DPRINT1("ScmrUnlockServiceDatabase() failed (Error %lu)\n", dwError
);
929 SetLastError(dwError
);
937 void __RPC_FAR
* __RPC_USER
midl_user_allocate(size_t len
)
939 return GlobalAlloc(GPTR
,len
);
942 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)