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 ******************************************************************/
16 WINE_DEFAULT_DEBUG_CHANNEL(advapi
);
19 /* FUNCTIONS *****************************************************************/
22 SVCCTL_HANDLEA_bind(SVCCTL_HANDLEA szMachineName
)
24 handle_t hBinding
= NULL
;
25 UCHAR
*pszStringBinding
;
28 TRACE("SVCCTL_HANDLEA_bind() called\n");
30 status
= RpcStringBindingComposeA(NULL
,
32 (UCHAR
*)szMachineName
,
33 (UCHAR
*)"\\pipe\\ntsvcs",
35 (UCHAR
**)&pszStringBinding
);
36 if (status
!= RPC_S_OK
)
38 ERR("RpcStringBindingCompose returned 0x%x\n", status
);
42 /* Set the binding handle that will be used to bind to the server. */
43 status
= RpcBindingFromStringBindingA(pszStringBinding
,
45 if (status
!= RPC_S_OK
)
47 ERR("RpcBindingFromStringBinding returned 0x%x\n", status
);
50 status
= RpcStringFreeA(&pszStringBinding
);
51 if (status
!= RPC_S_OK
)
53 ERR("RpcStringFree returned 0x%x\n", status
);
61 SVCCTL_HANDLEA_unbind(SVCCTL_HANDLEA szMachineName
,
66 TRACE("SVCCTL_HANDLEA_unbind() called\n");
68 status
= RpcBindingFree(&hBinding
);
69 if (status
!= RPC_S_OK
)
71 ERR("RpcBindingFree returned 0x%x\n", status
);
77 SVCCTL_HANDLEW_bind(SVCCTL_HANDLEW szMachineName
)
79 handle_t hBinding
= NULL
;
80 LPWSTR pszStringBinding
;
83 TRACE("SVCCTL_HANDLEW_bind() called\n");
85 status
= RpcStringBindingComposeW(NULL
,
91 if (status
!= RPC_S_OK
)
93 ERR("RpcStringBindingCompose returned 0x%x\n", status
);
97 /* Set the binding handle that will be used to bind to the server. */
98 status
= RpcBindingFromStringBindingW(pszStringBinding
,
100 if (status
!= RPC_S_OK
)
102 ERR("RpcBindingFromStringBinding returned 0x%x\n", status
);
105 status
= RpcStringFreeW(&pszStringBinding
);
106 if (status
!= RPC_S_OK
)
108 ERR("RpcStringFree returned 0x%x\n", status
);
116 SVCCTL_HANDLEW_unbind(SVCCTL_HANDLEW szMachineName
,
121 TRACE("SVCCTL_HANDLEW_unbind() called\n");
123 status
= RpcBindingFree(&hBinding
);
124 if (status
!= RPC_S_OK
)
126 ERR("RpcBindingFree returned 0x%x\n", status
);
132 ScmRpcStatusToWinError(RPC_STATUS Status
)
136 case RPC_S_INVALID_BINDING
:
137 case RPC_X_SS_IN_NULL_CONTEXT
:
138 return ERROR_INVALID_HANDLE
;
140 case RPC_X_ENUM_VALUE_OUT_OF_RANGE
:
141 case RPC_X_BYTE_COUNT_TOO_SMALL
:
142 return ERROR_INVALID_PARAMETER
;
144 case RPC_X_NULL_REF_POINTER
:
145 return ERROR_INVALID_ADDRESS
;
148 return (DWORD
)Status
;
153 /**********************************************************************
154 * ChangeServiceConfig2A
159 ChangeServiceConfig2A(SC_HANDLE hService
,
163 SC_RPC_CONFIG_INFOA Info
;
166 TRACE("ChangeServiceConfig2A() called\n");
168 if (lpInfo
== NULL
) return TRUE
;
170 /* Fill relevant field of the Info structure */
171 Info
.dwInfoLevel
= dwInfoLevel
;
174 case SERVICE_CONFIG_DESCRIPTION
:
178 case SERVICE_CONFIG_FAILURE_ACTIONS
:
183 WARN("Unknown info level 0x%lx\n", dwInfoLevel
);
184 SetLastError(ERROR_INVALID_PARAMETER
);
190 dwError
= RChangeServiceConfig2A((SC_RPC_HANDLE
)hService
,
193 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
195 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
199 if (dwError
!= ERROR_SUCCESS
)
201 TRACE("RChangeServiceConfig2A() failed (Error %lu)\n", dwError
);
202 SetLastError(dwError
);
210 /**********************************************************************
211 * ChangeServiceConfig2W
216 ChangeServiceConfig2W(SC_HANDLE hService
,
220 SC_RPC_CONFIG_INFOW Info
;
223 TRACE("ChangeServiceConfig2W() called\n");
225 if (lpInfo
== NULL
) return TRUE
;
227 /* Fill relevant field of the Info structure */
228 Info
.dwInfoLevel
= dwInfoLevel
;
231 case SERVICE_CONFIG_DESCRIPTION
:
235 case SERVICE_CONFIG_FAILURE_ACTIONS
:
240 WARN("Unknown info level 0x%lx\n", dwInfoLevel
);
241 SetLastError(ERROR_INVALID_PARAMETER
);
247 dwError
= RChangeServiceConfig2W((SC_RPC_HANDLE
)hService
,
250 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
252 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
256 if (dwError
!= ERROR_SUCCESS
)
258 TRACE("RChangeServiceConfig2W() failed (Error %lu)\n", dwError
);
259 SetLastError(dwError
);
267 /**********************************************************************
268 * ChangeServiceConfigA
273 ChangeServiceConfigA(SC_HANDLE hService
,
276 DWORD dwErrorControl
,
277 LPCSTR lpBinaryPathName
,
278 LPCSTR lpLoadOrderGroup
,
280 LPCSTR lpDependencies
,
281 LPCSTR lpServiceStartName
,
283 LPCSTR lpDisplayName
)
286 DWORD dwDependenciesLength
= 0;
289 DWORD dwPasswordLength
= 0;
290 LPBYTE lpEncryptedPassword
= NULL
;
292 TRACE("ChangeServiceConfigA() called\n");
294 /* Calculate the Dependencies length*/
295 if (lpDependencies
!= NULL
)
297 lpStr
= lpDependencies
;
300 cchLength
= strlen(lpStr
) + 1;
301 dwDependenciesLength
+= (DWORD
)cchLength
;
302 lpStr
= lpStr
+ cchLength
;
304 dwDependenciesLength
++;
307 /* FIXME: Encrypt the password */
308 lpEncryptedPassword
= (LPBYTE
)lpPassword
;
309 dwPasswordLength
= (DWORD
)(lpPassword
? (strlen(lpPassword
) + 1) * sizeof(CHAR
) : 0);
313 /* Call to services.exe using RPC */
314 dwError
= RChangeServiceConfigA((SC_RPC_HANDLE
)hService
,
318 (LPSTR
)lpBinaryPathName
,
319 (LPSTR
)lpLoadOrderGroup
,
321 (LPBYTE
)lpDependencies
,
322 dwDependenciesLength
,
323 (LPSTR
)lpServiceStartName
,
326 (LPSTR
)lpDisplayName
);
328 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
330 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
334 if (dwError
!= ERROR_SUCCESS
)
336 TRACE("RChangeServiceConfigA() failed (Error %lu)\n", dwError
);
337 SetLastError(dwError
);
345 /**********************************************************************
346 * ChangeServiceConfigW
351 ChangeServiceConfigW(SC_HANDLE hService
,
354 DWORD dwErrorControl
,
355 LPCWSTR lpBinaryPathName
,
356 LPCWSTR lpLoadOrderGroup
,
358 LPCWSTR lpDependencies
,
359 LPCWSTR lpServiceStartName
,
361 LPCWSTR lpDisplayName
)
364 DWORD dwDependenciesLength
= 0;
367 DWORD dwPasswordLength
= 0;
368 LPBYTE lpEncryptedPassword
= NULL
;
370 TRACE("ChangeServiceConfigW() called\n");
372 /* Calculate the Dependencies length*/
373 if (lpDependencies
!= NULL
)
375 lpStr
= lpDependencies
;
378 cchLength
= wcslen(lpStr
) + 1;
379 dwDependenciesLength
+= (DWORD
)cchLength
;
380 lpStr
= lpStr
+ cchLength
;
382 dwDependenciesLength
++;
383 dwDependenciesLength
*= sizeof(WCHAR
);
386 /* FIXME: Encrypt the password */
387 lpEncryptedPassword
= (LPBYTE
)lpPassword
;
388 dwPasswordLength
= (lpPassword
? (wcslen(lpPassword
) + 1) * sizeof(WCHAR
) : 0);
392 /* Call to services.exe using RPC */
393 dwError
= RChangeServiceConfigW((SC_RPC_HANDLE
)hService
,
397 (LPWSTR
)lpBinaryPathName
,
398 (LPWSTR
)lpLoadOrderGroup
,
400 (LPBYTE
)lpDependencies
,
401 dwDependenciesLength
,
402 (LPWSTR
)lpServiceStartName
,
405 (LPWSTR
)lpDisplayName
);
407 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
409 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
413 if (dwError
!= ERROR_SUCCESS
)
415 TRACE("RChangeServiceConfigW() failed (Error %lu)\n", dwError
);
416 SetLastError(dwError
);
424 /**********************************************************************
430 CloseServiceHandle(SC_HANDLE hSCObject
)
434 TRACE("CloseServiceHandle() called\n");
438 SetLastError(ERROR_INVALID_HANDLE
);
444 /* Call to services.exe using RPC */
445 dwError
= RCloseServiceHandle((LPSC_RPC_HANDLE
)&hSCObject
);
447 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
449 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
455 TRACE("RCloseServiceHandle() failed (Error %lu)\n", dwError
);
456 SetLastError(dwError
);
460 TRACE("CloseServiceHandle() done\n");
466 /**********************************************************************
472 ControlService(SC_HANDLE hService
,
474 LPSERVICE_STATUS lpServiceStatus
)
478 TRACE("ControlService(%x, %x, %p)\n",
479 hService
, dwControl
, lpServiceStatus
);
483 /* Call to services.exe using RPC */
484 dwError
= RControlService((SC_RPC_HANDLE
)hService
,
488 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
490 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
494 if (dwError
!= ERROR_SUCCESS
)
496 TRACE("RControlService() failed (Error %lu)\n", dwError
);
497 SetLastError(dwError
);
501 TRACE("ControlService() done\n");
507 /**********************************************************************
513 ControlServiceEx(IN SC_HANDLE hService
,
515 IN DWORD dwInfoLevel
,
516 IN OUT PVOID pControlParams
)
518 FIXME("ControlServiceEx(0x%p, 0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n",
519 hService
, dwControl
, dwInfoLevel
, pControlParams
);
520 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
525 /**********************************************************************
531 CreateServiceA(SC_HANDLE hSCManager
,
532 LPCSTR lpServiceName
,
533 LPCSTR lpDisplayName
,
534 DWORD dwDesiredAccess
,
537 DWORD dwErrorControl
,
538 LPCSTR lpBinaryPathName
,
539 LPCSTR lpLoadOrderGroup
,
541 LPCSTR lpDependencies
,
542 LPCSTR lpServiceStartName
,
545 SC_HANDLE hService
= NULL
;
546 DWORD dwDependenciesLength
= 0;
550 DWORD dwPasswordLength
= 0;
551 LPBYTE lpEncryptedPassword
= NULL
;
553 TRACE("CreateServiceA() called\n");
554 TRACE("%p %s %s\n", hSCManager
,
555 lpServiceName
, lpDisplayName
);
559 SetLastError(ERROR_INVALID_HANDLE
);
563 /* Calculate the Dependencies length */
564 if (lpDependencies
!= NULL
)
566 lpStr
= lpDependencies
;
569 cchLength
= strlen(lpStr
) + 1;
570 dwDependenciesLength
+= (DWORD
)cchLength
;
571 lpStr
= lpStr
+ cchLength
;
573 dwDependenciesLength
++;
576 /* FIXME: Encrypt the password */
577 lpEncryptedPassword
= (LPBYTE
)lpPassword
;
578 dwPasswordLength
= (DWORD
)(lpPassword
? (strlen(lpPassword
) + 1) * sizeof(CHAR
) : 0);
582 /* Call to services.exe using RPC */
583 dwError
= RCreateServiceA((SC_RPC_HANDLE
)hSCManager
,
584 (LPSTR
)lpServiceName
,
585 (LPSTR
)lpDisplayName
,
590 (LPSTR
)lpBinaryPathName
,
591 (LPSTR
)lpLoadOrderGroup
,
593 (LPBYTE
)lpDependencies
,
594 dwDependenciesLength
,
595 (LPSTR
)lpServiceStartName
,
598 (SC_RPC_HANDLE
*)&hService
);
600 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
602 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
606 if (dwError
!= ERROR_SUCCESS
)
608 TRACE("RCreateServiceA() failed (Error %lu)\n", dwError
);
609 SetLastError(dwError
);
617 /**********************************************************************
623 CreateServiceW(SC_HANDLE hSCManager
,
624 LPCWSTR lpServiceName
,
625 LPCWSTR lpDisplayName
,
626 DWORD dwDesiredAccess
,
629 DWORD dwErrorControl
,
630 LPCWSTR lpBinaryPathName
,
631 LPCWSTR lpLoadOrderGroup
,
633 LPCWSTR lpDependencies
,
634 LPCWSTR lpServiceStartName
,
637 SC_HANDLE hService
= NULL
;
638 DWORD dwDependenciesLength
= 0;
642 DWORD dwPasswordLength
= 0;
643 LPBYTE lpEncryptedPassword
= NULL
;
645 TRACE("CreateServiceW() called\n");
646 TRACE("%p %S %S\n", hSCManager
,
647 lpServiceName
, lpDisplayName
);
651 SetLastError(ERROR_INVALID_HANDLE
);
655 /* Calculate the Dependencies length */
656 if (lpDependencies
!= NULL
)
658 lpStr
= lpDependencies
;
661 cchLength
= wcslen(lpStr
) + 1;
662 dwDependenciesLength
+= (DWORD
)cchLength
;
663 lpStr
= lpStr
+ cchLength
;
665 dwDependenciesLength
++;
666 dwDependenciesLength
*= sizeof(WCHAR
);
669 /* FIXME: Encrypt the password */
670 lpEncryptedPassword
= (LPBYTE
)lpPassword
;
671 dwPasswordLength
= (DWORD
)(lpPassword
? (wcslen(lpPassword
) + 1) * sizeof(WCHAR
) : 0);
675 /* Call to services.exe using RPC */
676 dwError
= RCreateServiceW((SC_RPC_HANDLE
)hSCManager
,
686 (LPBYTE
)lpDependencies
,
687 dwDependenciesLength
,
691 (SC_RPC_HANDLE
*)&hService
);
693 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
695 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
699 if (dwError
!= ERROR_SUCCESS
)
701 TRACE("RCreateServiceW() failed (Error %lu)\n", dwError
);
702 SetLastError(dwError
);
710 /**********************************************************************
716 DeleteService(SC_HANDLE hService
)
720 TRACE("DeleteService(%x)\n", hService
);
724 /* Call to services.exe using RPC */
725 dwError
= RDeleteService((SC_RPC_HANDLE
)hService
);
727 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
729 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
733 if (dwError
!= ERROR_SUCCESS
)
735 TRACE("RDeleteService() failed (Error %lu)\n", dwError
);
736 SetLastError(dwError
);
744 /**********************************************************************
745 * EnumDependentServicesA
750 EnumDependentServicesA(SC_HANDLE hService
,
751 DWORD dwServiceState
,
752 LPENUM_SERVICE_STATUSA lpServices
,
754 LPDWORD pcbBytesNeeded
,
755 LPDWORD lpServicesReturned
)
757 ENUM_SERVICE_STATUSA ServiceStatus
;
758 LPENUM_SERVICE_STATUSA lpStatusPtr
;
763 TRACE("EnumDependentServicesA() called\n");
765 if (lpServices
== NULL
|| cbBufSize
< sizeof(ENUM_SERVICE_STATUSA
))
767 lpStatusPtr
= &ServiceStatus
;
768 dwBufferSize
= sizeof(ENUM_SERVICE_STATUSA
);
772 lpStatusPtr
= lpServices
;
773 dwBufferSize
= cbBufSize
;
778 dwError
= REnumDependentServicesA((SC_RPC_HANDLE
)hService
,
785 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
787 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
791 if (dwError
== ERROR_SUCCESS
|| dwError
== ERROR_MORE_DATA
)
793 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
795 if (lpStatusPtr
->lpServiceName
)
796 lpStatusPtr
->lpServiceName
=
797 (LPSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
799 if (lpStatusPtr
->lpDisplayName
)
800 lpStatusPtr
->lpDisplayName
=
801 (LPSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
807 if (dwError
!= ERROR_SUCCESS
)
809 TRACE("REnumDependentServicesA() failed (Error %lu)\n", dwError
);
810 SetLastError(dwError
);
814 TRACE("EnumDependentServicesA() done\n");
820 /**********************************************************************
821 * EnumDependentServicesW
826 EnumDependentServicesW(SC_HANDLE hService
,
827 DWORD dwServiceState
,
828 LPENUM_SERVICE_STATUSW lpServices
,
830 LPDWORD pcbBytesNeeded
,
831 LPDWORD lpServicesReturned
)
833 ENUM_SERVICE_STATUSW ServiceStatus
;
834 LPENUM_SERVICE_STATUSW lpStatusPtr
;
839 TRACE("EnumDependentServicesW() called\n");
841 if (lpServices
== NULL
|| cbBufSize
< sizeof(ENUM_SERVICE_STATUSW
))
843 lpStatusPtr
= &ServiceStatus
;
844 dwBufferSize
= sizeof(ENUM_SERVICE_STATUSW
);
848 lpStatusPtr
= lpServices
;
849 dwBufferSize
= cbBufSize
;
854 dwError
= REnumDependentServicesW((SC_RPC_HANDLE
)hService
,
861 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
863 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
867 if (dwError
== ERROR_SUCCESS
|| dwError
== ERROR_MORE_DATA
)
869 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
871 if (lpStatusPtr
->lpServiceName
)
872 lpStatusPtr
->lpServiceName
=
873 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
875 if (lpStatusPtr
->lpDisplayName
)
876 lpStatusPtr
->lpDisplayName
=
877 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
883 if (dwError
!= ERROR_SUCCESS
)
885 TRACE("REnumDependentServicesW() failed (Error %lu)\n", dwError
);
886 SetLastError(dwError
);
890 TRACE("EnumDependentServicesW() done\n");
896 /**********************************************************************
902 EnumServiceGroupW(SC_HANDLE hSCManager
,
904 DWORD dwServiceState
,
905 LPENUM_SERVICE_STATUSW lpServices
,
907 LPDWORD pcbBytesNeeded
,
908 LPDWORD lpServicesReturned
,
909 LPDWORD lpResumeHandle
,
912 ENUM_SERVICE_STATUSW ServiceStatus
;
913 LPENUM_SERVICE_STATUSW lpStatusPtr
;
918 TRACE("EnumServiceGroupW() called\n");
922 SetLastError(ERROR_INVALID_HANDLE
);
926 if (pcbBytesNeeded
== NULL
|| lpServicesReturned
== NULL
)
928 SetLastError(ERROR_INVALID_ADDRESS
);
932 if (lpServices
== NULL
|| cbBufSize
< sizeof(ENUM_SERVICE_STATUSW
))
934 lpStatusPtr
= &ServiceStatus
;
935 dwBufferSize
= sizeof(ENUM_SERVICE_STATUSW
);
939 lpStatusPtr
= lpServices
;
940 dwBufferSize
= cbBufSize
;
947 dwError
= REnumServicesStatusW((SC_RPC_HANDLE
)hSCManager
,
958 dwError
= REnumServiceGroupW((SC_RPC_HANDLE
)hSCManager
,
969 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
971 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
975 if (dwError
== ERROR_SUCCESS
|| dwError
== ERROR_MORE_DATA
)
977 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
979 if (lpStatusPtr
->lpServiceName
)
980 lpStatusPtr
->lpServiceName
=
981 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
983 if (lpStatusPtr
->lpDisplayName
)
984 lpStatusPtr
->lpDisplayName
=
985 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
991 if (dwError
!= ERROR_SUCCESS
)
993 TRACE("REnumServiceGroupW() failed (Error %lu)\n", dwError
);
994 SetLastError(dwError
);
998 TRACE("EnumServiceGroupW() done\n");
1004 /**********************************************************************
1005 * EnumServicesStatusA
1010 EnumServicesStatusA(SC_HANDLE hSCManager
,
1011 DWORD dwServiceType
,
1012 DWORD dwServiceState
,
1013 LPENUM_SERVICE_STATUSA lpServices
,
1015 LPDWORD pcbBytesNeeded
,
1016 LPDWORD lpServicesReturned
,
1017 LPDWORD lpResumeHandle
)
1019 ENUM_SERVICE_STATUSA ServiceStatus
;
1020 LPENUM_SERVICE_STATUSA lpStatusPtr
;
1025 TRACE("EnumServicesStatusA() called\n");
1029 SetLastError(ERROR_INVALID_HANDLE
);
1033 if (pcbBytesNeeded
== NULL
|| lpServicesReturned
== NULL
)
1035 SetLastError(ERROR_INVALID_ADDRESS
);
1039 if (lpServices
== NULL
|| cbBufSize
< sizeof(ENUM_SERVICE_STATUSA
))
1041 lpStatusPtr
= &ServiceStatus
;
1042 dwBufferSize
= sizeof(ENUM_SERVICE_STATUSA
);
1046 lpStatusPtr
= lpServices
;
1047 dwBufferSize
= cbBufSize
;
1052 dwError
= REnumServicesStatusA((SC_RPC_HANDLE
)hSCManager
,
1055 (LPBYTE
)lpStatusPtr
,
1061 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1063 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1067 if (dwError
== ERROR_SUCCESS
|| dwError
== ERROR_MORE_DATA
)
1069 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
1071 if (lpStatusPtr
->lpServiceName
)
1072 lpStatusPtr
->lpServiceName
=
1073 (LPSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
1075 if (lpStatusPtr
->lpDisplayName
)
1076 lpStatusPtr
->lpDisplayName
=
1077 (LPSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
1083 if (dwError
!= ERROR_SUCCESS
)
1085 TRACE("REnumServicesStatusA() failed (Error %lu)\n", dwError
);
1086 SetLastError(dwError
);
1090 TRACE("EnumServicesStatusA() done\n");
1096 /**********************************************************************
1097 * EnumServicesStatusW
1102 EnumServicesStatusW(SC_HANDLE hSCManager
,
1103 DWORD dwServiceType
,
1104 DWORD dwServiceState
,
1105 LPENUM_SERVICE_STATUSW lpServices
,
1107 LPDWORD pcbBytesNeeded
,
1108 LPDWORD lpServicesReturned
,
1109 LPDWORD lpResumeHandle
)
1111 ENUM_SERVICE_STATUSW ServiceStatus
;
1112 LPENUM_SERVICE_STATUSW lpStatusPtr
;
1117 TRACE("EnumServicesStatusW() called\n");
1121 SetLastError(ERROR_INVALID_HANDLE
);
1125 if (pcbBytesNeeded
== NULL
|| lpServicesReturned
== NULL
)
1127 SetLastError(ERROR_INVALID_ADDRESS
);
1131 if (lpServices
== NULL
|| cbBufSize
< sizeof(ENUM_SERVICE_STATUSW
))
1133 lpStatusPtr
= &ServiceStatus
;
1134 dwBufferSize
= sizeof(ENUM_SERVICE_STATUSW
);
1138 lpStatusPtr
= lpServices
;
1139 dwBufferSize
= cbBufSize
;
1144 dwError
= REnumServicesStatusW((SC_RPC_HANDLE
)hSCManager
,
1147 (LPBYTE
)lpStatusPtr
,
1153 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1155 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1159 if (dwError
== ERROR_SUCCESS
|| dwError
== ERROR_MORE_DATA
)
1161 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
1163 if (lpStatusPtr
->lpServiceName
)
1164 lpStatusPtr
->lpServiceName
=
1165 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
1167 if (lpStatusPtr
->lpDisplayName
)
1168 lpStatusPtr
->lpDisplayName
=
1169 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
1175 if (dwError
!= ERROR_SUCCESS
)
1177 TRACE("REnumServicesStatusW() failed (Error %lu)\n", dwError
);
1178 SetLastError(dwError
);
1182 TRACE("EnumServicesStatusW() done\n");
1188 /**********************************************************************
1189 * EnumServicesStatusExA
1194 EnumServicesStatusExA(SC_HANDLE hSCManager
,
1195 SC_ENUM_TYPE InfoLevel
,
1196 DWORD dwServiceType
,
1197 DWORD dwServiceState
,
1200 LPDWORD pcbBytesNeeded
,
1201 LPDWORD lpServicesReturned
,
1202 LPDWORD lpResumeHandle
,
1203 LPCSTR pszGroupName
)
1205 ENUM_SERVICE_STATUS_PROCESSA ServiceStatus
;
1206 LPENUM_SERVICE_STATUS_PROCESSA lpStatusPtr
;
1211 TRACE("EnumServicesStatusExA() called\n");
1213 if (InfoLevel
!= SC_ENUM_PROCESS_INFO
)
1215 SetLastError(ERROR_INVALID_LEVEL
);
1221 SetLastError(ERROR_INVALID_HANDLE
);
1225 if (pcbBytesNeeded
== NULL
|| lpServicesReturned
== NULL
)
1227 SetLastError(ERROR_INVALID_ADDRESS
);
1231 if (lpServices
== NULL
|| cbBufSize
< sizeof(ENUM_SERVICE_STATUS_PROCESSA
))
1233 lpStatusPtr
= &ServiceStatus
;
1234 dwBufferSize
= sizeof(ENUM_SERVICE_STATUS_PROCESSA
);
1238 lpStatusPtr
= (LPENUM_SERVICE_STATUS_PROCESSA
)lpServices
;
1239 dwBufferSize
= cbBufSize
;
1244 dwError
= REnumServicesStatusExA((SC_RPC_HANDLE
)hSCManager
,
1248 (LPBYTE
)lpStatusPtr
,
1253 (LPSTR
)pszGroupName
);
1255 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1257 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1261 if (dwError
== ERROR_SUCCESS
|| dwError
== ERROR_MORE_DATA
)
1263 if (InfoLevel
== SC_ENUM_PROCESS_INFO
)
1265 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
1267 if (lpStatusPtr
->lpServiceName
)
1268 lpStatusPtr
->lpServiceName
=
1269 (LPSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
1271 if (lpStatusPtr
->lpDisplayName
)
1272 lpStatusPtr
->lpDisplayName
=
1273 (LPSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
1280 if (dwError
!= ERROR_SUCCESS
)
1282 TRACE("REnumServicesStatusExA() failed (Error %lu)\n", dwError
);
1283 SetLastError(dwError
);
1287 TRACE("EnumServicesStatusExA() done\n");
1293 /**********************************************************************
1294 * EnumServicesStatusExW
1299 EnumServicesStatusExW(SC_HANDLE hSCManager
,
1300 SC_ENUM_TYPE InfoLevel
,
1301 DWORD dwServiceType
,
1302 DWORD dwServiceState
,
1305 LPDWORD pcbBytesNeeded
,
1306 LPDWORD lpServicesReturned
,
1307 LPDWORD lpResumeHandle
,
1308 LPCWSTR pszGroupName
)
1310 ENUM_SERVICE_STATUS_PROCESSW ServiceStatus
;
1311 LPENUM_SERVICE_STATUS_PROCESSW lpStatusPtr
;
1316 TRACE("EnumServicesStatusExW() called\n");
1318 if (InfoLevel
!= SC_ENUM_PROCESS_INFO
)
1320 SetLastError(ERROR_INVALID_LEVEL
);
1326 SetLastError(ERROR_INVALID_HANDLE
);
1330 if (pcbBytesNeeded
== NULL
|| lpServicesReturned
== NULL
)
1332 SetLastError(ERROR_INVALID_ADDRESS
);
1336 if (lpServices
== NULL
|| cbBufSize
< sizeof(ENUM_SERVICE_STATUS_PROCESSW
))
1338 lpStatusPtr
= &ServiceStatus
;
1339 dwBufferSize
= sizeof(ENUM_SERVICE_STATUS_PROCESSW
);
1343 lpStatusPtr
= (LPENUM_SERVICE_STATUS_PROCESSW
)lpServices
;
1344 dwBufferSize
= cbBufSize
;
1349 dwError
= REnumServicesStatusExW((SC_RPC_HANDLE
)hSCManager
,
1353 (LPBYTE
)lpStatusPtr
,
1358 (LPWSTR
)pszGroupName
);
1360 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1362 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1366 if (dwError
== ERROR_SUCCESS
|| dwError
== ERROR_MORE_DATA
)
1368 if (InfoLevel
== SC_ENUM_PROCESS_INFO
)
1370 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
1372 if (lpStatusPtr
->lpServiceName
)
1373 lpStatusPtr
->lpServiceName
=
1374 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
1376 if (lpStatusPtr
->lpDisplayName
)
1377 lpStatusPtr
->lpDisplayName
=
1378 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
1385 if (dwError
!= ERROR_SUCCESS
)
1387 TRACE("REnumServicesStatusExW() failed (Error %lu)\n", dwError
);
1388 SetLastError(dwError
);
1392 TRACE("EnumServicesStatusExW() done\n");
1398 /**********************************************************************
1399 * GetServiceDisplayNameA
1404 GetServiceDisplayNameA(SC_HANDLE hSCManager
,
1405 LPCSTR lpServiceName
,
1406 LPSTR lpDisplayName
,
1407 LPDWORD lpcchBuffer
)
1411 CHAR szEmptyName
[] = "";
1413 TRACE("GetServiceDisplayNameA() called\n");
1414 TRACE("%p %s %p %p\n", hSCManager
,
1415 debugstr_a(lpServiceName
), lpDisplayName
, lpcchBuffer
);
1419 SetLastError(ERROR_INVALID_HANDLE
);
1423 if (!lpDisplayName
|| *lpcchBuffer
< sizeof(CHAR
))
1425 lpNameBuffer
= szEmptyName
;
1426 *lpcchBuffer
= sizeof(CHAR
);
1430 lpNameBuffer
= lpDisplayName
;
1435 dwError
= RGetServiceDisplayNameA((SC_RPC_HANDLE
)hSCManager
,
1440 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1442 /* HACK: because of a problem with rpcrt4, rpcserver is hacked to return 6 for ERROR_SERVICE_DOES_NOT_EXIST */
1443 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1447 if (dwError
!= ERROR_SUCCESS
)
1449 TRACE("RGetServiceDisplayNameA() failed (Error %lu)\n", dwError
);
1450 SetLastError(dwError
);
1458 /**********************************************************************
1459 * GetServiceDisplayNameW
1464 GetServiceDisplayNameW(SC_HANDLE hSCManager
,
1465 LPCWSTR lpServiceName
,
1466 LPWSTR lpDisplayName
,
1467 LPDWORD lpcchBuffer
)
1470 LPWSTR lpNameBuffer
;
1471 WCHAR szEmptyName
[] = L
"";
1473 TRACE("GetServiceDisplayNameW() called\n");
1477 SetLastError(ERROR_INVALID_HANDLE
);
1481 if (!lpDisplayName
|| *lpcchBuffer
< sizeof(WCHAR
))
1483 lpNameBuffer
= szEmptyName
;
1484 *lpcchBuffer
= sizeof(WCHAR
);
1488 lpNameBuffer
= lpDisplayName
;
1493 dwError
= RGetServiceDisplayNameW((SC_RPC_HANDLE
)hSCManager
,
1498 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1500 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1504 if (dwError
!= ERROR_SUCCESS
)
1506 TRACE("RGetServiceDisplayNameW() failed (Error %lu)\n", dwError
);
1507 SetLastError(dwError
);
1515 /**********************************************************************
1516 * GetServiceKeyNameA
1521 GetServiceKeyNameA(SC_HANDLE hSCManager
,
1522 LPCSTR lpDisplayName
,
1523 LPSTR lpServiceName
,
1524 LPDWORD lpcchBuffer
)
1528 CHAR szEmptyName
[] = "";
1530 TRACE("GetServiceKeyNameA() called\n");
1534 SetLastError(ERROR_INVALID_HANDLE
);
1538 if (!lpServiceName
|| *lpcchBuffer
< sizeof(CHAR
))
1540 lpNameBuffer
= szEmptyName
;
1541 *lpcchBuffer
= sizeof(CHAR
);
1545 lpNameBuffer
= lpServiceName
;
1550 dwError
= RGetServiceKeyNameA((SC_RPC_HANDLE
)hSCManager
,
1555 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1557 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1561 if (dwError
!= ERROR_SUCCESS
)
1563 TRACE("RGetServiceKeyNameA() failed (Error %lu)\n", dwError
);
1564 SetLastError(dwError
);
1572 /**********************************************************************
1573 * GetServiceKeyNameW
1578 GetServiceKeyNameW(SC_HANDLE hSCManager
,
1579 LPCWSTR lpDisplayName
,
1580 LPWSTR lpServiceName
,
1581 LPDWORD lpcchBuffer
)
1584 LPWSTR lpNameBuffer
;
1585 WCHAR szEmptyName
[] = L
"";
1587 TRACE("GetServiceKeyNameW() called\n");
1591 SetLastError(ERROR_INVALID_HANDLE
);
1595 if (!lpServiceName
|| *lpcchBuffer
< sizeof(WCHAR
))
1597 lpNameBuffer
= szEmptyName
;
1598 *lpcchBuffer
= sizeof(WCHAR
);
1602 lpNameBuffer
= lpServiceName
;
1607 dwError
= RGetServiceKeyNameW((SC_RPC_HANDLE
)hSCManager
,
1612 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1614 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1618 if (dwError
!= ERROR_SUCCESS
)
1620 TRACE("RGetServiceKeyNameW() failed (Error %lu)\n", dwError
);
1621 SetLastError(dwError
);
1629 /**********************************************************************
1630 * LockServiceDatabase
1635 LockServiceDatabase(SC_HANDLE hSCManager
)
1640 TRACE("LockServiceDatabase(%x)\n", hSCManager
);
1644 /* Call to services.exe using RPC */
1645 dwError
= RLockServiceDatabase((SC_RPC_HANDLE
)hSCManager
,
1646 (SC_RPC_LOCK
*)&hLock
);
1648 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1650 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1654 if (dwError
!= ERROR_SUCCESS
)
1656 TRACE("RLockServiceDatabase() failed (Error %lu)\n", dwError
);
1657 SetLastError(dwError
);
1661 TRACE("hLock = %p\n", hLock
);
1668 WaitForSCManager(VOID
)
1672 TRACE("WaitForSCManager() called\n");
1674 /* Try to open the existing event */
1675 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, SCM_START_EVENT
);
1678 if (GetLastError() != ERROR_FILE_NOT_FOUND
) return;
1680 /* Try to create a new event */
1681 hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, SCM_START_EVENT
);
1682 if (hEvent
== NULL
) return;
1685 /* Wait for 3 minutes */
1686 WaitForSingleObject(hEvent
, 180000);
1687 CloseHandle(hEvent
);
1689 TRACE("ScmWaitForSCManager() done\n");
1693 /**********************************************************************
1699 OpenSCManagerA(LPCSTR lpMachineName
,
1700 LPCSTR lpDatabaseName
,
1701 DWORD dwDesiredAccess
)
1703 SC_HANDLE hScm
= NULL
;
1706 TRACE("OpenSCManagerA(%s, %s, %lx)\n",
1707 lpMachineName
, lpDatabaseName
, dwDesiredAccess
);
1713 /* Call to services.exe using RPC */
1714 dwError
= ROpenSCManagerA((LPSTR
)lpMachineName
,
1715 (LPSTR
)lpDatabaseName
,
1717 (SC_RPC_HANDLE
*)&hScm
);
1719 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1721 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1725 if (dwError
!= ERROR_SUCCESS
)
1727 TRACE("ROpenSCManagerA() failed (Error %lu)\n", dwError
);
1728 SetLastError(dwError
);
1732 TRACE("hScm = %p\n", hScm
);
1738 /**********************************************************************
1744 OpenSCManagerW(LPCWSTR lpMachineName
,
1745 LPCWSTR lpDatabaseName
,
1746 DWORD dwDesiredAccess
)
1748 SC_HANDLE hScm
= NULL
;
1751 TRACE("OpenSCManagerW(%S, %S, %lx)\n",
1752 lpMachineName
, lpDatabaseName
, dwDesiredAccess
);
1758 /* Call to services.exe using RPC */
1759 dwError
= ROpenSCManagerW((LPWSTR
)lpMachineName
,
1760 (LPWSTR
)lpDatabaseName
,
1762 (SC_RPC_HANDLE
*)&hScm
);
1764 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1766 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1770 if (dwError
!= ERROR_SUCCESS
)
1772 TRACE("ROpenSCManagerW() failed (Error %lu)\n", dwError
);
1773 SetLastError(dwError
);
1777 TRACE("hScm = %p\n", hScm
);
1783 /**********************************************************************
1789 OpenServiceA(SC_HANDLE hSCManager
,
1790 LPCSTR lpServiceName
,
1791 DWORD dwDesiredAccess
)
1793 SC_HANDLE hService
= NULL
;
1796 TRACE("OpenServiceA(%p, %s, %lx)\n",
1797 hSCManager
, lpServiceName
, dwDesiredAccess
);
1801 SetLastError(ERROR_INVALID_HANDLE
);
1807 /* Call to services.exe using RPC */
1808 dwError
= ROpenServiceA((SC_RPC_HANDLE
)hSCManager
,
1809 (LPSTR
)lpServiceName
,
1811 (SC_RPC_HANDLE
*)&hService
);
1813 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1815 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1819 if (dwError
!= ERROR_SUCCESS
)
1821 TRACE("ROpenServiceA() failed (Error %lu)\n", dwError
);
1822 SetLastError(dwError
);
1826 TRACE("hService = %p\n", hService
);
1832 /**********************************************************************
1838 OpenServiceW(SC_HANDLE hSCManager
,
1839 LPCWSTR lpServiceName
,
1840 DWORD dwDesiredAccess
)
1842 SC_HANDLE hService
= NULL
;
1845 TRACE("OpenServiceW(%p, %S, %lx)\n",
1846 hSCManager
, lpServiceName
, dwDesiredAccess
);
1850 SetLastError(ERROR_INVALID_HANDLE
);
1856 /* Call to services.exe using RPC */
1857 dwError
= ROpenServiceW((SC_RPC_HANDLE
)hSCManager
,
1858 (LPWSTR
)lpServiceName
,
1860 (SC_RPC_HANDLE
*)&hService
);
1862 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1864 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1868 if (dwError
!= ERROR_SUCCESS
)
1870 TRACE("ROpenServiceW() failed (Error %lu)\n", dwError
);
1871 SetLastError(dwError
);
1875 TRACE("hService = %p\n", hService
);
1881 /**********************************************************************
1882 * QueryServiceConfigA
1887 QueryServiceConfigA(SC_HANDLE hService
,
1888 LPQUERY_SERVICE_CONFIGA lpServiceConfig
,
1890 LPDWORD pcbBytesNeeded
)
1892 QUERY_SERVICE_CONFIGA ServiceConfig
;
1893 LPQUERY_SERVICE_CONFIGA lpConfigPtr
;
1897 TRACE("QueryServiceConfigA(%p, %p, %lu, %p)\n",
1898 hService
, lpServiceConfig
, cbBufSize
, pcbBytesNeeded
);
1900 if (lpServiceConfig
== NULL
||
1901 cbBufSize
< sizeof(QUERY_SERVICE_CONFIGA
))
1903 lpConfigPtr
= &ServiceConfig
;
1904 dwBufferSize
= sizeof(QUERY_SERVICE_CONFIGA
);
1908 lpConfigPtr
= lpServiceConfig
;
1909 dwBufferSize
= cbBufSize
;
1914 /* Call to services.exe using RPC */
1915 dwError
= RQueryServiceConfigA((SC_RPC_HANDLE
)hService
,
1916 (LPBYTE
)lpConfigPtr
,
1920 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1922 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1926 if (dwError
!= ERROR_SUCCESS
)
1928 TRACE("RQueryServiceConfigA() failed (Error %lu)\n", dwError
);
1929 SetLastError(dwError
);
1933 /* Adjust the pointers */
1934 if (lpConfigPtr
->lpBinaryPathName
)
1935 lpConfigPtr
->lpBinaryPathName
=
1936 (LPSTR
)((ULONG_PTR
)lpConfigPtr
+
1937 (ULONG_PTR
)lpConfigPtr
->lpBinaryPathName
);
1939 if (lpConfigPtr
->lpLoadOrderGroup
)
1940 lpConfigPtr
->lpLoadOrderGroup
=
1941 (LPSTR
)((ULONG_PTR
)lpConfigPtr
+
1942 (ULONG_PTR
)lpConfigPtr
->lpLoadOrderGroup
);
1944 if (lpConfigPtr
->lpDependencies
)
1945 lpConfigPtr
->lpDependencies
=
1946 (LPSTR
)((ULONG_PTR
)lpConfigPtr
+
1947 (ULONG_PTR
)lpConfigPtr
->lpDependencies
);
1949 if (lpConfigPtr
->lpServiceStartName
)
1950 lpConfigPtr
->lpServiceStartName
=
1951 (LPSTR
)((ULONG_PTR
)lpConfigPtr
+
1952 (ULONG_PTR
)lpConfigPtr
->lpServiceStartName
);
1954 if (lpConfigPtr
->lpDisplayName
)
1955 lpConfigPtr
->lpDisplayName
=
1956 (LPSTR
)((ULONG_PTR
)lpConfigPtr
+
1957 (ULONG_PTR
)lpConfigPtr
->lpDisplayName
);
1959 TRACE("QueryServiceConfigA() done\n");
1965 /**********************************************************************
1966 * QueryServiceConfigW
1971 QueryServiceConfigW(SC_HANDLE hService
,
1972 LPQUERY_SERVICE_CONFIGW lpServiceConfig
,
1974 LPDWORD pcbBytesNeeded
)
1976 QUERY_SERVICE_CONFIGW ServiceConfig
;
1977 LPQUERY_SERVICE_CONFIGW lpConfigPtr
;
1981 TRACE("QueryServiceConfigW(%p, %p, %lu, %p)\n",
1982 hService
, lpServiceConfig
, cbBufSize
, pcbBytesNeeded
);
1984 if (lpServiceConfig
== NULL
||
1985 cbBufSize
< sizeof(QUERY_SERVICE_CONFIGW
))
1987 lpConfigPtr
= &ServiceConfig
;
1988 dwBufferSize
= sizeof(QUERY_SERVICE_CONFIGW
);
1992 lpConfigPtr
= lpServiceConfig
;
1993 dwBufferSize
= cbBufSize
;
1998 /* Call to services.exe using RPC */
1999 dwError
= RQueryServiceConfigW((SC_RPC_HANDLE
)hService
,
2000 (LPBYTE
)lpConfigPtr
,
2004 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2006 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2010 if (dwError
!= ERROR_SUCCESS
)
2012 TRACE("RQueryServiceConfigW() failed (Error %lu)\n", dwError
);
2013 SetLastError(dwError
);
2017 /* Adjust the pointers */
2018 if (lpConfigPtr
->lpBinaryPathName
)
2019 lpConfigPtr
->lpBinaryPathName
=
2020 (LPWSTR
)((ULONG_PTR
)lpConfigPtr
+
2021 (ULONG_PTR
)lpConfigPtr
->lpBinaryPathName
);
2023 if (lpConfigPtr
->lpLoadOrderGroup
)
2024 lpConfigPtr
->lpLoadOrderGroup
=
2025 (LPWSTR
)((ULONG_PTR
)lpConfigPtr
+
2026 (ULONG_PTR
)lpConfigPtr
->lpLoadOrderGroup
);
2028 if (lpConfigPtr
->lpDependencies
)
2029 lpConfigPtr
->lpDependencies
=
2030 (LPWSTR
)((ULONG_PTR
)lpConfigPtr
+
2031 (ULONG_PTR
)lpConfigPtr
->lpDependencies
);
2033 if (lpConfigPtr
->lpServiceStartName
)
2034 lpConfigPtr
->lpServiceStartName
=
2035 (LPWSTR
)((ULONG_PTR
)lpConfigPtr
+
2036 (ULONG_PTR
)lpConfigPtr
->lpServiceStartName
);
2038 if (lpConfigPtr
->lpDisplayName
)
2039 lpConfigPtr
->lpDisplayName
=
2040 (LPWSTR
)((ULONG_PTR
)lpConfigPtr
+
2041 (ULONG_PTR
)lpConfigPtr
->lpDisplayName
);
2043 TRACE("QueryServiceConfigW() done\n");
2049 /**********************************************************************
2050 * QueryServiceConfig2A
2055 QueryServiceConfig2A(SC_HANDLE hService
,
2059 LPDWORD pcbBytesNeeded
)
2061 SERVICE_DESCRIPTIONA ServiceDescription
;
2062 SERVICE_FAILURE_ACTIONSA ServiceFailureActions
;
2063 LPBYTE lpTempBuffer
;
2064 BOOL bUseTempBuffer
= FALSE
;
2068 TRACE("QueryServiceConfig2A(hService %p, dwInfoLevel %lu, lpBuffer %p, cbBufSize %lu, pcbBytesNeeded %p)\n",
2069 hService
, dwInfoLevel
, lpBuffer
, cbBufSize
, pcbBytesNeeded
);
2071 lpTempBuffer
= lpBuffer
;
2072 dwBufferSize
= cbBufSize
;
2074 switch (dwInfoLevel
)
2076 case SERVICE_CONFIG_DESCRIPTION
:
2077 if ((lpBuffer
== NULL
) || (cbBufSize
< sizeof(SERVICE_DESCRIPTIONA
)))
2079 lpTempBuffer
= (LPBYTE
)&ServiceDescription
;
2080 dwBufferSize
= sizeof(SERVICE_DESCRIPTIONA
);
2081 bUseTempBuffer
= TRUE
;
2085 case SERVICE_CONFIG_FAILURE_ACTIONS
:
2086 if ((lpBuffer
== NULL
) || (cbBufSize
< sizeof(SERVICE_FAILURE_ACTIONSA
)))
2088 lpTempBuffer
= (LPBYTE
)&ServiceFailureActions
;
2089 dwBufferSize
= sizeof(SERVICE_FAILURE_ACTIONSA
);
2090 bUseTempBuffer
= TRUE
;
2095 WARN("Unknown info level 0x%lx\n", dwInfoLevel
);
2096 SetLastError(ERROR_INVALID_LEVEL
);
2102 /* Call to services.exe using RPC */
2103 dwError
= RQueryServiceConfig2A((SC_RPC_HANDLE
)hService
,
2109 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2111 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2115 if (dwError
!= ERROR_SUCCESS
)
2117 TRACE("RQueryServiceConfig2A() failed (Error %lu)\n", dwError
);
2118 SetLastError(dwError
);
2122 if (bUseTempBuffer
== TRUE
)
2124 TRACE("RQueryServiceConfig2A() returns ERROR_INSUFFICIENT_BUFFER\n");
2125 *pcbBytesNeeded
= dwBufferSize
;
2126 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
2130 switch (dwInfoLevel
)
2132 case SERVICE_CONFIG_DESCRIPTION
:
2134 LPSERVICE_DESCRIPTIONA lpPtr
= (LPSERVICE_DESCRIPTIONA
)lpTempBuffer
;
2136 if (lpPtr
->lpDescription
!= NULL
)
2137 lpPtr
->lpDescription
=
2138 (LPSTR
)((ULONG_PTR
)lpPtr
+ (ULONG_PTR
)lpPtr
->lpDescription
);
2142 case SERVICE_CONFIG_FAILURE_ACTIONS
:
2144 LPSERVICE_FAILURE_ACTIONSA lpPtr
= (LPSERVICE_FAILURE_ACTIONSA
)lpTempBuffer
;
2146 if (lpPtr
->lpRebootMsg
!= NULL
)
2147 lpPtr
->lpRebootMsg
=
2148 (LPSTR
)((ULONG_PTR
)lpPtr
+ (ULONG_PTR
)lpPtr
->lpRebootMsg
);
2150 if (lpPtr
->lpCommand
!= NULL
)
2152 (LPSTR
)((ULONG_PTR
)lpPtr
+ (ULONG_PTR
)lpPtr
->lpCommand
);
2154 if (lpPtr
->lpsaActions
!= NULL
)
2155 lpPtr
->lpsaActions
=
2156 (LPSC_ACTION
)((ULONG_PTR
)lpPtr
+ (ULONG_PTR
)lpPtr
->lpsaActions
);
2161 TRACE("QueryServiceConfig2A() done\n");
2167 /**********************************************************************
2168 * QueryServiceConfig2W
2173 QueryServiceConfig2W(SC_HANDLE hService
,
2177 LPDWORD pcbBytesNeeded
)
2179 SERVICE_DESCRIPTIONW ServiceDescription
;
2180 SERVICE_FAILURE_ACTIONSW ServiceFailureActions
;
2181 LPBYTE lpTempBuffer
;
2182 BOOL bUseTempBuffer
= FALSE
;
2186 TRACE("QueryServiceConfig2W(%p, %lu, %p, %lu, %p)\n",
2187 hService
, dwInfoLevel
, lpBuffer
, cbBufSize
, pcbBytesNeeded
);
2189 lpTempBuffer
= lpBuffer
;
2190 dwBufferSize
= cbBufSize
;
2192 switch (dwInfoLevel
)
2194 case SERVICE_CONFIG_DESCRIPTION
:
2195 if ((lpBuffer
== NULL
) || (cbBufSize
< sizeof(SERVICE_DESCRIPTIONW
)))
2197 lpTempBuffer
= (LPBYTE
)&ServiceDescription
;
2198 dwBufferSize
= sizeof(SERVICE_DESCRIPTIONW
);
2199 bUseTempBuffer
= TRUE
;
2203 case SERVICE_CONFIG_FAILURE_ACTIONS
:
2204 if ((lpBuffer
== NULL
) || (cbBufSize
< sizeof(SERVICE_FAILURE_ACTIONSW
)))
2206 lpTempBuffer
= (LPBYTE
)&ServiceFailureActions
;
2207 dwBufferSize
= sizeof(SERVICE_FAILURE_ACTIONSW
);
2208 bUseTempBuffer
= TRUE
;
2213 WARN("Unknown info level 0x%lx\n", dwInfoLevel
);
2214 SetLastError(ERROR_INVALID_LEVEL
);
2220 /* Call to services.exe using RPC */
2221 dwError
= RQueryServiceConfig2W((SC_RPC_HANDLE
)hService
,
2227 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2229 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2233 if (dwError
!= ERROR_SUCCESS
)
2235 TRACE("RQueryServiceConfig2W() failed (Error %lu)\n", dwError
);
2236 SetLastError(dwError
);
2240 if (bUseTempBuffer
== TRUE
)
2242 TRACE("RQueryServiceConfig2W() returns ERROR_INSUFFICIENT_BUFFER\n");
2243 *pcbBytesNeeded
= dwBufferSize
;
2244 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
2248 switch (dwInfoLevel
)
2250 case SERVICE_CONFIG_DESCRIPTION
:
2252 LPSERVICE_DESCRIPTIONW lpPtr
= (LPSERVICE_DESCRIPTIONW
)lpTempBuffer
;
2254 if (lpPtr
->lpDescription
!= NULL
)
2255 lpPtr
->lpDescription
=
2256 (LPWSTR
)((ULONG_PTR
)lpPtr
+ (ULONG_PTR
)lpPtr
->lpDescription
);
2260 case SERVICE_CONFIG_FAILURE_ACTIONS
:
2262 LPSERVICE_FAILURE_ACTIONSW lpPtr
= (LPSERVICE_FAILURE_ACTIONSW
)lpTempBuffer
;
2264 if (lpPtr
->lpRebootMsg
!= NULL
)
2265 lpPtr
->lpRebootMsg
=
2266 (LPWSTR
)((ULONG_PTR
)lpPtr
+ (ULONG_PTR
)lpPtr
->lpRebootMsg
);
2268 if (lpPtr
->lpCommand
!= NULL
)
2270 (LPWSTR
)((ULONG_PTR
)lpPtr
+ (ULONG_PTR
)lpPtr
->lpCommand
);
2272 if (lpPtr
->lpsaActions
!= NULL
)
2273 lpPtr
->lpsaActions
=
2274 (LPSC_ACTION
)((ULONG_PTR
)lpPtr
+ (ULONG_PTR
)lpPtr
->lpsaActions
);
2279 TRACE("QueryServiceConfig2W() done\n");
2285 /**********************************************************************
2286 * QueryServiceLockStatusA
2291 QueryServiceLockStatusA(SC_HANDLE hSCManager
,
2292 LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
,
2294 LPDWORD pcbBytesNeeded
)
2296 QUERY_SERVICE_LOCK_STATUSA LockStatus
;
2297 LPQUERY_SERVICE_LOCK_STATUSA lpStatusPtr
;
2301 TRACE("QueryServiceLockStatusA() called\n");
2303 if (lpLockStatus
== NULL
|| cbBufSize
< sizeof(QUERY_SERVICE_LOCK_STATUSA
))
2305 lpStatusPtr
= &LockStatus
;
2306 dwBufferSize
= sizeof(QUERY_SERVICE_LOCK_STATUSA
);
2310 lpStatusPtr
= lpLockStatus
;
2311 dwBufferSize
= cbBufSize
;
2316 /* Call to services.exe using RPC */
2317 dwError
= RQueryServiceLockStatusA((SC_RPC_HANDLE
)hSCManager
,
2318 (LPBYTE
)lpStatusPtr
,
2322 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2324 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2328 if (dwError
!= ERROR_SUCCESS
)
2330 TRACE("RQueryServiceLockStatusA() failed (Error %lu)\n", dwError
);
2331 SetLastError(dwError
);
2335 if (lpStatusPtr
->lpLockOwner
!= NULL
)
2337 lpStatusPtr
->lpLockOwner
=
2338 (LPSTR
)((ULONG_PTR
)lpStatusPtr
+ (ULONG_PTR
)lpStatusPtr
->lpLockOwner
);
2341 TRACE("QueryServiceLockStatusA() done\n");
2347 /**********************************************************************
2348 * QueryServiceLockStatusW
2353 QueryServiceLockStatusW(SC_HANDLE hSCManager
,
2354 LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
,
2356 LPDWORD pcbBytesNeeded
)
2358 QUERY_SERVICE_LOCK_STATUSW LockStatus
;
2359 LPQUERY_SERVICE_LOCK_STATUSW lpStatusPtr
;
2363 TRACE("QueryServiceLockStatusW() called\n");
2365 if (lpLockStatus
== NULL
|| cbBufSize
< sizeof(QUERY_SERVICE_LOCK_STATUSW
))
2367 lpStatusPtr
= &LockStatus
;
2368 dwBufferSize
= sizeof(QUERY_SERVICE_LOCK_STATUSW
);
2372 lpStatusPtr
= lpLockStatus
;
2373 dwBufferSize
= cbBufSize
;
2378 /* Call to services.exe using RPC */
2379 dwError
= RQueryServiceLockStatusW((SC_RPC_HANDLE
)hSCManager
,
2380 (LPBYTE
)lpStatusPtr
,
2384 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2386 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2390 if (dwError
!= ERROR_SUCCESS
)
2392 TRACE("RQueryServiceLockStatusW() failed (Error %lu)\n", dwError
);
2393 SetLastError(dwError
);
2397 if (lpStatusPtr
->lpLockOwner
!= NULL
)
2399 lpStatusPtr
->lpLockOwner
=
2400 (LPWSTR
)((ULONG_PTR
)lpStatusPtr
+ (ULONG_PTR
)lpStatusPtr
->lpLockOwner
);
2403 TRACE("QueryServiceLockStatusW() done\n");
2409 /**********************************************************************
2410 * QueryServiceObjectSecurity
2415 QueryServiceObjectSecurity(SC_HANDLE hService
,
2416 SECURITY_INFORMATION dwSecurityInformation
,
2417 PSECURITY_DESCRIPTOR lpSecurityDescriptor
,
2419 LPDWORD pcbBytesNeeded
)
2423 TRACE("QueryServiceObjectSecurity(%p, %lu, %p)\n",
2424 hService
, dwSecurityInformation
, lpSecurityDescriptor
);
2428 /* Call to services.exe using RPC */
2429 dwError
= RQueryServiceObjectSecurity((SC_RPC_HANDLE
)hService
,
2430 dwSecurityInformation
,
2431 (LPBYTE
)lpSecurityDescriptor
,
2435 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2437 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2441 if (dwError
!= ERROR_SUCCESS
)
2443 TRACE("QueryServiceObjectSecurity() failed (Error %lu)\n", dwError
);
2444 SetLastError(dwError
);
2451 /**********************************************************************
2452 * SetServiceObjectSecurity
2457 SetServiceObjectSecurity(SC_HANDLE hService
,
2458 SECURITY_INFORMATION dwSecurityInformation
,
2459 PSECURITY_DESCRIPTOR lpSecurityDescriptor
)
2461 PSECURITY_DESCRIPTOR SelfRelativeSD
= NULL
;
2467 Status
= RtlMakeSelfRelativeSD(lpSecurityDescriptor
,
2470 if (Status
!= STATUS_BUFFER_TOO_SMALL
)
2472 SetLastError(ERROR_INVALID_PARAMETER
);
2476 SelfRelativeSD
= HeapAlloc(GetProcessHeap(), 0, Length
);
2477 if (SelfRelativeSD
== NULL
)
2479 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2483 Status
= RtlMakeSelfRelativeSD(lpSecurityDescriptor
,
2486 if (!NT_SUCCESS(Status
))
2488 HeapFree(GetProcessHeap(), 0, SelfRelativeSD
);
2489 SetLastError(RtlNtStatusToDosError(Status
));
2495 /* Call to services.exe using RPC */
2496 dwError
= RSetServiceObjectSecurity((SC_RPC_HANDLE
)hService
,
2497 dwSecurityInformation
,
2498 (LPBYTE
)SelfRelativeSD
,
2501 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2503 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2507 HeapFree(GetProcessHeap(), 0, SelfRelativeSD
);
2509 if (dwError
!= ERROR_SUCCESS
)
2511 TRACE("RServiceObjectSecurity() failed (Error %lu)\n", dwError
);
2512 SetLastError(dwError
);
2520 /**********************************************************************
2521 * QueryServiceStatus
2526 QueryServiceStatus(SC_HANDLE hService
,
2527 LPSERVICE_STATUS lpServiceStatus
)
2531 TRACE("QueryServiceStatus(%p, %p)\n",
2532 hService
, lpServiceStatus
);
2536 SetLastError(ERROR_INVALID_HANDLE
);
2542 /* Call to services.exe using RPC */
2543 dwError
= RQueryServiceStatus((SC_RPC_HANDLE
)hService
,
2546 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2548 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2552 if (dwError
!= ERROR_SUCCESS
)
2554 TRACE("RQueryServiceStatus() failed (Error %lu)\n", dwError
);
2555 SetLastError(dwError
);
2563 /**********************************************************************
2564 * QueryServiceStatusEx
2569 QueryServiceStatusEx(SC_HANDLE hService
,
2570 SC_STATUS_TYPE InfoLevel
,
2573 LPDWORD pcbBytesNeeded
)
2577 TRACE("QueryServiceStatusEx() called\n");
2579 if (InfoLevel
!= SC_STATUS_PROCESS_INFO
)
2581 SetLastError(ERROR_INVALID_LEVEL
);
2585 if (cbBufSize
< sizeof(SERVICE_STATUS_PROCESS
))
2587 *pcbBytesNeeded
= sizeof(SERVICE_STATUS_PROCESS
);
2588 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
2594 /* Call to services.exe using RPC */
2595 dwError
= RQueryServiceStatusEx((SC_RPC_HANDLE
)hService
,
2601 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2603 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2607 if (dwError
!= ERROR_SUCCESS
)
2609 TRACE("RQueryServiceStatusEx() failed (Error %lu)\n", dwError
);
2610 SetLastError(dwError
);
2618 /**********************************************************************
2624 StartServiceA(SC_HANDLE hService
,
2625 DWORD dwNumServiceArgs
,
2626 LPCSTR
*lpServiceArgVectors
)
2632 dwError
= RStartServiceA((SC_RPC_HANDLE
)hService
,
2634 (LPSTRING_PTRSA
)lpServiceArgVectors
);
2636 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2638 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2642 if (dwError
!= ERROR_SUCCESS
)
2644 ERR("RStartServiceA() failed (Error %lu)\n", dwError
);
2645 SetLastError(dwError
);
2653 /**********************************************************************
2659 StartServiceW(SC_HANDLE hService
,
2660 DWORD dwNumServiceArgs
,
2661 LPCWSTR
*lpServiceArgVectors
)
2667 dwError
= RStartServiceW((SC_RPC_HANDLE
)hService
,
2669 (LPSTRING_PTRSW
)lpServiceArgVectors
);
2671 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2673 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2677 if (dwError
!= ERROR_SUCCESS
)
2679 ERR("RStartServiceW() failed (Error %lu)\n", dwError
);
2680 SetLastError(dwError
);
2688 /**********************************************************************
2689 * UnlockServiceDatabase
2694 UnlockServiceDatabase(SC_LOCK ScLock
)
2698 TRACE("UnlockServiceDatabase(%x)\n", ScLock
);
2702 /* Call to services.exe using RPC */
2703 dwError
= RUnlockServiceDatabase((LPSC_RPC_LOCK
)&ScLock
);
2705 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2707 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2711 if (dwError
!= ERROR_SUCCESS
)
2713 TRACE("RUnlockServiceDatabase() failed (Error %lu)\n", dwError
);
2714 SetLastError(dwError
);
2722 /**********************************************************************
2723 * NotifyBootConfigStatus
2728 NotifyBootConfigStatus(BOOL BootAcceptable
)
2732 TRACE("NotifyBootConfigStatus()\n");
2736 /* Call to services.exe using RPC */
2737 dwError
= RNotifyBootConfigStatus(NULL
,
2740 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2742 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2746 if (dwError
!= ERROR_SUCCESS
)
2748 TRACE("NotifyBootConfigStatus() failed (Error %lu)\n", dwError
);
2749 SetLastError(dwError
);