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 PSECURITY_DESCRIPTOR pPipeSD
;
107 /* FUNCTIONS ***************************************************************/
111 DWORD
ScmOpenServiceKey(LPWSTR lpServiceName
,
115 DWORD
ScmCreateServiceKey(LPCWSTR lpServiceName
,
119 DWORD
ScmWriteDependencies(HKEY hServiceKey
,
120 LPCWSTR lpDependencies
,
121 DWORD dwDependenciesLength
);
123 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
124 BOOL
ScmIsDeleteFlagSet(HKEY hServiceKey
);
126 DWORD
ScmReadString(HKEY hServiceKey
,
131 ScmReadDependencies(HKEY hServiceKey
,
132 LPWSTR
*lpDependencies
,
133 DWORD
*lpdwDependenciesLength
);
136 ScmSetServicePassword(
137 IN PCWSTR pszServiceName
,
138 IN PCWSTR pszPassword
);
141 ScmWriteSecurityDescriptor(
142 _In_ HKEY hServiceKey
,
143 _In_ PSECURITY_DESCRIPTOR pSecurityDescriptor
);
146 ScmReadSecurityDescriptor(
147 _In_ HKEY hServiceKey
,
148 _Out_ PSECURITY_DESCRIPTOR
*ppSecurityDescriptor
);
153 _In_ PCWSTR pszSubKey
);
157 _In_ PBYTE pPassword
,
158 _In_ DWORD dwPasswordSize
,
159 _Out_ PWSTR
*pDecryptedPassword
);
165 ScmCreateLastKnownGoodControlSet(VOID
);
171 ScmRunLastKnownGood(VOID
);
176 DWORD
ScmCreateServiceDatabase(VOID
);
177 VOID
ScmShutdownServiceDatabase(VOID
);
178 VOID
ScmGetBootAndSystemDriverState(VOID
);
179 VOID
ScmAutoStartServices(VOID
);
180 VOID
ScmAutoShutdownServices(VOID
);
181 DWORD
ScmStartService(PSERVICE Service
,
185 VOID
ScmRemoveServiceImage(PSERVICE_IMAGE pServiceImage
);
186 PSERVICE
ScmGetServiceEntryByName(LPCWSTR lpServiceName
);
187 PSERVICE
ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName
);
188 PSERVICE
ScmGetServiceEntryByResumeCount(DWORD dwResumeCount
);
189 DWORD
ScmCreateNewServiceRecord(LPCWSTR lpServiceName
,
190 PSERVICE
*lpServiceRecord
,
193 VOID
ScmDeleteServiceRecord(PSERVICE lpService
);
194 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
196 DWORD
ScmControlService(HANDLE hControlPipe
,
198 SERVICE_STATUS_HANDLE hServiceStatus
,
201 BOOL
ScmLockDatabaseExclusive(VOID
);
202 BOOL
ScmLockDatabaseShared(VOID
);
203 VOID
ScmUnlockDatabase(VOID
);
205 VOID
ScmInitNamedPipeCriticalSection(VOID
);
206 VOID
ScmDeleteNamedPipeCriticalSection(VOID
);
208 DWORD
ScmGetServiceNameFromTag(PTAG_INFO_NAME_FROM_TAG_IN_PARAMS InParams
,
209 PTAG_INFO_NAME_FROM_TAG_OUT_PARAMS
*OutParams
);
211 DWORD
ScmGenerateServiceTag(PSERVICE lpServiceRecord
);
215 DWORD
ScmStartDriver(PSERVICE lpService
);
216 DWORD
ScmControlDriver(PSERVICE lpService
,
218 LPSERVICE_STATUS lpServiceStatus
);
224 ScmGetServiceGroupByName(
225 _In_ LPCWSTR lpGroupName
);
227 DWORD
ScmCreateGroupList(VOID
);
228 DWORD
ScmSetServiceGroup(PSERVICE lpService
,
229 LPCWSTR lpGroupName
);
234 DWORD
ScmAcquireServiceStartLock(IN BOOL IsServiceController
,
235 OUT LPSC_RPC_LOCK lpLock
);
236 DWORD
ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock
);
237 VOID
ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
);
238 VOID
ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
);
243 VOID
ScmStartRpcServer(VOID
);
248 DWORD
ScmInitializeSecurity(VOID
);
249 VOID
ScmShutdownSecurity(VOID
);
252 ScmCreateDefaultServiceSD(
253 PSECURITY_DESCRIPTOR
*ppSecurityDescriptor
);
258 VOID
PrintString(LPCSTR fmt
, ...);
259 VOID
ScmLogEvent(DWORD dwEventId
,
263 VOID
ScmWaitForLsa(VOID
);
265 #endif /* _SERVICES_H */