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
;
46 DWORD dwImageRunCount
;
53 } SERVICE_IMAGE
, *PSERVICE_IMAGE
;
56 typedef struct _SERVICE
58 LIST_ENTRY ServiceListEntry
;
61 PSERVICE_GROUP lpGroup
;
62 PSERVICE_IMAGE lpImage
;
67 SERVICE_STATUS Status
;
74 PSECURITY_DESCRIPTOR lpSecurityDescriptor
;
76 BOOLEAN ServiceVisited
;
78 WCHAR szServiceName
[1];
82 #define LOCK_TAG 0x4C697041 /* 'ApiL' */
84 typedef struct _START_LOCK
86 DWORD Tag
; /* Must be LOCK_TAG */
87 DWORD TimeWhenLocked
; /* Number of seconds since 1970 */
88 PSID LockOwnerSid
; /* It is NULL if the SCM aquired the lock */
89 } START_LOCK
, *PSTART_LOCK
;
92 /* VARIABLES ***************************************************************/
94 extern LIST_ENTRY ServiceListHead
;
95 extern LIST_ENTRY GroupListHead
;
96 extern LIST_ENTRY ImageListHead
;
97 extern BOOL ScmInitialize
;
98 extern BOOL ScmShutdown
;
101 /* FUNCTIONS ***************************************************************/
105 DWORD
ScmOpenServiceKey(LPWSTR lpServiceName
,
109 DWORD
ScmCreateServiceKey(LPCWSTR lpServiceName
,
113 DWORD
ScmWriteDependencies(HKEY hServiceKey
,
114 LPCWSTR lpDependencies
,
115 DWORD dwDependenciesLength
);
117 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
118 BOOL
ScmIsDeleteFlagSet(HKEY hServiceKey
);
120 DWORD
ScmReadString(HKEY hServiceKey
,
125 ScmReadDependencies(HKEY hServiceKey
,
126 LPWSTR
*lpDependencies
,
127 DWORD
*lpdwDependenciesLength
);
132 BOOL
ScmGetControlSetValues(VOID
);
137 DWORD
ScmCreateServiceDatabase(VOID
);
138 VOID
ScmShutdownServiceDatabase(VOID
);
139 VOID
ScmGetBootAndSystemDriverState(VOID
);
140 VOID
ScmAutoStartServices(VOID
);
141 VOID
ScmAutoShutdownServices(VOID
);
142 DWORD
ScmStartService(PSERVICE Service
,
146 PSERVICE
ScmGetServiceEntryByName(LPCWSTR lpServiceName
);
147 PSERVICE
ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName
);
148 PSERVICE
ScmGetServiceEntryByResumeCount(DWORD dwResumeCount
);
149 DWORD
ScmCreateNewServiceRecord(LPCWSTR lpServiceName
,
150 PSERVICE
*lpServiceRecord
);
151 VOID
ScmDeleteServiceRecord(PSERVICE lpService
);
152 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
154 DWORD
ScmControlService(PSERVICE Service
,
157 BOOL
ScmLockDatabaseExclusive(VOID
);
158 BOOL
ScmLockDatabaseShared(VOID
);
159 VOID
ScmUnlockDatabase(VOID
);
161 VOID
ScmInitNamedPipeCriticalSection(VOID
);
162 VOID
ScmDeleteNamedPipeCriticalSection(VOID
);
167 DWORD
ScmLoadDriver(PSERVICE lpService
);
168 DWORD
ScmUnloadDriver(PSERVICE lpService
);
169 DWORD
ScmControlDriver(PSERVICE lpService
,
171 LPSERVICE_STATUS lpServiceStatus
);
176 DWORD
ScmCreateGroupList(VOID
);
177 DWORD
ScmSetServiceGroup(PSERVICE lpService
,
178 LPCWSTR lpGroupName
);
183 DWORD
ScmAcquireServiceStartLock(IN BOOL IsServiceController
,
184 OUT LPSC_RPC_LOCK lpLock
);
185 DWORD
ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock
);
186 VOID
ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
);
187 VOID
ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
);
192 VOID
ScmStartRpcServer(VOID
);
197 VOID
PrintString(LPCSTR fmt
, ...);
198 VOID
ScmLogEvent(DWORD dwEventId
,
202 VOID
ScmWaitForLsa(VOID
);
204 #endif /* _SERVICES_H */