1 /* $Id: scm.c,v 1.13 2002/11/14 18:21:04 chorns Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/advapi32/service/scm.c
6 * PURPOSE: Service control manager functions
7 * PROGRAMMER: Emanuele Aliberti
13 /* INCLUDES ******************************************************************/
15 #define NTOS_MODE_USER
20 /* FUNCTIONS *****************************************************************/
22 /**********************************************************************
23 * ChangeServiceConfigA
32 LPCSTR lpBinaryPathName
,
33 LPCSTR lpLoadOrderGroup
,
35 LPCSTR lpDependencies
,
36 LPCSTR lpServiceStartName
,
41 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
46 /**********************************************************************
47 * ChangeServiceConfigW
56 LPCWSTR lpBinaryPathName
,
57 LPCWSTR lpLoadOrderGroup
,
59 LPCWSTR lpDependencies
,
60 LPCWSTR lpServiceStartName
,
65 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
70 /**********************************************************************
75 CloseServiceHandle( SC_HANDLE hSCObject
)
77 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
82 /**********************************************************************
90 LPSERVICE_STATUS lpServiceStatus
93 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
98 /**********************************************************************
104 SC_HANDLE hSCManager
,
105 LPCSTR lpServiceName
,
106 LPCSTR lpDisplayName
,
107 DWORD dwDesiredAccess
,
110 DWORD dwErrorControl
,
111 LPCSTR lpBinaryPathName
,
112 LPCSTR lpLoadOrderGroup
,
114 LPCSTR lpDependencies
,
115 LPCSTR lpServiceStartName
,
119 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
124 /**********************************************************************
130 SC_HANDLE hSCManager
,
131 LPCWSTR lpServiceName
,
132 LPCWSTR lpDisplayName
,
133 DWORD dwDesiredAccess
,
136 DWORD dwErrorControl
,
137 LPCWSTR lpBinaryPathName
,
138 LPCWSTR lpLoadOrderGroup
,
140 LPCWSTR lpDependencies
,
141 LPCWSTR lpServiceStartName
,
145 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
150 /**********************************************************************
155 DeleteService( SC_HANDLE hService
)
157 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
162 /**********************************************************************
163 * EnumDependentServicesA
167 EnumDependentServicesA(
169 DWORD dwServiceState
,
170 LPENUM_SERVICE_STATUSA lpServices
,
172 LPDWORD pcbBytesNeeded
,
173 LPDWORD lpServicesReturned
176 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
181 /**********************************************************************
182 * EnumDependentServicesW
186 EnumDependentServicesW(
188 DWORD dwServiceState
,
189 LPENUM_SERVICE_STATUSW lpServices
,
191 LPDWORD pcbBytesNeeded
,
192 LPDWORD lpServicesReturned
195 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
200 /**********************************************************************
219 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
224 /**********************************************************************
225 * EnumServicesStatusA
229 EnumServicesStatusA (
230 SC_HANDLE hSCManager
,
232 DWORD dwServiceState
,
233 LPENUM_SERVICE_STATUSA lpServices
,
235 LPDWORD pcbBytesNeeded
,
236 LPDWORD lpServicesReturned
,
237 LPDWORD lpResumeHandle
240 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
245 /**********************************************************************
246 * EnumServicesStatusExA
250 EnumServicesStatusExA(SC_HANDLE hSCManager
,
251 SC_ENUM_TYPE InfoLevel
,
253 DWORD dwServiceState
,
256 LPDWORD pcbBytesNeeded
,
257 LPDWORD lpServicesReturned
,
258 LPDWORD lpResumeHandle
,
262 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
267 /**********************************************************************
268 * EnumServicesStatusExW
272 EnumServicesStatusExW(SC_HANDLE hSCManager
,
273 SC_ENUM_TYPE InfoLevel
,
275 DWORD dwServiceState
,
278 LPDWORD pcbBytesNeeded
,
279 LPDWORD lpServicesReturned
,
280 LPDWORD lpResumeHandle
,
284 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
289 /**********************************************************************
290 * EnumServicesStatusW
295 SC_HANDLE hSCManager
,
297 DWORD dwServiceState
,
298 LPENUM_SERVICE_STATUSW lpServices
,
300 LPDWORD pcbBytesNeeded
,
301 LPDWORD lpServicesReturned
,
302 LPDWORD lpResumeHandle
305 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
310 /**********************************************************************
311 * GetServiceDisplayNameA
315 GetServiceDisplayNameA(
316 SC_HANDLE hSCManager
,
317 LPCSTR lpServiceName
,
322 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
327 /**********************************************************************
328 * GetServiceDisplayNameW
332 GetServiceDisplayNameW(
333 SC_HANDLE hSCManager
,
334 LPCWSTR lpServiceName
,
335 LPWSTR lpDisplayName
,
339 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
344 /**********************************************************************
350 SC_HANDLE hSCManager
,
351 LPCSTR lpDisplayName
,
356 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
361 /**********************************************************************
367 SC_HANDLE hSCManager
,
368 LPCWSTR lpDisplayName
,
369 LPWSTR lpServiceName
,
373 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
377 /**********************************************************************
378 * LockServiceDatabase
386 SetLastError (ERROR_CALL_NOT_IMPLEMENTED
);
391 /**********************************************************************
395 OpenSCManagerA(LPCSTR lpMachineName
,
396 LPCSTR lpDatabaseName
,
397 DWORD dwDesiredAccess
)
400 UNICODE_STRING MachineNameW
;
401 UNICODE_STRING DatabaseNameW
;
402 ANSI_STRING MachineNameA
;
403 ANSI_STRING DatabaseNameA
;
405 RtlInitAnsiString(&MachineNameA
, (LPSTR
)lpMachineName
);
406 RtlAnsiStringToUnicodeString(&MachineNameW
,
409 RtlInitAnsiString(&DatabaseNameA
, (LPSTR
)lpDatabaseName
);
410 RtlAnsiStringToUnicodeString(&DatabaseNameW
,
414 Handle
= OpenSCManagerW(MachineNameW
.Buffer
,
415 DatabaseNameW
.Buffer
,
418 RtlFreeHeap(GetProcessHeap(),
420 MachineNameW
.Buffer
);
421 RtlFreeHeap(GetProcessHeap(),
423 DatabaseNameW
.Buffer
);
429 /**********************************************************************
432 SC_HANDLE STDCALL
OpenSCManagerW(LPCWSTR lpMachineName
,
433 LPCWSTR lpDatabaseName
,
434 DWORD dwDesiredAccess
)
441 LPWSTR lpszPipeName
= L
"\\\\.\\pipe\\Ntsvcs";
443 if(lpMachineName
== NULL
|| wcslen(lpMachineName
) == 0)
445 if(lpDatabaseName
!= NULL
&& wcscmp(lpDatabaseName
, SERVICES_ACTIVE_DATABASEW
) != 0)
448 // Only connect to scm when event "SvcctrlStartEvent_A3725DX" is signaled
449 hStartEvent
= OpenEvent(SYNCHRONIZE
, FALSE
, _T("SvcctrlStartEvent_A3725DX"));
450 if(hStartEvent
== NULL
)
452 SetLastError(ERROR_DATABASE_DOES_NOT_EXIST
);
455 dwWait
= WaitForSingleObject(hStartEvent
, INFINITE
);
456 if(dwWait
== WAIT_FAILED
)
458 SetLastError(ERROR_ACCESS_DENIED
);
461 CloseHandle(hStartEvent
);
463 // Try to open a named pipe; wait for it, if necessary
466 hPipe
= CreateFileW(lpszPipeName
, // pipe name
469 NULL
, // no security attributes
470 OPEN_EXISTING
, // opens existing pipe
471 0, // default attributes
472 NULL
); // no template file
474 // Break if the pipe handle is valid
475 if(hPipe
!= INVALID_HANDLE_VALUE
)
478 // Exit if an error other than ERROR_PIPE_BUSY occurs
479 if(GetLastError()!= ERROR_PIPE_BUSY
)
482 // All pipe instances are busy, so wait for 20 seconds
483 if(!WaitNamedPipeW(lpszPipeName
, 20000))
487 // The pipe connected; change to message-read mode
488 dwMode
= PIPE_READMODE_MESSAGE
;
489 fSuccess
= SetNamedPipeHandleState(
490 hPipe
, // pipe handle
491 &dwMode
, // new pipe mode
492 NULL
, // don't set maximum bytes
493 NULL
); // don't set maximum time
500 // Send a message to the pipe server
501 lpvMessage
= (argc
> 1) ? argv
[1] : "default message";
503 fSuccess
= WriteFile(
504 hPipe
, // pipe handle
505 lpvMessage
, // message
506 strlen(lpvMessage
) + 1, // message length
507 &cbWritten
, // bytes written
508 NULL
); // not overlapped
517 // Read from the pipe
519 hPipe
, // pipe handle
520 chBuf
, // buffer to receive reply
521 512, // size of buffer
522 &cbRead
, // number of bytes read
523 NULL
); // not overlapped
525 if(! fSuccess
&& GetLastError() != ERROR_MORE_DATA
)
528 // Reply from the pipe is written to STDOUT.
529 if(!WriteFile(GetStdHandle(STD_OUTPUT_HANDLE
), chBuf
, cbRead
, &cbWritten
, NULL
))
531 } while(!fSuccess
); // repeat loop if ERROR_MORE_DATA
533 //CloseHandle(hPipe);
539 /* FIXME: Connect to remote SCM */
545 /**********************************************************************
549 OpenServiceA(SC_HANDLE hSCManager
,
550 LPCSTR lpServiceName
,
551 DWORD dwDesiredAccess
)
553 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
558 /**********************************************************************
564 SC_HANDLE hSCManager
,
565 LPCWSTR lpServiceName
,
566 DWORD dwDesiredAccess
569 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
574 /**********************************************************************
575 * PrivilegedServiceAuditAlarmA
579 PrivilegedServiceAuditAlarmA(
580 LPCSTR SubsystemName
,
583 PPRIVILEGE_SET Privileges
,
587 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
592 /**********************************************************************
593 * PrivilegedServiceAuditAlarmW
597 PrivilegedServiceAuditAlarmW(
598 LPCWSTR SubsystemName
,
601 PPRIVILEGE_SET Privileges
,
605 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
610 /**********************************************************************
611 * QueryServiceConfigA
617 LPQUERY_SERVICE_CONFIGA lpServiceConfig
,
619 LPDWORD pcbBytesNeeded
622 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
627 /**********************************************************************
628 * QueryServiceConfigW
634 LPQUERY_SERVICE_CONFIGW lpServiceConfig
,
636 LPDWORD pcbBytesNeeded
639 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
644 /**********************************************************************
645 * QueryServiceLockStatusA
649 QueryServiceLockStatusA(
650 SC_HANDLE hSCManager
,
651 LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
,
653 LPDWORD pcbBytesNeeded
656 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
661 /**********************************************************************
662 * QueryServiceLockStatusW
666 QueryServiceLockStatusW(
667 SC_HANDLE hSCManager
,
668 LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
,
670 LPDWORD pcbBytesNeeded
673 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
678 /**********************************************************************
679 * QueryServiceObjectSecurity
683 QueryServiceObjectSecurity(
685 SECURITY_INFORMATION dwSecurityInformation
,
686 PSECURITY_DESCRIPTOR lpSecurityDescriptor
,
688 LPDWORD pcbBytesNeeded
691 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
696 /**********************************************************************
703 LPSERVICE_STATUS lpServiceStatus
706 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
711 /**********************************************************************
712 * QueryServiceStatusEx
716 QueryServiceStatusEx(SC_HANDLE hService
,
717 SC_STATUS_TYPE InfoLevel
,
720 LPDWORD pcbBytesNeeded
723 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
728 /**********************************************************************
735 DWORD dwNumServiceArgs
,
736 LPCSTR
*lpServiceArgVectors
739 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
746 /**********************************************************************
753 DWORD dwNumServiceArgs
,
754 LPCWSTR
*lpServiceArgVectors
757 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
762 /**********************************************************************
763 * UnlockServiceDatabase
767 UnlockServiceDatabase(
771 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);