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 DPRINT1("CloseServiceHandle() called\n");
146 /* Call to services.exe using RPC */
147 dwError
= ScmrCloseServiceHandle(BindingHandle
,
148 (unsigned int)hSCObject
);
149 DPRINT1("dwError %lu\n", dwError
);
153 SetLastError(dwError
);
161 /**********************************************************************
167 ControlService(SC_HANDLE hService
,
169 LPSERVICE_STATUS lpServiceStatus
)
174 DPRINT1("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 SetLastError(dwError
);
193 DPRINT1("ControlService is unimplemented\n");
194 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
199 /**********************************************************************
207 SC_HANDLE hSCManager
,
208 LPCSTR lpServiceName
,
209 LPCSTR lpDisplayName
,
210 DWORD dwDesiredAccess
,
213 DWORD dwErrorControl
,
214 LPCSTR lpBinaryPathName
,
215 LPCSTR lpLoadOrderGroup
,
217 LPCSTR lpDependencies
,
218 LPCSTR lpServiceStartName
,
221 DPRINT1("CreateServiceA is unimplemented, but returning INVALID_HANDLE_VALUE instead of NULL\n");
222 return INVALID_HANDLE_VALUE
;
226 /**********************************************************************
234 SC_HANDLE hSCManager
,
235 LPCWSTR lpServiceName
,
236 LPCWSTR lpDisplayName
,
237 DWORD dwDesiredAccess
,
240 DWORD dwErrorControl
,
241 LPCWSTR lpBinaryPathName
,
242 LPCWSTR lpLoadOrderGroup
,
244 LPCWSTR lpDependencies
,
245 LPCWSTR lpServiceStartName
,
248 DPRINT1("CreateServiceW is unimplemented, but returning INVALID_HANDLE_VALUE instead of NULL\n");
249 return INVALID_HANDLE_VALUE
;
253 /**********************************************************************
259 DeleteService(SC_HANDLE hService
)
263 DPRINT1("DeleteService(%x)\n", hService
);
267 /* Call to services.exe using RPC */
268 dwError
= ScmrDeleteService(BindingHandle
,
269 (unsigned int)hService
);
270 if (dwError
!= ERROR_SUCCESS
)
272 SetLastError(dwError
);
280 /**********************************************************************
281 * EnumDependentServicesA
287 EnumDependentServicesA(
289 DWORD dwServiceState
,
290 LPENUM_SERVICE_STATUSA lpServices
,
292 LPDWORD pcbBytesNeeded
,
293 LPDWORD lpServicesReturned
)
295 DPRINT1("EnumDependentServicesA is unimplemented\n");
296 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
301 /**********************************************************************
302 * EnumDependentServicesW
308 EnumDependentServicesW(
310 DWORD dwServiceState
,
311 LPENUM_SERVICE_STATUSW lpServices
,
313 LPDWORD pcbBytesNeeded
,
314 LPDWORD lpServicesReturned
)
316 DPRINT1("EnumDependentServicesW is unimplemented\n");
317 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
322 /**********************************************************************
340 DPRINT1("EnumServiceGroupW is unimplemented\n");
341 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
346 /**********************************************************************
347 * EnumServicesStatusA
353 EnumServicesStatusA (
354 SC_HANDLE hSCManager
,
356 DWORD dwServiceState
,
357 LPENUM_SERVICE_STATUSA lpServices
,
359 LPDWORD pcbBytesNeeded
,
360 LPDWORD lpServicesReturned
,
361 LPDWORD lpResumeHandle
)
363 DPRINT1("EnumServicesStatusA is unimplemented\n");
364 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
369 /**********************************************************************
370 * EnumServicesStatusExA
376 EnumServicesStatusExA(SC_HANDLE hSCManager
,
377 SC_ENUM_TYPE InfoLevel
,
379 DWORD dwServiceState
,
382 LPDWORD pcbBytesNeeded
,
383 LPDWORD lpServicesReturned
,
384 LPDWORD lpResumeHandle
,
387 DPRINT1("EnumServicesStatusExA is unimplemented\n");
388 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
393 /**********************************************************************
394 * EnumServicesStatusExW
400 EnumServicesStatusExW(SC_HANDLE hSCManager
,
401 SC_ENUM_TYPE InfoLevel
,
403 DWORD dwServiceState
,
406 LPDWORD pcbBytesNeeded
,
407 LPDWORD lpServicesReturned
,
408 LPDWORD lpResumeHandle
,
409 LPCWSTR pszGroupName
)
411 DPRINT1("EnumServicesStatusExW is unimplemented\n");
412 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
417 /**********************************************************************
418 * EnumServicesStatusW
425 SC_HANDLE hSCManager
,
427 DWORD dwServiceState
,
428 LPENUM_SERVICE_STATUSW lpServices
,
430 LPDWORD pcbBytesNeeded
,
431 LPDWORD lpServicesReturned
,
432 LPDWORD lpResumeHandle
)
434 DPRINT1("EnumServicesStatusW is unimplemented\n");
435 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
440 /**********************************************************************
441 * GetServiceDisplayNameA
447 GetServiceDisplayNameA(
448 SC_HANDLE hSCManager
,
449 LPCSTR lpServiceName
,
453 DPRINT1("GetServiceDisplayNameA is unimplemented\n");
454 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
459 /**********************************************************************
460 * GetServiceDisplayNameW
466 GetServiceDisplayNameW(
467 SC_HANDLE hSCManager
,
468 LPCWSTR lpServiceName
,
469 LPWSTR lpDisplayName
,
472 DPRINT1("GetServiceDisplayNameW is unimplemented\n");
473 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
478 /**********************************************************************
486 SC_HANDLE hSCManager
,
487 LPCSTR lpDisplayName
,
491 DPRINT1("GetServiceKeyNameA is unimplemented\n");
492 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
497 /**********************************************************************
505 SC_HANDLE hSCManager
,
506 LPCWSTR lpDisplayName
,
507 LPWSTR lpServiceName
,
510 DPRINT1("GetServiceKeyNameW is unimplemented\n");
511 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
516 /**********************************************************************
517 * LockServiceDatabase
523 LockServiceDatabase(SC_HANDLE hSCManager
)
525 DPRINT1("LockServiceDatabase is unimplemented\n");
526 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
532 WaitForSCManager(VOID
)
536 DPRINT1("WaitForSCManager() called\n");
538 /* Try to open the existing event */
539 hEvent
= OpenEventW(SYNCHRONIZE
,
541 L
"SvcctrlStartEvent_A3725DX");
544 if (GetLastError() != ERROR_FILE_NOT_FOUND
)
547 /* Try to create a new event */
548 hEvent
= CreateEventW(NULL
,
551 L
"SvcctrlStartEvent_A3725DX");
554 /* Try to open the existing event again */
555 hEvent
= OpenEventW(SYNCHRONIZE
,
557 L
"SvcctrlStartEvent_A3725DX");
563 /* Wait for 3 minutes */
564 WaitForSingleObject(hEvent
, 180000);
567 DPRINT1("ScmWaitForSCManager() done\n");
571 /**********************************************************************
577 OpenSCManagerA(LPCSTR lpMachineName
,
578 LPCSTR lpDatabaseName
,
579 DWORD dwDesiredAccess
)
581 SC_HANDLE hScm
= NULL
;
584 DPRINT1("OpenSCManagerA(%s, %s, %lx)\n",
585 lpMachineName
, lpDatabaseName
, dwDesiredAccess
);
591 /* Call to services.exe using RPC */
592 dwError
= ScmrOpenSCManagerA(BindingHandle
,
593 (LPSTR
)lpMachineName
,
594 (LPSTR
)lpDatabaseName
,
596 (unsigned int*)&hScm
);
597 DPRINT1("hScm = %p\n", hScm
);
600 SetLastError(dwError
);
608 /**********************************************************************
614 OpenSCManagerW(LPCWSTR lpMachineName
,
615 LPCWSTR lpDatabaseName
,
616 DWORD dwDesiredAccess
)
618 SC_HANDLE hScm
= NULL
;
621 DPRINT1("OpenSCManagerW(%S, %S, %lx)\n",
622 lpMachineName
, lpDatabaseName
, dwDesiredAccess
);
628 /* Call to services.exe using RPC */
629 dwError
= ScmrOpenSCManagerW(BindingHandle
,
630 (LPWSTR
)lpMachineName
,
631 (LPWSTR
)lpDatabaseName
,
633 (unsigned int*)&hScm
);
634 if (dwError
!= ERROR_SUCCESS
)
636 DPRINT1("ScmrOpenSCManagerW() failed (Error %lu)\n", dwError
);
637 SetLastError(dwError
);
641 DPRINT1("hScm = %p\n", hScm
);
647 /**********************************************************************
653 OpenServiceA(SC_HANDLE hSCManager
,
654 LPCSTR lpServiceName
,
655 DWORD dwDesiredAccess
)
657 SC_HANDLE hService
= NULL
;
660 DPRINT1("OpenServiceA(%p, %s, %lx)\n",
661 hSCManager
, lpServiceName
, dwDesiredAccess
);
665 /* Call to services.exe using RPC */
666 dwError
= ScmrOpenServiceA(BindingHandle
,
667 (unsigned int)hSCManager
,
668 (LPSTR
)lpServiceName
,
670 (unsigned int*)&hService
);
671 if (dwError
!= ERROR_SUCCESS
)
673 DPRINT1("ScmrOpenServiceA() failed (Error %lu)\n", dwError
);
674 SetLastError(dwError
);
678 DPRINT1("hService = %p\n", hService
);
684 /**********************************************************************
690 OpenServiceW(SC_HANDLE hSCManager
,
691 LPCWSTR lpServiceName
,
692 DWORD dwDesiredAccess
)
694 SC_HANDLE hService
= NULL
;
697 DPRINT1("OpenServiceW(%p, %S, %lx)\n",
698 hSCManager
, lpServiceName
, dwDesiredAccess
);
702 /* Call to services.exe using RPC */
703 dwError
= ScmrOpenServiceW(BindingHandle
,
704 (unsigned int)hSCManager
,
705 (LPWSTR
)lpServiceName
,
707 (unsigned int*)&hService
);
708 if (dwError
!= ERROR_SUCCESS
)
710 DPRINT1("ScmrOpenServiceW() failed (Error %lu)\n", dwError
);
711 SetLastError(dwError
);
715 DPRINT1("hService = %p\n", hService
);
721 /**********************************************************************
722 * QueryServiceConfigA
730 LPQUERY_SERVICE_CONFIGA lpServiceConfig
,
732 LPDWORD pcbBytesNeeded
)
734 DPRINT1("QueryServiceConfigA is unimplemented\n");
735 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
740 /**********************************************************************
741 * QueryServiceConfigW
749 LPQUERY_SERVICE_CONFIGW lpServiceConfig
,
751 LPDWORD pcbBytesNeeded
)
753 DPRINT1("QueryServiceConfigW is unimplemented\n");
754 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
759 /**********************************************************************
760 * QueryServiceLockStatusA
766 QueryServiceLockStatusA(
767 SC_HANDLE hSCManager
,
768 LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
,
770 LPDWORD pcbBytesNeeded
)
772 DPRINT1("QueryServiceLockStatusA is unimplemented\n");
773 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
778 /**********************************************************************
779 * QueryServiceLockStatusW
785 QueryServiceLockStatusW(
786 SC_HANDLE hSCManager
,
787 LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
,
789 LPDWORD pcbBytesNeeded
)
791 DPRINT1("QueryServiceLockStatusW is unimplemented\n");
792 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
797 /**********************************************************************
798 * QueryServiceObjectSecurity
804 QueryServiceObjectSecurity(
806 SECURITY_INFORMATION dwSecurityInformation
,
807 PSECURITY_DESCRIPTOR lpSecurityDescriptor
,
809 LPDWORD pcbBytesNeeded
)
811 DPRINT1("QueryServiceObjectSecurity is unimplemented\n");
812 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
817 /**********************************************************************
826 LPSERVICE_STATUS lpServiceStatus
)
828 DPRINT1("QueryServiceStatus is unimplemented\n");
829 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
834 /**********************************************************************
835 * QueryServiceStatusEx
841 QueryServiceStatusEx(SC_HANDLE hService
,
842 SC_STATUS_TYPE InfoLevel
,
845 LPDWORD pcbBytesNeeded
)
847 DPRINT1("QueryServiceStatusEx is unimplemented\n");
848 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
853 /**********************************************************************
862 DWORD dwNumServiceArgs
,
863 LPCSTR
*lpServiceArgVectors
)
865 DPRINT1("StartServiceA is unimplemented\n");
866 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
873 /**********************************************************************
882 DWORD dwNumServiceArgs
,
883 LPCWSTR
*lpServiceArgVectors
)
885 DPRINT1("StartServiceW is unimplemented\n");
886 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
891 /**********************************************************************
892 * UnlockServiceDatabase
898 UnlockServiceDatabase(SC_LOCK ScLock
)
900 DPRINT1("UnlockServiceDatabase is unimplemented\n");
901 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
906 void __RPC_FAR
* __RPC_USER
midl_user_allocate(size_t len
)
908 return GlobalAlloc(GPTR
,len
);
911 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)