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
;
76 PSECURITY_DESCRIPTOR pSecurityDescriptor
;
78 BOOLEAN ServiceVisited
;
80 WCHAR szServiceName
[1];
84 #define LOCK_TAG 0x4C697041 /* 'ApiL' */
86 typedef struct _START_LOCK
88 DWORD Tag
; /* Must be LOCK_TAG */
89 DWORD TimeWhenLocked
; /* Number of seconds since 1970 */
90 PSID LockOwnerSid
; /* It is NULL if the SCM acquired the lock */
91 } START_LOCK
, *PSTART_LOCK
;
94 /* VARIABLES ***************************************************************/
96 extern LIST_ENTRY ServiceListHead
;
97 extern LIST_ENTRY GroupListHead
;
98 extern LIST_ENTRY ImageListHead
;
99 extern BOOL ScmInitialize
;
100 extern BOOL ScmShutdown
;
103 /* FUNCTIONS ***************************************************************/
107 DWORD
ScmOpenServiceKey(LPWSTR lpServiceName
,
111 DWORD
ScmCreateServiceKey(LPCWSTR lpServiceName
,
115 DWORD
ScmWriteDependencies(HKEY hServiceKey
,
116 LPCWSTR lpDependencies
,
117 DWORD dwDependenciesLength
);
119 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
120 BOOL
ScmIsDeleteFlagSet(HKEY hServiceKey
);
122 DWORD
ScmReadString(HKEY hServiceKey
,
127 ScmReadDependencies(HKEY hServiceKey
,
128 LPWSTR
*lpDependencies
,
129 DWORD
*lpdwDependenciesLength
);
132 ScmSetServicePassword(
133 IN PCWSTR pszServiceName
,
134 IN PCWSTR pszPassword
);
137 ScmWriteSecurityDescriptor(
138 _In_ HKEY hServiceKey
,
139 _In_ PSECURITY_DESCRIPTOR pSecurityDescriptor
);
142 ScmReadSecurityDescriptor(
143 _In_ HKEY hServiceKey
,
144 _Out_ PSECURITY_DESCRIPTOR
*ppSecurityDescriptor
);
149 _In_ PCWSTR pszSubKey
);
153 BOOL
ScmGetControlSetValues(VOID
);
158 DWORD
ScmCreateServiceDatabase(VOID
);
159 VOID
ScmShutdownServiceDatabase(VOID
);
160 VOID
ScmGetBootAndSystemDriverState(VOID
);
161 VOID
ScmAutoStartServices(VOID
);
162 VOID
ScmAutoShutdownServices(VOID
);
163 DWORD
ScmStartService(PSERVICE Service
,
167 VOID
ScmRemoveServiceImage(PSERVICE_IMAGE pServiceImage
);
168 PSERVICE
ScmGetServiceEntryByName(LPCWSTR lpServiceName
);
169 PSERVICE
ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName
);
170 PSERVICE
ScmGetServiceEntryByResumeCount(DWORD dwResumeCount
);
171 DWORD
ScmCreateNewServiceRecord(LPCWSTR lpServiceName
,
172 PSERVICE
*lpServiceRecord
,
175 VOID
ScmDeleteServiceRecord(PSERVICE lpService
);
176 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
178 DWORD
ScmControlService(HANDLE hControlPipe
,
180 SERVICE_STATUS_HANDLE hServiceStatus
,
183 BOOL
ScmLockDatabaseExclusive(VOID
);
184 BOOL
ScmLockDatabaseShared(VOID
);
185 VOID
ScmUnlockDatabase(VOID
);
187 VOID
ScmInitNamedPipeCriticalSection(VOID
);
188 VOID
ScmDeleteNamedPipeCriticalSection(VOID
);
193 DWORD
ScmStartDriver(PSERVICE lpService
);
194 DWORD
ScmControlDriver(PSERVICE lpService
,
196 LPSERVICE_STATUS lpServiceStatus
);
202 ScmGetServiceGroupByName(
203 _In_ LPCWSTR lpGroupName
);
205 DWORD
ScmCreateGroupList(VOID
);
206 DWORD
ScmSetServiceGroup(PSERVICE lpService
,
207 LPCWSTR lpGroupName
);
212 DWORD
ScmAcquireServiceStartLock(IN BOOL IsServiceController
,
213 OUT LPSC_RPC_LOCK lpLock
);
214 DWORD
ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock
);
215 VOID
ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
);
216 VOID
ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
);
221 VOID
ScmStartRpcServer(VOID
);
226 DWORD
ScmInitializeSecurity(VOID
);
227 VOID
ScmShutdownSecurity(VOID
);
230 ScmCreateDefaultServiceSD(
231 PSECURITY_DESCRIPTOR
*ppSecurityDescriptor
);
236 VOID
PrintString(LPCSTR fmt
, ...);
237 VOID
ScmLogEvent(DWORD dwEventId
,
241 VOID
ScmWaitForLsa(VOID
);
243 #endif /* _SERVICES_H */