11 #define WIN32_NO_STATUS
13 #define COM_NO_WINDOWS_H
21 #define NTOS_MODE_USER
22 #include <ndk/obfuncs.h>
23 #include <ndk/rtlfuncs.h>
24 #include <services/services.h>
29 typedef struct _SERVICE_GROUP
31 LIST_ENTRY GroupListEntry
;
35 BOOLEAN ServicesRunning
;
40 } SERVICE_GROUP
, *PSERVICE_GROUP
;
43 typedef struct _SERVICE_IMAGE
45 LIST_ENTRY ImageListEntry
;
47 LPWSTR pszAccountName
;
48 DWORD dwImageRunCount
;
55 } SERVICE_IMAGE
, *PSERVICE_IMAGE
;
58 typedef struct _SERVICE
60 LIST_ENTRY ServiceListEntry
;
63 PSERVICE_GROUP lpGroup
;
64 PSERVICE_IMAGE lpImage
;
69 SERVICE_STATUS Status
;
78 PSECURITY_DESCRIPTOR pSecurityDescriptor
;
80 BOOLEAN ServiceVisited
;
82 WCHAR szServiceName
[1];
86 #define LOCK_TAG 0x4C697041 /* 'ApiL' */
88 typedef struct _START_LOCK
90 DWORD Tag
; /* Must be LOCK_TAG */
91 DWORD TimeWhenLocked
; /* Number of seconds since 1970 */
92 PSID LockOwnerSid
; /* It is NULL if the SCM acquired the lock */
93 } START_LOCK
, *PSTART_LOCK
;
96 /* VARIABLES ***************************************************************/
98 extern LIST_ENTRY ServiceListHead
;
99 extern LIST_ENTRY GroupListHead
;
100 extern LIST_ENTRY ImageListHead
;
101 extern BOOL ScmInitialize
;
102 extern BOOL ScmShutdown
;
105 /* FUNCTIONS ***************************************************************/
109 DWORD
ScmOpenServiceKey(LPWSTR lpServiceName
,
113 DWORD
ScmCreateServiceKey(LPCWSTR lpServiceName
,
117 DWORD
ScmWriteDependencies(HKEY hServiceKey
,
118 LPCWSTR lpDependencies
,
119 DWORD dwDependenciesLength
);
121 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
122 BOOL
ScmIsDeleteFlagSet(HKEY hServiceKey
);
124 DWORD
ScmReadString(HKEY hServiceKey
,
129 ScmReadDependencies(HKEY hServiceKey
,
130 LPWSTR
*lpDependencies
,
131 DWORD
*lpdwDependenciesLength
);
134 ScmSetServicePassword(
135 IN PCWSTR pszServiceName
,
136 IN PCWSTR pszPassword
);
139 ScmWriteSecurityDescriptor(
140 _In_ HKEY hServiceKey
,
141 _In_ PSECURITY_DESCRIPTOR pSecurityDescriptor
);
144 ScmReadSecurityDescriptor(
145 _In_ HKEY hServiceKey
,
146 _Out_ PSECURITY_DESCRIPTOR
*ppSecurityDescriptor
);
151 _In_ PCWSTR pszSubKey
);
155 _In_ PBYTE pPassword
,
156 _In_ DWORD dwPasswordSize
,
157 _Out_ PWSTR
*pDecryptedPassword
);
163 ScmUpdateControlSets(VOID
)
168 DWORD
ScmCreateServiceDatabase(VOID
);
169 VOID
ScmShutdownServiceDatabase(VOID
);
170 VOID
ScmGetBootAndSystemDriverState(VOID
);
171 VOID
ScmAutoStartServices(VOID
);
172 VOID
ScmAutoShutdownServices(VOID
);
173 DWORD
ScmStartService(PSERVICE Service
,
177 VOID
ScmRemoveServiceImage(PSERVICE_IMAGE pServiceImage
);
178 PSERVICE
ScmGetServiceEntryByName(LPCWSTR lpServiceName
);
179 PSERVICE
ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName
);
180 PSERVICE
ScmGetServiceEntryByResumeCount(DWORD dwResumeCount
);
181 DWORD
ScmCreateNewServiceRecord(LPCWSTR lpServiceName
,
182 PSERVICE
*lpServiceRecord
,
185 VOID
ScmDeleteServiceRecord(PSERVICE lpService
);
186 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
188 DWORD
ScmControlService(HANDLE hControlPipe
,
190 SERVICE_STATUS_HANDLE hServiceStatus
,
193 BOOL
ScmLockDatabaseExclusive(VOID
);
194 BOOL
ScmLockDatabaseShared(VOID
);
195 VOID
ScmUnlockDatabase(VOID
);
197 VOID
ScmInitNamedPipeCriticalSection(VOID
);
198 VOID
ScmDeleteNamedPipeCriticalSection(VOID
);
203 DWORD
ScmStartDriver(PSERVICE lpService
);
204 DWORD
ScmControlDriver(PSERVICE lpService
,
206 LPSERVICE_STATUS lpServiceStatus
);
212 ScmGetServiceGroupByName(
213 _In_ LPCWSTR lpGroupName
);
215 DWORD
ScmCreateGroupList(VOID
);
216 DWORD
ScmSetServiceGroup(PSERVICE lpService
,
217 LPCWSTR lpGroupName
);
222 DWORD
ScmAcquireServiceStartLock(IN BOOL IsServiceController
,
223 OUT LPSC_RPC_LOCK lpLock
);
224 DWORD
ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock
);
225 VOID
ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
);
226 VOID
ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
);
231 VOID
ScmStartRpcServer(VOID
);
236 DWORD
ScmInitializeSecurity(VOID
);
237 VOID
ScmShutdownSecurity(VOID
);
240 ScmCreateDefaultServiceSD(
241 PSECURITY_DESCRIPTOR
*ppSecurityDescriptor
);
246 VOID
PrintString(LPCSTR fmt
, ...);
247 VOID
ScmLogEvent(DWORD dwEventId
,
251 VOID
ScmWaitForLsa(VOID
);
253 #endif /* _SERVICES_H */