11 #define WIN32_NO_STATUS
13 #define COM_NO_WINDOWS_H
21 #define NTOS_MODE_USER
22 #include <ndk/setypes.h>
23 #include <ndk/obfuncs.h>
24 #include <ndk/rtlfuncs.h>
25 #include <services/services.h>
30 typedef struct _SERVICE_GROUP
32 LIST_ENTRY GroupListEntry
;
36 BOOLEAN ServicesRunning
;
41 } SERVICE_GROUP
, *PSERVICE_GROUP
;
44 typedef struct _SERVICE_IMAGE
46 LIST_ENTRY ImageListEntry
;
48 LPWSTR pszAccountName
;
49 DWORD dwImageRunCount
;
56 } SERVICE_IMAGE
, *PSERVICE_IMAGE
;
59 typedef struct _SERVICE
61 LIST_ENTRY ServiceListEntry
;
64 PSERVICE_GROUP lpGroup
;
65 PSERVICE_IMAGE lpImage
;
70 SERVICE_STATUS Status
;
79 PSECURITY_DESCRIPTOR pSecurityDescriptor
;
81 BOOLEAN ServiceVisited
;
83 WCHAR szServiceName
[1];
87 #define LOCK_TAG 0x4C697041 /* 'ApiL' */
89 typedef struct _START_LOCK
91 DWORD Tag
; /* Must be LOCK_TAG */
92 DWORD TimeWhenLocked
; /* Number of seconds since 1970 */
93 PSID LockOwnerSid
; /* It is NULL if the SCM acquired the lock */
94 } START_LOCK
, *PSTART_LOCK
;
97 /* VARIABLES ***************************************************************/
99 extern LIST_ENTRY ServiceListHead
;
100 extern LIST_ENTRY GroupListHead
;
101 extern LIST_ENTRY ImageListHead
;
102 extern BOOL ScmInitialize
;
103 extern BOOL ScmShutdown
;
104 extern BOOL ScmLiveSetup
;
105 extern PSECURITY_DESCRIPTOR pPipeSD
;
108 /* FUNCTIONS ***************************************************************/
112 DWORD
ScmOpenServiceKey(LPWSTR lpServiceName
,
116 DWORD
ScmCreateServiceKey(LPCWSTR lpServiceName
,
120 DWORD
ScmWriteDependencies(HKEY hServiceKey
,
121 LPCWSTR lpDependencies
,
122 DWORD dwDependenciesLength
);
124 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
125 BOOL
ScmIsDeleteFlagSet(HKEY hServiceKey
);
127 DWORD
ScmReadString(HKEY hServiceKey
,
132 ScmReadDependencies(HKEY hServiceKey
,
133 LPWSTR
*lpDependencies
,
134 DWORD
*lpdwDependenciesLength
);
137 ScmSetServicePassword(
138 IN PCWSTR pszServiceName
,
139 IN PCWSTR pszPassword
);
142 ScmWriteSecurityDescriptor(
143 _In_ HKEY hServiceKey
,
144 _In_ PSECURITY_DESCRIPTOR pSecurityDescriptor
);
147 ScmReadSecurityDescriptor(
148 _In_ HKEY hServiceKey
,
149 _Out_ PSECURITY_DESCRIPTOR
*ppSecurityDescriptor
);
154 _In_ PCWSTR pszSubKey
);
158 _In_ PVOID ContextHandle
,
159 _In_ PBYTE pPassword
,
160 _In_ DWORD dwPasswordSize
,
161 _Out_ PWSTR
*pDecryptedPassword
);
167 ScmCreateLastKnownGoodControlSet(VOID
);
173 ScmRunLastKnownGood(VOID
);
178 DWORD
ScmCreateServiceDatabase(VOID
);
179 VOID
ScmShutdownServiceDatabase(VOID
);
180 VOID
ScmGetBootAndSystemDriverState(VOID
);
181 VOID
ScmAutoStartServices(VOID
);
182 VOID
ScmAutoShutdownServices(VOID
);
183 DWORD
ScmStartService(PSERVICE Service
,
187 VOID
ScmRemoveServiceImage(PSERVICE_IMAGE pServiceImage
);
188 PSERVICE
ScmGetServiceEntryByName(LPCWSTR lpServiceName
);
189 PSERVICE
ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName
);
190 PSERVICE
ScmGetServiceEntryByResumeCount(DWORD dwResumeCount
);
191 DWORD
ScmCreateNewServiceRecord(LPCWSTR lpServiceName
,
192 PSERVICE
*lpServiceRecord
,
195 VOID
ScmDeleteServiceRecord(PSERVICE lpService
);
196 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
198 DWORD
ScmControlService(HANDLE hControlPipe
,
200 SERVICE_STATUS_HANDLE hServiceStatus
,
203 BOOL
ScmLockDatabaseExclusive(VOID
);
204 BOOL
ScmLockDatabaseShared(VOID
);
205 VOID
ScmUnlockDatabase(VOID
);
207 VOID
ScmInitNamedPipeCriticalSection(VOID
);
208 VOID
ScmDeleteNamedPipeCriticalSection(VOID
);
210 DWORD
ScmGetServiceNameFromTag(PTAG_INFO_NAME_FROM_TAG_IN_PARAMS InParams
,
211 PTAG_INFO_NAME_FROM_TAG_OUT_PARAMS
*OutParams
);
213 DWORD
ScmGenerateServiceTag(PSERVICE lpServiceRecord
);
217 DWORD
ScmStartDriver(PSERVICE lpService
);
218 DWORD
ScmControlDriver(PSERVICE lpService
,
220 LPSERVICE_STATUS lpServiceStatus
);
226 ScmGetServiceGroupByName(
227 _In_ LPCWSTR lpGroupName
);
229 DWORD
ScmCreateGroupList(VOID
);
230 DWORD
ScmSetServiceGroup(PSERVICE lpService
,
231 LPCWSTR lpGroupName
);
236 DWORD
ScmAcquireServiceStartLock(IN BOOL IsServiceController
,
237 OUT LPSC_RPC_LOCK lpLock
);
238 DWORD
ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock
);
239 VOID
ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
);
240 VOID
ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
);
245 VOID
ScmStartRpcServer(VOID
);
250 DWORD
ScmInitializeSecurity(VOID
);
251 VOID
ScmShutdownSecurity(VOID
);
254 ScmCreateDefaultServiceSD(
255 PSECURITY_DESCRIPTOR
*ppSecurityDescriptor
);
260 VOID
PrintString(LPCSTR fmt
, ...);
261 DWORD
SetSecurityServicesEvent(VOID
);
262 VOID
ScmLogEvent(DWORD dwEventId
,
266 VOID
ScmWaitForLsa(VOID
);
268 #endif /* _SERVICES_H */