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 ******************************************************************/
17 #include "wine/debug.h"
19 WINE_DEFAULT_DEBUG_CHANNEL(advapi
);
22 /* FUNCTIONS *****************************************************************/
25 SVCCTL_HANDLEA_bind(SVCCTL_HANDLEA szMachineName
)
27 handle_t hBinding
= NULL
;
28 UCHAR
*pszStringBinding
;
31 ERR("SVCCTL_HANDLEA_bind() called\n");
33 status
= RpcStringBindingComposeA((UCHAR
*)szMachineName
,
36 (UCHAR
*)"\\pipe\\ntsvcs",
38 (UCHAR
**)&pszStringBinding
);
41 ERR("RpcStringBindingCompose returned 0x%x\n", status
);
45 /* Set the binding handle that will be used to bind to the server. */
46 status
= RpcBindingFromStringBindingA(pszStringBinding
,
50 ERR("RpcBindingFromStringBinding returned 0x%x\n", status
);
53 status
= RpcStringFreeA(&pszStringBinding
);
56 ERR("RpcStringFree returned 0x%x\n", status
);
64 SVCCTL_HANDLEA_unbind(SVCCTL_HANDLEA szMachineName
,
69 ERR("SVCCTL_HANDLEA_unbind() called\n");
71 status
= RpcBindingFree(&hBinding
);
74 ERR("RpcBindingFree returned 0x%x\n", status
);
80 SVCCTL_HANDLEW_bind(SVCCTL_HANDLEW szMachineName
)
82 handle_t hBinding
= NULL
;
83 LPWSTR pszStringBinding
;
86 ERR("SVCCTL_HANDLEW_bind() called\n");
89 status
= RpcStringBindingComposeW(szMachineName
,
97 ERR("RpcStringBindingCompose returned 0x%x\n", status
);
101 /* Set the binding handle that will be used to bind to the server. */
102 status
= RpcBindingFromStringBindingW(pszStringBinding
,
106 ERR("RpcBindingFromStringBinding returned 0x%x\n", status
);
109 status
= RpcStringFreeW(&pszStringBinding
);
112 ERR("RpcStringFree returned 0x%x\n", status
);
120 SVCCTL_HANDLEW_unbind(SVCCTL_HANDLEW szMachineName
,
125 ERR("SVCCTL_HANDLEW_unbind() called\n");
127 status
= RpcBindingFree(&hBinding
);
130 ERR("RpcBindingFree returned 0x%x\n", status
);
136 RPC_SERVICE_STATUS_HANDLE_bind(RPC_SERVICE_STATUS_HANDLE hServiceStatus
)
138 handle_t hBinding
= NULL
;
139 LPWSTR pszStringBinding
;
142 ERR("RPC_SERVICE_STATUS_HANDLE_bind() called\n");
145 status
= RpcStringBindingComposeW(NULL
,
153 ERR("RpcStringBindingCompose returned 0x%x\n", status
);
157 /* Set the binding handle that will be used to bind to the server. */
158 status
= RpcBindingFromStringBindingW(pszStringBinding
,
162 ERR("RpcBindingFromStringBinding returned 0x%x\n", status
);
165 status
= RpcStringFreeW(&pszStringBinding
);
168 ERR("RpcStringFree returned 0x%x\n", status
);
176 RPC_SERVICE_STATUS_HANDLE_unbind(RPC_SERVICE_STATUS_HANDLE hServiceStatus
,
181 ERR("RPC_SERVICE_STATUS_HANDLE_unbind() called\n");
183 status
= RpcBindingFree(&hBinding
);
186 ERR("RpcBindingFree returned 0x%x\n", status
);
192 ScmRpcStatusToWinError(RPC_STATUS Status
)
196 case RPC_X_SS_IN_NULL_CONTEXT
:
197 return ERROR_INVALID_HANDLE
;
199 case RPC_X_NULL_REF_POINTER
:
200 return ERROR_INVALID_PARAMETER
;
202 case STATUS_ACCESS_VIOLATION
:
203 return ERROR_INVALID_ADDRESS
;
206 return (DWORD
)Status
;
211 /**********************************************************************
212 * ChangeServiceConfig2A
217 ChangeServiceConfig2A(SC_HANDLE hService
,
221 SC_RPC_CONFIG_INFOA Info
;
224 TRACE("ChangeServiceConfig2A() called\n");
226 /* Fill relevent field of the Info structure */
227 Info
.dwInfoLevel
= dwInfoLevel
;
230 case SERVICE_CONFIG_DESCRIPTION
:
231 Info
.psd
= (LPSERVICE_DESCRIPTIONA
)&lpInfo
;
234 case SERVICE_CONFIG_FAILURE_ACTIONS
:
235 Info
.psfa
= (LPSERVICE_FAILURE_ACTIONSA
)&lpInfo
;
239 WARN("Unknown info level 0x%lx\n", dwInfoLevel
);
240 SetLastError(ERROR_INVALID_PARAMETER
);
249 dwError
= RChangeServiceConfig2A((SC_RPC_HANDLE
)hService
,
254 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
258 if (dwError
!= ERROR_SUCCESS
)
260 ERR("RChangeServiceConfig2A() failed (Error %lu)\n", dwError
);
261 SetLastError(dwError
);
269 /**********************************************************************
270 * ChangeServiceConfig2W
275 ChangeServiceConfig2W(SC_HANDLE hService
,
279 SC_RPC_CONFIG_INFOW Info
;
282 TRACE("ChangeServiceConfig2W() called\n");
284 /* Fill relevent field of the Info structure */
285 Info
.dwInfoLevel
= dwInfoLevel
;
288 case SERVICE_CONFIG_DESCRIPTION
:
290 Info
.psd
= (LPSERVICE_DESCRIPTIONW
)&lpInfo
;
294 case SERVICE_CONFIG_FAILURE_ACTIONS
:
295 Info
.psfa
= (LPSERVICE_FAILURE_ACTIONSW
)&lpInfo
;
299 WARN("Unknown info level 0x%lx\n", dwInfoLevel
);
300 SetLastError(ERROR_INVALID_PARAMETER
);
309 dwError
= RChangeServiceConfig2W((SC_RPC_HANDLE
)hService
,
314 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
318 if (dwError
!= ERROR_SUCCESS
)
320 ERR("RChangeServiceConfig2W() failed (Error %lu)\n", dwError
);
321 SetLastError(dwError
);
329 /**********************************************************************
330 * ChangeServiceConfigA
335 ChangeServiceConfigA(SC_HANDLE hService
,
338 DWORD dwErrorControl
,
339 LPCSTR lpBinaryPathName
,
340 LPCSTR lpLoadOrderGroup
,
342 LPCSTR lpDependencies
,
343 LPCSTR lpServiceStartName
,
345 LPCSTR lpDisplayName
)
348 DWORD dwDependenciesLength
= 0;
352 TRACE("ChangeServiceConfigA() called\n");
354 /* Calculate the Dependencies length*/
355 if (lpDependencies
!= NULL
)
357 lpStr
= (LPSTR
)lpDependencies
;
360 dwLength
= strlen(lpStr
) + 1;
361 dwDependenciesLength
+= dwLength
;
362 lpStr
= lpStr
+ dwLength
;
364 dwDependenciesLength
++;
367 /* FIXME: Encrypt the password */
371 /* Call to services.exe using RPC */
372 dwError
= RChangeServiceConfigA((SC_RPC_HANDLE
)hService
,
376 (LPSTR
)lpBinaryPathName
,
377 (LPSTR
)lpLoadOrderGroup
,
379 (LPSTR
)lpDependencies
,
380 dwDependenciesLength
,
381 (LPSTR
)lpServiceStartName
,
382 NULL
, /* FIXME: lpPassword */
383 0, /* FIXME: dwPasswordLength */
384 (LPSTR
)lpDisplayName
);
388 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
392 if (dwError
!= ERROR_SUCCESS
)
394 ERR("RChangeServiceConfigA() failed (Error %lu)\n", dwError
);
395 SetLastError(dwError
);
403 /**********************************************************************
404 * ChangeServiceConfigW
409 ChangeServiceConfigW(SC_HANDLE hService
,
412 DWORD dwErrorControl
,
413 LPCWSTR lpBinaryPathName
,
414 LPCWSTR lpLoadOrderGroup
,
416 LPCWSTR lpDependencies
,
417 LPCWSTR lpServiceStartName
,
419 LPCWSTR lpDisplayName
)
422 DWORD dwDependenciesLength
= 0;
426 TRACE("ChangeServiceConfigW() called\n");
428 /* Calculate the Dependencies length*/
429 if (lpDependencies
!= NULL
)
431 lpStr
= (LPWSTR
)lpDependencies
;
434 dwLength
= wcslen(lpStr
) + 1;
435 dwDependenciesLength
+= dwLength
;
436 lpStr
= lpStr
+ dwLength
;
438 dwDependenciesLength
++;
441 /* FIXME: Encrypt the password */
445 /* Call to services.exe using RPC */
446 dwError
= RChangeServiceConfigW((SC_RPC_HANDLE
)hService
,
450 (LPWSTR
)lpBinaryPathName
,
451 (LPWSTR
)lpLoadOrderGroup
,
453 (LPBYTE
)lpDependencies
,
454 dwDependenciesLength
,
455 (LPWSTR
)lpServiceStartName
,
456 NULL
, /* FIXME: lpPassword */
457 0, /* FIXME: dwPasswordLength */
458 (LPWSTR
)lpDisplayName
);
462 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
466 if (dwError
!= ERROR_SUCCESS
)
468 ERR("RChangeServiceConfigW() failed (Error %lu)\n", dwError
);
469 SetLastError(dwError
);
477 /**********************************************************************
483 CloseServiceHandle(SC_HANDLE hSCObject
)
487 TRACE("CloseServiceHandle() called\n");
491 /* Call to services.exe using RPC */
492 dwError
= RCloseServiceHandle((LPSC_RPC_HANDLE
)&hSCObject
);
496 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
502 ERR("RCloseServiceHandle() failed (Error %lu)\n", dwError
);
503 SetLastError(dwError
);
507 TRACE("CloseServiceHandle() done\n");
513 /**********************************************************************
519 ControlService(SC_HANDLE hService
,
521 LPSERVICE_STATUS lpServiceStatus
)
525 TRACE("ControlService(%x, %x, %p)\n",
526 hService
, dwControl
, lpServiceStatus
);
530 /* Call to services.exe using RPC */
531 dwError
= RControlService((SC_RPC_HANDLE
)hService
,
537 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
541 if (dwError
!= ERROR_SUCCESS
)
543 ERR("RControlService() failed (Error %lu)\n", dwError
);
544 SetLastError(dwError
);
548 TRACE("ControlService() done\n");
554 /**********************************************************************
560 ControlServiceEx(IN SC_HANDLE hService
,
562 IN DWORD dwInfoLevel
,
563 IN OUT PVOID pControlParams
)
565 FIXME("ControlServiceEx(0x%p, 0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n",
566 hService
, dwControl
, dwInfoLevel
, pControlParams
);
567 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
572 /**********************************************************************
578 CreateServiceA(SC_HANDLE hSCManager
,
579 LPCSTR lpServiceName
,
580 LPCSTR lpDisplayName
,
581 DWORD dwDesiredAccess
,
584 DWORD dwErrorControl
,
585 LPCSTR lpBinaryPathName
,
586 LPCSTR lpLoadOrderGroup
,
588 LPCSTR lpDependencies
,
589 LPCSTR lpServiceStartName
,
592 SC_HANDLE RetVal
= NULL
;
593 LPWSTR lpServiceNameW
= NULL
;
594 LPWSTR lpDisplayNameW
= NULL
;
595 LPWSTR lpBinaryPathNameW
= NULL
;
596 LPWSTR lpLoadOrderGroupW
= NULL
;
597 LPWSTR lpDependenciesW
= NULL
;
598 LPWSTR lpServiceStartNameW
= NULL
;
599 LPWSTR lpPasswordW
= NULL
;
600 DWORD dwDependenciesLength
= 0;
607 len
= MultiByteToWideChar(CP_ACP
, 0, lpServiceName
, -1, NULL
, 0);
608 lpServiceNameW
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
611 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
614 MultiByteToWideChar(CP_ACP
, 0, lpServiceName
, -1, lpServiceNameW
, len
);
619 len
= MultiByteToWideChar(CP_ACP
, 0, lpDisplayName
, -1, NULL
, 0);
620 lpDisplayNameW
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
623 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
626 MultiByteToWideChar(CP_ACP
, 0, lpDisplayName
, -1, lpDisplayNameW
, len
);
629 if (lpBinaryPathName
)
631 len
= MultiByteToWideChar(CP_ACP
, 0, lpBinaryPathName
, -1, NULL
, 0);
632 lpBinaryPathNameW
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
633 if (!lpBinaryPathNameW
)
635 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
638 MultiByteToWideChar(CP_ACP
, 0, lpBinaryPathName
, -1, lpBinaryPathNameW
, len
);
641 if (lpLoadOrderGroup
)
643 len
= MultiByteToWideChar(CP_ACP
, 0, lpLoadOrderGroup
, -1, NULL
, 0);
644 lpLoadOrderGroupW
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
645 if (!lpLoadOrderGroupW
)
647 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
650 MultiByteToWideChar(CP_ACP
, 0, lpLoadOrderGroup
, -1, lpLoadOrderGroupW
, len
);
655 lpStr
= (LPSTR
)lpDependencies
;
658 dwLength
= strlen(lpStr
) + 1;
659 dwDependenciesLength
+= dwLength
;
660 lpStr
= lpStr
+ dwLength
;
662 dwDependenciesLength
++;
664 lpDependenciesW
= HeapAlloc(GetProcessHeap(), 0, dwDependenciesLength
* sizeof(WCHAR
));
665 if (!lpDependenciesW
)
667 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
670 MultiByteToWideChar(CP_ACP
, 0, lpDependencies
, dwDependenciesLength
, lpDependenciesW
, dwDependenciesLength
);
673 if (lpServiceStartName
)
675 len
= MultiByteToWideChar(CP_ACP
, 0, lpServiceStartName
, -1, NULL
, 0);
676 lpServiceStartNameW
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
677 if (!lpServiceStartNameW
)
679 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
682 MultiByteToWideChar(CP_ACP
, 0, lpServiceStartName
, -1, lpServiceStartNameW
, len
);
687 len
= MultiByteToWideChar(CP_ACP
, 0, lpPassword
, -1, NULL
, 0);
688 lpPasswordW
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
691 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
694 MultiByteToWideChar(CP_ACP
, 0, lpPassword
, -1, lpPasswordW
, len
);
697 RetVal
= CreateServiceW(hSCManager
,
712 if (lpServiceNameW
!=NULL
)
713 HeapFree(GetProcessHeap(), 0, lpServiceNameW
);
715 if (lpDisplayNameW
!= NULL
)
716 HeapFree(GetProcessHeap(), 0, lpDisplayNameW
);
718 if (lpBinaryPathNameW
!= NULL
)
719 HeapFree(GetProcessHeap(), 0, lpBinaryPathNameW
);
721 if (lpLoadOrderGroupW
!= NULL
)
722 HeapFree(GetProcessHeap(), 0, lpLoadOrderGroupW
);
724 if (lpDependenciesW
!= NULL
)
725 HeapFree(GetProcessHeap(), 0, lpDependenciesW
);
727 if (lpServiceStartNameW
!= NULL
)
728 HeapFree(GetProcessHeap(), 0, lpServiceStartNameW
);
730 if (lpPasswordW
!= NULL
)
731 HeapFree(GetProcessHeap(), 0, lpPasswordW
);
737 /**********************************************************************
743 CreateServiceW(SC_HANDLE hSCManager
,
744 LPCWSTR lpServiceName
,
745 LPCWSTR lpDisplayName
,
746 DWORD dwDesiredAccess
,
749 DWORD dwErrorControl
,
750 LPCWSTR lpBinaryPathName
,
751 LPCWSTR lpLoadOrderGroup
,
753 LPCWSTR lpDependencies
,
754 LPCWSTR lpServiceStartName
,
757 SC_HANDLE hService
= NULL
;
758 DWORD dwDependenciesLength
= 0;
763 TRACE("CreateServiceW() called\n");
765 /* Calculate the Dependencies length*/
766 if (lpDependencies
!= NULL
)
768 lpStr
= (LPWSTR
)lpDependencies
;
771 dwLength
= wcslen(lpStr
) + 1;
772 dwDependenciesLength
+= dwLength
;
773 lpStr
= lpStr
+ dwLength
;
775 dwDependenciesLength
++;
777 dwDependenciesLength
*= sizeof(WCHAR
);
780 /* FIXME: Encrypt the password */
784 /* Call to services.exe using RPC */
785 dwError
= RCreateServiceW((SC_RPC_HANDLE
)hSCManager
,
786 (LPWSTR
)lpServiceName
,
787 (LPWSTR
)lpDisplayName
,
792 (LPWSTR
)lpBinaryPathName
,
793 (LPWSTR
)lpLoadOrderGroup
,
795 (LPBYTE
)lpDependencies
,
796 dwDependenciesLength
,
797 (LPWSTR
)lpServiceStartName
,
798 NULL
, /* FIXME: lpPassword */
799 0, /* FIXME: dwPasswordLength */
800 (SC_RPC_HANDLE
*)&hService
);
804 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
808 if (dwError
!= ERROR_SUCCESS
)
810 ERR("RCreateServiceW() failed (Error %lu)\n", dwError
);
811 SetLastError(dwError
);
819 /**********************************************************************
825 DeleteService(SC_HANDLE hService
)
829 TRACE("DeleteService(%x)\n", hService
);
833 /* Call to services.exe using RPC */
834 dwError
= RDeleteService((SC_RPC_HANDLE
)hService
);
838 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
842 if (dwError
!= ERROR_SUCCESS
)
844 ERR("RDeleteService() failed (Error %lu)\n", dwError
);
845 SetLastError(dwError
);
853 /**********************************************************************
854 * EnumDependentServicesA
859 EnumDependentServicesA(SC_HANDLE hService
,
860 DWORD dwServiceState
,
861 LPENUM_SERVICE_STATUSA lpServices
,
863 LPDWORD pcbBytesNeeded
,
864 LPDWORD lpServicesReturned
)
866 LPENUM_SERVICE_STATUSA lpStatusPtr
;
870 TRACE("EnumServicesStatusA() called\n");
874 dwError
= REnumDependentServicesA((SC_RPC_HANDLE
)hService
,
883 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
887 if (dwError
!= ERROR_SUCCESS
)
889 ERR("REnumDependentServicesA() failed (Error %lu)\n", dwError
);
890 SetLastError(dwError
);
894 lpStatusPtr
= (LPENUM_SERVICE_STATUSA
)lpServices
;
895 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
897 if (lpStatusPtr
->lpServiceName
)
898 lpStatusPtr
->lpServiceName
=
899 (LPSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
901 if (lpStatusPtr
->lpDisplayName
)
902 lpStatusPtr
->lpDisplayName
=
903 (LPSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
908 TRACE("EnumDependentServicesA() done\n");
914 /**********************************************************************
915 * EnumDependentServicesW
920 EnumDependentServicesW(SC_HANDLE hService
,
921 DWORD dwServiceState
,
922 LPENUM_SERVICE_STATUSW lpServices
,
924 LPDWORD pcbBytesNeeded
,
925 LPDWORD lpServicesReturned
)
927 LPENUM_SERVICE_STATUSW lpStatusPtr
;
931 TRACE("EnumServicesStatusW() called\n");
935 dwError
= REnumDependentServicesW((SC_RPC_HANDLE
)hService
,
944 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
948 if (dwError
!= ERROR_SUCCESS
)
950 ERR("REnumDependentServicesW() failed (Error %lu)\n", dwError
);
951 SetLastError(dwError
);
955 lpStatusPtr
= (LPENUM_SERVICE_STATUSW
)lpServices
;
956 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
958 if (lpStatusPtr
->lpServiceName
)
959 lpStatusPtr
->lpServiceName
=
960 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
962 if (lpStatusPtr
->lpDisplayName
)
963 lpStatusPtr
->lpDisplayName
=
964 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
969 TRACE("EnumDependentServicesW() done\n");
975 /**********************************************************************
983 SC_HANDLE hSCManager
,
985 DWORD dwServiceState
,
986 LPENUM_SERVICE_STATUSW lpServices
,
988 LPDWORD pcbBytesNeeded
,
989 LPDWORD lpServicesReturned
,
990 LPDWORD lpResumeHandle
,
993 FIXME("EnumServiceGroupW is unimplemented\n");
994 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
999 /**********************************************************************
1000 * EnumServicesStatusA
1005 EnumServicesStatusA(SC_HANDLE hSCManager
,
1006 DWORD dwServiceType
,
1007 DWORD dwServiceState
,
1008 LPENUM_SERVICE_STATUSA lpServices
,
1010 LPDWORD pcbBytesNeeded
,
1011 LPDWORD lpServicesReturned
,
1012 LPDWORD lpResumeHandle
)
1014 LPENUM_SERVICE_STATUSA lpStatusPtr
;
1018 TRACE("EnumServicesStatusA() called\n");
1022 dwError
= REnumServicesStatusA((SC_RPC_HANDLE
)hSCManager
,
1033 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1037 if (dwError
!= ERROR_SUCCESS
)
1039 ERR("REnumServicesStatusA() failed (Error %lu)\n", dwError
);
1040 SetLastError(dwError
);
1044 lpStatusPtr
= (LPENUM_SERVICE_STATUSA
)lpServices
;
1045 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
1047 if (lpStatusPtr
->lpServiceName
)
1048 lpStatusPtr
->lpServiceName
=
1049 (LPSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
1051 if (lpStatusPtr
->lpDisplayName
)
1052 lpStatusPtr
->lpDisplayName
=
1053 (LPSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
1058 TRACE("EnumServicesStatusA() done\n");
1064 /**********************************************************************
1065 * EnumServicesStatusW
1070 EnumServicesStatusW(SC_HANDLE hSCManager
,
1071 DWORD dwServiceType
,
1072 DWORD dwServiceState
,
1073 LPENUM_SERVICE_STATUSW lpServices
,
1075 LPDWORD pcbBytesNeeded
,
1076 LPDWORD lpServicesReturned
,
1077 LPDWORD lpResumeHandle
)
1079 LPENUM_SERVICE_STATUSW lpStatusPtr
;
1083 TRACE("EnumServicesStatusW() called\n");
1087 dwError
= REnumServicesStatusW((SC_RPC_HANDLE
)hSCManager
,
1098 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1102 if (dwError
!= ERROR_SUCCESS
)
1104 ERR("REnumServicesStatusW() failed (Error %lu)\n", dwError
);
1105 SetLastError(dwError
);
1109 lpStatusPtr
= (LPENUM_SERVICE_STATUSW
)lpServices
;
1110 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
1112 if (lpStatusPtr
->lpServiceName
)
1113 lpStatusPtr
->lpServiceName
=
1114 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
1116 if (lpStatusPtr
->lpDisplayName
)
1117 lpStatusPtr
->lpDisplayName
=
1118 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
1123 TRACE("EnumServicesStatusW() done\n");
1129 /**********************************************************************
1130 * EnumServicesStatusExA
1135 EnumServicesStatusExA(SC_HANDLE hSCManager
,
1136 SC_ENUM_TYPE InfoLevel
,
1137 DWORD dwServiceType
,
1138 DWORD dwServiceState
,
1141 LPDWORD pcbBytesNeeded
,
1142 LPDWORD lpServicesReturned
,
1143 LPDWORD lpResumeHandle
,
1144 LPCSTR pszGroupName
)
1146 LPENUM_SERVICE_STATUS_PROCESSA lpStatusPtr
;
1150 TRACE("EnumServicesStatusExA() called\n");
1154 dwError
= REnumServicesStatusExA((SC_RPC_HANDLE
)hSCManager
,
1163 (LPSTR
)pszGroupName
);
1167 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1171 if (dwError
== ERROR_MORE_DATA
)
1173 WARN("Required buffer size %ul\n", *pcbBytesNeeded
);
1174 SetLastError(dwError
);
1177 else if (dwError
== ERROR_SUCCESS
)
1179 lpStatusPtr
= (LPENUM_SERVICE_STATUS_PROCESSA
)lpServices
;
1180 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
1182 if (lpStatusPtr
->lpServiceName
)
1183 lpStatusPtr
->lpServiceName
=
1184 (LPSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
1186 if (lpStatusPtr
->lpDisplayName
)
1187 lpStatusPtr
->lpDisplayName
=
1188 (LPSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
1195 ERR("REnumServicesStatusExA() failed (Error %lu)\n", dwError
);
1196 SetLastError(dwError
);
1200 TRACE("EnumServicesStatusExA() done\n");
1206 /**********************************************************************
1207 * EnumServicesStatusExW
1212 EnumServicesStatusExW(SC_HANDLE hSCManager
,
1213 SC_ENUM_TYPE InfoLevel
,
1214 DWORD dwServiceType
,
1215 DWORD dwServiceState
,
1218 LPDWORD pcbBytesNeeded
,
1219 LPDWORD lpServicesReturned
,
1220 LPDWORD lpResumeHandle
,
1221 LPCWSTR pszGroupName
)
1223 LPENUM_SERVICE_STATUS_PROCESSW lpStatusPtr
;
1227 TRACE("EnumServicesStatusExW() called\n");
1231 dwError
= REnumServicesStatusExW((SC_RPC_HANDLE
)hSCManager
,
1240 (LPWSTR
)pszGroupName
);
1244 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1248 if (dwError
== ERROR_MORE_DATA
)
1250 WARN("Required buffer size %ul\n", *pcbBytesNeeded
);
1251 SetLastError(dwError
);
1254 else if (dwError
== ERROR_SUCCESS
)
1256 lpStatusPtr
= (LPENUM_SERVICE_STATUS_PROCESSW
)lpServices
;
1257 for (dwCount
= 0; dwCount
< *lpServicesReturned
; dwCount
++)
1259 if (lpStatusPtr
->lpServiceName
)
1260 lpStatusPtr
->lpServiceName
=
1261 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpServiceName
);
1263 if (lpStatusPtr
->lpDisplayName
)
1264 lpStatusPtr
->lpDisplayName
=
1265 (LPWSTR
)((ULONG_PTR
)lpServices
+ (ULONG_PTR
)lpStatusPtr
->lpDisplayName
);
1272 ERR("REnumServicesStatusExW() failed (Error %lu)\n", dwError
);
1273 SetLastError(dwError
);
1277 TRACE("EnumServicesStatusExW() done\n");
1283 /**********************************************************************
1284 * GetServiceDisplayNameA
1289 GetServiceDisplayNameA(SC_HANDLE hSCManager
,
1290 LPCSTR lpServiceName
,
1291 LPSTR lpDisplayName
,
1292 LPDWORD lpcchBuffer
)
1296 TRACE("GetServiceDisplayNameA() called\n");
1303 dwError
= RGetServiceDisplayNameA((SC_RPC_HANDLE
)hSCManager
,
1304 (LPSTR
)lpServiceName
,
1310 /* HACK: because of a problem with rpcrt4, rpcserver is hacked to return 6 for ERROR_SERVICE_DOES_NOT_EXIST */
1311 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1317 if (dwError
!= ERROR_SUCCESS
)
1319 ERR("RGetServiceDisplayNameA() failed (Error %lu)\n", dwError
);
1320 SetLastError(dwError
);
1328 /**********************************************************************
1329 * GetServiceDisplayNameW
1334 GetServiceDisplayNameW(SC_HANDLE hSCManager
,
1335 LPCWSTR lpServiceName
,
1336 LPWSTR lpDisplayName
,
1337 LPDWORD lpcchBuffer
)
1341 TRACE("GetServiceDisplayNameW() called\n");
1348 dwError
= RGetServiceDisplayNameW((SC_RPC_HANDLE
)hSCManager
,
1349 (LPWSTR
)lpServiceName
,
1355 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1359 if (dwError
!= ERROR_SUCCESS
)
1361 ERR("RGetServiceDisplayNameW() failed (Error %lu)\n", dwError
);
1362 SetLastError(dwError
);
1370 /**********************************************************************
1371 * GetServiceKeyNameA
1376 GetServiceKeyNameA(SC_HANDLE hSCManager
,
1377 LPCSTR lpDisplayName
,
1378 LPSTR lpServiceName
,
1379 LPDWORD lpcchBuffer
)
1383 TRACE("GetServiceKeyNameA() called\n");
1390 dwError
= RGetServiceKeyNameA((SC_RPC_HANDLE
)hSCManager
,
1391 (LPSTR
)lpDisplayName
,
1397 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1401 if (dwError
!= ERROR_SUCCESS
)
1403 ERR("RGetServiceKeyNameA() failed (Error %lu)\n", dwError
);
1404 SetLastError(dwError
);
1412 /**********************************************************************
1413 * GetServiceKeyNameW
1418 GetServiceKeyNameW(SC_HANDLE hSCManager
,
1419 LPCWSTR lpDisplayName
,
1420 LPWSTR lpServiceName
,
1421 LPDWORD lpcchBuffer
)
1425 TRACE("GetServiceKeyNameW() called\n");
1432 dwError
= RGetServiceKeyNameW((SC_RPC_HANDLE
)hSCManager
,
1433 (LPWSTR
)lpDisplayName
,
1439 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1443 if (dwError
!= ERROR_SUCCESS
)
1445 ERR("RGetServiceKeyNameW() failed (Error %lu)\n", dwError
);
1446 SetLastError(dwError
);
1454 /**********************************************************************
1455 * LockServiceDatabase
1460 LockServiceDatabase(SC_HANDLE hSCManager
)
1465 TRACE("LockServiceDatabase(%x)\n", hSCManager
);
1469 /* Call to services.exe using RPC */
1470 dwError
= RLockServiceDatabase((SC_RPC_HANDLE
)hSCManager
,
1471 (SC_RPC_LOCK
*)&hLock
);
1475 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1479 if (dwError
!= ERROR_SUCCESS
)
1481 ERR("RLockServiceDatabase() failed (Error %lu)\n", dwError
);
1482 SetLastError(dwError
);
1486 TRACE("hLock = %p\n", hLock
);
1493 WaitForSCManager(VOID
)
1497 TRACE("WaitForSCManager() called\n");
1499 /* Try to open the existing event */
1500 hEvent
= OpenEventW(SYNCHRONIZE
,
1502 L
"SvcctrlStartEvent_A3752DX");
1505 if (GetLastError() != ERROR_FILE_NOT_FOUND
)
1508 /* Try to create a new event */
1509 hEvent
= CreateEventW(NULL
,
1512 L
"SvcctrlStartEvent_A3752DX");
1515 /* Try to open the existing event again */
1516 hEvent
= OpenEventW(SYNCHRONIZE
,
1518 L
"SvcctrlStartEvent_A3752DX");
1524 /* Wait for 3 minutes */
1525 WaitForSingleObject(hEvent
, 180000);
1526 CloseHandle(hEvent
);
1528 TRACE("ScmWaitForSCManager() done\n");
1532 /**********************************************************************
1538 OpenSCManagerA(LPCSTR lpMachineName
,
1539 LPCSTR lpDatabaseName
,
1540 DWORD dwDesiredAccess
)
1542 SC_HANDLE hScm
= NULL
;
1545 TRACE("OpenSCManagerA(%s, %s, %lx)\n",
1546 lpMachineName
, lpDatabaseName
, dwDesiredAccess
);
1552 /* Call to services.exe using RPC */
1553 dwError
= ROpenSCManagerA((LPSTR
)lpMachineName
,
1554 (LPSTR
)lpDatabaseName
,
1556 (SC_RPC_HANDLE
*)&hScm
);
1560 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1564 if (dwError
!= ERROR_SUCCESS
)
1566 ERR("ROpenSCManagerA() failed (Error %lu)\n", dwError
);
1567 SetLastError(dwError
);
1571 TRACE("hScm = %p\n", hScm
);
1577 /**********************************************************************
1583 OpenSCManagerW(LPCWSTR lpMachineName
,
1584 LPCWSTR lpDatabaseName
,
1585 DWORD dwDesiredAccess
)
1587 SC_HANDLE hScm
= NULL
;
1590 TRACE("OpenSCManagerW(%S, %S, %lx)\n",
1591 lpMachineName
, lpDatabaseName
, dwDesiredAccess
);
1597 /* Call to services.exe using RPC */
1598 dwError
= ROpenSCManagerW((LPWSTR
)lpMachineName
,
1599 (LPWSTR
)lpDatabaseName
,
1601 (SC_RPC_HANDLE
*)&hScm
);
1605 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1609 if (dwError
!= ERROR_SUCCESS
)
1611 ERR("ROpenSCManagerW() failed (Error %lu)\n", dwError
);
1612 SetLastError(dwError
);
1616 TRACE("hScm = %p\n", hScm
);
1622 /**********************************************************************
1628 OpenServiceA(SC_HANDLE hSCManager
,
1629 LPCSTR lpServiceName
,
1630 DWORD dwDesiredAccess
)
1632 SC_HANDLE hService
= NULL
;
1635 TRACE("OpenServiceA(%p, %s, %lx)\n",
1636 hSCManager
, lpServiceName
, dwDesiredAccess
);
1640 /* Call to services.exe using RPC */
1641 dwError
= ROpenServiceA((SC_RPC_HANDLE
)hSCManager
,
1642 (LPSTR
)lpServiceName
,
1644 (SC_RPC_HANDLE
*)&hService
);
1648 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1652 if (dwError
!= ERROR_SUCCESS
)
1654 ERR("ROpenServiceA() failed (Error %lu)\n", dwError
);
1655 SetLastError(dwError
);
1659 TRACE("hService = %p\n", hService
);
1665 /**********************************************************************
1671 OpenServiceW(SC_HANDLE hSCManager
,
1672 LPCWSTR lpServiceName
,
1673 DWORD dwDesiredAccess
)
1675 SC_HANDLE hService
= NULL
;
1678 TRACE("OpenServiceW(%p, %S, %lx)\n",
1679 hSCManager
, lpServiceName
, dwDesiredAccess
);
1683 /* Call to services.exe using RPC */
1684 dwError
= ROpenServiceW((SC_RPC_HANDLE
)hSCManager
,
1685 (LPWSTR
)lpServiceName
,
1687 (SC_RPC_HANDLE
*)&hService
);
1691 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1695 if (dwError
!= ERROR_SUCCESS
)
1697 if (dwError
== ERROR_SERVICE_DOES_NOT_EXIST
)
1698 WARN("ROpenServiceW() failed (Error %lu)\n", dwError
);
1700 ERR("ROpenServiceW() failed (Error %lu)\n", dwError
);
1701 SetLastError(dwError
);
1705 TRACE("hService = %p\n", hService
);
1711 /**********************************************************************
1712 * QueryServiceConfigA
1717 QueryServiceConfigA(SC_HANDLE hService
,
1718 LPQUERY_SERVICE_CONFIGA lpServiceConfig
,
1720 LPDWORD pcbBytesNeeded
)
1724 TRACE("QueryServiceConfigA(%p, %p, %lu, %p)\n",
1725 hService
, lpServiceConfig
, cbBufSize
, pcbBytesNeeded
);
1729 /* Call to services.exe using RPC */
1730 dwError
= RQueryServiceConfigA((SC_RPC_HANDLE
)hService
,
1731 (LPBYTE
)lpServiceConfig
,
1737 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1741 if (dwError
!= ERROR_SUCCESS
)
1743 ERR("RQueryServiceConfigA() failed (Error %lu)\n", dwError
);
1744 SetLastError(dwError
);
1748 /* Adjust the pointers */
1749 if (lpServiceConfig
->lpBinaryPathName
)
1750 lpServiceConfig
->lpBinaryPathName
=
1751 (LPSTR
)((ULONG_PTR
)lpServiceConfig
+
1752 (ULONG_PTR
)lpServiceConfig
->lpBinaryPathName
);
1754 if (lpServiceConfig
->lpLoadOrderGroup
)
1755 lpServiceConfig
->lpLoadOrderGroup
=
1756 (LPSTR
)((ULONG_PTR
)lpServiceConfig
+
1757 (ULONG_PTR
)lpServiceConfig
->lpLoadOrderGroup
);
1759 if (lpServiceConfig
->lpDependencies
)
1760 lpServiceConfig
->lpDependencies
=
1761 (LPSTR
)((ULONG_PTR
)lpServiceConfig
+
1762 (ULONG_PTR
)lpServiceConfig
->lpDependencies
);
1764 if (lpServiceConfig
->lpServiceStartName
)
1765 lpServiceConfig
->lpServiceStartName
=
1766 (LPSTR
)((ULONG_PTR
)lpServiceConfig
+
1767 (ULONG_PTR
)lpServiceConfig
->lpServiceStartName
);
1769 if (lpServiceConfig
->lpDisplayName
)
1770 lpServiceConfig
->lpDisplayName
=
1771 (LPSTR
)((ULONG_PTR
)lpServiceConfig
+
1772 (ULONG_PTR
)lpServiceConfig
->lpDisplayName
);
1774 TRACE("QueryServiceConfigA() done\n");
1780 /**********************************************************************
1781 * QueryServiceConfigW
1786 QueryServiceConfigW(SC_HANDLE hService
,
1787 LPQUERY_SERVICE_CONFIGW lpServiceConfig
,
1789 LPDWORD pcbBytesNeeded
)
1793 TRACE("QueryServiceConfigW(%p, %p, %lu, %p)\n",
1794 hService
, lpServiceConfig
, cbBufSize
, pcbBytesNeeded
);
1798 /* Call to services.exe using RPC */
1799 dwError
= RQueryServiceConfigW((SC_RPC_HANDLE
)hService
,
1800 (LPBYTE
)lpServiceConfig
,
1806 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1810 if (dwError
!= ERROR_SUCCESS
)
1812 if (dwError
== ERROR_INSUFFICIENT_BUFFER
)
1813 WARN("RQueryServiceConfigW() failed (Error %lu)\n", dwError
);
1815 ERR("RQueryServiceConfigW() failed (Error %lu)\n", dwError
);
1816 SetLastError(dwError
);
1820 /* Adjust the pointers */
1821 if (lpServiceConfig
->lpBinaryPathName
)
1822 lpServiceConfig
->lpBinaryPathName
=
1823 (LPWSTR
)((ULONG_PTR
)lpServiceConfig
+
1824 (ULONG_PTR
)lpServiceConfig
->lpBinaryPathName
);
1826 if (lpServiceConfig
->lpLoadOrderGroup
)
1827 lpServiceConfig
->lpLoadOrderGroup
=
1828 (LPWSTR
)((ULONG_PTR
)lpServiceConfig
+
1829 (ULONG_PTR
)lpServiceConfig
->lpLoadOrderGroup
);
1831 if (lpServiceConfig
->lpDependencies
)
1832 lpServiceConfig
->lpDependencies
=
1833 (LPWSTR
)((ULONG_PTR
)lpServiceConfig
+
1834 (ULONG_PTR
)lpServiceConfig
->lpDependencies
);
1836 if (lpServiceConfig
->lpServiceStartName
)
1837 lpServiceConfig
->lpServiceStartName
=
1838 (LPWSTR
)((ULONG_PTR
)lpServiceConfig
+
1839 (ULONG_PTR
)lpServiceConfig
->lpServiceStartName
);
1841 if (lpServiceConfig
->lpDisplayName
)
1842 lpServiceConfig
->lpDisplayName
=
1843 (LPWSTR
)((ULONG_PTR
)lpServiceConfig
+
1844 (ULONG_PTR
)lpServiceConfig
->lpDisplayName
);
1846 TRACE("QueryServiceConfigW() done\n");
1852 /**********************************************************************
1853 * QueryServiceConfig2A
1858 QueryServiceConfig2A(SC_HANDLE hService
,
1862 LPDWORD pcbBytesNeeded
)
1866 TRACE("QueryServiceConfig2A(%p, %lu, %p, %lu, %p)\n",
1867 hService
, dwInfoLevel
, lpBuffer
, cbBufSize
, pcbBytesNeeded
);
1869 if (dwInfoLevel
!= SERVICE_CONFIG_DESCRIPTION
&&
1870 dwInfoLevel
!= SERVICE_CONFIG_FAILURE_ACTIONS
)
1872 SetLastError(ERROR_INVALID_LEVEL
);
1876 if ((lpBuffer
== NULL
&& cbBufSize
!= 0) ||
1877 pcbBytesNeeded
== NULL
)
1879 SetLastError(ERROR_INVALID_ADDRESS
);
1885 /* Call to services.exe using RPC */
1886 dwError
= RQueryServiceConfig2A((SC_RPC_HANDLE
)hService
,
1894 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1898 if (dwError
!= ERROR_SUCCESS
)
1900 ERR("RQueryServiceConfig2A() failed (Error %lu)\n", dwError
);
1901 SetLastError(dwError
);
1905 switch (dwInfoLevel
)
1907 case SERVICE_CONFIG_DESCRIPTION
:
1909 LPSERVICE_DESCRIPTIONA lpPtr
= (LPSERVICE_DESCRIPTIONA
)lpBuffer
;
1911 if (lpPtr
->lpDescription
!= NULL
)
1912 lpPtr
->lpDescription
=
1913 (LPSTR
)((UINT_PTR
)lpPtr
+ (UINT_PTR
)lpPtr
->lpDescription
);
1917 case SERVICE_CONFIG_FAILURE_ACTIONS
:
1919 LPSERVICE_FAILURE_ACTIONSA lpPtr
= (LPSERVICE_FAILURE_ACTIONSA
)lpBuffer
;
1921 if (lpPtr
->lpRebootMsg
!= NULL
)
1922 lpPtr
->lpRebootMsg
=
1923 (LPSTR
)((UINT_PTR
)lpPtr
+ (UINT_PTR
)lpPtr
->lpRebootMsg
);
1925 if (lpPtr
->lpCommand
!= NULL
)
1927 (LPSTR
)((UINT_PTR
)lpPtr
+ (UINT_PTR
)lpPtr
->lpCommand
);
1929 if (lpPtr
->lpsaActions
!= NULL
)
1930 lpPtr
->lpsaActions
=
1931 (SC_ACTION
*)((UINT_PTR
)lpPtr
+ (UINT_PTR
)lpPtr
->lpsaActions
);
1936 ERR("Unknown info level 0x%lx\n", dwInfoLevel
);
1937 SetLastError(ERROR_INVALID_PARAMETER
);
1941 TRACE("QueryServiceConfig2A() done\n");
1947 /**********************************************************************
1948 * QueryServiceConfig2W
1953 QueryServiceConfig2W(SC_HANDLE hService
,
1957 LPDWORD pcbBytesNeeded
)
1961 TRACE("QueryServiceConfig2W(%p, %lu, %p, %lu, %p)\n",
1962 hService
, dwInfoLevel
, lpBuffer
, cbBufSize
, pcbBytesNeeded
);
1964 if (dwInfoLevel
!= SERVICE_CONFIG_DESCRIPTION
&&
1965 dwInfoLevel
!= SERVICE_CONFIG_FAILURE_ACTIONS
)
1967 SetLastError(ERROR_INVALID_LEVEL
);
1971 if ((lpBuffer
== NULL
&& cbBufSize
!= 0) ||
1972 pcbBytesNeeded
== NULL
)
1974 SetLastError(ERROR_INVALID_ADDRESS
);
1980 /* Call to services.exe using RPC */
1981 dwError
= RQueryServiceConfig2W((SC_RPC_HANDLE
)hService
,
1989 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
1993 if (dwError
!= ERROR_SUCCESS
)
1995 ERR("RQueryServiceConfig2W() failed (Error %lu)\n", dwError
);
1996 SetLastError(dwError
);
2000 switch (dwInfoLevel
)
2002 case SERVICE_CONFIG_DESCRIPTION
:
2004 LPSERVICE_DESCRIPTIONW lpPtr
= (LPSERVICE_DESCRIPTIONW
)lpBuffer
;
2006 if (lpPtr
->lpDescription
!= NULL
)
2007 lpPtr
->lpDescription
=
2008 (LPWSTR
)((UINT_PTR
)lpPtr
+ (UINT_PTR
)lpPtr
->lpDescription
);
2012 case SERVICE_CONFIG_FAILURE_ACTIONS
:
2014 LPSERVICE_FAILURE_ACTIONSW lpPtr
= (LPSERVICE_FAILURE_ACTIONSW
)lpBuffer
;
2016 if (lpPtr
->lpRebootMsg
!= NULL
)
2017 lpPtr
->lpRebootMsg
=
2018 (LPWSTR
)((UINT_PTR
)lpPtr
+ (UINT_PTR
)lpPtr
->lpRebootMsg
);
2020 if (lpPtr
->lpCommand
!= NULL
)
2022 (LPWSTR
)((UINT_PTR
)lpPtr
+ (UINT_PTR
)lpPtr
->lpCommand
);
2024 if (lpPtr
->lpsaActions
!= NULL
)
2025 lpPtr
->lpsaActions
=
2026 (SC_ACTION
*)((UINT_PTR
)lpPtr
+ (UINT_PTR
)lpPtr
->lpsaActions
);
2031 WARN("Unknown info level 0x%lx\n", dwInfoLevel
);
2032 SetLastError(ERROR_INVALID_PARAMETER
);
2036 TRACE("QueryServiceConfig2W() done\n");
2042 /**********************************************************************
2043 * QueryServiceLockStatusA
2048 QueryServiceLockStatusA(SC_HANDLE hSCManager
,
2049 LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
,
2051 LPDWORD pcbBytesNeeded
)
2055 TRACE("QueryServiceLockStatusA() called\n");
2059 /* Call to services.exe using RPC */
2060 dwError
= RQueryServiceLockStatusA((SC_RPC_HANDLE
)hSCManager
,
2067 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2071 if (dwError
!= ERROR_SUCCESS
)
2073 ERR("RQueryServiceLockStatusA() failed (Error %lu)\n", dwError
);
2074 SetLastError(dwError
);
2078 if (lpLockStatus
->lpLockOwner
!= NULL
)
2080 lpLockStatus
->lpLockOwner
=
2081 (LPSTR
)((UINT_PTR
)lpLockStatus
+ (UINT_PTR
)lpLockStatus
->lpLockOwner
);
2084 TRACE("QueryServiceLockStatusA() done\n");
2090 /**********************************************************************
2091 * QueryServiceLockStatusW
2096 QueryServiceLockStatusW(SC_HANDLE hSCManager
,
2097 LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
,
2099 LPDWORD pcbBytesNeeded
)
2103 TRACE("QueryServiceLockStatusW() called\n");
2107 /* Call to services.exe using RPC */
2108 dwError
= RQueryServiceLockStatusW((SC_RPC_HANDLE
)hSCManager
,
2115 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2119 if (dwError
!= ERROR_SUCCESS
)
2121 ERR("RQueryServiceLockStatusW() failed (Error %lu)\n", dwError
);
2122 SetLastError(dwError
);
2126 if (lpLockStatus
->lpLockOwner
!= NULL
)
2128 lpLockStatus
->lpLockOwner
=
2129 (LPWSTR
)((UINT_PTR
)lpLockStatus
+ (UINT_PTR
)lpLockStatus
->lpLockOwner
);
2132 TRACE("QueryServiceLockStatusW() done\n");
2138 /**********************************************************************
2139 * QueryServiceObjectSecurity
2144 QueryServiceObjectSecurity(SC_HANDLE hService
,
2145 SECURITY_INFORMATION dwSecurityInformation
,
2146 PSECURITY_DESCRIPTOR lpSecurityDescriptor
,
2148 LPDWORD pcbBytesNeeded
)
2152 TRACE("QueryServiceObjectSecurity(%p, %lu, %p)\n",
2153 hService
, dwSecurityInformation
, lpSecurityDescriptor
);
2157 /* Call to services.exe using RPC */
2158 dwError
= RQueryServiceObjectSecurity((SC_RPC_HANDLE
)hService
,
2159 dwSecurityInformation
,
2160 (LPBYTE
)lpSecurityDescriptor
,
2166 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2170 if (dwError
!= ERROR_SUCCESS
)
2172 ERR("QueryServiceObjectSecurity() failed (Error %lu)\n", dwError
);
2173 SetLastError(dwError
);
2180 /**********************************************************************
2181 * SetServiceObjectSecurity
2186 SetServiceObjectSecurity(SC_HANDLE hService
,
2187 SECURITY_INFORMATION dwSecurityInformation
,
2188 PSECURITY_DESCRIPTOR lpSecurityDescriptor
)
2190 PSECURITY_DESCRIPTOR SelfRelativeSD
= NULL
;
2196 Status
= RtlMakeSelfRelativeSD(lpSecurityDescriptor
,
2199 if (Status
!= STATUS_BUFFER_TOO_SMALL
)
2201 SetLastError(ERROR_INVALID_PARAMETER
);
2205 SelfRelativeSD
= HeapAlloc(GetProcessHeap(), 0, Length
);
2206 if (SelfRelativeSD
== NULL
)
2208 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
2212 Status
= RtlMakeSelfRelativeSD(lpSecurityDescriptor
,
2215 if (!NT_SUCCESS(Status
))
2217 HeapFree(GetProcessHeap(), 0, SelfRelativeSD
);
2218 SetLastError(RtlNtStatusToDosError(Status
));
2224 /* Call to services.exe using RPC */
2225 dwError
= RSetServiceObjectSecurity((SC_RPC_HANDLE
)hService
,
2226 dwSecurityInformation
,
2227 (LPBYTE
)SelfRelativeSD
,
2232 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2236 HeapFree(GetProcessHeap(), 0, SelfRelativeSD
);
2238 if (dwError
!= ERROR_SUCCESS
)
2240 ERR("RServiceObjectSecurity() failed (Error %lu)\n", dwError
);
2241 SetLastError(dwError
);
2249 /**********************************************************************
2250 * QueryServiceStatus
2255 QueryServiceStatus(SC_HANDLE hService
,
2256 LPSERVICE_STATUS lpServiceStatus
)
2260 TRACE("QueryServiceStatus(%p, %p)\n",
2261 hService
, lpServiceStatus
);
2265 /* Call to services.exe using RPC */
2266 dwError
= RQueryServiceStatus((SC_RPC_HANDLE
)hService
,
2271 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2275 if (dwError
!= ERROR_SUCCESS
)
2277 ERR("RQueryServiceStatus() failed (Error %lu)\n", dwError
);
2278 SetLastError(dwError
);
2286 /**********************************************************************
2287 * QueryServiceStatusEx
2292 QueryServiceStatusEx(SC_HANDLE hService
,
2293 SC_STATUS_TYPE InfoLevel
,
2296 LPDWORD pcbBytesNeeded
)
2300 TRACE("QueryServiceStatusEx() called\n");
2304 /* Call to services.exe using RPC */
2305 dwError
= RQueryServiceStatusEx((SC_RPC_HANDLE
)hService
,
2313 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2317 if (dwError
!= ERROR_SUCCESS
)
2319 ERR("RQueryServiceStatusEx() failed (Error %lu)\n", dwError
);
2320 SetLastError(dwError
);
2328 /**********************************************************************
2334 StartServiceA(SC_HANDLE hService
,
2335 DWORD dwNumServiceArgs
,
2336 LPCSTR
*lpServiceArgVectors
)
2342 dwError
= RStartServiceA((SC_RPC_HANDLE
)hService
,
2344 (LPSTRING_PTRSA
)lpServiceArgVectors
);
2348 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2352 if (dwError
!= ERROR_SUCCESS
)
2354 ERR("RStartServiceA() failed (Error %lu)\n", dwError
);
2355 SetLastError(dwError
);
2363 /**********************************************************************
2369 StartServiceW(SC_HANDLE hService
,
2370 DWORD dwNumServiceArgs
,
2371 LPCWSTR
*lpServiceArgVectors
)
2377 dwError
= RStartServiceW((SC_RPC_HANDLE
)hService
,
2379 (LPSTRING_PTRSW
)lpServiceArgVectors
);
2383 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2387 if (dwError
!= ERROR_SUCCESS
)
2389 ERR("RStartServiceW() failed (Error %lu)\n", dwError
);
2390 SetLastError(dwError
);
2398 /**********************************************************************
2399 * UnlockServiceDatabase
2404 UnlockServiceDatabase(SC_LOCK ScLock
)
2408 TRACE("UnlockServiceDatabase(%x)\n", ScLock
);
2412 /* Call to services.exe using RPC */
2413 dwError
= RUnlockServiceDatabase((LPSC_RPC_LOCK
)&ScLock
);
2417 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2421 if (dwError
!= ERROR_SUCCESS
)
2423 ERR("RUnlockServiceDatabase() failed (Error %lu)\n", dwError
);
2424 SetLastError(dwError
);
2432 /**********************************************************************
2433 * NotifyBootConfigStatus
2438 NotifyBootConfigStatus(BOOL BootAcceptable
)
2442 TRACE("NotifyBootConfigStatus()\n");
2446 /* Call to services.exe using RPC */
2447 dwError
= RNotifyBootConfigStatus(NULL
,
2452 dwError
= ScmRpcStatusToWinError(RpcExceptionCode());
2456 if (dwError
!= ERROR_SUCCESS
)
2458 ERR("NotifyBootConfigStatus() failed (Error %lu)\n", dwError
);
2459 SetLastError(dwError
);